USDT PHP開發包OmniTool簡介
OmniTool開發包適用於為PHP應用快速增加對Omni Layer/USDT數字資產的支援能力,即支援使用自有Omni Layer節點的應用場景,也支援基於第三方API服務和離線裸交易的輕量級部署場景。下載地址:omni/usdt php開發包 。
1、OmniTool開發包簡介
OmniTool開發包主要包含以下特性:
- 完善的Omni Layer節點RPC封裝
- 支援利用自有節點或第三方服務獲取指定地址的utxo集合
- 支援離線生成omni代幣轉賬裸交易
- 支援利用自有節點或第三方服務廣播裸交易
OmniTool支援本地部署的Omnicored節點,也支援blockchain.info、btc.com等提供的開放API,要增加對其他第三方服務的支援也非常簡單,只需要參考程式碼實現如下介面:
- UtxoCollectorInterface:utxo收集器
- UtxoSelectorInterface:utxo篩選器
- BroadcasterInterface:裸交易廣播器
- ExplorerInterface:資料查詢介面
OmniTool軟體包執行在**Php 7.1+**環境下,當前版本1.0.0,主要類/介面及關係如下圖所示:
OmniTool的主要程式碼檔案清單參見:http://sc.hubwiz.com/codebag/omni-php-lib/
2、RpcClient類使用說明
RpcClient類封裝了Omni Layer的RPC介面協議。建立RpcClient物件時,需要傳入包含有效身份資訊的節點RPC URL。例如,假設安裝在本機的omnicored節點軟體配置如下:
- rpcuser:user
- rpcpassword:123456
- rpcport:8332
那麼可以使用如下的程式碼來例項化RpcClient:
use \OmniTool\RpcClient;
$client = new RpcClient(
'http://user:123456@localhost:8332' /*節點RPC介面的URL*/
);
Omni Core節點在Bitcoin原有的RPC介面之外,擴充了額外的介面用來操作Omni層的資料,這些擴充套件的RPC介面採用omni_
字首以區隔於Bitcoin的原有RPC介面。為了便於區隔這兩層的RPC呼叫,RpcClient引入了協議子模組
例如,獲取某個地址的USDT代幣餘額需要使用Omni層的omni_getbalance呼叫,這個RPC呼叫對應於RpcClient例項的omni
子模組的getBalance()
方法。下面的程式碼獲取地址1EXoDusjGwvnjZUyKkxZ4UHEf77z6A5S4P
的USDT(資產ID:31)餘額:
$ret = $client->omni->getBalance(
'1EXoDusjGwvnjZUyKkxZ4UHEf77z6A5S4P', /*地址*/
31 /*資產ID:USDT*/
);
類似的,可以使用omni_send呼叫來執行簡單的USDT轉賬,這個呼叫對應於RpcClient例項的omni子模組的send()
方法。下面的程式碼從地址3M9qvHKtgARhqcMtM5cRT9VaiDJ5PSfQGY
向地址37FaKponF7zqoMLUjEiko25pDiuVH5YLEa
轉入100.0個USDT代幣:
$ret = $client->omni->send(
'3M9qvHKtgARhqcMtM5cRT9VaiDJ5PSfQGY', /*代幣轉出地址*/
'37FaKponF7zqoMLUjEiko25pDiuVH5YLEa', /*代幣轉入地址*/
31, /*代幣ID:USDT*/
"100.00" /*轉移的代幣數量*/
);
原有的bitoin層的RPC介面則可以通過RpcClient的btc子模組來訪問。例如,使用listunspent呼叫來獲取本地節點中指定地址的utxo:
$ret = $client->btc->listUnspent(
6, /*最小確認數*/
999999, /*最大確認數*/
['mgnucj8nYqdrPFh2JfZSB1NmUThUGnmsqe'] /*地址清單*/
);
開發包中的demo/rpc-demo.php
示例程式碼使用RpcClient類完整演示了在Omni層的代幣發行與轉賬功能,如果你計劃搭建自己的Omni Core節點,相信這個示例會有很大幫助。
3、Wallet類使用說明
如果不願意搭建自己的Omni Core節點,而是希望基於第三方API為自己的PHP應用增加對Omni Layer/USDT的支援,那麼最簡單的方法是使用離線交易的入口類Wallet。
Wallet類的主要作用是根據建立並廣播Omni代幣轉賬裸交易或比特幣轉賬裸交易,它的基本使用步驟如下:
- 使用
Wallet::cloud()
靜態方法建立一個支援雲端API服務的Wallet例項 - 使用
addKey()
方法將必要的私鑰加入該Wallet例項,例如轉出地址的私鑰,因為Wallet需要利用私鑰對裸交易進行簽名 - 使用
omniSendTx()
方法生成Omni代幣轉賬裸交易,或者使用btcSendTx()
方法比特幣轉賬裸交易 - 使用
broadcast()
方法廣播裸交易
3.1 Omni代幣轉賬
使用Wallet實現的Omni代幣轉賬示例程式碼如下,說明見註釋:
<?php
require('../vendor/autoload.php');
use OmniTool\Wallet; /*引入開發包*/
$wallet = Wallet::cloud(
'./demo.wallet', /*錢包檔案地址,自動建立*/
'testnet' /*網路ID*/
);
$prvKey = '4aec8e45106....00d5c5af494a4e05b'; /*私鑰:16進位制字串*/
$wallet->addKey($prvKey); /*將私鑰加入錢包,只需加入一次*/
$addressList = $wallet->getAddressList(); /*返回錢包管理的所有地址,陣列*/
$rawtx = $wallet->omniSendTx(
$addressList[0], /*傳送方地址,私鑰必須已經加入錢包*/
'mgYPLmNuZymK...e2XUNF6VFnT', /*接收方地址*/
2, /*轉賬OMNI代幣ID,2:TOMN*/
'0.000001' /*轉賬OMNI代幣數量*/
);
$ret = $wallet->broadcast($rawtx); /*廣播OMNI裸交易*/
var_dump($ret);
注意:
- Wallet例項利用錢包中的私鑰生成地址列表,並利用這些地址從第三方服務獲取utxo資訊。 因此需要錢包中 的私鑰對應地址在鏈上有utxo存在,Wallet物件才能夠成功構造裸交易。
- 轉賬目標地址應當與建立Wallet物件時指定的鏈ID一致,例如mainnet的p2pkh地址,字首應當為1
3.2 指定Omni交易的手續費支付地址
在Omni協議層不需要支付交易手續費,但是Omni交易所嵌入的比特幣交易依然需要支付手續費。預設情況下omniSendTx()
方法使用傳送方地址支付比特幣交易手續費,但可以傳入額外的引數來指定其他地址支付交易手續費,當你的PHP應用需要實現多賬戶歸集功能時,使用統一的手續費支付地址會更容易管理一些。
例如,下面的程式碼使用地址mnRo8JyTHDd5NxRb3UvGbAhCBPQTQ4UZ8W
支付omni交易的手續費:
$rawtx = $wallet->omniSendTx(
$addressList[0], /*傳送方地址,私鑰必須已經加入錢包*/
'mgYPLmNuZymK...e2XUNF6VFnT', /*接收方地址*/
2, /*轉賬OMNI代幣ID,2:TOMN*/
'0.000001', /*轉賬OMNI代幣數量*/
'mnRo8JyTHDd5...CBPQTQ4UZ8W' /*交易手續費支付地址*/
);
注意:
- 即使指定了餘額充足的手續費支付地址,Omni交易的傳送方依然必須有微量的比特幣 餘額(546 SATOSHI),因為Omni協議需要交易傳送方至少有一個可用UTXO。
- 手續費支付地址同時也是找零地址,多餘的比特幣將返回至該地址
3.3 指定Omni交易的比特幣轉賬數量
由於Omni交易要求傳送方必須有可用的UTXO,因此為了便於接收Omni代幣的地址可以繼續流通所持有的Omni代幣,omniSendTx()
方法在預設情況下將向接收方地址轉入微量的比特幣(546 SATOSHI),可以在呼叫該方法時修改這個預設數值。
例如,下面的程式碼轉入接收方1000個SATOSHI:
$rawtx = $wallet->omniSendTx(
$addressList[0], /*傳送方地址,私鑰必須已經加入錢包*/
'mgYPLmNuZymK...e2XUNF6VFnT', /*接收方地址
2, /*轉賬OMNI代幣ID,2:TOMN*/
'0.000001', /*轉賬OMNI代幣數量*/
'mnRo8JyTHDd5...CBPQTQ4UZ8W', /*交易手續費支付地址*/
1000 /*轉賬比特幣數量,單位:SATOSHI*/
);
3.4 比特幣轉賬
OmniTool也支援比特幣轉賬裸交易的生成與廣播。
例如,下面的程式碼從錢包的第一個地址向指定接受地址轉入1000個SATOSHI:
<?php
require('../vendor/autoload.php');
use OmniTool\Wallet;
$wallet = Wallet::cloud('./demo.wallet','testnet');
$addressList = $wallet->getAddressList();
$rawtx = $wallet->btcSendTx(
$addressList[0], /*傳送方地址*/
'moneyqMan7u...8qVrc9ikLP', /*接收方地址*/
1000, /*轉賬比特幣數量,單位:SATOSHI*/
500 /*手續費,單位:SATOSHI*/
);
echo 'btc rawtx => ' . $rawtx . PHP_EOL;
$ret = $wallet->broadcast($rawtx); /*廣播裸交易*/
預設情況下,btcSendTx()
使用傳送方地址作為找零地址,也可以在呼叫時指定其他地址作為找零地址,例如,下面的程式碼建立一個新地址接收找零:
$changeAddress = $wallet->getNewAddress(); /*建立新地址*/
$rawtx = $wallet->btcSendTx(
$addressList[0], /*傳送方地址*/
'moneyqMan7u...8qVrc9ikLP', /*接收方地址*/
1000, /*轉賬比特幣數量,單位:SATOSHI*/
500, /*手續費,單位:SATOSHI*/
$changeAddress /*找零地址*/
);
4、UTXO收集器
OmniTool使用介面UtxoCollectorInterface
來約定UTXO的收集功能。該介面的實現需要支援獲取指定地址的候選UTXO集合,可指定多個地址。
介面方法:
- collect($addressList):提取並返回候選UTXO集合
引數$addressList
用來宣告要收集UTXO的地址清單,型別為陣列。
當前實現類:
- CloudUtxoCollector:基於blockchain.com的開放API實現的Utxo收集器
- LocalUtxoCollector:基於omnicored節點RPC API實現的Utxo收集器
例如,下面的程式碼使用CloudUtxoCollector獲取地址mi8BvbK73nDQfaN3acpaFGYQKhfQ5ysKRn
的UTXO:
use OmniTool\CloudUtxoCollector;
$collector = new CloudUtxoCollector(
'testnet' /*測試網*/
);
$candidateBag = $collector->collect(
['mi8BvbK73nDQ...KhfQ5ysKRn'] /*地址清單*/
);
5、UTXO篩選器
OmniTool使用UtxoSelectorInterface
來約定UTXO篩選功能。該介面的實現需要根據目標金額從候選UTXO中選擇可用UTXO,並返回新的UtxoBag例項。
介面方法:
- select($target,$candidates):選擇可消費UTXO,返回UtxoBag物件
引數$target
宣告要達成的最低金額目標,單位:wei。
引數$candidates
是候選的utxo集合,通常是UtxoCollectorInterface實現物件的collect()呼叫返回的UtxoBag物件。
當前實現類:
- DefaultUtxoSelector
例如下面的程式碼使用DefaultUtxoSelector例項從候選UTXO中刪選出至少100000 wei 的UTXO:
use OmniTool\DefaultUtxoSelector;
$selector = new DefaultUtxoSelector();
$selectedBag = $selector->select(
100000, /*最低目標金額*/
$candidateBag /*候選UTXO集合*/
);
考慮到UTXO的不可分割性,篩選出的若干UTXO的總和,有可能超過目標金額。可以使用UtxoBag例項的getTotal()
方法檢視集合中的UTXO總額:
echo 'total wei in bag => ' . $selectedBag->getTotal() . PHP_EOL;
6、裸交易廣播器
OmniTool使用BroadcasterInterface
來約定裸交易廣播的功能。該介面的實現應當將裸交易廣播到Omni網路中。
介面方法:
- broadcast($rawtx):廣播裸交易
引數$rawtx
用來宣告要廣播的裸交易,型別為16進位制字串。
當前實現類:
- CloudBroadcaster
- LocalBroadcaster
例如,下面的程式碼使用CloudBroadcaster將裸交易碼流廣播到Omni網路中:
use OmniTool\CloudBroadcaster;
$broadcaster = new CloudBroadcaster(
'testnet' /*測試網*/
);
$ret = $broadcaster->broadcast(
'01000000011da9283b4...59f58488ac00000000' /*裸交易*/
);
7、資料查詢介面
OmniTool使用ExplorerInterface
來約定Omni資料查詢功能。
介面方法:
- getBtcBalance($address):查詢指定地址的比特幣餘額
- getOmniBalance($address,$propertyId):查詢指定地址的Omni代幣餘額
當前實現類:
- CloudBroadcaster
- LocalBroadcaster
例如,下面的程式碼使用CloudExplorer查詢地址1Jekm8ZswQmDhLFMp9cuYb1Kcq26riFp6m
的比特幣餘額與USDT代幣餘額:
use OmniTool\CloudExplorer;
$explorer = new CloudExplorer('mainnet');
$address = '1Jekm8ZswQmDhLFMp9cuYb1Kcq26riFp6m';
$balance = $explorer->getBtcBalance($address);
echo 'btc balance => ' . PHP_EOL;
$balance = $explorer->getOmniBalance($address,31);
echo 'usdt balance => ' . $balance['balance']. PHP_EOL;
如果你想學習區塊鏈並在Blockchain Technologies建立職業生涯,那麼請檢視我們分享的一些以太坊、比特幣、EOS、Fabric、Tendermint等區塊鏈相關的互動式線上程式設計實戰教程:
- java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
- python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
- php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和交易等內容。
- 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
- 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
- ERC721以太坊通證實戰,課程以一個數字藝術品創作與分享DApp的實戰開發為主線,深入講解以太坊非同質化通證的概念、標準與開發方案。內容包含ERC-721標準的自主實現,講解OpenZeppelin合約程式碼庫二次開發,實戰專案採用Truffle,IPFS,實現了通證以及去中心化的通證交易所。
- C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和交易等。
- java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Java程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
- php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Php程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
- c#比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在C#程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是C#工程師不可多得的比特幣開發學習課程。
- EOS入門教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
- 深入淺出玩轉EOS錢包開發,本課程以手機EOS錢包的完整開發過程為主線,深入學習EOS區塊鏈應用開發,課程內容即涵蓋賬戶、計算資源、智慧合約、動作與交易等EOS區塊鏈的核心概念,同時也講解如何使用eosjs和eosjs-ecc開發包訪問EOS區塊鏈,以及如何在React前端應用中整合對EOS區塊鏈的支援。課程內容深入淺出,非常適合前端工程師深入學習EOS區塊鏈應用開發。
- Hyperledger Fabric 區塊鏈開發詳解,本課程面向初學者,內容即包含Hyperledger Fabric的身份證書與MSP服務、許可權策略、通道配置與啟動、鏈碼通訊介面等核心概念,也包含Fabric網路設計、nodejs鏈碼與應用開發的操作實踐,是Nodejs工程師學習Fabric區塊鏈開發的最佳選擇。
- Hyperledger Fabric java 區塊鏈開發詳解,課程面向初學者,內容即包含Hyperledger Fabric的身份證書與MSP服務、許可權策略、通道配置與啟動、鏈碼通訊介面等核心概念,也包含Fabric網路設計、java鏈碼與應用開發的操作實踐,是java工程師學習Fabric區塊鏈開發的最佳選擇。
- tendermint區塊鏈開發詳解,本課程適合希望使用tendermint進行區塊鏈開發的工程師,課程內容即包括tendermint應用開發模型中的核心概念,例如ABCI介面、默克爾樹、多版本狀態庫等,也包括代幣發行等豐富的實操程式碼,是go語言工程師快速入門區塊鏈開發的最佳選擇。