Omni/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的主要代码文件清单如下:

代码文件说明
omni.php/src/RpcClient.phpOmni Layer的RPC协议封装类
omni.php/src/RpcModule.phpOmni Layer的RPC协议分模块访问语法糖
omni.php/src/protocol-spec.jsonOmni Layer协议描述元信息
omni.php/src/SerializeBuffer.phpOmni Layer协议序列化缓冲区
omni.php/src/PayloadFactory.phpOmni Layer协议载荷工厂类
omni.php/src/Utxo.php未消费交易输出类
omni.php/src/UtxoBag.phpUtxo集合类
omni.php/src/UtxoCollectorInterface.phpUtxo收集器接口
omni.php/src/LocalUtxoCollector.php基于OmniCore节点的Utxo收集器实现
omni.php/src/CloudUtxoCollector.php基于第三方服务的Utxo收集器实现
omni.php/src/UtxoSelectorInterface.phpUtxo筛选器接口
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.phpRpcClient使用示例,完整实现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.jsoncomposer配置文件

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

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下载地址:sc.hubwiz.com/codebag/omn…

转载于:https://juejin.im/post/5cf91ad46fb9a07eb55f4d28

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/27184.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用ethers.js创建以太坊HD钱包(生成BIP-039 + BIP-044钱包),在根据私钥、助记词找回钱包!

一、什么是ethers.js ethers.js库旨在成为一个完整而紧凑的库&#xff0c;用于与以太坊区块链及其生态系统进行交互。它最初设计用于ethers.io&#xff0c;后来扩展为更通用的库。官方链接&#xff1a;https://docs.ethers.io/ethers.js/html/getting-started.html 二、在Nod…

钱包:BOMO 轻钱包用户手册

BOMO 轻钱包用户手册 简介 Quick Wallet是网页版轻量级钱包&#xff0c;用户可快速登录Quick Wallet 进行发送BU的操作。目前&#xff0c;Quick Wallet有正式版和测试版&#xff0c;正式版网址为 https://quickwallet.bumo.io&#xff0c;测试版网址为 https://quickwallet.b…

usdt钱包地址查询_钱包开发 - USDT - 一、Omni本地钱包安装

1.win 官网下载安装 进入qt目录 命令行: 1.开始客户端 > omnicore-qt.exe -testnet -server -rpcbind=127.0.0.1 -rpcport=18332 -rpcuser=RPCuser -rpcpassword=RPCpasswd -datadir=“f:xxx” 如果安装了其他节点 需要指定data目录 > -datadir=“f:xxx” 指定钱包文件 …

区块链钱包

区块链钱包 一&#xff0c;关于钱包 关于钱包的加密货币中常见的误解是它们存储Token。 钱包不存储Token。 钱包的作用是将私钥存储在加密文件中并签署交易。 钱包只含有密钥&#xff0c;而包含钱币。 每个用户有一个包含多个密钥的钱包。 钱包只包含私钥/公钥对的密钥链。因…

LaTeX中的拼写及语法检查

在使用Overleaf或者texstudio进行LaTeX编辑的时候&#xff0c;一个不方便的地方就是不能像Word那样进行拼写及语法检查&#xff0c;也不能安装grammarly插件。 Overleaf和texstudio都有检查单词拼写的基础功能&#xff0c;但对于一些语法检查应该还不行。 目前没有找到特别满意…

oauth2授权码模式——微信第三方登录原理

oauth2有四种授权模式&#xff0c;授权码模式是最常用的模式 oauth2其实就是一种通用的协议&#xff0c;如果你的应用想要支持这种协议就需要通过代码来实现它 不过也没有谁会从头开始去实现这个协议&#xff0c;各种编程语言已经有现成的框架已经实现了oauth2协议&#xff0…

登陆时做下双因子验证

原文链接&#xff1a;http://www.ruanyifeng.com/blog/2017/11/2fa-tutorial.html 双因素认证&#xff08;2FA&#xff09;教程 所谓认证&#xff08;authentication&#xff09;就是确认用户的身份&#xff0c;是网站登录必不可少的步骤。 密码是最常见的认证方法&#xff…

spring security oauth2 实现微信登陆(授权回调域、前端重定向、微信解绑、获取用户信息中文乱码等相关问题解析)

OAuth 的核心 OAuth 的核心就是向第三方应用颁发令牌。OAuth提供了四种获取令牌的授权方式 授权码&#xff08;authorization-code&#xff09;、隐藏式&#xff08;implicit&#xff09;、密码式&#xff08;password&#xff09;、客户端凭证&#xff08;client credentials…

