cover

区块链钱包对接.NET开发包

汇智网 / hubwiz.com

简化PHP以太坊应用开发,避免部署自己的以太坊节点。

CoinGate实现了与以太坊、比特币和usdt的对接网关,并为二次开发提供了一致的API接口。

CoinGate运行于.net 4.5.2,当前版本1.0.0,文件清单如下:

代码文件说明
CoinGate/Gateway.cs钱包对接网关
CoinGate/CoinAdapter.cs币种适配器父类
CoinGate/FaceValue.cs币种面值处理父类
CoinGate/BitcoinAdapter.cs比特币适配器
CoinGate/BitcoinFaceValue.cs比特币面值处理
CoinGate/EthereumAdapter.cs以太坊适配器
CoinGate/EthereumFaceValue.cs以太坊面值处理
CoinGate/OmniAdapter.csOmni适配器(usdt)
CoinGate/OmniFaceValue.csOmni面值处理
CoinGateDemo/Program.cs库使用示例代码

1、网关:Gateway

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

CoinAdapter adapter = Gateway.GetAdapter("eth");

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

NameValueCollection config = new NamveValueCollection 
{
  {"RPC_URL", "http://192.168.1.78:8545"}
};
CoinAdapter adapter = Gateway.GetAdapter("eth",config);

2、币种适配器:CoinAdapter

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

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

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

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

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

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

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

string txid = adapter.Transfer("0x1b7f44dac2b9e668d7f22372c8b40c9f9d611e7a",
                               "0x25087c725a889420db219746296bd9dc2f18c497","1000 wei");

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

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

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

在目前的实现中,置信度对应于交易的确认数,因此未确认的交易,其置信度为0;当交易上链 时,其置信度为1;包含交易的区块之后出现越多的区块,交易的置信度就越高。

CoinAdapter目前有三个实现,分别用于对接以太坊、比特币和USDT:

  • EthereumAdapter
  • BitcoinAdapter
  • OmniAdapter

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

2.1 以太坊

EthereumAdapter实现与以太坊节点旳对接。其配置参数说明如下:

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

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

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

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

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

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

0x1b7f44dac2b9e668d7f22372c8b40c9f9d611e7a

2.2 比特币

BitcoinAdapter实现与比特币节点旳对接,其配置参数说明如下:

  • 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:18443"},
  {"NETWORK","RegTest"}
};
CoinAdapter = Gateway.GetAdapter("btc",config);

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

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

BitcoinAdapter的方法调用参数与返回结果,涉及到地址的,均表示比特币地址,即 Base58编码的哈希值,例如:

17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhem

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

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

2.3 USDT

USDT是OmniLayer层的一个代币,因此我们使用OmniAdapter实现与USDT的对接, 其配置参数及默认值如下:

  • RPC_URL:节点RPC接口的URL,默认值:http://localhost:8332
  • RPC_USER:节点RPC接口的用户名,默认值:user
  • RPC_PASS:节点RPC接口的密码,默认值:pass
  • NETWORK:节点所接入的网络,默认值:Main,可选:Main / TestNet / RegTest
  • PROPERTY_ID:代币资产ID,默认值:31,即USDT

例如,使用本地私有链上的代币17892进行测试,可以如下配置:

NameValueCollection config = new NameValueCollection
{
  {"RPC_URL", "http://localhost:18332"},
  {"NETWORK", "RegTest"},
  {"PROPERTY_ID", "17892"}
};
CoinAdapter adapter = Gateway.GetAdapter("omni",config);

OmniAdapter的Transfer()方法可接受的资金描述信息,目前仅支持单位:usdt, 数值部分可以包含小数点,例如:100.00 usdt

OmniAdapter的GetBalance()方法返回的字符串为指定账户代币余额数值。

由于OmniLayer是在比特币协议上叠加的一层,因此OmniAdapter也使用比特币地址。 同时需要注意的一点是,由于转账的交易费采用比特币支付,因此USDT转账交易的发起账户 除了有足够的usdt余额,还需要有一定的比特币余额来支付手续费。

CoinGateDemo

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

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

测试以太坊对接:

> CoinGateDemo.exe eth

测试比特币对接:

> CoinGateDemo.exe btc

测试USDT对接:

> CoinGateDemo.exe omni

由于USDT宿主在比特币之上,因此交易发起账号还需要有一定的比特币余额用于 支付交易手续费。

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