上一篇描述了Binance
与Ethereum
的跨链原子交换技术规范;本节将描述Binance
在Ethereum
中的跨链院子交换合约。
Ethereum合约源码: https://github.com/binance-chain/bep3-smartcontracts/tree/master/ethereum/contracts
Binance
的跨链原子交换分为两种:ETH
跨链原子交换合约、基于Ethereum合约的ERC20
跨链原子交换合约。
两份合约实现上几乎一致,唯一的区别在于:ETH作为Ethereum
的原生token与基于ERC20
的合约token,转账有些不同。
以ETH
跨链原子交换合约为例.
原子交换的结构信息如下
struct Swap {
uint256 outAmount;
uint256 expireHeight;
bytes32 randomNumberHash;
uint64 timestamp;
address payable sender;
address payable recipientAddr;
}
mapping (bytes32 => Swap) private swaps;
mapping (bytes32 => States) private swapStates;
claim
或refund
时,会从合约中删除该原子交换的信息- key: Swap-ID,上篇文章有描述swapStates: 合约中存储的原子交换的状态;依据不同的事件,更新原子交换的状态
- key: Swap-ID,上篇文章有描述
原子交换的状态
enum States {
INVALID,
OPEN,
COMPLETED,
EXPIRED
}
总共有上述四种状态;对于一个未知的Swap-ID,它的状态为INVALID
;
通过下列交易,驱动原子交换的状态的变动。
图片上传失败...(image-988316-1575268834367)
合约中对外提供了三种调用方法,来驱动一个原子交换的状态变迁。
function htlt(bytes32 _randomNumberHash, uint64 _timestamp, uint256 _heightSpan, address payable _recipientAddr,
bytes20 _bep2SenderAddr, bytes20 _bep2RecipientAddr, uint256 _bep2Amount) external payable returns (bool) {
...
swaps[swapID] = swap;
swapStates[swapID] = States.OPEN;
emit HTLT(msg.sender, _recipientAddr, swapID, _randomNumberHash, _timestamp, _bep2RecipientAddr, swap.expireHeight, msg.value, _bep2Amount);
}
function claim(bytes32 _swapID, bytes32 _randomNumber) external onlyOpenSwaps(_swapID) onlyBeforeExpireHeight(_swapID) onlyWithRandomNumber(_swapID, _randomNumber) returns (bool) {
swapStates[_swapID] = States.COMPLETED;
...
recipientAddr.transfer(outAmount);
emit Claimed(msg.sender, recipientAddr, _swapID, randomNumberHash, _randomNumber);
}
function refund(bytes32 _swapID) external onlyOpenSwaps(_swapID) onlyAfterExpireHeight(_swapID) returns (bool) {
swapStates[_swapID] = States.EXPIRED;
...
swapSender.transfer(outAmount);
emit Refunded(msg.sender, swapSender, _swapID, randomNumberHash);
}
具体源码请看
合约代码挺简单;
htlt
中,进行一些检查后,将一则原子交换信息存储至合约状态下,更新原子交换信息的状态claim
中,将锁定在合约地址中的指定金额发送至接收者的账户,更新原子交换信息的状态 claim
交易任何人都可以发送。refund
中,将锁定在合约地址中的指定金额返还给发送者,更新原子交换信息的状态 refund
交易任何人都可以发送。claim
/refund
交易,来优化用户的体验(可以给用户一种类似于锁定转账的感觉,只需要用户发送htlt
交易);