天天看點

XrpTool - Ripple區塊鍊對接PHP開發包

XrpTool可以幫助PHP應用快速接入瑞波/Ripple區塊鍊, 即支援部署自有Ripple節點的應用場景,也支援利用公開的Ripple節點廣播離線裸交易的輕量級部署場景。XrpTool官方下載下傳位址: http://sc.hubwiz.com/codebag/xrp-php-lib/

1、開發包概述

XrpTool主要包括以下特性:

  • 全功能的Ripple節點用戶端,支援完整的RPC API開發接口
  • 支援離線生成Ripple密鑰對和位址,支援Secp256k1和Ed25519密碼學算法
  • 支援Ripple交易的離順序列化與離線簽名
  • 支援瑞波币/XRP和自發行代币的直接轉賬,支援代币發行、币币交易、支票簽發、資金托管等多種Ripple交易

XrpTool開發包運作在PHP 7.1+環境下, 目前版本1.0.0,主要類及關系如下:

XrpTool - Ripple區塊鍊對接PHP開發包

XrpTool開發包的主要代碼檔案清單如下:

代碼檔案 說明
xrp.php/src/ XrpTool源代碼目錄
xrp.php/src/RpcClient.php Ripple節點的RPC協定封裝類
xrp.php/src/TxProcessor.php Ripple交易處理器實作類
xrp.php/src/TxValidator.php Ripple交易格式驗證類
xrp.php/src/BinaryCodec.php Ripple交易序列化編碼器
xrp.php/src/AddressCodec.php Ripple位址編解碼器
xrp.php/src/Decimal.php 任意精度浮點數實作類
xrp.php/src/ExceptionHandler.php 異常處理實作類
xrp.php/src/Utils.php 輔助工具類
xrp.php/src/crypto/crdlFactory.php Ripple身份憑證工廠類
xrp.php/src/crypto/CrdlSecp256k1.php 基于Secp256k1算法的Ripple身份憑證實作類
xrp.php/src/crypto/CrdlEd25519.php 基于Ed25519算法的Ripple身份憑證實作類
xrp.php/src/types/defintions.json Ripple交易結構規範檔案
xrp.php/src/types/Defintions.php Ripple交易結構規範解析類
xrp.php/src/types/FieldFactory.php Ripple交易字段工廠類
xrp.php/src/types/TypeInterface.php Ripple交易資料類型接口
xrp.php/src/types/TypeBase.php Ripple交易資料類型基類
xrp.php/src/types/AccountID.php Ripple交易資料類型 - AccountID
xrp.php/src/types/Amount.php Ripple交易資料類型 - Amount
xrp.php/src/types/Blob.php Ripple交易資料類型 - Blob
xrp.php/src/types/Hash.php Ripple交易資料類型 - Hash
xrp.php/src/types/Hash128.php Ripple交易資料類型 - Hash128
xrp.php/src/types/Hash160.php Ripple交易資料類型 - Hash160
xrp.php/src/types/Hash256.php Ripple交易資料類型 - Hash256
xrp.php/src/types/PathSet.php Ripple交易資料類型 - PathSet
xrp.php/src/types/STArray.php Ripple交易資料類型 - STArray
xrp.php/src/types/STObject.php Ripple交易資料類型 - STObject
xrp.php/src/types/UInt.php Ripple交易資料類型 - UInt
xrp.php/src/types/UInt8.php Ripple交易資料類型 - UInt8
xrp.php/src/types/UInt16.php Ripple交易資料類型 - UInt16
xrp.php/src/types/UInt32.php Ripple交易資料類型 - UInt32
xrp.php/src/types/UInt64.php Ripple交易資料類型 - UInt64
demo/ 示範代碼目錄
demo/xrptool-demo.php XrpTool示範代碼
demo/issue-demo.php 代币發行示範代碼
demo/rpcclient-demo.php RpcClient示範代碼
demo/credential-demo.php 身份憑證建立/恢複/查詢示範代碼
demo/txprocessor-demo.php TxProcessor示範代碼
vendor/ 第三方依賴包目錄
composer.json composer配置檔案

2、XrpTool

XrpTool是開發包的入口類,可以利用它快速組織并廣播一個交易,或者通路開發包的其他類的預建立執行個體對象。

2.1 交易的組織、簽名與廣播

