MetaMask 作为最流行的去中心化钱包,相关中文资料却很少,自己啃着英文文档做了一个 Dapp,总结记录一下。
检测
首先要检测浏览器上 MetaMask 扩展是否已经安装,如果已安装,会在 window 下面挂载 ethereum 对象
const isMetaMaskInstalled = () => {
const { ethereum } = window
return Boolean(ethereum && ethereum.isMetaMask)
}
如果返回true
就是安装了 MetaMask,然后就可以进行连接了。
连接
连接需要调用eth_requestAccounts
这个 RPC 方法
const connect = async () => {
try {
await ethereum.request({ method: 'eth_requestAccounts' });
} catch (error) {
console.error(error);
}
};
此时就会看到 MetaMask 已经被拉起来,确认授权就可以进行接下来的操作。
调用智能合约
调用合约我使用的是 web3.js,拿到 ABI 文件和合约地址,调用 web3 的 API 即可
import Web3 from 'web3'
// 创建新的合约实例,需要提供ABI和合约地址
let MyContract = new web3.eth.Contract(ABI, CONTRACT_ADDRESS)
// 调用合约,myMethod即为ABI中声明的方法
MyContract.methods
.myMethod(params)
.send(params)
.then(res => {
console.log(res)
})
.catch(err => {
console.log(err)
})
这是一个简单的例子,web3 还有很多高级用法可以参考中文文档。
在手机上使用
MetaMask 有提供手机版 app,实际上就是一个内置了 MetaMask 扩展的浏览器,把页面在这个浏览器里打开,就可以和桌面浏览器一样使用 MetaMask 的各种功能。
问题是让用户在手机上手动打开 app 并输入冗长的链接体验很不好,于是官方提供了一个叫做深度链接(deeplinks)的东西,可以一键拉起 MetaMask app 跳转到指定页面。深度链接的规则如下
example.com 就是我们的页面。
在手机的任意浏览器点开这个链接,就会拉起 MetaMask app 跳转到 https://example.com ,注意一定要是 https 协议。如果没有安装 MetaMask app 怎么办呢?官方也想到了,没安装会自动跳转到应用商店的下载页,同时支持 App Store 和 Google Play。不过 MetaMask 并没有上架中国区,国内也用不了 Google Play,国内用户其实是点了个寂寞。