概述
上一篇描述了Binance與Ethereum的跨鏈原子交換技術(shù)規(guī)范;本節(jié)將描述Binance在Ethereum中的跨鏈院子交換合約。
Ethereum合約源碼: https://github.com/binance-chain/bep3-smartcontracts/tree/master/ethereum/contracts
合約講解
Binance的跨鏈原子交換分為兩種:ETH跨鏈原子交換合約、基于Ethereum合約的ERC20跨鏈原子交換合約。
兩份合約實現(xiàn)上幾乎一致,唯一的區(qū)別在于:ETH作為Ethereum的原生token與基于ERC20的合約token,轉(zhuǎn)賬有些不同。
合約代碼
以ETH跨鏈原子交換合約為例.
原子交換的結(jié)構(gòu)信息如下
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;
outAmount: 該筆原子交換向合約地址中鎖定的金額(ETH或ERC20 token數(shù)量)
expireHeight: 該筆原子交換的過期高度
randomNumberHash: 該筆原子使用的 LockHash
timestamp: 該筆院子交換使用的時間戳,單位秒;范圍為(blockTime-1800, blockTime+900),blockTime: 當(dāng)前區(qū)塊鏈的時間戳。
sender: 該筆院子交換的發(fā)起者
recipientAddr: 該筆原子交換的接收者
-
swaps: 合約中存儲的原子交換的信息;當(dāng)指定的原子交換被
claim或refund時,會從合約中刪除該原子交換的信息- key: Swap-ID,上篇文章有描述
-
swapStates: 合約中存儲的原子交換的狀態(tài);依據(jù)不同的事件,更新原子交換的狀態(tài)
- key: Swap-ID,上篇文章有描述
原子交換的狀態(tài)
enum States {
INVALID,
OPEN,
COMPLETED,
EXPIRED
}
總共有上述四種狀態(tài);對于一個未知的Swap-ID,它的狀態(tài)為INVALID;
通過下列交易,驅(qū)動原子交換的狀態(tài)的變動。
[圖片上傳失敗...(image-988316-1575268834367)]
實現(xiàn)了三種方法
合約中對外提供了三種調(diào)用方法,來驅(qū)動一個原子交換的狀態(tài)變遷。
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中,進(jìn)行一些檢查后,將一則原子交換信息存儲至合約狀態(tài)下,更新原子交換信息的狀態(tài) - 在
claim中,將鎖定在合約地址中的指定金額發(fā)送至接收者的賬戶,更新原子交換信息的狀態(tài)- 由合約代碼可以看出,
claim交易任何人都可以發(fā)送。
- 由合約代碼可以看出,
- 在
refund中,將鎖定在合約地址中的指定金額返還給發(fā)送者,更新原子交換信息的狀態(tài)- 由合約代碼可以看出,
refund交易任何人都可以發(fā)送。 - 可以有錢包服務(wù)商/第三方服務(wù),提供這種原子交換的服務(wù),通過監(jiān)控鏈上的事件,自動發(fā)送
claim/refund交易,來優(yōu)化用戶的體驗(可以給用戶一種類似于鎖定轉(zhuǎn)賬的感覺,只需要用戶發(fā)送htlt交易);
- 由合約代碼可以看出,