這邊主要是針對測試節點的動作
Test Action 是 Viem 的重要組成部分,因為它們提供了一種在以太坊網絡上測試和模擬不同場景的方法。
開發人員在構建 dapp 和其他應用程序時通常會使用它們,這些應用程序在部署到網絡之前需要進行測試。
通過使用 Test Actions,開發人員可以在受控環境中測試其應用程序的行為,而不需要真正的餘額或真實用戶。
這樣就能更容易地識別和修復錯誤,並確保應用程序在部署到網絡時能按預期運行。
簡單範例
import { createTestClient, http } from 'viem';
import { foundry } from 'viem/chains';
export const testClient = createTestClient({
chain: foundry,
mode: 'anvil',
transport: http(),
});
await testClient.impersonateAccount({
address: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',
});
但你們一定會看到錯誤
其中會有url : 127.0.0.1:8545
這裡可以得知 Test Action 就是測試本地端
我們看一下 mode: 'anvil'
這個屬性裡面大概長這樣
/** Mode of the test client. */
mode: mode | ('anvil' | 'hardhat' | 'ganache') // TODO: Type utility that expands `TestClientMode`
修正一下
import { createTestClient, http } from 'viem';
import { hardhat } from 'viem/chains';
export const testClient = createTestClient({
chain: hardhat,
mode: 'hardhat',
transport: http(),
});
// 模仿帳號
await testClient.impersonateAccount({
address: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',
});
我們可以使用 hardhat 或 ganache 建立本地的測試節點,ganache 有些 function 好像沒提供,所以還是使用 hardhat 會呼叫 impersonateAccount
啟動測試節點
npx hardhat install
npx hardhat node
執行~會發現節點呼叫 function
接下來是一些 Account 上的設定
impersonateAccount
模仿帳號
setBalance
設定金額
setCode
設定Bycode
setNonce
設定順序
setStorageAt
設定 storage
stopImpersonatingAccount
停止模仿帳號
// 模仿帳號, 或合約
await testClient.impersonateAccount({
address: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',
});
// 設定金額
await testClient.setBalance({
address: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',
value: parseEther('1'),
});
// 這裡是假冒帳號,所以可以直接取得餘額(publicClient)
// 如果你使用 testClient.getBalance,則會拋出錯誤
const balance = await await publicClient.getBalance({
address: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',
});
console.log(balance.toString());
// 設定地址的 bytecode 這在前面 Day 8 -Transaction(1) 有提到可以回去看
// 但不會去改這個...
await testClient.setCode({
address: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',
bytecode:
'0x60806040526000600355600019600955600c80546001600160a01b031916737a250d5630b4cf539739df...',
});
// https://zh.m.wikipedia.org/zh-tw/Nonce
// 這部分我研究沒有很深,不過大概知道是用來防止重複交易的
// 設定順序
await testClient.setNonce({
address: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',
nonce: 420,
});
// 設定 storage
await testClient.setStorageAt({
address: '0xe846c6fcf817734ca4527b28ccb4aea2b6663c79',
index: 2,
value: '0x0000000000000000000000000000000000000000000000000000000000000069',
});
// 停止模仿帳號
await testClient.stopImpersonatingAccount({
address: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',
});
大家看一下這些動作一般來說不會在正常節點或帳號中使用,能用真的是天下大亂!!
設定地址的 bytecode 這在前面 Day 8 -Transaction(1) 有提到,可以回去看
Nonce 可以看一下這篇 https://zh.m.wikipedia.org/zh-tw/Nonce
程式實作:
https://github.com/0xRory/ITHepleViem/blob/main/examples/5_1_testAction.js
參考:
https://viem.sh/docs/actions/test/impersonateAccount.html
https://viem.sh/docs/actions/test/setBalance.html
https://viem.sh/docs/actions/test/setCode.html
https://viem.sh/docs/actions/test/setNonce.html
https://viem.sh/docs/actions/test/setStorageAt.html
https://viem.sh/docs/actions/test/stopImpersonatingAccount.html