cover

区块链对接.NET开发包(二)

汇智网 / hubwiz.com

为对接多种区块链节点提供统一的.NET开发接口,内置多种主流数字货币的支持。

CoinGateX实现了与ltc、etc、bch和xrp的对接网关,并为二次开发 提供了一致的API接口。

CoinGateX运行于.net 4.6.1,当前版本1.0.0,主要代码文件清单如下:

代码文件说明
CoinGate.Core/Gateway.cs数字货币网关
CoinGate.Core/CoinAdapter.cs数字货币适配器接口
CoinGate.Core/FaceValue.cs币种面值处理父类
CoinGate.Core/KeyStore.cs密钥库接口及两个实现类:
  • MemoryKeyStore:内存密钥库
  • EsentKeyStore:Esent存储密钥库
CoinGate.Core/RpcClient.csRPC客户端基类
CoinGate.Ltc/Adapter.cs莱特币/LTC适配器
CoinGate.Ltc/FaceValue.cs莱特币/LTC面值处理
CoinGate.Ltc/NetworkSet.cs莱特币/LTC网络参数
CoinGate.Etc/Adapter.cs以太坊经典/ETC适配器
CoinGate.Etc/FaceValue.cs以太坊经典/ETC面值处理
CoinGate.Etc/RpcMessage.cs以太坊经典/ETC通信消息实现
CoinGate.Bch/Adapter.cs比特币现金/BCH适配器
CoinGate.Bch/FaceValue.cs比特币现金/BCH面值处理
CoinGate.Bch/NetworkSet.cs比特币现金/BCH网络参数
CoinGate.Bch/AltTransaction.cs比特币现金/BCH交易扩展实现
CoinGate.Xrp/Adapter.cs瑞波/XRP适配器
CoinGate.Xrp/FaceValue.cs瑞波/XRP面值处理
CoinGate.Xrp/RpcMessage.cs瑞波/XRP通信消息实现
CoinGate.Demo/Program.cs库使用示例代码
CoinGate.Demo/app.config示例代码配置文件

网关/Gateway

Gateway是一个工厂类,使用其静态方法GetAdapter()获取一个针对特定数字币的适配器, 例如下面的代码获取一个采用默认配置参数的Xrp适配器实例:

CoinAdapter adapter = Gateway.GetAdapter("CoinGate.Xrp.dll","CoinGate.Xrp.Adapter");

可以传入额外的配置对象来定制适配器的行为。例如修改默认的节点RPC地址:

NameValueCollection config = new NamveValueCollection 
{
  {"RPC_URL", "http://192.168.1.78:5005"}
};
CoinAdapter adapter = Gateway.GetAdapter("CoinGate.Xrp.dll","CoinGate.Xrp.Adapter",config);

也可以利用配置文件声明适配器的参数,例如:

CoinAdapter adapter = Gateway.GetAdapterFromConfig("xrp");

app.config中配置如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="xrp" type="System.Configuration.NameValueSectionHandler"/>
  </configSections>

  <xrp>
    <add key="assembly" value="CoinGate.Xrp.dll"/>
    <add key="adapter" value="CoinGate.Xrp.Adapter"/>
    <add key="RPC_URL" value="http://192.168.1.72:5005"/>
  </xrp>

  <!--more section-->  
</configuration>

注意,由于Gateway基于反射实现适配器的动态载入,因此在配置文件中的assembly键所指向的 实现程序集必须是可以在文件系统中定位的。例如CoinGate.Xrp.dll表示在应用程序 的当前目录或系统路径中查找该程序集。

货币适配器/CoinAdapter

CoinAdapter是一个包含如下方法声明的接口:

  • string NewAddress() :创建一个新地址
  • string GetBalance(string address):获取指定地址的余额
  • string Transfer(string from, string to, string asset):一对一转账
  • BigInteger GetConfidence(string txid):获取交易置信度
  • KeyStore KeyStore {get;}:密钥库

因此,使用上面获得的adapter实例,可以创建一个新地址,例如:

string address = adapter.NewAddress();
Console.WriteLine("address => {0}", address);

或者获取指定地址的余额,例如:

string balance = adapter.GetBalance("r9GfTV6qg64vKQFUTQsAWwHgcfdCm55Q9e");
Console.WriteLine("balance => {0}", balance);

或者执行一对一转账,例如:

string txid = adapter.Transfer("r9GfTV6qg64vKQFUTQsAWwHgcfdCm55Q9e",
                               "r9p1xSmPDnLjvJahc9mm3UmxaFvEB78LFA","1000 drop");

