您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息

USDT PHP开发包OmniTool简介

2024/4/20 12:36:48发布8次查看
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,主要类/接口及关系如下图所示:
2、rpcclient类使用说明
rpcclient类封装了omni layer的rpc接口协议。创建rpcclient对象时,需要传入包含有效身份信息的节点rpc url。例如,假设安装在本机的omnicored节点软件配置如下:
rpcuser:userrpcpassword:123456rpcport: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代币转账示例代码如下,说明见注释:
<?phprequire('../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:
<?phprequire('../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进制字符串。
当前实现类:
cloudbroadcasterlocalbroadcaster
例如,下面的代码使用cloudbroadcaster将裸交易码流广播到omni网络中:
use omnitool\cloudbroadcaster;$broadcaster = new cloudbroadcaster( 'testnet' /*测试网*/ );$ret = $broadcaster->broadcast( '01000000011da9283b4...59f58488ac00000000' /*裸交易*/ );
7、数据查询接口
omnitool使用explorerinterface来约定omni数据查询功能。
接口方法:
getbtcbalance($address):查询指定地址的比特币余额getomnibalance($address,$propertyid):查询指定地址的omni代币余额
当前实现类:
cloudbroadcasterlocalbroadcaster
例如,下面的代码使用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;
推荐教程:支付宝即时到账在线支付实战项目开发视频教程
以上就是usdt php开发包omnitool简介的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录