透過 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 的 readContractsimulateContractwriteContract 方法。

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 服務了,這對速度和性能有特殊要求的用戶很管用,另外有的鏈錢包還沒有內置支持的情況下也可以通過這種方式添加到錢包。