C#对接区块链【LTC/ETC/BCH/XRP】
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 | 密钥库接口及两个实现类:
|
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: 节点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
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的对接,其配置参数及默认值如下:
- RPC_URL:节点RPC接口的URL,默认值:http://localhost:5005
例如,使用测试链的节点,可以如下配置:
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/
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
以太坊批量交易PHP开发包,支持ETHER/ERC20
以太坊批量转账PHP开发包支持以太币ERC20代币的批量转账,有效减少交易手续费。官方下载地址:http://sc.hubwiz.com/codebag/eth-batch-transfer/。 1、以太坊批量转账PHP开发包简介 以太坊批量转账PHP开发包的主要特性如下: 支持以太币和ERC20代币一对多转账 只需要支付一个交易的手续费 支持使用公共节点(例如Infura)或自己部署节点 以太坊批量转账PHP开发包运行于PHP7.1+环境下,主要类及相互关系如下图所示: 以太坊批量转账PHP开发包的主要代码文件清单如下: 代码文件 说明 contract/BatchTransferContract.sol 批量转账合约 contract/Erc20.sol Erc20接口合约 contract/SafeMath.sol 安全计算合约 contract/EzToken.sol 示例代币合约 ethtool/src/BatchTransfer.php 批量转账合约PHP API ethtool/src/EthApi.php EthApi接口定义 ethtool/src/EthApiWeb...
- 下一篇
JavaScript设计模式学习笔记
《JavaScript设计模式与开发实践》14种设计模式学习笔记。 单例模式策略模式代理模式迭代器模式发布-订阅模式命令模式组合模式模板方法模式享元模式职责链模式中介者模式装饰者模式状态模式适配器模式单例模式保证一个类仅有一个实例,并提供一个全局访问点。 // 构造函数var Singleton = function (name) { this.name = name;}Singleton.prototype.getName = function () { alert(this.name);} // 方案1 绑定到构造函数上Singleton.instance = null;Singleton.getInstance = function (name) { if (!this.instance) { this.instance = new Singleton(name); } return this.instance;} // 方案2 闭包Singleton.getInstance = (function () { var instance = null; return functio...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS8安装Docker,最新的服务器搭配容器使用