玩转Metamask

Metamask给浏览器提供了一个web3环境, 不止Dapp可以调用,你自己也可以手动调用. 利用这个可以做很多有趣方便的事情

在浏览器中调用web3接口

请确认您已经在浏览器中安装Metamask

查看web3对象

以Chrome浏览器为例,随便打开一个网页,然后在页面上右键,点击检查,就会弹出浏览器的选项卡, 切换到Console(控制台)栏,在下面输入 web3.

可以看到当前已经有了web3对象, Metamask提供的web3 API是 0.20 版本的, API文档见地址.

有了这个web3对象,我们可以做不少事.

计算函数签名

以太坊交易调用智能合约时,交易data前几位默认是函数签名. 这个签名是由合约函数声明哈希后取前几位生成的,我们可以利用这个web3轻松计算签名.

> web3.sha3("approve(address,uint256)")
"0x095ea7b334ae44009aa867bfb386f5c3b4b443ac6f0ee573fa91c4608fbadfba"

approve是以太坊ERC20的授信函数,我们可以在Etherscan上找一个授信交易看看实际的data

授信交易

MethodID: 0x096ea7b3 正好就是函数声明的sha3结果前8位.

提取当前地址所有以太坊

注意啦,这个web3对象是可以通过web3.eth.sendTransaction接口实际发出链上交易的.

我们日常会遇到一些case,想把一个地址里的所有ETH全部提取出来,但是因为gas的原因,我们每次总会剩一点点ETH提不干净.这可以逼坏了一些强迫症患者,利用这个web3,我们很容易就可以做到提取全部ETH.

打开console输入以下内容

function withdrawal(to, gasPrice) {
web3.eth.getBalance(web3.eth.coinbase, (err, balance) => {
if (err) {
console.error(`fail to get balance of ${web3.eth.coinbase}`, err)
} else {
gasPirce = web3.toWei(gasPrice, 'gwei')
const gas = new web3.BigNumber(21000)
const cost = gas.mul(gasPrice)
const left = balance.minus(cost)
web3.eth.sendTransaction({
to,
value: left,
gasPrice
}, console.log)
}
})
}

这里我们定义了一个提现函数, 先获取账户余额,再计算转账油费,然后提取(余额 - 油费), 最后账户上就会一点ETH都不剩啦.

使用方法如下:

//用4gwei的价格,提现当前账户所有ETH到0x92694d5c7e2655e3f358130ebd0e7Db3FbD3e455地址
> withdrawal("0x92694d5c7e2655e3f358130ebd0e7Db3FbD3e455", 4)

回车后Metamask会弹出交易提示框,点击确认就会发出转账啦.

后面的数字表示油价,单位是Gwei. 另外提现交易不可以用Metamask的交易加速功能,加速功能会上调油价,这样剩余的ETH就不够发送了.

新版本的Metamask增加了一个隐私保护,必须用户允许当前页面连接到Metamask后才能调用交易功能,否则会报错:

Uncaught Error: invalid address

解决方法: 可以先访问 https://tools.94eth.com, 页面会请求连接Metamask, 允许后, 再打开控制窗口重复上述操作.