USDT PHP開發包OmniTool簡介

2020-07-16 10:05:35
未標題-4.png

OmniTool開發包適用於為PHP應用快速增加對Omni Layer/USDT數位資產的支援能力,即支援使用自有Omni Layer節點的應用場景,也支援基於第三方API服務和離線裸交易的輕量級部署場景。

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-arch.png

2、RpcClient類使用說明

RpcClient類封裝了Omni Layer的RPC介面協定。建立RpcClient物件時,需要傳入包含有效身份資訊的節點RPC URL。例如,假設安裝在本機的omnicored節點軟體設定如下:

rpcuser:userrpcpassword:123456rpcport:8332

那麼可以使用如下的程式碼來範例化RpcClient:

use OmniToolRpcClient;

$client = new RpcClient(            'http://user:[email protected]:8332'   /*節點RPC介面的URL*/
          );

Omni Core節點在Bitcoin原有的RPC介面之外,擴充了額外的介面用來操作Omni層的資料,這些擴充套件的RPC介面採用omni_字首以區隔於Bitcoin的原有RPC介面。為了便於區隔這兩層的RPC呼叫,RpcClient引入了協定子模組的概念,將Bitcoin的原始RPC介面和Omni的擴充套件RPC介面分別掛接到btc子模組和omni子模組。

例如,獲取某個地址的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代幣轉賬範例程式碼如下,說明見注釋:

<?phprequire('../vendor/autoload.php');use OmniToolWallet;                              /*引入開發包*/$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:

<?phprequire('../vendor/autoload.php');use OmniToolWallet;

$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 OmniToolCloudUtxoCollector;

$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 OmniToolDefaultUtxoSelector;

$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進位制字串。

當前實現類:

CloudBroadcasterLocalBroadcaster

例如,下面的程式碼使用CloudBroadcaster將裸交易碼流廣播到Omni網路中:

use OmniToolCloudBroadcaster;

$broadcaster = new CloudBroadcaster(                      'testnet'                     /*測試網*/
                   );
$ret = $broadcaster->broadcast(        '01000000011da9283b4...59f58488ac00000000'  /*裸交易*/
       );

7、資料查詢介面

OmniTool使用ExplorerInterface來約定Omni資料查詢功能。

介面方法:

getBtcBalance($address):查詢指定地址的位元幣餘額getOmniBalance($address,$propertyId):查詢指定地址的Omni代幣餘額

當前實現類:

CloudBroadcasterLocalBroadcaster

例如,下面的程式碼使用CloudExplorer查詢地址1Jekm8ZswQmDhLFMp9cuYb1Kcq26riFp6m的位元幣餘額與USDT代幣餘額:

use OmniToolCloudExplorer;

$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;

推薦教學:支付寶即時到賬線上支付實戰專案開發視訊教學

以上就是USDT PHP開發包OmniTool簡介的詳細內容,更多請關注TW511.COM其它相關文章!