iT邦幫忙

2023 iThome 鐵人賽

DAY 2
0
自我挑戰組

Viem 介紹系列 第 3

Day3 - Introduction to Clients (1) - Public Client

  • 分享至 

  • xImage
  •  

Clients 可以想像是提供客戶端一個可訪問鏈上的工具。

分為三類

  • Public Client
    • 提供 PUBLIC JSON-RPC API 的介面,如 getBlockNumber 目前區塊數 , getBalance 目前餘額
  • Wallet Client
    • 錢包客戶與以太坊交互的介面,如 sendTransaction 傳送交易, signMessage 簽名訊息
  • Test Client
    • 提供客戶端本地開發的介面,例如 hardhat, ganache

先說明 Public Client

使用公共用戶端的 JSON-RPC-API 方法的介面

import

import { createPublicClient } from 'viem'

簡單的範例

import { createPublicClient, http } from 'viem'
import { mainnet } from 'viem/chains'

const client = createPublicClient({ 
	chain: mainnet, // 設定 chain
	transport: http(), // 選擇 http 或 webSocket
})

const blockNumber = await client.getBlockNumber() // 取得目前區塊號

優化:

試想一下我們在和鏈上互動時,都會需要使用 rpc 去互動,如果我們要呼叫很多合約方法就需要分別呼叫並多個 rpc 請求…如果又要及時更新的資料想必…請求量相當驚人,所以團隊對eth_call優化,有機會大家可以看一下這個 multicall3 內部就是使用這個。

以下用 USDT 得合約做範例

Address: 0xdAC17F958D2ee523a2206206994597C13D831ec7

abi: https://etherscan.io/token/0xdac17f958d2ee523a2206206994597c13d831ec7#code

import { createPublicClient, http } from 'viem';
import { mainnet } from 'viem/chains';
import { getContract } from 'viem';

const client = createPublicClient({
	batch: {
		multicall: true,     // 批次處理
		batchSize: 10,      // 呼叫資料大小限制
		wait: 16,           //批次處理等待最大延遲(毫秒數)
		cacheTime: 10_000,  // 快取時間
	},
	chain: mainnet, // 設定 chain
	transport: http(), // 選擇 http 或 webSocket
});

const contract = getContract({
	address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
	abi: [], //... 可以到上列地址複製
	chain: mainnet,
	publicClient: client,
});

contract.read.name().then(console.log);

// await
const [name, totalSupply, symbol] = await Promise.all([
	contract.read.name(),
	contract.read.totalSupply(),
	contract.read.symbol(),
]);

console.log(name, totalSupply, symbol); 

大家可以感受看看 multicall: true,false的差別
我感覺是我的使用場景不夠複雜比較沒感受,但有做出來這功能就可以試試。

實作範例:
https://github.com/0xRory/ITHepleViem/blob/main/examples/2_1_public.js

參考:
https://viem.sh/docs/clients/public.html


上一篇
Day2 - 小試身手
下一篇
Day4 - Introduction to Clients (2) - Wallet Client & Test Client
系列文
Viem 介紹11
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言