跨链原子交换的流程解析
扫描二维码
随时随地手机看文章
跨链原子交换概念介绍:
假设Alice持有BTC,想要换取Bob持有的LV。双方达成了交易医意愿,并确定了兑换比例和具体的交易金额。双方如何进行交易呢?
-如果Alice先把比特币转账给Bob,Alice会担心万一Bob收了比特币就逃跑了、消失了。如果Bob先把LV转账给Alice,Bob同样需要担心Alice可能会逃跑、消失。
因此,数字货币之间的交易,往往需要一个可信第三方,例如交易所或者交易见证人。
那么是否有可能在没有中介、交易双方也不完全信任对方的情况下完成交易呢?
跨链原子交换,就提供了一种完全依赖链上交易、保证两种数字货币之间能够在无中介的情况下无风险交易的方式。所谓“原子交换”,是指交易要么整体完成,要么整体失败,不会因一方完成而另一方失败造成单方损失。
LV-BTC跨链原子交换全流程:(假设Alice持有BTC,想要换取Bob持有的LV)
STEP1:Alice发起交易
STEP2:Bob响应交易
STEP3:Alice取走LV
STEP4:Bob取走BTC
说明:当前版本的LV-BTC跨链原子交换机仅为全节点钱包内置(0.3.4版本开始支持),用户需要有操作全节点钱包(命令行方式)的基础。未来,Lava会进一步完善跨链原子交换机的使用体验。
【STEP 1:Alice发起交易】
“我是Alice,我手里持有BTC,要交换Bob手里持有的LV。我们已经约定好了交易的数量和价格。现在需要由我来发起跨链原子交换!”
1. 首先,自定义一个谜底,比如说 “abcd”,记住千万不能告诉任何人!
接着,通过getimage获取相应的谜面(imagehash)。
输入:自定义的谜底,此处为abcd
返回:{ “preimage”: “abcd”,
“imagehash_SHA256”: “123d4c7ef2d1600a1b3a0f6addc60a10f05a3495c9409f2ecbf4cc095d000a6b”,
“imagehash_RIPEMD160”: “a21c2817130deaa1105afb3b858dbd219ee2da44”}
2. 然后可以开始构造BTC上的HTLC交易:先创建一个BTC冻结地址。
使用createhtlcaddress接口。输入:
•Bob的BTC地址(私下问bob要):
mgLqJcG6kykw636f4B8BtKjx5HUmnH1442,
•我自己的BTC地址:
mfmJmsGPgoJGPY4yzZsDj4Z5CfpWUQQHHD,
•上面的谜题(选取短的即可):
a21c2817130deaa1105afb3b858dbd219ee2da44
•这笔钱的冻结高度(BTC高度):
1609905 (注意,这里的高度含义是当BTC主网超过这个高度时,我有权直接收回冻结的BTC。)
返回:
{“address”: “2MwjSbwWbq6u3Yyvrz67meWUZ6WaaVqdFbT”,
“redeemScript”:
“63a614a21c2817130deaa1105afb3b858dbd219ee2da448876a914090e217eff3b75215b5d106ad861d40e0d46af776703b19018b17576a91402b6eb3eb965532c942f1c112c585716db12b0636888ac”}
3. 现在,对上面产生的冻结地址:
“2MwjSbwWbq6u3Yyvrz67meWUZ6WaaVqdFbT”
转入约定数量的BTC。转账完成后,这些BTC就暂时冻结在这个地址中了。
冻结完成后,将以下三个信息私下通知给Bob,等待Bob响应即可。
我自己的BTC地址:
mfmJmsGPgoJGPY4yzZsDj4Z5CfpWUQQHHD,
上面的谜面(选取短的即可):
a21c2817130deaa1105afb3b858dbd219ee2da44
(千万别把谜底“abcd”告诉Bob!)
这笔钱的冻结高度(BTC高度):
1609905
【STEP 2:Bob响应交易】
“我是Bob,我手里持有LV,要交换Alice手里持有的BTC。我们已经约定好了交易的数量和价格。Alice已经跨出了第一步,现在我该做什么呢?”
1. 首先,要对Alice发起的交易进行验证。
假设现在我(Bob)收到了Alice通过微信发给你的三个信息:
•Alice的BTC地址:
mfmJmsGPgoJGPY4yzZsDj4Z5CfpWUQQHHD,
•一个很难解的谜面:
a21c2817130deaa1105afb3b858dbd219ee2da44
•Alice设定的BTC冻结高度:1609905
接下来,我需要验证Alice给我的信息的真实性和有效性:
首先验证冻结高度1609905是否已经到达?
→如果主网已经到达了1609905,那么不能再操作,告诉Alice不交易了,让她取回自己的BTC。
→如果高度未到达,我就可以继续操作。通过上述信息调用createhtlcaddress接口,复现Alice的操作,依次输入:
•我(Bob)自己的BTC地址:
mgLqJcG6kykw636f4B8BtKjx5HUmnH1442,
•Alice的BTC地址:
mfmJmsGPgoJGPY4yzZsDj4Z5CfpWUQQHHD,
•上面的谜题:
a21c2817130deaa1105afb3b858dbd219ee2da44
•Alice手中BTC的冻结高度(BTC高度):1609905
返回:
{“address”: “2MwjSbwWbq6u3Yyvrz67meWUZ6WaaVqdFbT”,
“redeemScript”: “63a614a21c2817130deaa1105afb3b858dbd219ee2da448876a914090e217eff3b75215b5d106ad861d40e0d46af776703b19018b17576a91402b6eb3eb965532c942f1c112c585716db12b0636888ac”}
其次验证Alice是否已经往该冻结地址中转入BTC?
去浏览器上查询:
“2MwjSbwWbq6u3Yyvrz67meWUZ6WaaVqdFbT”地址的交易记录,看看Alice有没有给它转账约定数量的BTC。这个数量也就是之后我(Bob)会获得的BTC数量。
以上验证步骤,有任何一个地方出现问题,请立即终止交易!
2.验证通过,Alice没骗我。下面我需要构造一笔冻结LV的交易,以响应Alice的交易请求。
与Alice流程一样,我开始构造Lava上的HTLC交易,创建一个Lava的冻结地址。
使用createhtlcaddress接口。依次输入:
•Alice的Lava地址(私下问Alice要):
mfmJmsGPgoJGPY4yzZsDj4Z5CfpWUQQHHD,
•自己的Lava地址:
mgLqJcG6kykw636f4B8BtKjx5HUmnH1442,
•上面的谜面:
a21c2817130deaa1105afb3b858dbd219ee2da44
•这笔钱的冻结高度(Lava高度):7600 →注意:请确保该Lava高度到来的比Alice设定的BTC高度更早!这一点非常重要!
返回:
{“address”: “2NBzEWiW4T9de94VRRq2RZno1712uSxopG9”,
“redeemScript”: “63a614a21c2817130deaa1105afb3b858dbd219ee2da448876a91402b6eb3eb965532c942f1c112c585716db12b0636702b01db17576a914090e217eff3b75215b5d106ad861d40e0d46af776888ac”}
3. 向冻结地址:
“2NBzEWiW4T9de94VRRq2RZno1712uSxopG9”转入约定数量的LV。
完成转账后,将以下信息私下通知给Alice,等待Alice进一步响应即可:
这笔钱的冻结高度(LAVA高度):7600
【STEP 3:Alice取走LV】
“我是Alice,我手里持有BTC,要交换Bob手里持有的LV。现在,Bob已经完成对LV的冻结,我需要取走这些LV以完成交易。”
1. 首先是检验Bob设定的高度和金额信息是否正确:
获得Bob发来的Lava高度信息 7600 后,开始用相同的方式推演出Bob的冻结地址。
当然,请确保这个Lava高度 7600 还没达到, 否则请终止交易(放心,不会有任何损失)。
仍然调用createhtlcaddress:
输入:
•自己的Lava地址:
mfmJmsGPgoJGPY4yzZsDj4Z5CfpWUQQHHD,
•Bob的Lava地址:
mgLqJcG6kykw636f4B8BtKjx5HUmnH1442,
•自己创的谜题:
a21c2817130deaa1105afb3b858dbd219ee2da44
•这笔钱的冻结高度(Lava高度):7600
返回:
{“address”: “2NBzEWiW4T9de94VRRq2RZno1712uSxopG9”,
“redeemScript”:
“63a614a21c2817130deaa1105afb3b858dbd219ee2da448876a91402b6eb3eb965532c942f1c112c585716db12b0636702b01db17576a914090e217eff3b75215b5d106ad861d40e0d46af776888ac”}
然后,去Lava的主网查看:
“2NBzEWiW4T9de94VRRq2RZno1712uSxopG9”地址上是否有约定好的LV金额。没有的话就取消交易吧。
2. 以上都确认无误后,我将要进行最后的步骤:提款走人。
根据Lava浏览器查询结果,我已经知道Bob冻结LV的交易id是:
b05fa0adec37559f98b7b94c775e78f6e93434c0029c3795eae584a69580957b
接着,调用整个交换过程中最复杂的接口spendhtlcwithwallet来将这些LV转走。
输入:
•刚才获取的bob冻结LV交易的txid:
b05fa0adec37559f98b7b94c775e78f6e93434c0029c3795eae584a69580957b
•上面交易中的对应output序号,可以浏览器自己查询看到,也可以用命令行看到,这次是0。我们用命令行来验证下。确实是0.
•Alice想取走的金额:当然是取走所有约定的金额
•Alice的LV接收地址:
mfmJmsGPgoJGPY4yzZsDj4Z5CfpWUQQHHD (重要,就是接受这笔LV的地址。这是一个我的私人地址。)
•Alice之前设置的谜底:abcd (终于用上了!)
以及Bob构造这笔100lv冻结交易时的信息:
•Alice使用的谜题:
a21c2817130deaa1105afb3b858dbd219ee2da44
•Alice的Lava地址:
mfmJmsGPgoJGPY4yzZsDj4Z5CfpWUQQHHD,
•Bob的Lava地址:
mgLqJcG6kykw636f4B8BtKjx5HUmnH1442,
•这笔钱的冻结高度(Lava高度):7600
•标志位,表示该花费交易是否为赎回交易:
这里填0,表示是正常流程的互换交易;
如果填1,表示是违约后,或者超时后的取回交易。
返回:
02000000017b958095a684e5ea95379c02c03434e9f6785e774cb9b7989f5537ecada05fb000000000bf473044022068d9e6c815d99fedd31b6cd4f205124a8e1da3b2b65042c389ddca873ff708cb02203864c31bf8b8597de9e2f101b006dd0f55877e9854af568df10525297cdabef6012102da788aa6e547746556a27bee415ff3187df45033e3ef7e79fe8d506047bd6fb802abcd514c4f63a614a21c2817130deaa1105afb3b858dbd219ee2da448876a91402b6eb3eb965532c942f1c112c585716db12b0636702b01db17576a914090e217eff3b75215b5d106ad861d40e0d46af776888ac00000000017ccc0b54020000001976a91402b6eb3eb965532c942f1c112c585716db12b06388ac00000000
把以上结果在用sendrawtransacTIon接口发送到Lava主网。
获得txid为:
2abc47531de88a6952614702f3c842f24e4d524fc73e16b07934e530f46e9135
【STEP 4:Bob取走BTC】
“我是Bob,我手里持有LV,要交换Alice手里持有的BTC。现在Alice已经取走了我冻结的LV,现在我要取走Alice冻结的BTC来正式完成这笔交易。”
1. 观察Lava浏览器,我发现之前冻结LV的地址 2NBzEWiW4T9de94VRRq2RZno1712uSxopG9 中出现一笔转账交易:
2abc47531de88a6952614702f3c842f24e4d524fc73e16b07934e530f46e9135
这也就是刚才Alice转走LV的交易。
既然Alice已经利用谜底转走LV了,那么这个谜底就暴露在区块链上了!调用checkpreimage接口即可获取Alice公布的谜底:
输入参数为:
目标txid:
2abc47531de88a6952614702f3c842f24e4d524fc73e16b07934e530f46e9135
返回:
{“Preimage”: “abcd”}
由此,我知道了Alice设置的谜底就是 abcd。
2. 接下来,我也使用spendhtlcwithwallet接口来转走Alice冻结的BTC:
输入参数:
•刚才获取的Alice冻结BTC的txid:
4b879e138ea104569d718f12bb47d7207c908f7f2ee5750ddf127bc8bebf0060
•上面交易中的对应输出序号,可以浏览器自己查询看到,是0。
•我想转走的金额:当然是取走所有约定的金额
•我的BTC接收地址:
mgLqJcG6kykw636f4B8BtKjx5HUmnH1442
•Alice之前设置的谜底:abcd (刚才获得的)
以及Alice构造这笔0.00031BTC冻结交易时的信息:
•Alice使用的谜题:
a21c2817130deaa1105afb3b858dbd219ee2da44
•我的BTC地址:
mgLqJcG6kykw636f4B8BtKjx5HUmnH1442,
•Alice的BTC地址:
mfmJmsGPgoJGPY4yzZsDj4Z5CfpWUQQHHD,
•这笔钱的冻结高度(BTC高度):1609905
•标志位,表示该花费交易是否为赎回交易:
这里填0,表示是正常流程的互换交易,
如果填1,表示是违约后,或者超时后的取回交易。
将上面获取的结果通过Lava内置的命令sendrawBTCtx发送到BTC主网,即可取回属于我的BTC,大功告成!
这里需要注意:
1.软件默认使用的比特币区块链浏览器(https://www.blockcypher.com/)可能有翻墙的问题,可能使sendrawBTCtx发送不成功。我们也可以直接去该网站或者其他比特币主网浏览器上直接发送交易。
2.考虑到BTC网络交易费用很高,所以做这笔BTC主网交易之前一定要设置好合理的settxfee!具体的btc交易费一般都可以在btc浏览器上找到。在第四步Bob使用spendhtlcwithwallet之前,先调用lava全节点的settxfee=btc主网费率即可。
Lava通过PoC共识机制让人人挖矿成为现实,⼤大降低了挖矿的门槛和成本。使得挖矿成为每⼀个人都可以操作的小事情。更通过「跨链原⼦子交换机」使得⽤户挖出来的币有了更加方便、安全的流通⽅式,使得Lava⽣态变得更为健康和完善,保证了挖矿⽤户的收益,也保持了链上的活性。