Omni/USDT錢包對接PHP開發包

OmniTool開發包適用於爲PHP應用快速增長對Omni Layer/USDT數字資產的支持能力,即支持使用自有Omni Layer節點的應用場景,也支持基於第三方API服務和離線裸交易的輕量級部署場景。下載地址:omni/usdt php開發包php

一、OmniTool開發包簡介

OmniTool開發包主要包含如下特性:json

  • 完善的Omni Layer節點RPC封裝
  • 支持利用自有節點或第三方服務獲取指定地址的utxo集合
  • 支持離線生成omni代幣轉帳裸交易
  • 支持利用自有節點或第三方服務廣播裸交易

OmniTool支持本地部署的Omnicored節點,也支持blockchain.info、btc.com等提供的開放API,要增長對其餘第三方服務的支持也很是簡單,只須要參考代碼實現以下接口:api

  • UtxoCollectorInterface:utxo收集器
  • UtxoSelectorInterface:utxo篩選器
  • BroadcasterInterface:裸交易廣播器
  • ExplorerInterface:數據查詢接口

OmniTool軟件包運行在**Php 7.1+**環境下,當前版本1.0.0,主要類/接口及關係以下圖所示:數組

omnitool arch

OmniTool的主要代碼文件清單以下:bash

代碼文件 說明
omni.php/src/RpcClient.php Omni Layer的RPC協議封裝類
omni.php/src/RpcModule.php Omni Layer的RPC協議分模塊訪問語法糖
omni.php/src/protocol-spec.json Omni Layer協議描述元信息
omni.php/src/SerializeBuffer.php Omni Layer協議序列化緩衝區
omni.php/src/PayloadFactory.php Omni Layer協議載荷工廠類
omni.php/src/Utxo.php 未消費交易輸出類
omni.php/src/UtxoBag.php Utxo集合類
omni.php/src/UtxoCollectorInterface.php Utxo收集器接口
omni.php/src/LocalUtxoCollector.php 基於OmniCore節點的Utxo收集器實現
omni.php/src/CloudUtxoCollector.php 基於第三方服務的Utxo收集器實現
omni.php/src/UtxoSelectorInterface.php Utxo篩選器接口
omni.php/src/DefaultUtxoSelector.php 默認的Utxo篩選器實現
omni.php/src/BroadcasterInterface.php 裸交易廣播器接口
omni.php/src/LocalBroadcaster.php 基於OmniCore節點的裸交易廣播器實現
omni.php/src/CloudBroadcaster.php 基於第三方服務的裸交易廣播器實現
omni.php/src/ExplorerInterface.php 數據查詢接口
omni.php/src/CloudExplorer.php 基於第三方服務的數據查詢接口實現
omni.php/src/LocalExplorer.php 基於OmniCore節點的數據查詢接口實現
omni.php/src/Utils.php 經常使用輔助函數
omni.php/src/Wallet.php 離線錢包類
demo/rpc-demo.php RpcClient使用示例,完整實現OMNI代幣的發行與轉帳
demo/omni-tx-cloud.php 建立並廣播Omni代幣轉帳裸交易,使用第三方雲服務API
demo/omni-tx-local.php 建立並廣播Omni代幣轉帳裸交易,使用自有節點
demo/btc-tx-cloud.php 建立並廣播比特幣轉帳裸交易,使用第三方雲服務API
demo/btc-tx-local.php 建立並廣播比特幣轉帳裸交易,使用自有節點
demo/explorer-cloud.php 查詢指定的地址比特幣餘額/Omni代幣餘額,使用第三方雲服務API
demo/explorer-local.php 查詢指定地址的比特幣餘額/Omni代幣餘額,使用自有節點
demo/wallet-init.php 本地錢包初始化
demo/wallet-demo.php 錢包載入、裸交易構造和廣播
vendor 第三方依賴包目錄
composer.json composer配置文件

二、RpcClient類使用說明

RpcClient類封裝了Omni Layer的RPC接口協議。建立RpcClient對象時,須要傳入包含有效身份信息的節點RPC URL。例如,假設安裝在本機的omnicored節點軟件配置以下:網絡

  • rpcuser:user
  • rpcpassword:123456
  • rpcport:8332

那麼能夠使用以下的代碼來實例化RpcClient:composer

use \OmniTool\RpcClient;

$client = new RpcClient(
            'http://user:123456@localhost: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代幣:ui

$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節點,相信這個示例會有很大幫助。

三、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                  /*找零地址*/
                  );                       
複製代碼

四、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']   /*地址清單*/
                );
複製代碼

五、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;
複製代碼

六、裸交易廣播器

OmniTool使用BroadcasterInterface來約定裸交易廣播的功能。該接口的實現應當將裸交易廣播到Omni網絡中。

接口方法:

  • broadcast($rawtx):廣播裸交易

參數$rawtx用來聲明要廣播的裸交易,類型爲16進制字符串。

當前實現類:

  • CloudBroadcaster
  • LocalBroadcaster

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

use OmniTool\CloudBroadcaster;

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

七、數據查詢接口

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;
複製代碼

OmniTool下載地址:sc.hubwiz.com/codebag/omn…

相關文章
相關標籤/搜索