在XrpTool中,一個Ripple交易的執行包含以下環節:

  • 交易資料的組織,使用關聯數組來組織交易資料
  • 交易資料簽名與廣播,使用XrpTool執行個體的

    transact()

    方法進行交易 預處理、序列化和簽名,最後送出給節點廣播到網絡中
  • 等待交易确認

例如,下面的代碼使用XrpTool完成瑞波币/XRP的直接支付交易:

use XrpTool\XrpTool;

$tool = new XrpTool('https://s.altnet.rippletest.net:51234');             //使用測試鍊公開節點

//用密文恢複身份憑證
$credential = $tool->restoreCredential('snT3WxQbGLMAfqPhS9pYHM9gpib79');  //發起賬号的身份憑證

//組織交易資料
$tx = [
  'TransactionType' => 'Payment',                                         //交易類型:支付
  'Account' => 'rfT5EnW5kfJNyLpUb6X9Do8HoUMvQKDrS8',                      //發起賬号
  'Destination' => 'rnU5a7v51BV6znn8kq8jdGtZNDiMJxojcc',                  //接收賬号
  'Amount' => '13500'                                                     //交易數量,機關:drop 
];

//交易序列化、簽名、送出
$txid = $tool->transact($tx,$credential);                                 //送出給節點廣播  
echo "tx hash => " . $txid . PHP_EOL;                                     //顯示交易哈希

//等待交易确認
$validated = $tool->waitForTx($txid);                                     //預設逾時:5秒
echo "tx validated => "  . $validated . PHP_EOL;                          //顯示是否已确認

//查詢接收賬号的餘額
$balance = $tool->getBalance($tx['Destination']);                         //檢查接收賬号的餘額
echo "xrp balance => " . $balance->xrp . PHP_EOL;                         //顯示XRP餘額           
XrpTool官方下載下傳位址:

2.2 支援的交易類型

XrpTool目前支援以下類型的Ripple交易:

Ripple交易類型 交易說明
AccountSet 設定賬戶選項。例如設定賬戶标志、設定所發行代币轉賬手續費率等
CheckCreate 建立支票。支票是一種延遲支付方式,接收賬戶可以将支票兌現
CheckCash 兌現支票。隻有支票的接收賬戶可以将支票兌換為XRP或代币
CheckCancel 取消支票。被取消的支票将不再可兌現
DepositPreauth 充值預授權。當某個賬戶啟用充值授權标志後,隻有被預授權的賬戶才可以向該賬戶進行支付
EscrowCreate 建立托管支付。托管支付可視為暫時挂起的支付,隻有當滿足指定條件時,資金才會注入接收賬戶
EscrowFinish 完成托管支付。完成指定的托管支付,将資金釋放給接收賬戶
EscrowCancel 取消托管支付。取消指定給的托管支付,将資金返還給發送賬戶
OfferCreate 交易所挂單。在Ripple内置的去中心化交易所中建立一個限價交易單,用于不同币種的兌換
OfferCancel 取消挂單。取消指定的兌換限價單
Payment 轉賬支付。從一個賬戶向另一個賬戶支付XRP或代币
PaymentChannelCreate 建立支付通道并注入XRP。支付通道是兩個賬戶間的單向支付手段
PaymentChannelFund 支付通道充值。向指定的支付通道補充額外的XRP
PaymentChannelClaim 支付通道資金認領。從指定的支付通道提取XRP
SetRegularKey 管理賬戶的正常密鑰對。正常密鑰可以用來簽名賬戶交易,減少主密鑰的使用
TrustSet 管理賬戶間信任線。信任線用于Ripple區塊鍊中的代币發行

2.3 示例:代币發行與轉賬

Ripple區塊鍊支援任何使用者發行代币,前提是得到别人的信任,這就是信任線/TrustLine的作用:

Ripple使用信任線來表示一個使用者對另一個使用者的有限的信任額度。

在Ripple區塊鍊中發行代币有三個步驟:

  • 啟用發行賬戶的DefaultRipple标志
  • 接收賬戶設定對發行賬戶的信任線
  • 發行賬戶向接收賬戶轉賬代币

下面代碼展示了如何使用XrpTool發行自定義代币,其中issuer表示發行賬戶,receiver表示代币接收賬戶:

use XrpTool\XrpTool;

