Binance 的跨链`Ethereum`智能合约

2019-12-02  本文已影响0人  路之遥_其漫漫_

概述

上一篇描述了BinanceEthereum的跨链原子交换技术规范;本节将描述BinanceEthereum中的跨链院子交换合约。

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;

原子交换的状态

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);
}

具体源码请看

合约代码挺简单;

上一篇 下一篇

猜你喜欢

热点阅读