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+