为对接多种区块链节点提供统一的.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 | 密钥库接口及两个实现类:
|
CoinGate.Core/RpcClient.cs | RPC客户端基类 |
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是一个工厂类,使用其静态方法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是一个包含如下方法声明的接口:
因此,使用上面获得的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:
虽然以上CoinAdapter实现的接口方法一致,但其对配置参数、地址、资金描述信息等数据 的要求各有不同。下面分别说明。
CoinGate.Etc.Adapter实现与Etc节点旳对接。其配置参数说明如下:
例如,使用默认节点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.Adapter实现与Bch节点旳对接,其配置参数说明如下:
例如,使用本地的私有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.Adapter实现与Ltc节点旳对接,其配置参数说明如下:
例如,使用本地的私有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.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是CoinGate的演示项目。在运行CoinGateDemo演示之前,请根据自己的 运行环境修改演示代码,例如:节点URL、交易发起账号、转账金额等,并确保交易发起账号有足够的余额。
修改代码后生成执行程序,然后打开一个控制台,即可进行测试:
CoinGate.Demo.exe ltc # ltc测试
CoinGate.Demo.exe etc # etc测试
CoinGate.Demo.exe bch # bch测试
CoinGate.Demo.exe xrp # xrp测试
本站所提供软件包仅用于学习和研究,请依法合规使用。
本站所提供软件包均提供完整源码,使用前请认真阅读源代码和文档以确保充分理解软件包的设计与功能实现,本站不承担 因不当使用本站所提供软件包而造成的任何法律风险或财产损失责任。