OmniTool開發包適用於爲PHP應用快速增長對Omni Layer/USDT數字資產的支持能力,即支持使用自有Omni Layer節點的應用場景,也支持基於第三方API服務和離線裸交易的輕量級部署場景。下載地址:omni/usdt php開發包 。php
OmniTool開發包主要包含如下特性:前端
OmniTool支持本地部署的Omnicored節點,也支持blockchain.info、btc.com等提供的開放API,要增長對其餘第三方服務的支持也很是簡單,只須要參考代碼實現以下接口:java
OmniTool軟件包運行在**Php 7.1+**環境下,當前版本1.0.0,主要類/接口及關係以下圖所示:node
OmniTool的主要代碼文件清單以下:python
代碼文件 說明android
omni.php/src/RpcClient.php Omni Layer的RPC協議封裝類程序員
omni.php/src/RpcModule.php Omni Layer的RPC協議分模塊訪問語法糖web
omni.php/src/protocol-spec.json Omni Layer協議描述元信息mongodb
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類封裝了Omni Layer的RPC接口協議。建立RpcClient對象時,須要傳入 包含有效身份信息的節點RPC URL。例如,假設安裝在本機的omnicored節點軟件配置以下:
那麼可使用以下的代碼來實例化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節點,相信這個示例會有很大幫助。
若是不肯意搭建本身的Omni Core節點,而是但願基於第三方API爲本身的PHP應用增長對Omni Layer/USDT的支持,那麼最簡單的方法是使用離線交易的入口類Wallet。
Wallet類的主要做用是根據建立並廣播Omni代幣轉帳裸交易或比特幣轉帳裸交易,它的基本使用步驟以下:
Wallet::cloud()
靜態方法建立一個支持雲端API服務的Wallet實例addKey()
方法將必要的私鑰加入該Wallet實例,例如轉出地址的私鑰,由於Wallet須要利用私鑰對裸交易進行簽名omniSendTx()
方法生成Omni代幣轉帳裸交易,或者使用btcSendTx()
方法比特幣轉帳裸交易broadcast()
方法廣播裸交易使用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);
注意:
在Omni協議層不須要支付交易手續費,可是Omni交易所嵌入的比特幣交易依然須要支付手續費。默認狀況下omniSendTx()
方法使用發送方地址支付比特幣交易手續費,但能夠傳入額外的參數來指定其餘地址支付交易手續費,當你的PHP應用須要實現多帳戶歸集功能時,使用統一的手續費支付地址會更容易管理一些。
例如,下面的代碼使用地址mnRo8JyTHDd5NxRb3UvGbAhCBPQTQ4UZ8W
支付omni交易的手續費:
$rawtx = $wallet->omniSendTx( $addressList[0], /*發送方地址,私鑰必須已經加入錢包*/ 'mgYPLmNuZymK...e2XUNF6VFnT', /*接收方地址*/ 2, /*轉帳OMNI代幣ID,2:TOMN*/ '0.000001', /*轉帳OMNI代幣數量*/ 'mnRo8JyTHDd5...CBPQTQ4UZ8W' /*交易手續費支付地址*/ );
注意:
因爲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*/ );
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 /*找零地址*/ );
OmniTool使用接口UtxoCollectorInterface
來約定UTXO的收集功能。該接口的實現須要支持獲取指定地址的候選UTXO集合,可指定多個地址。
接口方法:
參數$addressList
用來聲明要收集UTXO的地址清單,類型爲數組。
當前實現類:
例如,下面的代碼使用CloudUtxoCollector獲取地址mi8BvbK73nDQfaN3acpaFGYQKhfQ5ysKRn
的UTXO:
use OmniTool\CloudUtxoCollector; $collector = new CloudUtxoCollector( 'testnet' /*測試網*/ ); $candidateBag = $collector->collect( ['mi8BvbK73nDQ...KhfQ5ysKRn'] /*地址清單*/ );
OmniTool使用UtxoSelectorInterface
來約定UTXO篩選功能。該接口的實現須要根據目標金額從候選UTXO中選擇可用UTXO,並返回新的UtxoBag實例。
接口方法:
參數$target
聲明要達成的最低金額目標,單位:wei。
參數$candidates
是候選的utxo集合,一般是UtxoCollectorInterface實現對象的collect()調用返回的UtxoBag對象。
當前實現類:
例以下面的代碼使用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網絡中。
接口方法:
參數$rawtx
用來聲明要廣播的裸交易,類型爲16進制字符串。
當前實現類:
例如,下面的代碼使用CloudBroadcaster將裸交易碼流廣播到Omni網絡中:
use OmniTool\CloudBroadcaster; $broadcaster = new CloudBroadcaster( 'testnet' /*測試網*/ ); $ret = $broadcaster->broadcast( '01000000011da9283b4...59f58488ac00000000' /*裸交易*/ );
OmniTool使用ExplorerInterface
來約定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;
若是你想學習區塊鏈並在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語言工程師快速入門區塊鏈開發的最佳選擇。