跨链资产闪兑¶
当全节点与全网同步所有区块后,我们可以用命令行工具(hbtccli)与HBTC Chain进行交互,可以运行以下指令查询所有的命令。
$ hbtccli help
我们给出跨链资产充币,闪兑和提币的流程简介,用两个用户alice与bob为例介绍完整的交互流程。(假设我们的二进制运行在本机的node目录下,alice与bob为两个不同的用户)。
1. 创建和管理霍比特链托管单元¶
$ hbtccli keys add alice --home node/hbtccli
通过该命令我们在指定的node目录下创建了一个alice的托管单元(创建过程中需要输入你的密码对托管单元密钥进行加密存储),创建成功后展示如下:
{
"name": "alice",
"address": "HBCPNuLKXuQSVgGe4kfF3JxJZb1Uytkajb3Q",
"pubkey": "hbcpub1addwnpepqdp4ac6l2f7tjtwssvdra7fy2xfrl8th4ltcx4dgy60z2a7ffx5lcu2ja8v",
}
这样,alice就为自己离线创建了一个账户,同样,bob也按照相同的操作创建一个账户如下:
{
"name": "bob",
"address": "HBCcUCWJNattE5PYm6xQKbaCoRCG2SaVdHvH",
"pubkey": "hbcpub1addwnpepqddz9uqphxcphs50j9ewqeccymkl66n2nqkes3h4w8xrna39qxm0jwk688c",
}
完成这个操作后需要向HBTC Chain申请一定的hbc用来测试,具体申请方式请参考FAQ。
2. 创建比特币和以太坊的跨链托管地址¶
首先,为alice托管单元创建一个BTC的跨链托管地址,操作命令如下:
$ hbtccli tx keygen keygen alice btc HBCPNuLKXuQSVgGe4kfF3JxJZb1Uytkajb3Q --chain-id hbtc-testnet --home node/hbtccli
通过这个命令alice创建了一个btc跨链托管单元地址,命令发送执行后等待2-3个区块后(密钥的分布式生成需要一定的时间),我们通过下面的命令查询对应的托管单元信息,可以获取到alice的btc跨链托管地址:
$ hbtccli query cu cuinfo HBCPNuLKXuQSVgGe4kfF3JxJZb1Uytkajb3Q --chain-id hbtc-testnet --home node/hbtccli
查询的结果展示为:
{
"type": "hbtcchain/CustodianUnit",
"value": {
"address": "HBCPNuLKXuQSVgGe4kfF3JxJZb1Uytkajb3Q",
"assets": [
{
"denom": "btc",
"address": "12ayvTjKBxZnScRoEZ67seVySsqD5JboaA",
"enable_sendtx": true
}
],
}
}
从查询到的信息看,为alice托管单元在创建了一个btc的跨链托管地址(mtZQH3wjTGu8FgPrS7B6gicay4kcPVa1wa),并且这个地址的密钥由各个记账人节点分布式保存其中的分片。 同样的原理,bob为自己创建了一个eth/usdt的跨链托管地址,其数据查询如下:
{
"type": "hbtcchain/CustodianUnit",
"value": {
"address": "HBCcUCWJNattE5PYm6xQKbaCoRCG2SaVdHvH",
"assets": [
{
"denom": "usdt",
"address": "0xB48fEe1Df0Ae85415Eb286E66b262DA70BD94693",
"nonce": "0",
"enable_sendtx": true
},
{
"denom": "eth",
"address": "0xB48fEe1Df0Ae85415Eb286E66b262DA70BD94693",
"nonce": "0",
"enable_sendtx": true
}
],
}
}
3. 充入跨链资产¶
通过上述步骤,alice和bob分别创建了btc/eth相关的跨链地址,alice可以通过自己的钱包向自己的跨链btc地址(12ayvTjKBxZnScRoEZ67seVySsqD5JboaA)充入一定输了的btc,bob可以向自己的eth跨链地址(0xB48fEe1Df0Ae85415Eb286E66b262DA70BD94693)充入一定的eth和btc,充值完成后,HBTC Chain会自动扫描托管单元的跨链地址,把对应的充值记账到HBTC Chain 对应的托管单元上。比如,bob充值了0.5eth和100tusdt,查询对应托管单元的信息如下:
{
"type": "hbtcchain/CustodianUnit",
"value": {
"address": "HBCcUCWJNattE5PYm6xQKbaCoRCG2SaVdHvH",
"coins": [
{
"denom": "eth",
"amount": "500000000000000000"
},
{
"denom": "usdt",
"amount": "100000000"
}
],
"assets": [
{
"denom": "tusdt",
"address": "0xB48fEe1Df0Ae85415Eb286E66b262DA70BD94693",
"nonce": "0",
"enable_sendtx": true
},
{
"denom": "eth",
"address": "0xB48fEe1Df0Ae85415Eb286E66b262DA70BD94693",
"nonce": "2",
"enable_sendtx": true
}
],
}
可以很清晰的看到bob的托管单元里面已经有了对应的资产,同理,alice的账户也会有对应充值进去的btc资产。
4. 跨链资产闪兑¶
alice和bob分别充入了对应的btc和eth/usdt的资产,充值完成后(HBTC Chain链上资产可以查询验证),alice决定和bob进行一次资产兑换,用alice的btc兑换bob的usdt,资产兑换的流程如下:
1.构建闪兑交易¶
alice和bob可以分别在本地构建相同的兑换交易,alice用0.05btc和bob的100usdt进行兑换,其交易构建命令如下:
$ hbtccli tx transfer multisend HBCPNuLKXuQSVgGe4kfF3JxJZb1Uytkajb3Q 5000000btc HBCcUCWJNattE5PYm6xQKbaCoRCG2SaVdHvH 100000000usdt 0 --output-document swapmsg.json --home node/hbtccli
该命令执行后,会在当前执行目录下生成一个swapmsg.json的文件,文件内容为对应的交易内容。
2.交易签名¶
交易构建完成后,alice和bob分别对该交易进行签名,交易签名的命令如下:
$ hbtccli tx sign swapmsg.json --from HBCPNuLKXuQSVgGe4kfF3JxJZb1Uytkajb3Q --home node/hbtccli --output-document alicesign.json
签名后的交易保存在当前只想目录下的alicesign.json里,其文件内容如下:
{
"type": "hbtcchain/StdTx",
"value": {
"msg": [
{
"type": "hbtcchain/transfer/MsgMultiSend",
"value": {
"inputs": [
{
"address": "HBCPNuLKXuQSVgGe4kfF3JxJZb1Uytkajb3Q",
"coins": [
{
"denom": "btc",
"amount": "5000000"
}
]
},
{
"address": "HBCcUCWJNattE5PYm6xQKbaCoRCG2SaVdHvH",
"coins": [
{
"denom": "usdt",
"amount": "100000000"
}
]
}
],
"outputs": [
{
"address": "HBCPNuLKXuQSVgGe4kfF3JxJZb1Uytkajb3Q",
"coins": [
{
"denom": "usdt",
"amount": "100000000"
}
]
},
{
"address": "HBCcUCWJNattE5PYm6xQKbaCoRCG2SaVdHvH",
"coins": [
{
"denom": "btc",
"amount": "5000000"
}
]
}
],
"max_height": "0"
}
}
],
"fee": {
"amount": [],
"gas": "200000"
},
"signatures": [
{
"pub_key": {
"type": "tendermint/PubKeySecp256k1",
"value": "A0Ne419SfLkt0IMaPvkkUZI/nXev14NVqCaeJXfJSan8"
},
"signature": "jVd+LPWQLSUhKYCo2Rsn24NizEv5GwDafvtFZM5nuNEPZelRCJ5CbjeIv4DtsUL5HRd5Iy3GMrnjJhmSKMM5zA=="
}
],
"memo": ""
}
}
同样,bob通过如下命令对该交易进行签名:
$ hbtccli tx sign exchangemsg.json --from HBCcUCWJNattE5PYm6xQKbaCoRCG2SaVdHvH --home node/hbtccli --output-document bobsign.json
bob和alice分别签名完成后,bob把签名信息发送给alice,alice把bob的的签名消息组装到交易里面去,放到交易的signatures里面,组装完成的交易后是:
{
"type": "hbtcchain/StdTx",
"value": {
"msg": [
{
"type": "hbtcchain/transfer/MsgMultiSend",
"value": {
"inputs": [
{
"address": "HBCPNuLKXuQSVgGe4kfF3JxJZb1Uytkajb3Q",
"coins": [
{
"denom": "btc",
"amount": "5000000"
}
]
},
{
"address": "HBCcUCWJNattE5PYm6xQKbaCoRCG2SaVdHvH",
"coins": [
{
"denom": "usdt",
"amount": "100000000"
}
]
}
],
"outputs": [
{
"address": "HBCPNuLKXuQSVgGe4kfF3JxJZb1Uytkajb3Q",
"coins": [
{
"denom": "usdt",
"amount": "100000000"
}
]
},
{
"address": "HBCcUCWJNattE5PYm6xQKbaCoRCG2SaVdHvH",
"coins": [
{
"denom": "btc",
"amount": "5000000"
}
]
}
],
"max_height": "0"
}
}
],
"fee": {
"amount": [],
"gas": "200000"
},
"signatures": [
{
"pub_key": {
"type": "tendermint/PubKeySecp256k1",
"value": "A0Ne419SfLkt0IMaPvkkUZI/nXev14NVqCaeJXfJSan8"
},
"signature": "jVd+LPWQLSUhKYCo2Rsn24NizEv5GwDafvtFZM5nuNEPZelRCJ5CbjeIv4DtsUL5HRd5Iy3GMrnjJhmSKMM5zA=="
},
{
"pub_key": {
"type": "tendermint/PubKeySecp256k1",
"value": "A1oi8AG5sBvCj5Fy4GcYJu39amqYLZhG9XHMOfYlAbb5"
},
"signature": "/W9RJqOvx3RImGFzq7p02bw1oUW9S2L61tOCoF9TwwFAlHAKChf2HIwrwZjLUf3d81t6T4pR0L7ph4PiS2yKXw=="
}
],
"memo": ""
}
}
我们交易组装后保存为swaptx.json。
3.交易发送¶
$ hbtccli tx broadcast swaptx.json
通过该命令我们完成了alice和bob的交易,alice的0.05个btc交换到了bob的100usdt,交易完成后可以通过查看对应的托管单元的资产,比如alice的资产展示为:
{
"type": "hbtcchain/CustodianUnit",
"value": {
"address": "HBCPNuLKXuQSVgGe4kfF3JxJZb1Uytkajb3Q",
"coins": [
{
"denom": "usdt",
"amount": "100000000"
}
],
}
可以看到,bob成功换到了100usdt,这样我们完成了资产闪兑。
4.交易取消¶
存在一种情况,alice签名完成后,把签名后的信息发送给bob,但是由于一些别的原因,alice不想再继续交易,如果bob未把签名组装后的交易发送到链上,alice可以主动发送如下交易取消该交易,其命令如下:
$ hbtccli tx transfer cancel-uncommitted-tx alice --home node/hbtccli
另外,我们可以在组装兑换交易的时候,指定一个最大成交高度(为交易的第五个参数),如果超过该高度后交易发送到链上,交易也不会被成交(如果填0,则表示该交易不限制高度)。
5. 提出跨链资产¶
alice和bob交易完成后,alice想提出交易获取到的100usdt到自己的钱包中,则可以执行如下命令:
$ hbtccli tx transfer withdrawal alice 0xC933C741416151dAcFE9428d39222f747e2b45EB 100000000usdt 21000000000000000 --chain-id hbtc-testnet --home node/hbtccli
通过该命令,alice把自己通过交易获取到的100usdt提现到自己的eth账户(0xC933C741416151dAcFE9428d39222f747e2b45EB 非托管地址)上,通过一定区块高度后,用户可以在自己的钱包账户看到提现到账信息。(注:alice如果想提取usdt,需要在链上充入或者交易获取到一定的eth作为手续费)。