区块链 第11.6.3章 Wrapped Ether 区块链 第11.6.3章 Wrapped Ether

1天前

一、Wrapped Ether

如果一个合约既支持 ETH 付款,也支持 ERC-20 代币付款,我们会发现这两种付款方式处理逻辑是不一样的:

contract Shop {
   function pay(uint productId) public payable {
       // pay ETH...
   }
   function pay(uint productId, address erc, uint256 amount) public {
       // pay ERC...
   }
}

两种逻辑混在一起用,代码就会复杂,就容易出问题。

一个简单的解决方法是将 ETH 也变成一种代币,可以用一个简单的 WETH 合约实现:

contract WETH {
   string public name     = "Wrapped Ether";
   string public symbol   = "WETH";
   uint8  public decimals = 18;

   mapping (address => uint) public  balanceOf;

   function deposit() public payable {
       balanceOf[msg.sender] += msg.value;
   }

   function withdraw(uint wad) public {
       require(balanceOf[msg.sender] >= wad);
       balanceOf[msg.sender] -= wad;
       msg.sender.transfer(wad);
   }

   ...
}

这样,处理 ETH 付款就可以简单地将它变成 WETH,然后走同一种逻辑:

contract Shop {
   function pay(uint productId) public payable {
       // ETH -> WETH:
       WETH.deposit.value(msg.value)();
       _pay(productId, address(this), WETH.address, msg.value);
   }

   function pay(uint productId, address erc, uint256 amount) public {
       _pay(productId, msg.sender, erc, amount);
   }

   function _pay(uint productId, address sender, address erc, uint256 amount) private {
       // pay ERC...
   }
}

不需要自己实现WETH,因为以太坊主网已经有一个通用的 WETH

二、小结

通过 WETH,将 ETH 变成 ERC20 代币,可以简化处理代币的逻辑。

阅读 17