通过 BlockChain RPC 调用以太坊合约
获取 RPC 地址
首先,需要访问 https://zan.top/service/apikeys 获取 RPC 地址:
需要登录 ZAN,ZAN 会自己帮你创建一个免费的 Access Key,对于其它大部分 BlockChain RPC 服务提供商,也是类似的逻辑,你都需要先获得一个地址,这个地址就是调用 RPC 服务的 Endpoint。
通过命令行访问
你可以通过下面代码直接在 Shell 命令行中访问 PRC 测试是否可以联通:
curl --location 'https://api.zan.top/node/v1/eth/mainnet/${YOUR_ACCEEE_KEY}' \
--header 'Content-Type: application/json' \
--data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
需要注意的是 ${YOUR_ACCEEE_KEY}
需要替换成为你自己的 Key。你也可以直接通过 ZAN 网站上提供的代码来运行:
然后你可以看到输出类似如下的结果:
{"result":"0x15a0d89","id":1,"jsonrpc":"2.0"}
这就表明 RPC 调用成功了。
通过 JS SDK 调用合约
你可以通过 Viem、Ethers 这些 SDK 来调用合约,如果是在前端,使用 React 的情况,还可以用类似 wagmi 和 Ant Design Web3 这样的 SDK 和组件库。
比如通过 Viem,你可以通过下面方式来初始化 SDK 并调用 getBlockNumber
方法:
import { createPublicClient, http } from 'viem'
import { mainnet } from 'viem/chains'
const publicClient = createPublicClient({
chain: mainnet,
transport: http('https://api.zan.top/node/v1/eth/mainnet/${YOUR_ACCEEE_KEY}')
})
const blockNumber = await publicClient.getBlockNumber()
调用合约则需要通过调用 SDK 的 readContract
、simulateContract
和 writeContract
方法。
Viem SDK 的 readContract 方法在底层本质上调用的是 Ethereum JSON-RPC 接口中的 eth_call 方法。不消耗 Gas 且不会上链,用于调用那些只读的合约接口。writeContract 则是调用的 eth_sendTransaction,用于调用合约会发生写操作的接口。simulateContract 则是 Viem 通过调用 eth_call + eth_estimateGas 来模拟写操作的方法。
对于 writeContract
来说,写交易需要对交易做签名,所以你需要按照 SDK 的写法来初始化:
import { wagmiAbi } from './abi'
import { createWalletClient, custom } from 'viem'
import { mainnet } from 'viem/chains'
const walletClient = createWalletClient({
chain: mainnet,
transport: custom(window.ethereum!)
})
const publicClient = createPublicClient({
chain: mainnet,
transport: http('https://api.zan.top/node/v1/eth/mainnet/${YOUR_ACCEEE_KEY}')
})
const { request } = await publicClient.simulateContract({
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi,
functionName: 'mint',
args: [69420],
account
})
await walletClient.writeContract(request)
配置钱包的 RPC
对于钱包来说,也需要和链交互,你也可以通过在钱包中配置自定义网络来使用自定义的 RPC 服务,下面一 MetaMask 为例,你先在钱包左上角网络点开:
然后可以编辑已有的网络或者添加自定义网络:
比如我把调用以太坊的 RPC 换成 ZAN 的:
这样当钱包内发起交易和请求的时候就会使用 ZAN 的 RPC 服务了,这对速度和性能有特殊要求的用户很管用,另外有的链钱包还没有内置支持的情况下也可以通过这种方式添加到钱包。