简化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.cs | Omni适配器(usdt) |
CoinGate/OmniFaceValue.cs | Omni面值处理 |
CoinGateDemo/Program.cs | 库使用示例代码 |
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);
CoinAdapter是一个包含如下方法声明的接口:
因此,使用上面获得的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:
虽然以上CoinAdapter实现的接口方法一致,但其对配置参数、地址、资金描述信息等数据 的要求各有不同。下面分别说明。
EthereumAdapter实现与以太坊节点旳对接。其配置参数说明如下:
例如,使用默认节点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
BitcoinAdapter实现与比特币节点旳对接,其配置参数说明如下:
例如,使用本地的私有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实例才可以使用该地址。
USDT是OmniLayer层的一个代币,因此我们使用OmniAdapter实现与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演示之前,请根据自己的运行环境修改演示代码,例如: 节点URL、交易发起账号、转账金额等,并确保交易发起账号有足够的余额。
修改代码后生成执行程序,然后打开一个控制台,即可进行测试。
测试以太坊对接:
> CoinGateDemo.exe eth
测试比特币对接:
> CoinGateDemo.exe btc
测试USDT对接:
> CoinGateDemo.exe omni
由于USDT宿主在比特币之上,因此交易发起账号还需要有一定的比特币余额用于 支付交易手续费。
本站所提供软件包仅用于学习和研究,请依法合规使用。
本站所提供软件包均提供完整源码,使用前请认真阅读源代码和文档以确保充分理解软件包的设计与功能实现,本站不承担 因不当使用本站所提供软件包而造成的任何法律风险或财产损失责任。