主页 > imtoken如何转账 > Java json转map_Java对接Omni/USDT教程《OmniToo

Java json转map_Java对接Omni/USDT教程《OmniToo

imtoken如何转账 2024-01-26 05:13:36

OmniTool.Java开发包适用于为Java应用快速添加对Omni/USDT数字资产的支持,即支持使用自有Omni节点的应用场景,也支持基于第三方API服务和离线的轻量级部署场景裸交易。 官方下载地址:.

一、开发包概述

OmniTool.Java开发包主要包含以下功能:

OmniTool.Java 支持本地部署的 Omnicored 节点,也支持第三方服务提供的开放 API。 添加新的第三方服务也非常简单。 只需要参考代码实现如下接口:

OmniTool.Java软件包当前版本为1.0.0,主要类/接口及其关系如下图所示:

3a984f5465179a149659a56001aedf10.png

OmniTool.Java软件包的主要代码文件列表,请访问官网:

2.RpcClient类使用说明

RpcClient类封装了Bitcoin和Omni Layer的RPC API接口协议。 创建RpcClient对象时,需要传入包含有效身份信息的节点RPC URL。例如假设本机安装的omnicored节点软件连接主网,其配置如下:

然后就可以使用下面的代码来实例化RpcClient:

import omnitool.RpcClient;RpcClient client = new RpcClient( "http://user:123456@127.0.0.1:8332" /*节点RPC API的URL*/ );

使用RpcClient的call()方法调用Bitcoin层和omni层的所有RPC API。 例如,使用 listunspent 调用获取本地节点中指定地址的 utxo:

//import java.util.Map;Map[] unspents = client.call( Map[].class, /*返回结果类型*/ "listunspent", /*RPC API名称*/ 6, /*最小确认数*/ 999999, /*最大确认数*/ new String[]{"mgnucj8nYqdrPFh2JfZSB1NmUThUGnmsqe"} /*地址清单*/ );for(Object unspent: unspents) { System.out.printf("txid: %s",(String)unspent.get("txid"));}

call()方法的返回结果对应RPC API的JSON响应中的result字段,其类型取决于我们传入的第一个参数。

call()方法的第一个参数声明了该方法返回的结果类型的Class对象,该方法会将RPC API的JSON响应中的result字段解码为该参数指定的类型。 通常我们可以使用Map或者Map[]来对应JSON响应中result字段的内容,如上例所示。 这种方式可以适应不断变化的RPC API,但是在从结果中提取数据的时候,需要小心处理类型转换的问题。

call()方法的第二个参数声明了要调用的RPC API方法的名称,从第三个参数开始的其他参数表示指定RPC API方法的参数。

okex里usdt怎么转成usdt_日本东京个人地址生成_usdt地址怎么生成

2.1 定义自己的结果类

可选地,您也可以自己定义一个类,以简化从 call() 方法的返回结果中提取数据的难度。 比如上面的例子,我们可以定义一个Unspent类来描述listupsent response中的JSON对象(不需要定义所有的字段,根据自己的需要选择):

class Unspent{ public String txid; public long vout; public String account; public String scriptPubKey; public double amount; public long confirmations;}

然后我们可以调用 RpcClient 如下:

Unspent[] unspents = client.call( Unspent[].class, /*返回结果类型*/ "listunspent", /*RPC API方法名*/ 6, /*最小确认数*/ 999999, /*最大确认数*/ new String[]{"mgnucj8nYqdrPFh2JfZSB1NmUThUGnmsqe"} /*地址清单*/ );for(Object unspent: unspents) { System.out.printf("txid: %s",unspent.txid); System.out.printf("vout: %d",unspent.vout); System.out.printf("amount:%f",unspent.amount);}

显然,定义自己的结果类可以直接将RPC API的JSON响应反序列化为指定的类型,这对于操作复杂的响应结果很有帮助。 但是比特币的RPC API和Omni层不仅是动态演进的,而且一些JSON响应的结构也是动态的,所以往往需要结合使用更通用的Map或者Map[]类型。

2.2 Omni层RPC API

OmniCore节点除了比特币原有的RPC接口外,还扩展了额外的接口来操作Omni层的数据。 这些扩展的RPC接口使用omni_前缀来区别于比特币原有的RPC接口。

例如获取某个地址的USDT代币余额,需要使用Omni层的omni_getbalance调用。 以下代码获取地址1EXoDusjGwvnjZUyKkxZ4UHEf77z6A5S4P的USDT(资产ID:31)余额:

Map[] balances = client.call( Map[].class, /*返回结果类型*/ "omni_getbalance" /*Omni RPC API方法名*/ "1EXoDusjGwvnjZUyKkxZ4UHEf77z6A5S4P", /*账户地址*/ 31 /*Omni资产ID:USDT=31*/);for(Map b:balances){ System.out.printf("balance: %s",(String)b.balance);}

同样,可以使用 omni_send 调用执行简单的 USDT 转账。 例如,下面的代码将 100.0 USDT 代币从地址 3M9qvHKtgARhqcMtM5cRT9VaiDJ5PSfQGY 转移到地址 37FaKponF7zqoMLUjEiko25pDiuVH5YLEa:

String txid = client.call( String.class, /*返回结果类型*/ "omni_send", /*RPC API方法名*/ "3M9qvHKtgARhqcMtM5cRT9VaiDJ5PSfQGY", /*代币转出地址*/ "37FaKponF7zqoMLUjEiko25pDiuVH5YLEa", /*代币转入地址*/ 31, /*代币ID:USDT*/ "100.00" /*转移的代币数量*/);System.out.printf("tx hash => %s",txid);

开发包中的demo/RpcClientDemo.java示例代码使用RpcClient完整演示了Omni层的代币发行和转账功能。 如果你打算搭建自己的 Omni Core 节点,相信这个例子会有很大的帮助。

3.ToolKit类使用说明

如果你不愿意搭建自己的Omni Core节点,而是想在你基于第三方API的Java应用中加入对Omni Layer/USDT的支持,那么最简单的方法就是使用离线交易入口类ToolKit。

okex里usdt怎么转成usdt_usdt地址怎么生成_日本东京个人地址生成

ToolKit类的主要功能是创建和广播Omni代币或比特币转账裸交易。 其基本步骤如下:

3.1 Omni/USDT代币转账

使用ToolKit实现的Omni/USDT代币转账示例代码如下,说明在注释中:

import omnitool.*;String network = "main"; ToolKit kit = new ToolKit( network, /*接入的网络*/ new KeyStoreMemory(), /*使用内存密钥库*/ new UtxoCollectorSmartbit(network), /*使用云端Utxo采集器*/ new UtxoSelectorDefault(), /*使用默认策略Utxo选择器*/ new BroadcasterSmartbit(network) /*使用云端裸交易广播器*/);String privHex = "4aec8e45106....00d5c5a05b"; /*私钥:16进制字符串*/ kit.addKey(privHex); /*将私钥加入ToolKit*/String from = kit.getKeyStore() .getByKey(privHex).address; /*私钥对应的地址作为发起账号*/String to = "1GxX5tQR1C.....x2zbdj4mMuDcWR"; /*接收地址*/ String txid = kit.sendOmnicoin( from, /*发送方地址,私钥必须已经加入钱包*/ to, /*接收方地址*/ 31, /*转账代币ID,USDT=31*/ 10000 /*转账代币数量,调整为最小单位计量的整数*/ null, /*比特币手续费支付地址,私钥必须已加入ToolKit*/  546, /*向接收方发送的流通比特币,单位:satoshi*/ 1000, /*交易手续费,单位:satoshi*/  true /*是否广播*/);System.out.printf("txid => %s",txid); /*打印交易哈希*/ 

注意:

3.2 指定Omni交易的手续费支付地址

Omni协议层无需支付交易费用,但嵌入Omni交易所的比特币交易仍需支付交易费用。 当 sendOmnicoin() 方法的费用支付地址设置为 null 时,发送地址将用于支付比特币交易费用。 当您的Java应用需要实现多账户收款功能时,使用统一的缴费地址会更容易管理。

例如,下面的代码使用地址 35stX1w6LKHj7hGHz6GVNzXZCdUhAeqDb6 为 Omni 交易支付费用:

String txid = kit.sendOmnicoin( from, /*发送方地址,私钥必须已加入ToolKit*/ to, /*接收方地址*/ 31, /*转账OMNI代币ID,31:USDT*/ 10000, /*转账OMNI代币数量,已调整至最小单位*/ "35stX1w6LKH...CdUhAeqDb6" /*交易手续费支付地址,私钥必须已加入ToolKit*/ 546, /*向接收方发送的流通比特币,单位:satoshi*/ 1000, /*交易手续费,单位:satoshi*/  true /*是否广播*/ );

注意:

3.3 指定Omni交易的比特币转账次数