$tool = new XrpTool('https://s.altnet.rippletest.net:51234');           //使用測試鍊公開節點

$issuer_address = 'rfT5EnW5kfJNyLpUb6X9Do8HoUMvQKDrS8';                 //發行賬戶位址
$issuer_secret = 'snT3WxQbGLMAfqPhS9pYHM9gpib79';                       //發行賬戶密文

$receiver_address = 'rnU5a7v51BV6znn8kq8jdGtZNDiMJxojcc';               //接收賬戶位址
$receiver_secret = 'snfjzzfRtq3hPdZ2msjFUxRN1748B';                     //接收賬戶密文

//啟用發行賬戶的相關标志
$txi = [                                                                  
  'TransactionType' => 'AccountSet',                                    //交易類型:AccountSet
  'Account' => $issuer_address,                                         //交易發起賬戶
  'SetFlag' => 8,  //default-ripple                                     //設定DefaultRipple标志
];
$txid = $tool->transactWithSecret($txi,$issuer_secret);                 //送出交易  
$tool->waitForTx($txid);                                                //等待交易确認

//接收賬戶設定信任線
$txi = [                                                                  
  'TransactionType' => 'TrustSet',                                      //交易類型:TrustSet
  'Account' => $receiver_address,                                       //交易發起賬戶
  'LimitAmount' => [
    'currency' => 'WIZ',                                                //信任的代币名稱:WIZ  
    'issuer' => $issuer_address,                                        //信任的發行賬戶
    'value' => '1000'                                                   //信任額度
  ]
];
$txid = $tool->transactWithSecret($txi,$receiver_secret);               //送出交易
$tool->waitForTx($txid);                                                //等待交易确認

//發行代币
$txi = [                                                                  
  'TransactionType' => 'Payment',                                       //交易類型:Payment
  'Account' => $issuer_address,                                         //交易發起賬戶
  'Destination' => $receiver_address,                                   //代币接收賬戶
  'Amount' => [                                                         //代币金額
    'currency' => 'WIZ',                                                //代币名稱
    'value' => '15',                                                    //代币數量
    'issuer' => $issuer_address                                         //代币發行賬戶
  ]
];
$txid = $tool->transactWithSecret($txi,$issuer_secret);                 //送出交易
$tool->waitForTx($txid);                                                //等待交易确認

//查詢代币餘額
$balance = $tool->getBalance($receiver_address);                        //查詢接收賬戶的代币餘額
foreach($balance->issued as $issued) {
  echo "issuer => " . $issued->issuer . PHP_EOL;                        //代币發行賬戶
  echo "currency => "  . $issued->currency . PHP_EOL;                   //代币名稱
  echo "balance => " . $issued->balance . PHP_EOL;                      //代币餘額
} 
           

可以看到,在Ripple中XRP轉賬和代币轉賬都使用Payment交易,差別僅在于

Amount

字段的值類型:如果值是一個關聯數組,表示執行代币轉賬;如果是一個數值字元串,表示執行XRP轉賬。

3、RpcClient

RpcClient類封裝了Ripple節點的RPC API接口協定,XrpTool執行個體通過

rpcClient

屬性提供了預建立的RpcClient對象,也可以獨立建立一個RpcClient執行個體。

3.1 執行個體化

執行個體化RpcClient需要指定節點的RPC API通路URL。例如,下面的代碼建立一個連接配接本地Ripple節點的RpcClient執行個體,之後的RPC調用都将送出給這個URL對應的節點:

use XrpTool\RpcClient;

$client = new RpcClient('http://localhost:51234');                //使用本地節點           
注意:Ripple節點的RPC API的通路協定(http | https)與監聽端口依賴于 配置檔案。上面的代碼假設本地Ripple節點RPC API已經配置了http協定通路,并且 在51234端口監聽。

你也可以建立一個連接配接主鍊公開節點的RpcClient執行個體,例如:

$client = new RpcClient('https://s1.ripple.com:51234');             //使用主鍊公開節點           

或者建立一個連接配接測試鍊公開節點的RpcClient執行個體,例如:

$client = new RpcClient('https://s.altnet.rippletest.net:51234');   //使用測試鍊公開節點           

3.2 調用RPC API

RpcClient的方法名直接對應Ripple的RPC API名稱,例如,如下的代碼調用

server_info

接口查詢Ripple節點資訊:

