我们以 Ethereum 举例,当智能合约被部署到区块链上后,我们可以通过构建以太坊交易(Transaction),调用合约中的相应方法,前提是知道合约的 ABI 文件和合约的 HASH 地址。
ABI 是 Application Binary Interface 的缩写,是一种二进制接口标准,用于定义智能合约的函数和参数,合约 HASH 是合约在区块链上的地址,它们都可以在部署智能合约时获得。
DApp 调用合约方法一般有两种方式:通过钱包插件连接、通过节点 RPC 直接连接,我们主要介绍第一种方式。
MetaMask 是目前以太坊生态中用户最多的钱包插件,它提供了一个简单的方式,让用户在浏览器中管理自己的以太坊资产,同时也是 DApp 与以太坊网络交互的桥梁。如果你还没有使用过,可以在这里下载安装,并参考官网的教程完成初始的配置。
MetaMask 钱包安装完成后,我们可以在浏览器的右上角看到 MetaMask 的图标,同时它也会给每一个页面注入 window.ethereum
对象,这个对象是 DApp 与以太坊网络交互的接口,我们可以通过它来调用以太坊的 API。比如我们可以发起一个 eth_chainId
的 RPC 请求,获取当前网络的 ID:
await window.ethereum.request({ method: 'eth_chainId' }); // 0x1 代表以太坊主网
我们也可以通过下面这段代码,获取当前钱包的账户地址和其他信息:
async function getAccount() {const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' }).catch((err) => {if (err.code === 4001) {// EIP-1193 userRejectedRequest error// If this happens, the user rejected the connection request.console.log('Please connect to MetaMask.');} else {console.error(err);}});const account = accounts[0];return account;}await getAccount(); // 你的账户地址
更多的钱包 RPC 和 API 可以参考 MetaMask 官方文档。
直接使用 js 访问钱包是复杂且容易出错的,我们推荐在项目中使用 Ant Design Web3,让 DApp 开发更方便。