文档章节

EosTool - PHP版的EOS区块链应用开发包

汇智网教程
 汇智网教程
发布于 2018/12/06 03:02
字数 2267
阅读 28
收藏 1

EosTool的目的是消除使用PHP开发EOS区块链应用的痛苦,例如:

  • 通过Nodeos和Keosd的RPC接口调用其功能
  • 离线生成EOS格式的私钥和公钥
  • 使用本地私钥生成符合EOS要求的交易签名
  • 将交易对象序列化为Nodeos要求的packed_trx格式

<!--more-->

可以认为EosTool是PHP版本的eosjs,利用它可以完整地实现EOS官方客户端Cleos的功能, 也可以很方便地在PHP应用中增加对EOS区块链的支持能力,极大地提高开发效率。

原文链接:http://sc.hubwiz.com/codebag/eos-php-sdk/

EosTool运行在Php 7.1+环境下,当前版本1.0.0,主要代码文件清单如下:

<table class="table table-striped"> <thead> <tr> <th>代码文件</th><th>说明</th> </tr> </thead> <tbody> <tr><td>eostool/src/client/NodeClient.php</td><td>节点软件nodeos的rpc接口封装类</td></tr> <tr><td>eostool/src/client/WalletClient.php</td><td>钱包软件keosd的rpc接口封装类</td></tr> <tr><td>eostool/src/client/RpcOutput.php</td><td>RPC返回结果封装类</td></tr> <tr><td>eostool/src/Crypto/PrivateKey.php</td><td>EOS私钥类</td></tr> <tr><td>eostool/src/Crypto/PublicKey.php</td><td>EOS公钥类</td></tr> <tr><td>eostool/src/Crypto/Signature.php</td><td>EOS签名类</td></tr> <tr><td>eostool/src/Serializer/AbiType.php</td><td>EOS的ABI类型封装类</td></tr> <tr><td>eostool/src/Serializer/AbiTypeFactory.php</td><td>ABI类型工厂类</td></tr> <tr><td>eostool/src/Serializer/SerialBuffer.php</td><td>序列化缓冲区实现类</td></tr> <tr><td>eostool/src/Serializer/Serializer.php</td><td>序列化器实现类</td></tr> <tr><td>eostool/src/Signer/Signer.php</td><td>签名器接口</td></tr> <tr><td>eostool/src/Signer/KeosdSigner.php</td><td>Keosd签名器实现类</td></tr> <tr><td>eostool/src/Signer/LocalSigner.php</td><td>本地离线签名器实现接口</td></tr> <tr><td>eostool/src/Contract.php</td><td>合约类</td></tr> <tr><td>eostool/src/EosTool.php</td><td>开发包入口类</td></tr> <tr><td>eostool/tests</td><td>单元测试用例目录</td></tr> <tr><td>eostool/phpunit.xml</td><td>单元测试配置文件</td></tr> <tr><td>eostool/vendor</td><td>第三方依赖包</td></tr> <tr><td>eostool/composer.json</td><td>composer配置文件</td></tr> </tbody> </table>

2. 访问节点服务器

使用NodeClient类访问nodeos的rpc接口。例如,下面的代码访问本机运行的 Nodeos节点的chain插件的get_info接口:

use EosTool\Client\NodeClient;

$nc = new NodeClient();
$ret = $nc->chain->getInfo();
if($ret->hasError()) throw new Exception($ret->getError());
$info = $ret->getResult();

2.1 RPC调用分组

Nodeos采用了插件化架构,不同的插件的API也归入不同的分组,EosTool采用了保持一致的 命名方法,根据api即可推断出NodeClient的调用方法:API分组对应于NodeClient的一个同名 属性,API则对应与No的Client的分组同名属性下的一个经过camelCase转化的方法。例如:

