美文网首页区块链研习社区块链研究
一种符合ERC-20标准的ETH-WETH

一种符合ERC-20标准的ETH-WETH

作者: 六天天天向上 | 来源:发表于2019-10-12 15:03 被阅读0次

    是什么?

    WETH是一种符合ERC-20标准以太坊代币,与以太坊网络的原生代币以太币(ETH)可以进行互换,可以将1ETH兑换为1WETH,同时也可以将1WETH兑换回1ETH,兑换是基于智能合约完成的。

    为什么需要?

    ERC-20是建立在以太坊上的一种标准Token接口,只要你开发的应用程序支持ERC-20标准,那你的程序就可以处理所有依据ERC-20标准创建出来的Token。而以太币(ETH)是以太坊网络的原生代币,并不符合ERC-20标准,这就会造成应用程序需要对ETH相关的逻辑进行单独处理。

    比如在一个合约里获取一种Token的余额这个需求,符合ERC-20的Token,获取余额的代码为:contractAddress.balanceOf(_address)(#示意代码)

    而如果是要获取以太币,获取余额的代码为:address.balance

    可能有些人觉得这也没什么不妥的,试想一下,如果是在去中心化交易的场景下,两种符合ERC-20标准的Token可以很容易实现交易,而以太币和某一ERC-20的Token进行交易,则复杂的多。

    这时候很多dApp的开发人员就发现,如果将以太币抽象成为符合ERC-20标准的Token,就可以达到简化智能合约的目的,因此WETH应运而生。

    如何实现?

    WETH合约的部署地址:

    代码如下所示。(不同版本的代码可能不一样,但核心方法是一样的)

    pragma solidity ^0.4.18;
    
    contract WETH9 {
        string public name     = "Wrapped Ether";
        string public symbol   = "WETH";
        uint8  public decimals = 18;
    
        event  Approval(address indexed src, address indexed guy, uint wad);
        event  Transfer(address indexed src, address indexed dst, uint wad);
        event  Deposit(address indexed dst, uint wad);
        event  Withdrawal(address indexed src, uint wad);
    
        mapping (address => uint)                       public  balanceOf;
        mapping (address => mapping (address => uint))  public  allowance;
    
        function() public payable {
            deposit();
        }
        function deposit() public payable {
            balanceOf[msg.sender] += msg.value;
            Deposit(msg.sender, msg.value);
        }
        function withdraw(uint wad) public {
            require(balanceOf[msg.sender] >= wad);
            balanceOf[msg.sender] -= wad;
            msg.sender.transfer(wad);
            Withdrawal(msg.sender, wad);
        }
    
        function totalSupply() public view returns (uint) {
            return this.balance;
        }
    
        function approve(address guy, uint wad) public returns (bool) {
            allowance[msg.sender][guy] = wad;
            Approval(msg.sender, guy, wad);
            return true;
        }
    
        function transfer(address dst, uint wad) public returns (bool) {
            return transferFrom(msg.sender, dst, wad);
        }
    
        function transferFrom(address src, address dst, uint wad)
            public
            returns (bool)
        {
            require(balanceOf[src] >= wad);
    
            if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) {
                require(allowance[src][msg.sender] >= wad);
                allowance[src][msg.sender] -= wad;
            }
    
            balanceOf[src] -= wad;
            balanceOf[dst] += wad;
    
            Transfer(src, dst, wad);
    
            return true;
        }
    }
    

    从代码中也可以看出,这是一个标准的ERC-20的Token,Token的名称是“Wrapped Ether”,标识是“WETH”,有效位是18位等。

    对合约的详细解析:

    1、第16行代码,合约的fallback函数调用了deposit方法(存款),这也意味着使用imtoken这样的钱包,直接给该合约地址转账以太币就能够完成兑换WETH。

    2、第19行代码,合约的deposit方法,用来接收以太币,逻辑很简单,就是给调用者地址的WETH余额增加了接收到的以太币数量。

    3、第23行代码,合约的withdraw方法,用来提取以太币,将WETH转换回以太币,wad参数是提取的数量。该方法首先判断了账户余额是否足够,其次对账户的WETH余额减去提取数量,再向合约调用地址发送对应的以太币。

    其它approve、transfer、transferFrom都是ERC-20的标准方法,不再赘述。

    参考

    https://etherscan.io/address/0x2956356cd2a2bf3202f771f50d3d14a367b48070#code

    https://www.etherchain.org/account/c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#code

    相关文章

      网友评论

        本文标题:一种符合ERC-20标准的ETH-WETH

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