$ret = $client->server_info();                                    //調用RPC API:server_info
echo 'version => ' . $ret->info->build_version . PHP_EOL;         //顯示節點軟體版本資訊            

有的RPC API調用需要傳入一些參數,例如查詢賬戶資訊的

account_info

調用,這時需要将參數整理為關聯數組傳入RpcClient對象的同名方法:

$params = [                                                       //使用關聯數組聲明RPC API參數
  'account' => 'rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn'               //account: 要查詢的賬戶    
];
$ret = $client->account_info($params);                            //查詢指定Ripple賬戶的詳細資訊
echo 'balance => ' . $ret->account_data->Balance . PHP_EOL;       //顯示賬戶餘額,機關:drop           

3.3 示例:使用RPC API轉賬XRP

如果你使用自己的Ripple節點,可以使用

submit

調用的

Sign-and-Submit

模式執行轉賬等交易。例如,使用下面的代碼從Alice的賬号向Bob的賬号支付0.0123456 XRP:

$alice = "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn";                      //Alice的賬戶
$bob = "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX";                        //Bob的賬戶
$amount = "123456";                                                 //機關:drop

$params = [
  "offline" => false,                                               //需要節點簽名
  "secret" => "s████████████████████████████",                      //用于簽名的密碼
  "tx_json" => [
      "TransactionType": "Payment",                                 //交易類型:支付
      "Account" => $alice,                                          //發起賬号
      "Destination": $bob,                                          //接收賬号
      "Amount" => $amount                                           //支付數量,機關:drop
  ]
];
$ret = $client->submit($params);                                    //簽名并廣播交易
echo 'tx hash => ' . $ret->tx_json->hash . PHP_EOL;                 //交易哈希           
注意:預設情況下

submit

sign-and-submit

模式隻允許在節點管理連接配接上調用,要正确執行 上面的代碼,你需要使用管理連接配接建立RpcClient執行個體,或者為該節點啟用公共簽名支援。如果你 執行

demo/rpcclient-demo.php

,就會出現如下異常:
XrpTool - Ripple區塊鍊對接PHP開發包

4、Credential

和其他區塊鍊一樣,Ripple也使用非對稱密鑰對來辨別身份,不過它即支援經典的Secp256k1算法,也支援更新一些的Ed25519算法,XrpTool開發包分别使用

CrdlSecp256k1

類和

CrdlEd25519

類來表征這兩種算法對應的Ripple身份憑證。

可以使用CrdlFacotry工廠類來離線建立新的Ripple密鑰對和位址,或者使用Ripple密文來恢複之前建立的密鑰對和位址。XrpTool對象的crdlFactory屬性提供了預建立的CrdlFactory對象,也可以用如下的代碼直接建立CrdlFactory對象:

use Xrp\Crypto\CrdlFactory;

$cf = new CrdlFactory();                                          //建立身份憑證工廠對象           

4.1 建立新的身份憑證

使用

generate()

方法來建立一個新的随機密鑰對并推導出相應的Ripple位址。例如,下面的代碼使用

Secp256k1

算法建立一個Ripple身份憑證:

$credential = $cf->generate();                                    //使用secp256k1算法建立随機身份憑證
//$credential = $cf->generate('secp256k1');                       //同上,預設使用secp256k1算法
echo 'private => ' . $credential->private . PHP_EOL;              //顯示身份憑證的私鑰
echo 'public => ' . $credential->public . PHP_EOL;                //顯示身份憑證的公鑰
echo 'address => ' . $credential->address . PHP_EOL;              //顯示身份憑證的位址           

類似的,下面的代碼使用

ed25519

算法建立身份憑證:

$credential = $cf->generate('ed25519');                           //使用ed25519算法建立随機身份憑證
echo 'address => ' . $credential->address . PHP_EOL;              //顯示身份憑證的位址           

4.2 使用Ripple密文恢複身份憑證

如果持有身份憑證密文,那麼可以使用

fromSecret()

方法來恢複對應的Ripple身份憑證。例如:

$secret = 'snfjzzfRtq3hPdZ2msjFUxRN1748B';                        //Ripple身份憑證密文
$credential = $cf->fromSecret($secret);                           //利用密碼恢複身份憑證
echo 'address => ' . $credential->address . PHP_EOL;              //顯示身份憑證的位址