2.以太坊php web3 使用curl获取节点版本信息

正文开始

[md] 以太坊规定了节点必须实现web3_clientVersion 接口来向外部应用提供节点旳版本信息。接口协议的交互流程如下

这是一个典型的请求/应答模型,请求包和响应包都是标准的JSON格式。其中,jsonrpc字段用来 标识协议版本,id则用来帮助建立响应包与请求包的对应关系。

在请求包中,使用method字段来声明接口方法,例如web3_clientVersion,使用params 字段来声明接口方法的参数数组。 在响应包中,result字段中保存了命令执行的返回结果。

以太坊JSON RPC并没有规定传输层的实现,不过大部分节点都会实现HTTP和IPC的访问。因此 我们可以使用命令行工具curl来测试这个接口:

~$ curl -X POST http://localhost:8545  -d '{
> "jsonrpc": "2.0",
> "method": "web3_clientVersion",
> "params": [],
> "id": 123
> }'

如果一切顺利的话,你应该看到这个结果:

{"id":123,"jsonrpc":"web3_clientVersion","result":"EthereumJS TestRPC..."}

如果你是一个追求完美的人,希望返回的结果看着舒服些,那么可以级联一个jq命令:

~$ curl http://localhost:845 -XPOST -s -d '{...}' | jq

jq是一个命令行json解析工具,是curl的好伴侣。加上它之后,结果就更像给人看的了:

{ "id": 123, "jsonrpc": "web3_clientVersion", "result": "EthereumJS TestRPC..." }

使用php获取节点版本信息

就像前一节看到的,我们只要在php代码中发送http请求包就可以了。 你可以使用任何一个你喜欢的http库例如curl、guzzle等, 甚至直接使用socket来调用以太坊的JSON RPC API。

例如,下面的代码使用guzzle库:

<?php
use GuzzleHttp\Client;
require_once ('vendor/autoload.php');

$client = new Client();
$opts = [
  'json' => [
    'jsonrpc' => '2.0',
    'method' => 'web3_clientVersion',
    'params' => [],
    'id' => time()
  ]
];

$rsp = $client->post('http://localhost:8545',$opts);
echo $rsp->getBody() . PHP_EOL;

把上面的内容保存为raw-test.php,然后执行:

~$ php rpc-guzzle.php

你应当就可以看到结果了:

{"id":1595839976,"jsonrpc":"2.0","result":"EthereumJS TestRPC/v2.10.2/ethereum-js"}

使用现成的轮子

尽管可行,但我还是建议你尽量避免自己去封装这些rpc接口,毕竟 这个事已经做过好几次了,而且rpc接口封装仅仅是整个故事的一部分。

虽然目前针对以太坊的php开发包普遍还不成熟,但我们可以选择一个 还在活跃的维护当中的库,作为前进的基础。在这里,我们使用web3.php:

有点山寨的感觉? 这其实是我们设计着玩儿的...项目实际并没有LOGO...

下篇是介绍使用web3.php。

正文结束

1.以太坊php web3 在windows10下调试——ganache工具的安装 【hi 以太坊】 3.以太坊php web3-web3类的介绍