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開發包的主要代碼檔案清單如下:
代碼檔案 | 說明 |
---|---|
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
模式隻允許在節點管理連接配接上調用,要正确執行 上面的代碼,你需要使用管理連接配接建立RpcClient執行個體,或者為該節點啟用公共簽名支援。如果你 執行
sign-and-submit
,就會出現如下異常:
demo/rpcclient-demo.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; //顯示身份憑證的位址