本文目录导读:

PHP 与 Polkadot/平行链
PHP 可以用于与 Polkadot 网络及其平行链进行交互,主要方式是通过 RPC 接口调用,以下是具体的实现方案和示例:
基础连接设置
<?php
// 使用 cURL 与 Polkadot 节点通信
class PolkadotRPC {
private $nodeUrl;
public function __construct($nodeUrl = 'https://rpc.polkadot.io') {
$this->nodeUrl = $nodeUrl;
}
private function sendRequest($method, $params = []) {
$data = json_encode([
'jsonrpc' => '2.0',
'id' => 1,
'method' => $method,
'params' => $params
]);
$ch = curl_init($this->nodeUrl);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $data,
CURLOPT_HTTPHEADER => ['Content-Type: application/json']
]);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
}
获取链上数据
<?php
class PolkadotAPI extends PolkadotRPC {
// 获取最新区块信息
public function getLatestBlock() {
return $this->sendRequest('chain_getBlock');
}
// 获取账户余额
public function getBalance($address) {
return $this->sendRequest('system_account', [$address]);
}
// 获取平行链信息
public function getParachains() {
return $this->sendRequest('parachains_getParachains');
}
// 获取平行链区块头
public function getParachainHeader($paraId) {
return $this->sendRequest('chain_getHeader', [$paraId]);
}
}
// 使用示例
$polkadot = new PolkadotAPI();
$latestBlock = $polkadot->getLatestBlock();
$balance = $polkadot->getBalance('1ChFWeNRLarAPRCTM3bfJmnc6bY1GvS8yC');
交易签名与发送
<?php
// 需要安装 php-secp256k1 扩展或使用第三方库
require_once 'vendor/autoload.php';
use BitWasp\Bitcoin\Crypto\EcAdapter\Adapter\EcAdapterFactory;
use BitWasp\Bitcoin\Crypto\Keys\PrivateKeyFactory;
class TransactionManager extends PolkadotRPC {
public function createTransfer($from, $to, $amount, $privateKey) {
// 1. 获取 nonce
$accountInfo = $this->sendRequest('system_account', [$from]);
$nonce = $accountInfo['result']['nonce'];
// 2. 构建交易数据
$txData = [
'from' => $from,
'to' => $to,
'amount' => $amount,
'nonce' => $nonce
];
// 3. 签名交易
$signature = $this->signTransaction($txData, $privateKey);
// 4. 广播交易
return $this->sendRequest('author_submitExtrinsic', [
'tx' => $signature
]);
}
private function signTransaction($txData, $privateKey) {
// 实际的签名逻辑比较复杂,需要按照 Polkadot 的规范
// 这里简化为一个框架
// 建议使用 subxt 或 polkadot-js 进行实际签名
return base64_encode(json_encode($txData) . $privateKey);
}
}
平行链交互示例
<?php
class ParachainInteractor extends PolkadotRPC {
// 发送跨链消息
public function sendXCM($parachainId, $destination, $message) {
$xcmMessage = [
'dest' => [
'V1' => [
'interior' => [
'X1' => [
'Parachain' => $parachainId
]
],
'parents' => 0
]
],
'message' => $message
];
return $this->sendRequest('xcm_send', [$xcmMessage]);
}
// 查询平行链状态
public function getParachainState($paraId) {
return $this->sendRequest('state_getStorage', [
'0x' . bin2hex('ParachainInfo' . pack('V', $paraId))
]);
}
}
// 使用示例
$interactor = new ParachainInteractor();
$response = $interactor->sendXCM(
2000, // 平行链 ID (如 Acala)
'0x...', // 目标地址
['Withdraw' => ['amount' => 1000000000000]]
);
完整项目结构
polkadot-php-project/
├── composer.json
├── src/
│ ├── RPC/
│ │ └── Client.php
│ ├── API/
│ │ ├── Chain.php
│ │ ├── System.php
│ │ └── Parachain.php
│ ├── Transaction/
│ │ ├── Builder.php
│ │ └── Signer.php
│ └── Utils/
│ └── Encoder.php
├── config/
│ └── networks.php
└── examples/
└── basic.php
composer.json 依赖
{
"require": {
"php": ">=7.4",
"ext-curl": "*",
"ext-json": "*",
"bitwasp/secp256k1": "^0.2",
"simplito/elliptic-php": "^1.0"
},
"autoload": {
"psr-4": {
"Polkadot\\": "src/"
}
}
}
实际应用建议
-
使用成熟的 PHP 库:
- polkadot-php - 社区开发
- 通过 Web3 封装库调用
-
推荐使用 WebSocket:
// 使用 Ratchet WebSocket 客户端 $loop = \React\EventLoop\Factory::create(); $connector = new \Ratchet\Client\Connector($loop);
$connector('wss://rpc.polkadot.io') ->then(function($connection) { $connection->on('message', function($msg) { echo "Received: {$msg}\n"; });
$connection->send(json_encode([
'jsonrpc' => '2.0',
'id' => 1,
'method' => 'chain_subscribeNewHeads',
'params' => []
]));
});
3. **生产环境注意事项**:
- 使用 HTTPS/WSS 加密连接
- 实现重试机制和错误处理
- 缓存频繁查询的数据
- 使用连接池管理 RPC 连接
## 示例:简单的交易监控系统
```php
<?php
class TransactionMonitor extends PolkadotRPC {
public function watchAddress($address, $callback) {
while (true) {
try {
$balance = $this->getBalance($address);
// 处理余额变动
$callback($balance);
sleep(6); // Polkadot 区块时间约 6 秒
} catch (Exception $e) {
// 错误处理
sleep(10);
}
}
}
}
PHP 虽然不是区块链开发的主流语言,但通过 RPC 接口完全可以实现对 Polkadot 生态系统的监控、查询和基本交互,对于复杂的签名和交易逻辑,建议配合底层工具使用。