OmniTool 개발 키트는 Omni Layer/USDT 디지털 자산에 대한 지원을 PHP 애플리케이션에 신속하게 추가하는 데 적합합니다. 자체 Omni Layer 노드를 사용하는 애플리케이션 시나리오를 지원하고 타사 API 서비스를 기반으로 하는 경량 트랜잭션도 지원합니다. 대규모 배포 시나리오.
1. OmniTool 개발 키트 소개
OmniTool 개발 키트에는 주로 다음 기능이 포함되어 있습니다.
완전한 Omni Layer 노드 RPC 패키징은 자체 노드 또는 타사 서비스를 사용하여 지정된 주소의 utxo 컬렉션을 지원합니다. 옴니 토큰 전송의 오프라인 생성 네이키드 트랜잭션은 자체 노드 또는 제3자 서비스를 사용하여 네이키드 트랜잭션을 브로드캐스트하도록 지원합니다.
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 객체를 생성할 때 유효한 ID 정보가 포함된 노드 RPC URL을 전달해야 합니다. 예를 들어 로컬 시스템에 설치된 omnicored 노드 소프트웨어가 다음과 같이 구성되었다고 가정합니다.
rpcuser: userrpcpassword: 123456rpcport: 8332
그런 다음 다음 코드를 사용하여 RpcClient를 인스턴스화할 수 있습니다.
use \OmniTool\RpcClient; $client = new RpcClient( 'http://user:123456@localhost:8332' /*节点RPC接口的URL*/ );
Omni Core 노드는 다음 중 하나입니다. 비트코인의 원래 RPC 인터페이스 또한 옴니 레이어 데이터를 작동하기 위해 추가 인터페이스가 확장되었습니다. 이러한 확장된 RPC 인터페이스는 비트코인의 원래 RPC 인터페이스와 구별하기 위해 omni_ 접두사를 사용합니다. 이 두 계층에서 RPC 호출을 쉽게 분리하기 위해 RpcClient는 프로토콜 하위 모듈 개념을 도입하고 비트코인의 원래 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 전송을 수행할 수 있습니다. 이 호출은 omni 하위 모듈의 send() 메서드에 해당합니다. RpcClient 인스턴스. 다음 코드는 3M9qvHKtgARhqcMtM5cRT9VaiDJ5PSfQGY 주소에서 37FaKponF7zqoMLUjEiko25pDiuVH5YLEa 주소로 100.0 USDT 토큰을 전송합니다.
$ret = $client->omni->send( '3M9qvHKtgARhqcMtM5cRT9VaiDJ5PSfQGY', /*代币转出地址*/ '37FaKponF7zqoMLUjEiko25pDiuVH5YLEa', /*代币转入地址*/ 31, /*代币ID:USDT*/ "100.00" /*转移的代币数量*/ );
비토인 레이어의 원래 RPC 인터페이스는 RpcClient의 btc 하위 모듈을 통해 액세스할 수 있습니다. 예를 들어, listunspent 호출을 사용하여 로컬 노드에서 지정된 주소의 utxo를 얻습니다.
$ret = $client->btc->listUnspent( 6, /*最小确认数*/ 999999, /*最大确认数*/ ['mgnucj8nYqdrPFh2JfZSB1NmUThUGnmsqe'] /*地址清单*/ );
개발 패키지의 데모/rpc-demo.php 샘플 코드는 RpcClient 클래스를 사용하여 토큰 발급 및 전송 기능을 완벽하게 보여줍니다. 나만의 Omni Core 노드를 구축하려는 경우 이 예가 큰 도움이 될 것이라고 믿습니다.
3. Wallet 클래스 사용 지침
자신만의 Omni Core 노드를 구축하고 싶지 않지만 타사 API를 기반으로 하는 PHP 애플리케이션에 Omni Layer/USDT에 대한 지원을 추가하려는 경우 가장 쉬운 방법은 다음과 같습니다. 오프라인 거래를 사용하려면 엔트리 클래스 지갑입니다.
Wallet 클래스의 주요 기능은 Omni 토큰 전송 Naked 트랜잭션 또는 Bitcoin 전송 Naked 트랜잭션을 생성하고 브로드캐스팅하는 것입니다.
使用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 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!