<table class="table table-striped"> <thead> <tr><th>插件</th><th>API分组</th><th>RPC API</th><th>NodeClient方法</th></tr> </thead> <tbody> <tr><td>chain_api_plugin</td><td>chain</td><td>get_info</td><td>$nc->chain->getInfo()</td></tr> <tr><td>history_api_plugin</td><td>history</td><td>get_transaction</td><td>$nc->history->getTransaction()</td></tr> <tr><td>net_api_plugin</td><td>net</td><td>status</td><td>$nc->net->status()</td></tr> <tr><td>producer_api_plugin</td><td>producer</td><td>get_runtime_options</td><td>$nc->producer->getRunTimeOptions()</td></tr> <tr><td>dbsize_api_plugin</td><td>dbsize</td><td>get</td><td>$nc->dbsize->get()</td></tr> </tbody> </table>

RPC API的官方文档:https://developers.eos.io/eosio-nodeos/reference

2.2 RPC调用参数

对于Nodeos而言,有些调用需要传入额外的参数,例如chain插件的get_block接口, 使用EosTool进行调用时,将参数组织为一个关联数组即可,示例代码如下:

$payload = [  'block_num_or_id' => 1 ];
$ret = $nc->chain->getBlock($payload);

2.3 RPC调用返回值

所有RPC调用的返回结果都是一个RpcOutput实例,调用其hasError()方法可以 判断是否调用出错,进一步可以利用getError()方法获取错误信息。

RPC调用的响应则可以通过getResult()方法获取,它是一个由原始的JSON结果 转化出的StdClass对象,因此可以方便的提取属性信息,例如:

echo 'chain id' . $info->chain_id . PHP_EOL;

2.4 访问主网/测试网节点

在创建NodeClient实例时,可以传入额外的参数执行来制定要访问的EOS主网或测试网节点。 例如,使用下面的代码访问某个主网节点:

$nc = new NodeClient(['base_uri' => 'https://api.eosnewyork.io:443/v1/']);

或者访问jungle测试网的某个节点:

$nc = new NodeClient(['base_uri' => 'https://jungle.eosio.cr:443/v1/']);

3、访问钱包服务器

新版的Keosd已经不提供RPC API文档,这可能意味着它在EOS软件栈中已经开始滑向边缘地位。 不过可以在这个地址访问老版的文档:https://developers.eos.io/eosio-nodeos/v1.1.0/reference

使用WalletClient类访问Keosd的rpc接口。例如,下面的代码访问本机运行的 Keosd的list_wallets接口:

use EosTool\Client\WalletClient;

$wc = new WalletClient();
$ret = $wc->listWallets();
if($ret->hasError()) throw new Exception($ret->getError());
$wallets = $ret->getResult();

由于Keosd的API不再分组,因此RPC对应的方法直接挂在WalletClient对象上,这是一个不同之处。 与NodeClient一样的是,WalletClient的调用返回结果也是一个RpcOutput对象。

1.4版的Keosd默认使用UNIX套接字而不是HTTP提供RPC接口,这可能是考虑到绝大多数情况下 Keosd都运行在本机,使用IPC会更安全一些。因此这也是WalletClient的默认实例化选项, 在绝大多数情况下,不需要传入额外的参数来实例化WalletClient。

4. 私钥与公钥

EOS的密钥算法类似于比特币,但做了一些调整,定义了自己的格式。

使用PrivateKey类的静态方法new()生成随机私钥。例如:

use EosTool\Crypto\PrivateKey;

$prv = PrivateKey::new();
echo $prv->toEos() . PHP_EOL; //类似:5Hu6nxM6s6UQ3nYkr1s1GKA17zPqpceUuWxH3JBwK8ZorMSRqGi

toEos()方法用来将私钥对象转换为EOS的自定义格式。

4.1 公钥推导

从私钥可以推导出公钥,例如:

$pub = $prv->getPublicKey();
echo $pub->toEos() . PHP_EOL; //类似:EOS6wQ6t3n148GfzLzgxq7cC8ARDKxeaB3hQXdXn7oZYdwEyAXiSv

同样,使用toEos()方法将公钥转换为EOS的自定义格式。

4.2 导入EOS私钥

可以将一个EOS格式的私钥转化为EosTool的PrivateKey对象,例如,下面的 代码将指定的EOS私钥导入,并显示其对应的EOS公钥:

