天天看點

Omni/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,主要類/接口及關系如下圖所示:

Omni/USDT PHP開發包OmniTool簡介

OmniTool的主要代碼檔案清單如下:

代碼檔案 說明
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配置檔案

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引入了協定子子產品的概念,将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代币轉賬示例代碼如下,說明見注釋:

<?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、裸交易廣播器

BroadcasterInterface

來約定裸交易廣播的功能。該接口的實作應當将裸交易廣播到Omni網絡中。

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

$rawtx

用來聲明要廣播的裸交易,類型為16進制字元串。

  • CloudBroadcaster
  • LocalBroadcaster

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

use OmniTool\CloudBroadcaster;

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

7、資料查詢接口

ExplorerInterface

來約定Omni資料查詢功能。

  • getBtcBalance($address):查詢指定位址的比特币餘額
  • getOmniBalance($address,$propertyId):查詢指定位址的Omni代币餘額

例如,下面的代碼使用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;           

份證書與MSP服務、權限政策、信道配置與啟動、鍊碼通信接口等核心概念,也包含Fabric網絡設計、java鍊碼與應用開發的操作實踐,是java工程師學習Fabric區塊鍊開發的最佳選擇。

  • tendermint區塊鍊開發詳解 ,本課程适合希望使用tendermint進行區塊鍊開發的工程師,課程内容即包括tendermint應用開發模型中的核心概念,例如ABCI接口、默克爾樹、多版本狀态庫等,也包括代币發行等豐富的實操代碼,是go語言工程師快速入門區塊鍊開發的最佳選擇。

繼續閱讀