本文共 6761 字,大约阅读时间需要 22 分钟。
OmniTool.Net 开发包为 .Net/C# 应用提供了快速支持 Omni Layer/USDT 数字资产的能力,适用于基于自有 Omni Layer 节点的应用场景,也支持基于第三方 API 服务和离线裸交易的轻量级部署场景。以下是开发包的详细介绍。
OmniTool.Net 开发包主要包含以下功能特性:
此外,开发包支持本地部署的 OmniRaced 节点,也支持第三方服务提供的开放 API。新增第三方服务只需实现相应的接口,即可快速集成。
OmniTool.Net 的主要代码文件清单如下:
| 文件名 | 说明 |
|---|---|
| OmniTool.sln | OmniTool.Net 解决方案文件 |
| OmniTool.csproj | OmniTool.Net 开发库项目文件 |
| OmniClient.cs | Omni Layer/Btc RPC API 客户端 |
| RpcModule.cs | RPC API 模块实现类 |
| ToolKit.cs | 开发库入口类 |
| IKeyStore.cs | 密钥存储接口 |
| IUtxoCollector.cs | UTXO 采集器接口 |
| IUtxoSelector.cs | UTXO 选择器接口 |
| IBroadcaster.cs | 裸交易广播器接口 |
| KeyStoreMemory.cs | 内存密钥存储库实现类 |
| KeyStoreSqlite.cs | SQLite 密钥存储库实现类 |
| UtxoCollectorRpc.cs | 基于 RPC API 的 UTXO 采集器实现类 |
| UtxoCollectorSmartbit.cs | 基于云端第三方 API 的 UTXO 采集器实现类 |
| UtxoSelectorDefault.cs | UTXO 选择器接口默认策略实现类 |
| BroadcasterRpc.cs | 基于 RPC API 的裸交易广播器实现类 |
| BroadcasterSmartbit.cs | 基于云端第三方 API 的裸交易广播器实现类 |
| UtxoBag.cs | UTXO 集合类 |
| Utxo.cs | UTXO 模型类 |
| KeyStoreItem.cs | 密钥存储记录类 |
| Utils.cs | 辅助工具类 |
| Demo.csproj | OmniTool.Net 演示应用项目文件 |
| Program.cs | 演示应用入口代码 |
| RpcClientDemo.cs | Omni/Btc RPC API 客户端使用方法演示代码 |
| MemoryKeyStoreDemo.csproj | 内存密钥库使用方法演示代码 |
| SqliteKeyStoreDemo.csproj | SQLite 密钥库使用方法演示代码 |
| BtcTxRpcDemo.cs | 比特币转账交易演示代码,基于 RPC API |
| BtcTxCloudDemo.cs | 比特币转账交易演示代码,基于第三方服务 API |
| OmniTxRpcDemo.cs | Omni/USDT 代币转账交易演示代码,基于 RPC API |
| OmniTxCloudDemo.cs | Omni/USDT 代币转账交易演示代码,基于第三方服务 API |
OmniClient 类封装了比特币及 Omni Layer 的 RPC API 接口协议。创建 OmniClient 对象时,需要传入包含有效身份信息的节点 RPC URL。例如,安装在本机的 OmniCore 节点软件接入主网,其配置如下:
以下是创建 OmniClient 的示例代码:
// 使用 OmniTool; using OmniTool.OmniClient;OmniClient client = new OmniClient( "http://user:123456@127.0.0.1:8332", // 节点 RPC API URL "main" // 接入的 Bitcoin 网络);
OmniClient 类通过子模块概念将 Bitcoin 原有的 RPC 接口与 Omni 层的扩展接口分开管理。例如,获取某个地址的 USDT 代币余额需要调用 Omni 层的接口,方法如下:
var ret = client.Omni.GetBalance( "1EXoDusjGwvnjZUyKkxZ4UHEf77z6A5S4P", // 账户地址 31 // USDT 资产 ID);Console.WriteLine(ret); // 打印返回结果
使用 OmniClient 进行简单的 USDT 转账:
var ret = client.Omni.Send( "3M9qvHKtgARhqcMtM5cRT9VaiDJ5PSfQGY", // 转出地址 "37FaKponF7zqoMLUjEiko25pDiuVH5YLEa", // 转入地址 31, // USDT 资产 ID "100.00" // 转移代币数量);Console.WriteLine(ret); // 打印交易哈希
如果不愿搭建 OmniCore 节点,而是希望基于第三方 API 为应用增加对 Omni Layer/USDT 的支持,可以使用 ToolKit 类。ToolKit 类的主要功能是根据私钥生成并广播 Omni 代币转账或比特币转账裸交易。
以下是使用 ToolKit 实现的 Omni/USDT 代币转账示例代码:
// 使用 OmniTool; using OmniTool.ToolKit;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); // 将私钥加入 ToolKitString from = kit.KeyStore.GetByKey(privHex).Address; // 私钥对应的地址作为发起账号String to = "1GxX5tQR1C.....x2zbdj4mMuDcWR"; // 接收地址String txid = kit.SendOmnicoin( from, // 发送方地址 to, // 接收方地址 31, // 转账代币 ID:USDT=31 10000 // 转账代币数量);Console.WriteLine($"txid > {txid}"); // 打印交易哈希 以下是使用 ToolKit 实现的比特币转账示例代码:
// 使用 OmniTool; using OmniTool.ToolKit;String privHex = "4aec8e45106....00d5c5a05b"; // 私钥:16进制字符串kit.AddKey(privHex); // 将私钥加入 ToolKitString from = kit.KeyStore.GetByKey(privHex).Address; // 私钥对应的地址作为发起账号String to = "1GxX5tQR1C.....x2zbdj4mMuDcWR"; // 接收地址String txid = kit.SendBitcoin( from, // 发送方地址 to, // 接收方地址 10000 // 转账比特币数量,单位:SATOSHI);Console.WriteLine($"txid > {txid}"); // 打印交易哈希 OmniTool.Net 使用接口 IUtxoCollector 约定 UTXO 的采集功能。该接口的实现需要支持获取指定地址的候选 UTXO 集合,可指定多个地址。
UtxoBag Collect(String[] addresses); // 提取并返回候选 UTXO 集合
UtxoCollectorSmartbit:基于云端第三方 API 实现的 UTXO 采集器UtxoCollectorRpc:基于 OmniCore 节点 RPC API 实现的 UTXO 采集器以下是使用 UtxoCollectorSmartbit 获取测试链某个指定地址的 UTXO 示例代码:
// 使用 OmniTool; using OmniTool.UtxoCollectorSmartbit;IUtxoCollector collector = new UtxoCollectorSmartbit("testnet"); // 测试链String[] addresses = new String[] { "1C3TZ...brS2xHM" }; // 地址清单UtxoBag collected = collector.Collect(addresses); // 获取 UTXO 集合Console.WriteLine($"Collected UTXOs: {collected.Total}"); // 打印 UTXO 总额 OmniTool.Net 使用接口 IUtxoSelector 约定 UTXO 的筛选策略。该接口的实现需要根据目标金额从候选 UTXO 中选择可用 UTXO,并返回新的 UTXO 集合。
UtxoBag Select(long target, UtxoBag collected); // 选择可消费 UTXO,返回 UTXO 集合
UtxoSelectorDefault:选择不少于 6 个确认的未消费 UTXO以下是使用 UtxoSelectorDefault 从候选 UTXO 中选择至少 100000 SATOSHI 的示例代码:
// 使用 OmniTool; using OmniTool.UtxoSelectorDefault;IUtxoSelector selector = new UtxoSelectorDefault();UtxoBag collected = // 获取候选 UTXO 集合的代码;例如,调用 UtxoCollector.Collect()selector.Select(100000, collected); // 选择满足条件的 UTXOConsole.WriteLine($"Total > {selector.Selected.Total}"); // 打印选中的 UTXO 总额 OmniTool.Net 使用接口 IBroadcaster 约定 裸交易 的广播功能。该接口的实现需要将裸交易发送到 Omni/Btc 网络中。
String Broadcast(String rawtx); // 广播裸交易
BroadcasterSmartbit:基于云端第三方 API 的裸交易广播器BroadcasterRpc:基于 OmniCore 节点 RPC API 的裸交易广播器以下是使用 BroadcasterSmartbit 广播裸交易的示例代码:
// 使用 OmniTool; using OmniTool.BroadcasterSmartbit;IBroadcaster broadcaster = new BroadcasterSmartbit("testnet"); // 测试链String txid = broadcaster.Broadcast("01000000011da9283b4...59f58488ac00000000"); // 裸交易Console.WriteLine($"Broadcasted Transaction ID: {txid}"); // 打印交易哈希 OmniTool.Net 使用接口 IKeyStore 约定 密钥存储 的功能规格。
bool Add(KeyStoreItem item); // 存入密钥KeyStoreItem[] List(); // 浏览全部密钥KeyStoreItem GetByKey(); // 查询指定 16进制 私钥对应的密钥信息KeyStoreItem GetByWif(); // 查询指定 WIF 格式私钥对应的密钥信息KeyStoreItem GetByAddress(); // 查询指定地址对应的密钥信息KeyStoreItem GetByScript(); // 查询指定公钥脚本对应的密钥信息
KeyStoreMemory:基于内存字典实现的密钥存储库,适合调试KeyStoreSqlite:基于 SQLite 数据库实现的密钥存储库,适合生产环境以下是使用 KeyStoreSqlite 创建并查询密钥的示例代码:
// 使用 OmniTool; using OmniTool.KeyStoreSqlite;ToolKit kit = new ToolKit( "testnet", // 测试链 keyStore: new KeyStoreSqlite("./testnet.wallet") // 密钥存储库);String addr1 = kit.NewAddress("SEGWIT-P2SH"); // 生成隔离见证 P2SH 地址String addr2 = kit.NewAddress("SEGWIT"); // 生成隔离见证地址String addr3 = kit.NewAddress("P2PKH"); // 生成 P2PKH 地址String addr4 = kit.AddKey("4aec8e45106....00d5c5a05b", "SEGWIT-P2SH"); // 导入 16进制 私钥String addr5 = kit.AddWif("cNJFgo1driF...SkdcF6JXXwHMm"); // 导入 WIF 格式私钥KeyStoreItem[] items = kit.List(); // 获取全部密钥记录foreach (var item in items) { Console.WriteLine($"key > {item.Key}"); Console.WriteLine($"wif > {item.Wif}"); Console.WriteLine($"address > {item.Address}"); Console.WriteLine($"script > {item.Script}");}KeyStoreItem item = kit.GetByAddress(addr1); // 查询指定地址的密钥记录Console.WriteLine($"key > {item.Key}"); OmniTool.NET 下载地址:http://sc.hubwiz.com/codebag/omni-dotnet-lib/
转载地址:http://vlyaz.baihongyu.com/