$prv = PrivateKey::fromEos('5Hu6nxM6s6UQ3nYkr1s1GKA17zPqpceUuWxH3JBwK8ZorMSRqGi');
echo $prv->getPublicKey()->toEos() . PHP_EOL;

4.3 权威签名

PrivateKey的sign()方法支持普通签名和EOS节点要求的权威签名。例如下面的代码返回一个 普通签名:

$hex = '1234567890abcdef...';
$signature = $prv->sign($hex);

传入额外的参数来获得指定数据的权威签名:

$hex = '1234567890abcdef...';
$signature = $prv->sign($hex,true);

5. 序列化

EOS要求交易在提交节点push_transaction之前先进行序列化,这也是在PHP中操作EOS交易 绕不过去的一个环节。

在EosTool中,使用Serializer类进行序列化操作。例如,下面的代码将一个EOS转账交易 序列化为可以提交给EOS节点旳16进制码流格式:

use EosTool\Serializer\Serializer;

$abi = json_decode(file_get_contents('transaction.abi'),true);
$serializer = Serializer::fromAbi($abi);  

$tx = [
  'expiration'=>'2018-12-04T17:00:00',
  'ref_block_num' => 2878,
  'ref_block_prefix' => 29012031,
  'max_net_usage_words' => 0,
  'max_cpu_usage_ms' => 0,
  'delay_sec' => 0,
  'context_free_actions' => [],
  'actions' => [[
    'account' => 'eosio.token',
    'name' => 'transfer',
    'authorization' => [[
      'actor' => 'eosio',
      'permission' => 'active'
    ]],
    'data' => '1122334455667788990011223344556677.....889900'
  ]],
  'transaction_extensions' => []
];
$hex = $serializer->serialize('transaction',$tx);
echo  'serialized tx => ' .  $hex . PHP_EOL;

Serializer的静态方法fromAbi()用来根据一个指定的abi构造序列化器实例,然后 利用实例的serialize()方法对指定类型的数据进行序列化操作,得到16进制码流。

6. 签名

EosTool提供了两种进行交易签名的方法:利用Keosd进行签名,或者使用本地私钥进行签名。

使用KeosdSigner类来利用钱包服务器完成签名。例如:

use EosTool\Signer\KeosdSigner;

$signer = new KeosdSigner();
$signatures = $signer->sign($tx,$pubKeys,$chainId);

利用__LocalSigner__类,则可以避免使用keosd,直接利用离线私钥签名。例如:

use EosTool\Signer\LocalSigner;

$prvKeys = ['5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3'];
$signer = new LocalSigner($prvKeys);
$signatures = $signer->sign($tx,$pubKeys,$chainId);

7. 交易提交

一个交易数据,需要经过规范化、序列化、签名、打包一系列操作,才可以提交给 Nodeos节点广播出去。EosTool类提供了transact()方法来隔离这些繁琐的操作。

例如,下面的代码使用NodeClient和LocalSigner创建一个EosTool实例,然后提交 一个交易:

use EosTool\Client\NodeClient;
use EosTool\Signer\LocalSigner;
use EosTool\EosTool;

$nc = new NodeClient();
$signer = new LocalSigner(['5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3']);
$tool = new EosTool($nc,$signer);

$tx = [
  'actions' => [[
    'account' => 'eosio.token',
    'name' => 'transfer',
    'authorization' => [[
      'actor' => 'eosio',
      'permission' => 'active'
    ]],
    'data' => [
      'from' => 'eosio',
      'to' => 'tommy',
      'quantity' => '200.0000 EOS',
      'memo' => 'take care'
    ]
  ]]
];
$ret = $tool->transact($tx);
echo $ret->getResult()->transaction_id . PHP_EOL;

可以很方便地将签名器改为KeosdSigner,例如:

$nc = new NodeClient();
$signer = new KeosdSigner();
$tool = new EosTool($nc,$signer);

8. 调用单个合约动作

使用EosTool的pushAction()方法调用单个合约动作。例如,下面的代码调用tommy 账户托管合约的hi()方法:

$tool = new EosTool(new NodeClient(),new KeosdSigner());
$ret = $tool->pushAction('tommy','hi',['user'=>'tommy']);

9. 部署合约

使用EosTool的setContract()方法部署合约,例如:

$tool = new EosTool(new NodeClient(),new KeosdSigner());

$account = 'tommy';
$abi = file_get_contents('hello.abi');
$wasm = file_get_contents('hello.wasm');
$ret = $tool->setContract($account,$abi,$wasm);

© 著作权归作者所有

汇智网教程
粉丝 16
博文 221
码字总数 268089
作品 0
东城
私信 提问
技术分享:EOS区块链PHP开发包

1. 开发包概述 EosTool的目的是消除使用PHP开发EOS区块链应用的痛苦,例如: 通过Nodeos和Keosd的RPC接口调用其功能 离线生成EOS格式的私钥和公钥 使用本地私钥生成符合EOS要求的交易签名 将...

geek12345
2018/12/10
108
0
EOS离线签名交易PHP实现代码

EOS区块链的钱包服务器Keosd,提供了sign_transaction开发接口,允许开发者进行交易签名。但是,如果我们希望自己管理密钥而不是交给keosd管理,应该如何在PHP代码中实现交易的离线签名功能?...

汇智网教程
2018/12/10
148
0
Hyperledger Fabric Node.js开发中如何使用日志

Hyperledger Fabric Node.js开发中如何使用日志?本教程就来演示下如何使用hyperledgefabric node.js客户端日志记录功能。 概述 hyperledger fabric node.js客户端日志记录使用node.js 开发包...

笔阁
07/04
11
0
区块链教程大全:比特币、以太坊、EOS、Hyperledger Fabric、Tendermint

分享一些比特币、以太坊、EOS、Hyperledger Fabric、Tendermint等区块链相关的交互式在线编程实战教程: - java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存...

geek12345
03/29
29
0
USDT PHP开发包OmniTool简介

OmniTool开发包适用于为PHP应用快速增加对Omni Layer/USDT数字资产的支持能力,即支持使用自有Omni Layer节点的应用场景,也支持基于第三方API服务和离线裸交易的轻量级部署场景。下载地址:...

汇智网教程
06/06
83
0

没有更多内容

加载失败,请刷新页面

加载更多

centos7 linuxdeployqt qt5.13.1 打包程序

原文链接:https://www.cnblogs.com/linuxAndMcu/p/11016322.html 一、简介 linuxdeployqt 是Linux下的qt打包工具,可以将应用程序使用的资源(如库,图形和插件)复制到二进制运行文件所在的...

shzwork
14分钟前
3
0
IDEA 配置Springboot项目热部署

实现的方式概述 注意以下的热部署方式在IDEA是默认没有打开自动编译的,手动编译需要快捷键(Ctrl+Shift+F9),自动编译的修改配置如下:(注意刷新不要太快,会有1-2秒延迟) File-Settings-C...

小强的进阶之路
25分钟前
5
0
免费数据分析工具:secsoso

前段时间思考了理想数据分析平台,之后我们根据这个思路开发了spl语言并提供了一个数据分析平台,这个平台主要用在搜索ES,数据库索引中的数据。但后来发现对文件的事后处理也是个非常重要的...

赛克蓝德
27分钟前
4
0
暗黑2不能正常启动?带你轻松使用WIN10运行游戏

暗黑破坏神2这款游戏由于年代比较久远,所以设置启动这方面与现在的大部分游戏有很大差距,由于当初完美运行暗黑2是当年使用最多的XP系统,在使用现在大多数玩家使用的WIN7到WIN10系统常会出...

太空堡垒185
31分钟前
5
0
maven项目对象模型(二)

1.4.4.传递性依赖 一个传递性依赖就是一个依赖的依赖。如果project-a依赖于project-b,而后者接着依赖于project-c,那么project-c就是被认为是project-a的传递性依赖。如果project-c依赖于p...

万建宁
31分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部