上一篇讲解了原子交换技术的历史、应用场景、优缺点等,本篇主要用于描述原子交换技术的规范,以Binance
链与Ethereum
之间的交互进行描述。
概述
原子交换技术中,最关键的技术为加密哈希函数
与HTLC
功能,通过一个随机数
作为哈希原像,在跨链原子交换技术时起到可信因子的作用。
原子交换的大致过程为:
- 用户A使用一个私密随机数生成哈希,向区块链(如: Binance)上发布一个开始原子交换的HTLT交易,同时生成SwapID
- 用户B监测到Binance上这笔原子交换交易,检测正确后,同意进行交换,会向Ethereum也发布一个以SwapID作为参数的开始原子交换的HTLT交易
- 用户A监测到用户B在Ethereum发布的以SwapID为参数原子交换交易后,用户A同意双方进行交换,用户A会向Ethereum发布一个携带SwapID与私密随机数的确认交易,来获取在Ethereum上交换的资产
- 用户B检测到用户A在Ethereum上的确认交易后,提取其中的私密随机数,在Binance链上发布一笔携带SwapID与私密随机数的确认交易,来获取Binance上的交换资产
- 上述描述的流程为 Binance链上的用户A与Ethereum链上的用户B进行原子交换的大概步骤,其中省略了大量的必须参数;将在下面细节部分进行描述.
基础组件
工具:用于监控Binance、Ethereum链上的指定交易事件的工具,并触发相关用户在指定链上的相关交易动作。
合约:Ethereum的智能合约APS(Atomic Peg Swap),用于提供锁定资产和获取交换的原子资产,功能类似于Binance链上特殊交易;合约细节在下文描述
特殊的交易类型:由于Binance链当前不支持智能合约,为了与Ethereum链上的资产进行原子交换,Binance链上提供了一套特殊的HTLC交易,用于在链上锁定资产和获取原子交换的资产;交易的细节在下文描述。
Binance链上HTLC交易的主要目的是与 采用sha256哈希算法的智能合约链进行资产交换;此处以Ethereum作为代表进行描述。
准备工作
准备地址: BnbChainAddrA, BnbChainAddrB; EthChainAddrA, EthChainAddrB;
准备资产:
- 此处有两种场景:
- 使用Ethereum链上资产
tokenA
交换Binance链上的Bnb
;- 本场景下,Ethereum上用户A(含有tokenA)只需要找到Binance链上用户B(含有Bnb),直接与他发起跨链原子交换即可。
- 使用Ethereum链上资产
tokenA
交换Binance链上的tokenA
;此处tokenA
可以类比为USDT;两条链上tokenA
含有的价值与意义完全相同;- 本场景下,由于Binance链上初始阶段由于没有
tokenA
的资产,所以需要Ethereum上tokenA
的拥有者先锚定部分资产在Binance链上。 - 常用做法是:在Ethereum上燃烧或锁定一定数量amount的
tokenA
,然后在Binance上发行相同数量amount的tokenA
;由此保证tokenA数量与分散到两条链上之前恒定不变。类比于现实中,USDT在Ethereum上的燃烧与TRON上的增发。
- 本场景下,由于Binance链上初始阶段由于没有
- 使用Ethereum链上资产
此时Ethereum链上的用户A(EthChainAddrA)含有一定数量tokenA,Binance链上的用户B(BnbChainAddrB)含有一定数量的tokenB;同时Ethereum链上APS智能合约也已部署,监控两条链的工具也开始运行;接下来准备进行交换。
tokenB: 它既可以为Binance链上的tokenA,也可以为Binance上的其它资产(如Bnb)。
原子交换
从Ethereum到Binance链的资产交换
- 用户A(
EthChainAddrA
)使用如下参数调用APS智能合约:私密随机数
生成的哈希sHash1,锁定X个tokenA,T时间戳,期望交换Binance上Y个tokenB。如果参数校验通过(如:T时间戳合理,用户A含有足够的tokenA),将该笔交易上链。 - 工具监测到Ethereum链上的APS合约调用事件,并且校验通过(即交易有效、交换比例符合预期);此时用户B(
BnbChainAddrB
)会在Binance链上发送一笔HTLC交易,用于在一定的时间T‘范围内,锁定Y个tokenB(或者更多),同时将第1步生成的sHash1作为参数传入。注意:T' < T
- 工具检测到Binance链上HTLC交易,且校验通过(即交易有效、交换比例符合预期);此时用户A(
BnbChainAddrA
)会在Binance上通过发送一笔CHLT交易,来暴露第一步的私密随机数
;Binance链处理引擎接收到该交易后,验证私密随机数
的正确性(即是否可以生成相同的哈希sHash1),来将用户B(BnbChainAddrB
)锁定的Y个tokenB发放给用户A(BnbChainAddrA
) - 工具监测到Binance链上成功的CHLT交易,提取其中的
私密随机数
,然后调用APS合约,合约验证私密随机数的正确性,将锁定的X个tokenA发放给用户B(EthChainAddrB
)
atomic-swap.png
从Binance链到Ethereum的资产交换
该过程与上述资产交换过程相反。
- 用户A在Binance链上使用如下参数发送HTLT交易,用于跨链资产交换:
私密随机数
生成的哈希sHash1,锁定X个tokenA,T时间戳,期望交换Ethereum上Y个tokenB。如果参数校验通过(如:T时间戳合理,用户A含有足够的tokenA),该笔交易被记录上链。 - 工具检测到Binance链上的HTLC交易,且校验通过(即交易有效,交易比例符合预期)。此时用户B会在Ethereum链上使用下列参数调用APS合约:锁定Y个tokenB(甚至更多),第1步生成的sHash1,T'时间戳;来在Ethereum上锁定Y个数量的tokenB。注意:
T' < T
- 工具检测到Ethereum链上APS合约的调用,且校验成功;此时用户A使用下列参数来调用APS合约,获取锁定的Y个token:
私密随机数
。 - 工具检测到Ethereum链上APS合约的调用,提取其中的
私密随机数
,然后用户B在Binance上发送一笔携带该私密随机数
的CHLT交易,来获取锁定的X个tokenA。
单条区块链上的资产交换
当单条区块链上的两个陌生人想交换资产,又对彼此缺乏信任且不想使用中心化的交换场所,也可以使用原子交换技术来完成资产间的交换。
初步总结
由上述的交换过程可以看出,私密随机数
在跨链原子交换过程中起到了信任因子的作用,需要隐私保存,防止暴漏或被人猜到。
发起方发送一笔有条件的带超时的锁定转账交易,只有获取私密随机数
才能解锁这笔交易;
接收方以相同锁定条件进行应答或者不应答,当发起方的交易超时后,资金自动返还给发送者;
发起方通过暴露私钥来使双方各自获取此次原子交换过程中锁定的资产;否则,当交易超时后,资金原路返还给相应的发送者。
Ethereum合约接口、Binance交易类型
通过Binance的特定交易与Ethereum智能合约进行交互,来完成整个原子交换过程。
Binance交易类型
Binance提供了三种交易类型,来支持跨连原子交换。
HTLT: 发起一次跨连原子交换,或应答参与方发起的跨链原子交换。
claim HTLT: 通过暴露私密随机数
来获取锁定的资产/token。
refund HTLT: 撤销发起的跨链原子交换,时间到期后,资金原路返还给发送者
deposit HTLT: 用于Binance链自身的跨链交换操作,锁定交换的BEP2资产到已存在跨链原子交换交易中。
HTLT(Hash Timer Locked Transfer)交易类型的参数
Name | Type | Description | Optional |
---|---|---|---|
From | Address | 交易发送方的地址 | No |
To | Address | 交易接收方的地址 | No |
SenderOtherChain | bytes | 跨链交易发送方的地址 | Yes |
RecipientOtherChain | bytes | 跨链交易接收方的地址 | Yes |
RandomNumberHash | 32 bytes | 使用随机数和Timestamp生成的sha256哈希值 | No |
Timestamp | int64 | 发送交易的时间戳,单位为秒。APS合约应答时,应该使用相同的时间戳 | No |
OutAmount | Coins | 用于交换的资产;将被锁定在To地址上,直到满足交换条件或交易超时,依据情况将这笔资产发送给To或者返还给From | No |
ExpectedIncome | string | 期待其它链上获取的token互换比例,如1000:eth | No |
HeightSpan | int64 | 交易有效的区块数,超时后交易无效,资产返还给From。 518400(48小时) > HeightSpan >= 360(2分钟),Binance链3s生成一个区块 | No |
CrossChain | bool | 标识HTLT交易是否为跨链交易 | No |
需要注意的地方:
- 当
To
没有使用claim HTLT
交易去解锁当前的HTLT
交易时,OutAmount
资产不可以出现在To
的余额中 CrossChain
为false时,标示为同链原子交换HTLT
交易被确认有效后,会在应答中生成SwapID = sha256(swap.randomNumberHash, swap.From, swap.SenderOtherChain)
;如果**HTLT
**交易不是对其它原子交换的应答时,**SenderOtherChain
**字段应该为nil.- 生成的Swap-ID 在当前链上作为这笔原子交换的标识
Claim HTLT交易类型的参数
Name | Type | Description | Optional |
---|---|---|---|
From | Address | 发送者 | No |
SwapID | 32 bytes | HTLT交易生成的Swap-ID | No |
RandomNumber | 32 bytes | 私密随机数,用于生成哈希,解锁条件 | No |
Refund HTLT交易类型的参数
Name | Type | Description | Optional |
---|---|---|---|
From | Address | 发送者 | No |
SwapID | 32 bytes | HTLT交易生成的Swap-ID | No |
Ethereum 合约接口
htlt接口
function htlt(bytes32 _randomNumberHash, uint64 _timestamp, uint256 _heightSpan, address _receiverAddr, bytes20 _bep2Sender, bytes20 _bep2Recipient, uint256 _outAmount, uint256 _bep2Amount)
字段含义与Binance链的HTLT交易中字段含义相同,只是字段名称稍微有些变化。
Ethereum | Binance | 等价 |
---|---|---|
_randomNumberHash | RandomNumberHash | Yes |
_timestamp | Timestamp | Yes |
_heightSpan | HeightSpan | Yes |
_receiverAddr | To | Yes |
_bep2Sender | SenderOtherChain | Yes |
_bep2Recipient | RecipientOtherChain | Yes |
_outAmount | OutAmount | Yes |
_bep2Amount | ExpectedIncome | Yes |
- _heightSpan : 需要注意的是:由于不同链的出块速度不同,该值需要具体链的情况进行调整。
- _timestamp : 如果为应答Binance链上HTLT交易的情况时,该值需要与Binance保持一致,因为需要确保两条链的randomNumberHash为一致。
- _randomNumberHash : 如果为应答Binance链上HTLT交易的情况时,该值需要与Binance链上的RandomNumberHash保持一致。
claim接口
function claim(bytes32 _swapID, bytes32 _randomNumber)
_swapID : 上述Ethereum链上HTLT生成的
_swapID
. _randomNumber : 用于解锁条件的私密随机数
refund接口
function refund(bytes32 _swapID)
_swapID : 上述Ethereum链上HTLT生成的
_swapID
.
Swap-ID
Swap-ID:的作用是在单条链上作为跨链原子交换的标识;所以,一笔跨链原子交换时,会在两条链上生成不同的Swap-ID,分别在各自的链上标识这笔跨链原子交换。
参考、引用文章
BEP3: https://github.com/binance-chain/BEPs/blob/master/BEP3.md