Transfer()方法的前两个参数分别为转出地址和转入地址,第三个参数为资金描述信息,例如1000 drop 表示要转移的资金数量为1000,单位为drop,xrp的最小单位,1 xrp = 1000000 drop。

Transfer()方法返回提交给区块链节点的转账交易ID,并不表示该交易被确认。因此交易发起方应当 在提交转账交易后定期检查交易置信度,例如:

BigInteger cf = adapter.GetConfidence(txid);
Console.WriteLine("confidence => {0}", cf);

在目前的xrp实现中,因此未确认的交易,其置信度为0;当交易确认后,其置信度为1。

CoinAdapter目前有四个实现,分别用于对接xrp、bch、etc和ltc:

  • CoinGate.Xrp.Adapter
  • CoinGate.Bch.Adapter
  • CoinGate.Etc.Adapter
  • CoinGate.Ltc.Adapter

虽然以上CoinAdapter实现的接口方法一致,但其对配置参数、地址、资金描述信息等数据 的要求各有不同。下面分别说明。

以太坊经典/CoinGate.Etc

CoinGate.Etc.Adapter实现与Etc节点旳对接。其配置参数说明如下:

  • RPC_URL: 节点RPC接口的URL,默认值:http://localhost:8545
  • ACCOUNT_PASS: 节点账户的固定密码,默认值:123456

例如,使用默认节点RPC接口URL,但设置一个复杂点的节点账户密码:

NameValueCollection config = new NameValueCollection
{
  { "ACCOUNT_PASS", "2WEKaVNO"}
};

CoinGate.Etc.Adapter的Transfer()方法可接受的资金描述信息,目前支持单位:wei、eth, 当使用wei作为计量单位时,数值必需为不包含小数点的全数字,例如:23100000 wei; 当使用eth作为计量单位时,数值可以包含小数部分,例如:0.02 eth

CoinGate.Etc.Adapter的GetBalance()方法返回的字符串为指定账户余额数值,计量单位:wei。

CoinGate.Etc.Adapter的方法调用参数与返回结果,涉及到地址的,均表示以太坊地址,即包含0x 前缀的20字节16进制字符串,大小写不敏感,例如:

0x1b7f44dac2b9e668d7f22372c8b40c9f9d611e7a

比特币现金/CoinGate.Bch

CoinGate.Bch.Adapter实现与Bch节点旳对接,其配置参数说明如下:

  • RPC_URL:节点RPC接口的URL,默认值:http://localhost:8332
  • RPC_USER:节点RPC接口的用户名,默认值:user
  • RPC_PASS:节点RPC接口的密码,默认值:pass
  • MIN_CONFIRMATIONS:交易最小确认数,默认值:1
  • MAX_CONFIRMATIONS:交易最大确认数,默认值:9999999
  • RELAY_FEE:中继费,默认值:10000,计量单位为satoshi
  • NETWORK:节点所接入的网络,默认值:Main,可选:Main / TestNet / RegTest

例如,使用本地的私有bitcoind节点:

NameValueCollection config = new NameValueCollection
{
  {"RPC_URL","http://localhost:18332"},
  {"NETWORK","RegTest"}
};
CoinAdapter adapter = Gateway.GetAdapter("CoinGate.Bch.dll","CoinGate.Bch.Adapter",config);

CoinGate.Bch.Adapter的Transfer()方法可接受的资金描述信息,目前支持单位:sat、btc, 当使用sat作为参数时,数值中不能包含小数点,例如:2000000 sat; 当使用btc作为参数时,数值中可以包含小数点,例如:0.02 btc

CoinGate.Bch.Adapter的GetBalance()方法返回的字符串为指定账户余额数值,单位:sat。

CoinGate.Bch.Adapter的方法调用参数与返回结果,涉及到地址的,均表示Bch地址,即 Base58编码的哈希值,例如下面三个地址分别表示主网、测试网和regtest私链上的地址:

bitcoincash:qpzry9x8gf2tvdw0s3jn54khce6mua7lcw20ayyn    # 主网
bchtest:pr6m7j9njldwwzlg9v7v53unlr4jkmx6eyvwc0uz5t      # 测试网                
bchreg:qre4588qnhtx44gc8ep4dz9gpt73kwmpegq7z5en0y       # regtest私链

比特币存在多个网络,并且有多种地址形式,同一个私钥也可能有多种不同的地址。可以 参考官方的Bitcoin cash地址格式 进一步了解。

需要指出的是,在CoinGate.Bch.Adapter的方法调用时传入的地址参数,应当与创建 适配器实例时设定的网络相一致。例如上例中的地址是一个主网地址,因此需要 创建一个主网的CoinGate.Bch.Adapter实例才可以使用该地址。

