美文网首页
Binance 的跨链`Ethereum`智能合约

Binance 的跨链`Ethereum`智能合约

作者: 路之遥_其漫漫_ | 来源:发表于2019-12-02 14:40 被阅读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;
    
    • outAmount: 该笔原子交换向合约地址中锁定的金额(ETH或ERC20 token数量)

    • expireHeight: 该笔原子交换的过期高度

    • randomNumberHash: 该笔原子使用的 LockHash

    • timestamp: 该笔院子交换使用的时间戳,单位秒;范围为(blockTime-1800, blockTime+900),blockTime: 当前区块链的时间戳。

    • sender: 该笔院子交换的发起者

    • recipientAddr: 该笔原子交换的接收者

    • swaps: 合约中存储的原子交换的信息;当指定的原子交换被claimrefund时,会从合约中删除该原子交换的信息

      • 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交易);

    相关文章

      网友评论

          本文标题:Binance 的跨链`Ethereum`智能合约

          本文链接:https://www.haomeiwen.com/subject/nfffgctx.html