USDT对接专用PHP开发包

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,主要类/接口及关系如下图所示:

OmniTool的主要代码文件清单参见:http://sc.hubwiz.com/codebag/omni-php-lib/

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:[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代币转账示例代码如下,说明见注释:

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

OmniTool使用BroadcasterInterface来约定裸交易广播的功能。该接口的实现应当将裸交易广播到Omni网络中。

接口方法:

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

参数$rawtx用来声明要广播的裸交易,类型为16进制字符串。

当前实现类:

  • CloudBroadcaster
  • LocalBroadcaster

例如,下面的代码使用CloudBroadcaster将裸交易码流广播到Omni网络中:

use OmniTool\CloudBroadcaster;

$broadcaster = new CloudBroadcaster(
                      ‘testnet‘                     /*测试网*/
                   );
$ret = $broadcaster->broadcast(
        ‘01000000011da9283b4...59f58488ac00000000‘  /*裸交易*/
       );

7、数据查询接口

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下载地址:http://sc.hubwiz.com/codebag/omni-php-lib/

原文地址:https://blog.51cto.com/13692892/2406149

时间: 2024-11-13 02:33:26

USDT对接专用PHP开发包的相关文章

手机视频开发包

概述: 手机视频开发包是面向集成或软件开发商使用,用于开展手机视频相关的产品开发和系统集成. 开发包提供手机端音视频采集.编码.压缩.音视频传输等功能:通过与后端移动视频直播服务器对接,实现手机视频即拍即传.手机视频直播.开发包提供视频拍摄位置信息,视频描述采集和发布:开发包提供拍摄端和服务器端的文字和语音的对讲等功能. 当前版本的手机视频开发包采集端支持iOS和Android平台. 后端的视频服务器通过标准协议与集成商或软件开发商的业务系统进行对接,从而形成手机端到服务器端的实时移动视频应用.

高效简易websocket服务开发包beetle

websocket的主要是为了解决在web上应用长连接进行灵活的通讯应用而产生,但websocket本身只是一个基础协议,对于消息上还不算灵活,毕竟websocket只提供文本和二进制流这种基础数据格式.在实际应用则更偏向于对象消息的处理,而在这基础上更希望集成一系列的消息路由机制来解决消息处理上的问题.为了解决以上问题beetle针对websocket进行了一些高层次的封装,让服务端处理消息变得更简单灵活.以下通过不同的示例介绍Beetle websocket开发包的简易性. hello wo

3G手机视频对讲开发包

一.概述 针对3G网络研发的"手机视频对讲开发包",使人们在任何能够使用手机的地方都可以随时随地进行视频对讲.视频会议.应急视频指挥等,突破了传统固网的限制,是3G业务的革命性产品.该开发包已经通过了稳定性测试,是目前最完善的适合于大规模商用的3G视频应用开发包,填补了国内空白. 手机视频开发包可为3G用户提供视频监控和告警信息.远程采集.传输.存储.处理与传播等方面的无线网络视频服务,是一种有效的安防及管理工具:手机会议平台是为用户提供手机视频会议的定制.配置.使用的手机视频会议系统

Python开发包推荐系列之xml、html解析器PyQuery

使用python,喜欢她的简洁是一方面,另外就是它有着丰富的开发包 好用又方便 接下来会给大家推荐一系列很赞的开发包. 在解析html.xml过程中,我们有不少的包可以用.比如bs.lxml.xmltodict等 如果说你想立即上手,那么pyquery必然是最佳之选. 从名字上就可以看出,她一定和jQuery有着一定的关系 在官方网站上就是这样描述它的 pyquery: a jquery-like library for python 没错,作者就是将html.xml的解析接口封装成了类似jQu

最新Android SDK_API_开发包_离线包_下载

[转载][资源]最新Android SDK_API_开发包_离线包_下载 开发Android应用少不了Android SDK,由于谷歌服务器的原因,在国内下载Android SDK速度非常慢,如果要把所有的Android SDK下载回来势必是一件非常痛苦的事情.因此,在这里把本人下载的所有的Android SDK打包分享,希望对广大Android 开发者能有所帮助. 所安装的Android SDK,  包括谷歌到目前为止发布的所有的Android API,和部分工具. SDK_API_开发包_离

Struts开发包下载(包含源文件和各种文档)

(1)找了大半天加上各种版本的Struts开发包,基本上要么是不全,要么根本不可以用: (2)奋战了很久终于找到了官网,特给大家地址分享: http://struts.apache.org/download.cgi#struts221 源代码在里边哦! (3)如果链接失效,回复邮箱 发给你们!

Android SDK开发包国内下载地址

原文:Android SDK开发包国内下载地址 不知道是因为最近kaihui还是怎么的,打开android sdk官方网站特别的慢,想下载最新版本的platform几乎变成不可能完成的任务,不知道为什么Google不像Apache那样在各国设立镜像站.为了预防今后再出现这样的情况,这次干脆把android开发所需要的各种包总结一下,顺便提供本地下载链接,省得以后找起来麻烦. 通过分析SDK Manager里要用到的repository文件,我下载了目前google提供的各类安卓开发包并上传到了网

SVG开发包, 20 个有用的 SVG 工具,提供更好的图像处理

20 个有用的 SVG 工具,提供更好的图像处理 SVG 现正在 Web 设计领域变得越发流行, 你可以使用 Illustrator 或者 Inkscape 来创建 SVG 图像. 但当进行 Web 设计时,我们还需要做一些优化来使得 SVG 变得更加轻量. 下面介绍的 20 个工具,可以帮助你快速有效的创建 SVG 图像.现有的在线工具已经可以帮助我们进行优化.转换.新建模式等工作. 更详细的介绍,参见:How To Create SVG Animation Using CSS 交互式 SVG

移动互联网(一)短信和彩信界面开发包

参与这个项目,短信和彩信功能.它被认为是该项目的一个重要组成部分,如何开发这个功能以前认为.例如,有很多订单我们永和系统,怎样让用户及时知道自己卡里的消费情况?怎样让用户心中存在安全感,试想想在你的银行卡每次消费或者转入.转出每一笔款的时候都有短信提示,你是不是无意中添加了一份安全感呢? 大家在想想眼下的各类门户站点,以及我们经常使用的CSDN等论坛都提供有短信登录.以及短信验证码.短信注冊等等同短信沾边的业务内容,全部的这些都是一个思想提高系统灵活性.易用性.安全性,方便用户替用户考虑.全心全