Binance 的跨鏈`Ethereum`智能合約

概述

上一篇描述了BinanceEthereum的跨鏈原子交換技術(shù)規(guī)范;本節(jié)將描述BinanceEthereum中的跨鏈院子交換合約。

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)指定的原子交換被claimrefund時,會從合約中刪除該原子交換的信息

    • 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交易);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容