Spring Security OAuth2 优雅的集成短信验证码登录以及第三方登录

基于SpringCloud做微服务架构分布式系统时&#xff0c;OAuth2.0作为认证的业内标准&#xff0c;Spring Security OAuth2也提供了全套的解决方案来支持在Spring Cloud/Spring Boot环境下使用OAuth2.0&#xff0c;提供了开箱即用的组件。但是在开发过程中我们会发现由于Spring Se…

谷歌Google Authenticator实现双因素认证

参考&#xff1a; https://www.cnblogs.com/hanyifeng/p/kevin4real.html 介绍&#xff1a;什么是双因素认证 双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统。双因素认证是一种采用时间同步技术的系统&#xff0c;采用了…

Google-Authenticator双因子认证

简介&#xff1a;Google-authenticator是基于时间的一次性密码算法&#xff08;TOTP&#xff09;是一种根据预共享的密钥与当前时间计算一次性密码的算法。它已被互联网工程任务组接纳为RFC 6238标准[1]&#xff0c;成为主动开放认证&#xff08;OATH&#xff09;的基石&#x…

通过谷歌身份验证器实现双保险认证(1)

目录 一、谷歌身份验证器 二、下载谷歌验证器 1.linux端下载 2.手机端下载 三、linux端安装 1.安装环境 2.解压 3.编译安装​编辑 4.使用 一、谷歌身份验证器 谷歌身份验证器&#xff08;google authenticator&#xff09;是谷歌推出的基于时间的一次性密码&#xff08…

微信消息推送配置token验证

留一篇帖子来避坑 在接口配置修改中&#xff0c;微信官方需要验证你申请时填写的url能够正常响应&#xff0c;会给你填写的url接口发送get请求&#xff0c;接口需要正确返回才能都配置成功。我按照指引查看文档&#xff1a; 这狗官方只给php示例也就算了&#xff0c;这php的代码…

四、登录验证功能

登录验证. 用户访问任何业务资源,都需要进行登录验证. *只有登录成功的用户才能访问业务资源 *没有登录成功的用户访问业务资源,跳转到登录页面 分析 1.过滤器 ①implements Filter{ init doFilter destroy } ②配置过滤器web.xml 2.拦截器&#xff1a; ①提供拦截…

用双因子认证2FA替换Google authenticator谷歌令牌,助力准上市公司实现等保安全审计

21世纪初&#xff0c;某人力资源科技公司试水HR SaaS赛道&#xff0c;以大客户为目标客群&#xff0c;持续深耕&#xff0c;稳扎稳打&#xff0c;如今已是一家专门为中大型企业提供一体化HR SaaS及人才管理产品/解决方案的头部企业。其产品覆盖了从员工招募、入职、管理到离职的…

5 客户端认证 OAuth2ClientAuthenticationFilter

客户端认证 https://openid.net/specs/openid-connect-core-1_0.html#ClientAuthentication https://www.iana.org/assignments/oauth-parameters/oauth-parameters.xhtml#token-endpoint-auth-method 当访问 OAuth2 相关接口时&#xff08;/oauth2/token、/oauth2/introspect、…

outlook突然变得很慢很卡

​outlook之前用的好好的&#xff0c;突然有一天变得很卡&#xff0c;特别是在上传附件后。 可能原因&#xff1a;没有勾选使用缓存Exchange模式&#xff0c;导致没有生成本地的同步ost文件&#xff0c;而是直接从服务器存取数据。 对应解决办法&#xff1a;到账户设置里&#…

学术海报Poster-- 模板分享

学术海报Poster-- 模板分享 0、引言1、下载地址百度网盘链接地址CSDN托管 2、模板样例 ⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容…

世界杯球队分析

文章目录 1. 本文思路2.数据介绍2.1 results.csv数据集2.2 shootouts.csv数据集 3. 数据分析3.1 多维度分析3.2 数据分析案例3.2.1 导入模块3.2.2 导入数据1.遍历目录2.读取数据 3.2.3 查看描述数据1.查看数据2. 获取所有世界杯比赛的数据3. 查看包含FIFA的类型4. 获取世界杯数…

NBA比赛数据分析与预测

我的任务利用13到16年的NBA比赛统计数据&#xff0c;去预测17年的每场NBA比赛。数据是从http://www.basketball-reference.com/这个网站获得的。前期参考了https://www.shiyanlou.com/courses/782/labs/2647/document这里的分析与实现方法。这个实验楼里实现用了LogisticRegres…