iT邦幫忙

2023 iThome 鐵人賽

DAY 4
0
自我挑戰組

Viem 介紹系列 第 10

Day 10 - Test Action

  • 分享至 

  • xImage
  •  

這邊主要是針對測試節點的動作

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

https://ithelp.ithome.com.tw/upload/images/20230915/201620554dTKYkwPNP.png

接下來是一些 Account 上的設定/images/emoticon/emoticon39.gif

  • 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) 有提到,可以回去看/images/emoticon/emoticon12.gif

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


上一篇
Day 9 - Transaction (2)
下一篇
Day 11 - Contract- Instances (1)
系列文
Viem 介紹11
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言