莱特币/CoinGate.Ltc

CoinGate.Ltc.Adapter实现与Ltc节点旳对接,其配置参数说明如下:

  • RPC_URL:节点RPC接口的URL,默认值:http://localhost:8332
  • RPC_USER:节点RPC接口的用户名,默认值:user
  • RPC_PASS:节点RPC接口的密码,默认值:pass
  • MIN_CONFIRMATIONS:交易最小确认数,默认值:1
  • MAX_CONFIRMATIONS:交易最大确认数,默认值:9999999
  • RELAY_FEE:中继费,默认值:10000,计量单位为satoshi
  • NETWORK:节点所接入的网络,默认值:Main,可选:Main / TestNet / RegTest

例如,使用本地的私有bitcoind节点:

NameValueCollection config = new NameValueCollection
{
  {"RPC_URL","http://localhost:9432"},
  {"NETWORK","RegTest"}
};
CoinAdapter adapter = Gateway.GetAdapter("CoinGate.Ltc.dll","CoinGate.Ltc.Adapter",config);

CoinGate.Ltc.Adapter的Transfer()方法可接受的资金描述信息,目前支持单位:pho、ltc, 当使用pho作为参数时,数值中不能包含小数点,例如:2000000 pho; 当使用ltc作为参数时,数值中可以包含小数点,例如:0.02 ltc

CoinGate.Ltc.Adapter的GetBalance()方法返回的字符串为指定账户余额数值,单位:pho。

CoinGate.Ltc.Adapter的方法调用参数与返回结果,涉及到地址的,均表示Ltc地址,即 Base58编码的哈希值,例如:

QZhQvRMQVM7RaacE5SYq146UxaQ4r5fcEY

需要指出的是,在CoinGate.Ltc.Adapter的方法调用时传入的地址参数,应当与创建 适配器实例时设定的网络相一致。例如上例中的地址是一个主网地址,因此需要 创建一个主网的CoinGate.Ltc.Adapter实例才可以使用该地址。

瑞波币/CoinGate.Xrp

CoinGate.Xrp.Adapter实现与Ripple的对接,其配置参数及默认值如下:

例如,使用测试链的节点,可以如下配置:

NameValueCollection config = new NameValueCollection
{
  {"RPC_URL", "https://s.altnet.rippletest.net:51234"}
};
CoinAdapter adapter = Gateway.GetAdapter("CoinGate.Xrp.dll","CoinGate.Xrp.Adapter",config);

CoinGate.Xrp.Adapter的Transfer()方法可接受的资金描述信息,目前支持单位:drop, 当使用drop作为参数时,数值中不能包含小数点,例如:2000000 drop,1 xrp = 1000000 drop。

CoinGate.Xrp.Adapter的GetBalance()方法返回的字符串为指定账户代币余额数值,单位:drop。

由于Xrp节点没有钱包功能,因此Xrp适配器内置有基于Esent引擎的KeyStore实现, 用来管理Xrp适配器生成的密钥(种子)和地址。也可以实现一个自己的KeyStore类,替代 Xrp节点内置使用的KeyStore对象,例如自己实现一个基于SQL数据库的KeyStore, 也可以在生成新的地址后,利用适配器的KeyStore属性获取该地址对应的密钥种子 存储到自己

Xrp的另一个特点是其地址需要20 xrp的储备金才能生效,因此新创建的地址,需要向 其至少注入20个xrp来激活该地址。

演示程序/CoinGateDemo

CoinGateDemo是CoinGate的演示项目。在运行CoinGateDemo演示之前,请根据自己的 运行环境修改演示代码,例如:节点URL、交易发起账号、转账金额等,并确保交易发起账号有足够的余额。

修改代码后生成执行程序,然后打开一个控制台,即可进行测试:

CoinGate.Demo.exe ltc    # ltc测试
CoinGate.Demo.exe etc    # etc测试  
CoinGate.Demo.exe bch    # bch测试
CoinGate.Demo.exe xrp    # xrp测试

声 明

本站所提供软件包仅用于学习和研究,请依法合规使用。

本站所提供软件包均提供完整源码,使用前请认真阅读源代码和文档以确保充分理解软件包的设计与功能实现,本站不承担 因不当使用本站所提供软件包而造成的任何法律风险或财产损失责任。

¥9500.00
查看授权信息
  • 付费成功自动开通下载
  • 三个月内代码免费升级
  • 专业人员在线技术支持
  • 支持按需定制(另付费)
下载代码包
版本发布日期地址
1.0.0 2020-2-1
下载最新版
QQ咨询
2860991437
9+