CoinGateX实现了与ltc、etc、bch和xrp的对接网关,并为.NET应用开发提供了一致的API接口。CoinGateX官方下载地址:http://sc.hubwiz.com/codebag/coingatex.net/。
1、CoinGateX概述
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.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 |
示例代码配置文件 |
2、网关/CoinGate.Core.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表示在应用程序的当前目录或系统路径中查找该程序集。
3、货币适配器/CoinGate.Core.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实现的接口方法一致,但其对配置参数、地址、资金描述信息等数据的要求各有不同。下面分别说明。
4、以太坊经典对接/CoinGate.Etc
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
5、比特币现金对接/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实例才可以使用该地址。
6、莱特币对接/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实例才可以使用该地址。
7、瑞波币对接/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节点内置使用的eyStore对象,例如自己实现一个基于SQL数据库的KeyStore,也可以在生成新的地址后,利用适配器的KeyStore属性获取该地址对应的密钥种子存储到自己的库中。
Xrp的另一个特点是其地址需要20 xrp的储备金才能生效,因此新创建的地址,需要向其至少注入20个xrp来激活该地址。
8、演示程序/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测试
CoinGateX开发包官方下载地址:http://sc.hubwiz.com/codebag/coingatex.net/