什么是WETH
WETH字面意思是"包裝過的ETH"("wrapped ETH")。首先,Ether(ETH)是以太坊網(wǎng)絡(luò)(Ethereum)上的原生幣種,選擇建立在以太坊上的dAPP通常會部署自己的代幣,比如Augur的REP和Bancor的BNT。而ERC-20是在ETH發(fā)布之后制定的一個標(biāo)準(zhǔn),這個標(biāo)準(zhǔn)定義了代幣應(yīng)該如何在以太坊網(wǎng)絡(luò)上轉(zhuǎn)移,以及如保持代幣在以太坊網(wǎng)絡(luò)上的轉(zhuǎn)移能夠有一個一致的記錄。
ERC20標(biāo)準(zhǔn):
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address who) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
為什么需要wETH
ERC20是以太坊上最為普遍通用的代幣標(biāo)準(zhǔn),而ETH作為原生幣種本身不符合ERC20標(biāo)準(zhǔn),但一些dAPP對接的是ERC20標(biāo)準(zhǔn)代幣,比如Radar Relay,0x Portal。所以我們需要利用智能合約實(shí)現(xiàn)一種兼具ERC20標(biāo)準(zhǔn)的token形式的ETH。
實(shí)現(xiàn)代碼及前景
我們看看實(shí)現(xiàn)代碼:
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;
}
}
代碼非常簡單,實(shí)現(xiàn)了ERC20標(biāo)準(zhǔn),并提供deposit和withdraw函數(shù)完成原生ETH與WETH之間的1:1置換。
在etherscan上可以看到WETH自2017年12月12號部署以來,目前合約內(nèi)抵押了230萬個Ether,也就是有同樣數(shù)量的WETH處于流通狀態(tài)。
更新以太坊代碼使ETH符合ERC-20標(biāo)準(zhǔn)的計(jì)劃已經(jīng)在實(shí)施了。wETH只是目前階段為滿足一些使用場景,在合約層面做的實(shí)現(xiàn)。如果你有需要,可以直接使用WETH。