這篇文章主要為大家展示了“EOS區(qū)塊鏈PHP開發(fā)包怎么用”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“EOS區(qū)塊鏈PHP開發(fā)包怎么用”這篇文章吧。
創(chuàng)新互聯(lián)建站于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元羅江做網(wǎng)站,已為上家服務(wù),為羅江各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108
EosTool的目的是消除使用PHP開發(fā)EOS區(qū)塊鏈應(yīng)用的痛苦,例如:
通過Nodeos和Keosd的RPC接口調(diào)用其功能
離線生成EOS格式的私鑰和公鑰
使用本地私鑰生成符合EOS要求的交易簽名
將交易對象序列化為Nodeos要求的packed_trx格式
可以認為EosTool是PHP版本的eosjs,利用它可以完整地實現(xiàn)EOS官方客戶端Cleos的功能, 也可以很方便地在PHP應(yīng)用中增加對EOS區(qū)塊鏈的支持能力,極大地提高開發(fā)效率。
有興趣的朋友也可以直接訪問這里,本文內(nèi)容即轉(zhuǎn)自該博客:EOS區(qū)塊鏈PHP開發(fā)包
EosTool運行在**Php 7.1+**環(huán)境下,當前版本1.0.0,主要代碼文件清單如下:
代碼文件 | 說明 |
---|---|
eostool/src/client/NodeClient.php | 節(jié)點軟件nodeos的rpc接口封裝類 |
eostool/src/client/WalletClient.php | 錢包軟件keosd的rpc接口封裝類 |
eostool/src/client/RpcOutput.php | RPC返回結(jié)果封裝類 |
eostool/src/Crypto/PrivateKey.php | EOS私鑰類 |
eostool/src/Crypto/PublicKey.php | EOS公鑰類 |
eostool/src/Crypto/Signature.php | EOS簽名類 |
eostool/src/Serializer/AbiType.php | EOS的ABI類型封裝類 |
eostool/src/Serializer/AbiTypeFactory.php | ABI類型工廠類 |
eostool/src/Serializer/SerialBuffer.php | 序列化緩沖區(qū)實現(xiàn)類 |
eostool/src/Serializer/Serializer.php | 序列化器實現(xiàn)類 |
eostool/src/Signer/Signer.php | 簽名器接口 |
eostool/src/Signer/KeosdSigner.php | Keosd簽名器實現(xiàn)類 |
eostool/src/Signer/LocalSigner.php | 本地離線簽名器實現(xiàn)接口 |
eostool/src/Contract.php | 合約類 |
eostool/src/EosTool.php | 開發(fā)包入口類 |
eostool/tests | 單元測試用例目錄 |
eostool/phpunit.xml | 單元測試配置文件 |
eostool/vendor | 第三方依賴包 |
eostool/composer.json | composer配置文件 |
使用NodeClient類訪問nodeos的rpc接口。例如,下面的代碼訪問本機運行的 Nodeos節(jié)點的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調(diào)用分組
Nodeos采用了插件化架構(gòu),不同的插件的API也歸入不同的分組,EosTool采用了保持一致的 命名方法,根據(jù)api即可推斷出NodeClient的調(diào)用方法:API分組對應(yīng)于NodeClient的一個同名 屬性,API則對應(yīng)與No的Client的分組同名屬性下的一個經(jīng)過camelCase轉(zhuǎn)化的方法。例如:
插件 | API分組 | RPC API | NodeClient方法 |
---|---|---|---|
chain_api_plugin | chain | get_info | $nc->chain->getInfo() |
history_api_plugin | history | get_transaction | $nc->history->getTransaction() |
net_api_plugin | net | status | $nc->net->status() |
producer_api_plugin | producer | get_runtime_options | $nc->producer->getRunTimeOptions() |
dbsize_api_plugin | dbsize | get | $nc->dbsize->get() |
RPC API的官方文檔:https://developers.eos.io/eosio-nodeos/reference
2.2 RPC調(diào)用參數(shù)
對于Nodeos而言,有些調(diào)用需要傳入額外的參數(shù),例如chain插件的get_block接口, 使用EosTool進行調(diào)用時,將參數(shù)組織為一個關(guān)聯(lián)數(shù)組即可,示例代碼如下:
$payload = [ 'block_num_or_id' => 1 ]; $ret = $nc->chain->getBlock($payload);
2.3 RPC調(diào)用返回值
所有RPC調(diào)用的返回結(jié)果都是一個RpcOutput實例,調(diào)用其hasError()
方法可以 判斷是否調(diào)用出錯,進一步可以利用getError()
方法獲取錯誤信息。
RPC調(diào)用的響應(yīng)則可以通過getResult()
方法獲取,它是一個由原始的JSON結(jié)果 轉(zhuǎn)化出的StdClass對象,因此可以方便的提取屬性信息,例如:
echo 'chain id' . $info->chain_id . PHP_EOL;
2.4 訪問主網(wǎng)/測試網(wǎng)節(jié)點
在創(chuàng)建NodeClient實例時,可以傳入額外的參數(shù)執(zhí)行來制定要訪問的EOS主網(wǎng)或測試網(wǎng)節(jié)點。 例如,使用下面的代碼訪問某個主網(wǎng)節(jié)點:
$nc = new NodeClient(['base_uri' => 'https://api.eosnewyork.io:443/v1/']);
或者訪問jungle測試網(wǎng)的某個節(jié)點:
$nc = new NodeClient(['base_uri' => 'https://jungle.eosio.cr:443/v1/']);
新版的Keosd已經(jīng)不提供RPC API文檔,這可能意味著它在EOS軟件棧中已經(jīng)開始滑向邊緣地位。 不過可以在這個地址訪問老版的文檔: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對應(yīng)的方法直接掛在WalletClient對象上,這是一個不同之處。 與NodeClient一樣的是,WalletClient的調(diào)用返回結(jié)果也是一個RpcOutput對象。
1.4版的Keosd默認使用UNIX套接字而不是HTTP提供RPC接口,這可能是考慮到絕大多數(shù)情況下 Keosd都運行在本機,使用IPC會更安全一些。因此這也是WalletClient的默認實例化選項, 在絕大多數(shù)情況下,不需要傳入額外的參數(shù)來實例化WalletClient。
EOS的密鑰算法類似于比特幣,但做了一些調(diào)整,定義了自己的格式。
使用PrivateKey類的靜態(tài)方法new()
生成隨機私鑰。例如:
use EosTool\Crypto\PrivateKey; $prv = PrivateKey::new(); echo $prv->toEos() . PHP_EOL; //類似:5Hu6nxM6s6UQ3nYkr1s1GKA17zPqpceUuWxH3JBwK8ZorMSRqGi
toEos()
方法用來將私鑰對象轉(zhuǎn)換為EOS的自定義格式。
4.1 公鑰推導(dǎo)
從私鑰可以推導(dǎo)出公鑰,例如:
$pub = $prv->getPublicKey(); echo $pub->toEos() . PHP_EOL; //類似:EOS6wQ6t3n148GfzLzgxq7cC8ARDKxeaB3hQXdXn7oZYdwEyAXiSv
同樣,使用toEos()
方法將公鑰轉(zhuǎn)換為EOS的自定義格式。
4.2 導(dǎo)入EOS私鑰
可以將一個EOS格式的私鑰轉(zhuǎn)化為EosTool的PrivateKey對象,例如,下面的 代碼將指定的EOS私鑰導(dǎo)入,并顯示其對應(yīng)的EOS公鑰:
$prv = PrivateKey::fromEos('5Hu6nxM6s6UQ3nYkr1s1GKA17zPqpceUuWxH3JBwK8ZorMSRqGi'); echo $prv->getPublicKey()->toEos() . PHP_EOL;
4.3 權(quán)威簽名
PrivateKey的sign()
方法支持普通簽名和EOS節(jié)點要求的權(quán)威簽名。例如下面的代碼返回一個 普通簽名:
$hex = '1234567890abcdef...'; $signature = $prv->sign($hex);
傳入額外的參數(shù)來獲得指定數(shù)據(jù)的權(quán)威簽名:
$hex = '1234567890abcdef...'; $signature = $prv->sign($hex,true);
EOS要求交易在提交節(jié)點push_transaction
之前先進行序列化,這也是在PHP中操作EOS交易 繞不過去的一個環(huán)節(jié)。
在EosTool中,使用Serializer類進行序列化操作。例如,下面的代碼將一個EOS轉(zhuǎn)賬交易 序列化為可以提交給EOS節(jié)點旳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的靜態(tài)方法fromAbi()
用來根據(jù)一個指定的abi構(gòu)造序列化器實例,然后 利用實例的serialize()
方法對指定類型的數(shù)據(jù)進行序列化操作,得到16進制碼流。
EosTool提供了兩種進行交易簽名的方法:利用Keosd進行簽名,或者使用本地私鑰進行簽名。
使用KeosdSigner類來利用錢包服務(wù)器完成簽名。例如:
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);
一個交易數(shù)據(jù),需要經(jīng)過規(guī)范化、序列化、簽名、打包一系列操作,才可以提交給 Nodeos節(jié)點廣播出去。EosTool類提供了transact()
方法來隔離這些繁瑣的操作。
例如,下面的代碼使用NodeClient和LocalSigner創(chuàng)建一個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);
使用EosTool的pushAction()
方法調(diào)用單個合約動作。例如,下面的代碼調(diào)用tommy 賬戶托管合約的hi()
方法:
$tool = new EosTool(new NodeClient(),new KeosdSigner()); $ret = $tool->pushAction('tommy','hi',['user'=>'tommy']);
使用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);
以上是“EOS區(qū)塊鏈PHP開發(fā)包怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!