赞
踩
本文用一个例子,演示了如何使用 window.ethereum 对象连接并操作 MetaMask 钱包的方法。
MetaMask 是一个浏览器插件钱包,支持火狐浏览器(Firefox)和谷歌浏览器(Chrome)。
安装完成后,window 对象中会出现一个 window.ethereum 的对象,这个就是我们本文的主角。
项目依赖库如下:
首先,创建一个 Web 项目。该项目采用 html + javascript 开发,前端页面采用 Bootstrap 框架。
在项目中,我们创建一个前端 html 页面,命名为 index.html。
在页面文件引入 Bootstrap 依赖(包括 css 样式文件和 js 文件):
<link href="assets/css/bootstrap.min.css" rel="stylesheet">
<script src="assets/js/bootstrap.min.js"></script>
在页面文件中 引入 Jquery 依赖:
<script src="assets/js/jquery-3.3.1.min.js"></script>
页面设计这里不做介绍,本文我们重点介绍接口开发部分。
本项目介绍了几个基本的接口用法,更多的接口开发请参考 MetaMask 开发者指南。
页面初始化时,检测是否已安装 MetaMask,如果没有则提示安装。代码如下:
if (typeof window.ethereum === 'undefined') {
console.log("Please install MetaMask.");
} else {
// app init code
}
连接钱包,获取当前激活的账号。代码如下:
const connectMetamask = document.getElementById('connectMetamask');
connectMetamask.addEventListener('click', () => {
// 授权链接MetaMask
ethereum
.request({ method: 'eth_requestAccounts' })
.then(handleAccountsChanged)
.catch((err) => {
if (err.code === 4001) {
console.log('Please connect to MetaMask.');
} else {
console.error(err);
}
});
}
连接钱包时需要 MetaMask 授权。
handleAccountsChanged
是自定义的回调函数,代码如下:
var account = null;
function handleAccountsChanged(accounts) {
if (accounts.length === 0) {
console.log('Please connect to MetaMask.');
} else if (accounts[0] !== account) {
account = accounts[0];
}
}
以上代码判断是否连接成功,连接成功后重置当前账号。
获取当前激活的账号。代码如下:
const showAccount = document.getElementById('showAccount');
showAccount.addEventListener('click', () => {
ethereum.request({ method: 'eth_accounts' }).then((result) => {
console.log(result);
});
});
获取当前激活的区块链网络的链 ID。代码如下:
const showChainId = document.getElementById('showChainId');
showChainId.addEventListener('click', () => {
ethereum.request({ method: 'eth_chainId' }).then((result) => {
console.log(result);
});
});
获取当前激活账号的公钥。代码如下:
const showPublicKey = document.getElementById('showPublicKey'); showPublicKey.addEventListener('click', () => { // 授权提供公钥 ethereum .request({ method: 'eth_getEncryptionPublicKey', params: [account] }) .then((result) => { console.log(result); }) .catch((err) => { if (err.code === 4001) { console.log('Please connect to MetaMask.'); } else { console.error(err); } }); });
获取公钥时需要 MetaMask 授权。
用于监听钱包账号的变更。代码如下:
ethereum.on('accountsChanged', (accounts) => {
handleAccountsChanged(accounts);
});
钱包地址变更后需要重新获取当前激活的账号。
用于监听区块链网络的变更。代码如下:
ethereum.on('chainChanged', (chainId) => {
window.location.reload(); //刷新
// todo
});
建议变更区块链网络后重新刷新页面进行初始化。
项目在 Apache 或 IIS 等 Web 服务中部署,打开浏览器访问。界面如下:
项目源码请访问 Github 仓库获取。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。