由于Omni交易需要发送方有可用的UTXO,为了方便Omni代币接收地址继续流通持有的Omni代币,sendOmnicoin()方法需要至少转546个SATOSHI比特币到接收方地址,这个默认调用此方法时可以更改值。

例如,以下代码将 1000 SATOSHI 转给接收方:

String txid = kit.SendOmnicoin( from, /*发送方地址,私钥必须已加入ToolKit*/ to, /*接收方地址*/ 31, /*转账OMNI代币ID,31:USDT*/ 10000, /*转账OMNI代币数量,已调整至最小单位*/ fundAddr: "35stX1w6LKH...CdUhAeqDb6" /*交易手续费支付地址,私钥必须已加入ToolKit*/ 1000, /*向接收方发送的流通比特币,单位:satoshi*/ 1000, /*交易手续费,单位:satoshi*/  true /*是否广播*/ );

3.4 指定Omni交易的手续费

okex里usdt怎么转成usdt_日本东京个人地址生成_usdt地址怎么生成

sendOmnicoin() 方法可以设置交易手续费,例如设置为 3000 SATOSHI:

String txid = kit.SendOmnicoin( from, /*发送方地址,私钥必须已加入ToolKit*/ to, /*接收方地址*/ 31, /*转账OMNI代币ID,31:USDT*/ 10000, /*转账OMNI代币数量*/ fundAddr: "35stX1w6LKH...CdUhAeqDb6" /*交易手续费支付地址,私钥必须已加入ToolKit*/ 1000, /*向接收方发送的流通比特币,单位:satoshi*/ 3000, /*交易手续费,单位:SATOSHI*/ true /*是否广播*/ );

3.5 只生成Omni裸交易不广播

有时可能只需要生成一个 Omni transfer 裸交易而不广播它。 可以将sendOmnicoin()方法的最后一个参数设置为false来取消广播,生成的裸交易将被返回。 例如:

String rawtx = kit.SendOmnicoin( from, /*发送方地址,私钥必须已加入ToolKit*/ to, /*接收方地址*/ 31, /*转账OMNI代币ID,31:USDT*/ 10000, /*转账OMNI代币数量,已调整至最小单位*/ fundAddr: "35stX1w6LKH...CdUhAeqDb6" /*交易手续费支付地址,私钥必须已加入ToolKit*/ 1000, /*向接收方发送的流通比特币,单位:satoshi*/ 3000, /*交易手续费,单位:SATOSHI*/ false /*是否广播*/ );System.out.println(rawtx); /*打印裸交易内容*/

3.6 比特币转账

OmniTool.Java 还支持比特币转账裸交易的生成和广播。

例如,以下代码将 10000 SATOSHI 从 ToolKit 的一个地址转移到另一个地址:

String privHex = "4aec8e45106....00d5c5a05b"; /*私钥:16进制字符串*/ kit.addKey(privHex); /*将私钥加入ToolKit*/String from = kit.getKeyStore() .getByKey(privHex).address; /*私钥对应的地址作为发起账号*/String to = "1GxX5tQR1C.....x2zbdj4mMuDcWR"; /*接收地址*/ String txid = kit.sendBitcoin( from, /*发送方地址*/ to, /*接收方地址*/ 10000, /*转账比特币数量,单位:SATOSHI*/ 1500, /*手续费,单位:SATOSHI*/ null, /*找零地址*/ true /*是否广播*/ ); 

当找零地址设置为空时,SendBitcoin() 方法使用发件人地址作为找零地址。 以下代码创建一个新地址来接收找零:

String changeAddr = kit.newAddress(); /*创建新地址*/String txid = kit.sendBitcoin( from, /*发送方地址*/ to, /*接收方地址*/ 10000, /*转账比特币数量,单位:SATOSHI*/ 1500, /*手续费,单位:SATOSHI*/ changeAddr, /*找零地址*/ true /*是否广播*/ ); 

同样,当你只需要生成裸交易,不想广播时usdt地址怎么生成,可以将最后一个参数设置为false。

4. UTXO收集器

OmniTool.Java使用接口UtxoCollector来约定UTXO的收集功能。 该接口的实现需要支持获取指定地址的候选UTXO集,可以指定多个地址。

接口方法:

usdt地址怎么生成_okex里usdt怎么转成usdt_日本东京个人地址生成

UtxoBag collect(String[] addresses); /*提取并返回候选UTXO集合*/

参数addresses用于声明收集UTXO的地址列表。

当前实现类:

例如,以下代码使用UtxoCollectorSmartbit获取测试链中指定地址的UTXO:

UtxoCollector collector = new UtxoCollectorSmartbit( "main" /*主链*/ );String[] addresses = new String[]{"1C3TZ...brS2xHM"};UtxoBag collected = collector.Collect( addresses /*地址清单*/ );

5.UTXO选择器

OmniTool.Java 使用 UtxoSelector 接口来商定 UTXO 筛选策略。 该接口的实现需要根据目标数量从候选UTXO中选择可用的UTXO,并返回一个新的UtxoBag实例。

接口方法:

UtxoBag select(long target,UtxoBag collected); /*选择可消费UTXO,返回UtxoBag对象*/

参数 target 声明了要达到的最小数量目标,单位:SATOSHI。

收集到的参数是候选utxo集合,通常是UtxoCollector的collect()调用返回的结果。

当前实现类:

例如,以下代码使用 UtxoSelectorDefault 实例从候选 UTXO 中选择至少 100,000 SATOSHI 的 UTXO:

//collected表示候选UTXO集合,来自Utxo采集器的collect()调用结果UtxoSelector selector = new UtxoSelectorDefault();UtxoBag selected = selector.select( 100000, /*最低目标金额*/ collected /*候选UTXO集合*/ );System.out.printf("total:%d":selected.getTotal()); /*打印输出选中utxo总额*/

考虑到 UTXO 的不可分割性,选择的 UTXO 的总和可能会超过目标数量。 您可以使用 UtxoBag 实例的 getTotal() 方法查看集合中的总 UTXO,如上。

日本东京个人地址生成_usdt地址怎么生成_okex里usdt怎么转成usdt

6. 裸交易广播者

OmniTool.Java使用Broadcaster接口约定裸交易广播的功能规范。 该接口的实现应该将裸交易广播到 Omni/Btc 网络。

接口方法:

String broadcast(String rawtx); /*广播裸交易*/

参数rawtx用于声明要广播的原始交易,类型为十六进制字符串。

当前实现类:

例如,以下代码使用 BroadcasterSmartbit 将裸交易流广播到 Omni/Btc 网络:

Broadcaster broadcaster = new BroadcasterSmartbit( "testnet" /*测试链*/ );String txid = broadcaster.broadcast( "01000000011da9283b4...59f58488ac00000000" /*裸交易*/ );

7.密钥存储接口

OmniTool.Java 使用 KeyStore 来约定密钥存储的功能规范。

接口方法:

bool add(KeyStoreItem item); /*存入密钥*/KeyStoreItem[] list(); /*浏览全部密钥*/KeyStoreItem getByKey(); /*查询指定16进制私钥对应的密钥信息*/ KeyStoreItem getByWif(); /*查询指定WIF格式私钥对应的密钥信息*/KeyStoreItem getByAddress(); /*查询指定地址对应的密钥信息*/KeyStoreItem getByScript(); /*查询指定公钥脚本对应的密钥信息*/

KeyStore目前有两个实现类:

密钥存储实例的主要作用是为ToolKit提供密钥存储和查询能力。 以下代码使用KeyStoreSql启动ToolKitusdt地址怎么生成,生成几种不同类型的地址,导入十六进制私钥和WIF私钥,然后查询:

ToolKit kit = new ToolKit( "testnet", new KeyStoreSqlite("testnet.wallet"), null,null,null );String addr1 = kit.newAddress("SEGWIT-P2SH"); /*生成隔离见证p2sh地址*/String addr2 = kit.newAddress("SEGWIT"); /*生成隔离见证地址*/String addr3 = kit.newAddress("P2PKH"); /*生成P2PKH地址,默认选项*/String addr4 = kit.addKey( /*导入16进制私钥*/ "4aec8e45106....00d5c5a05b", "SEGWIT-P2SH" /*使用该私钥的SEGWIT-P2SH地址*/  ); String addr5 = kit.addWif( /*导入WIF格式的私钥*/ "cNJFgo1driF...SkdcF6JXXwHMm"  ); /*默认使用私钥的P2PKH地址*/ KeyStoreItem[] items = kit.list(); /*返回全部密钥记录*/for(KeyStoreItem item:items){ System.out.printf("key => %s",item.key); System.out.printf("wif => %s",item.wif); System.out.printf("address => %s",item.address); System.out.printf("script => %s",item.script);}  KeyStoreItem item = kit.getByAddress(addr1); /*查询指定地址的密钥记录*/System.out.printf("key => %s",item.key); 

下载地址:Omni/USDT Java开发包-汇智网