ERC20代币和主网token切换映射的3种实现方式

in #swap5 years ago

当前大部分区块链项目,为了融资等需要,会在 Mainnet上线之前,先在 ETH 上发行自己的 ERC-20 token,待主网上线之后,再将其切换过来;目前主网代币的映射和切换主要有3种方式。

1、主网切换需要完成的工作

由于主网没上线之前,用户的代币都是基于ETH上的ERC-20 token,存放在ETH地址中,等到主网上线时,必须用一种机制把基于ETH地址的Token给“转移”到主网地址上,然后将原来的token销毁。所以必须完成如下几件工作:

  1. 收集 ETH地址 -> 主网地址 的映射表,这个过程要防止冒领或者错领;
  2. 收集原ETH中ERC20 token的余额;
  3. 在主网中转账给收集到的地址和余额;
  4. 销毁原来的ERC20 token;

2、地址映射合约

对于项目方来说,要收集 ETH地址 -> 主网地址 的映射表,同时要防止冒领或者错领,最好的方法就是在ETH中部署一个收集映射表的合约,由于,只有持有ETH地址私钥的人才能调用该合约,这样保证了Token持有人才能设置自己的主网地址。

下面以EOS的映射合约合约为例,EOS众筹合约

    // Value should be a public key.  Read full key import policy.
    // Manually registering requires a base58
    // encoded using the STEEM, BTS, or EOS public key format.
    function register(string key) {
        assert(today() <=  numberOfDays + 1);
        assert(bytes(key).length <= 64);

        keys[msg.sender] = key;

        LogRegister(msg.sender, key);
    }

    // Crowdsale owners can collect ETH any number of times
    function collect() auth {
        assert(today() > 0); // Prevent recycling during window 0
        exec(msg.sender, this.balance);
        LogCollect(this.balance);
    }

    // Anyone can freeze the token 1 day after the sale ends
    function freeze() {
        assert(today() > numberOfDays + 1);
        EOS.stop();
        LogFreeze();
    }

3、3种用户调用合约的方法

当项目方以上收集地址映射的合约部署后,对于专业用户来,即可以使用常用的ETH钱包或者网站,调用该合约中的 register() 方法,发起一笔交易,完成地址映射;

更一般地,项目方应当为用户提供一个解决方案,以便:

  • 方便用户创建主网的公私钥;
  • 方便用户调用地址映射合约;
  • 防止用户提供的不是主网地址;
  • 防止用户提供一个自己并没有私钥的主网地址;
  • 方便用户验证映射是否成功;

下面介绍3个主流的区块链平台主网切换的处理过程:

3.1 EOS之专业用户手操方案

EOS的主网映射时,为用户提供了网站,供用户创建公私钥,其他的操作,只提供了操作指南,在通常的ETH钱包中进行,需要用户专业性比较强;

具体操作可参考:EOS官方标准映射攻略

3.2 TRX之交易所简易方案

TRX主网切换时,发布公告,让用户将token转到指定的若干交易所,免去用户的大部分操作,避免操作过程可能出错的现象,不过用户首先的在交易所注册一个账户。

公告见:TRX的ERC20代币迁移至波场主网代币

3.3 Qtum之专用钱包方案

Qtum主网切换时,可以在以一个专用的钱包内进行映射,这样能避免注册一个多余的交易所账户,同时也减少出错的可能,不过这个钱包必须同时支持ETH和Qtum才行。

具体过程可参考:Qtum ERC20 to Mainnet Token Swap

4、ERC20 token销毁

一般当主网上线上线后的一段时间,当地址映射收集后,会在主网上转账给用户的同时,将原ERC20 token销毁。就销毁ERC20 token而言,各个平台的处理方案,有所不同。

4.1 预设的 stop() 方法

一些先知先觉的项目,会在发行ERC20 token的同时,会将销毁方法写好,例如 EOS,见第1节的 EOS.stop() 方法,会在截止日期后一次性销毁;

contract DSStop is DSAuth, DSNote {

    bool public stopped;

    modifier stoppable {
        assert (!stopped);
        _;
    }
    function stop() auth note {
        stopped = true;
    }
    function start() auth note {
        stopped = false;
    }

}

4.2 转给映射合约

对于其他项目,由于事先没有销毁方法,只能采用迂回的方式,分批次销毁token,可让用户将token转给新部署的映射合约地址或者其他指定的ETH地址,让token永远无法使用,即销毁了token。

例如:


参考文章:

Coin Marketplace

STEEM 0.30
TRX 0.12
JST 0.032
BTC 57741.16
ETH 2947.53
USDT 1.00
SBD 3.69