Hardhat

Hardhat 如何在不使用 etherjs 的情況下模擬本地分叉的帳戶

  • February 20, 2022

所有教程都展示瞭如何使用 hardhat 和 etherjs 模擬帳戶。在我的情況下,我創建了一個本地主網分支並執行測試並使用 golang 創建 TX,因此很想知道如何在不使用 etherjs 的情況下進行模擬

硬硬參考中提到的是 json rpc 呼叫的參數。這與乙太無關,可以使用任何語言的任何 http 客戶端執行。

使用 cUrl 的範例

curl --location --request POST 'localhost:8545' \
--header 'Content-Type: application/json' \
--data-raw '{
   "jsonrpc": "2.0",
   "id": "1",
   "method": "hardhat_impersonateAccount",
   "params": ["0x364d6D0333432C3Ac016Ca832fb8594A8cE43Ca6"]
}'

使用範例native go(由郵遞員 :D 自動生成):

package main

import (
 "fmt"
 "strings"
 "net/http"
 "io/ioutil"
)

func main() {

 url := "localhost:8545"
 method := "POST"

 payload := strings.NewReader(`{
   "jsonrpc": "2.0",
   "id": "1",
   "method": "hardhat_impersonateAccount",
   "params": ["0x364d6D0333432C3Ac016Ca832fb8594A8cE43Ca6"]
}`)

 client := &http.Client {
 }
 req, err := http.NewRequest(method, url, payload)

 if err != nil {
   fmt.Println(err)
   return
 }
 req.Header.Add("Content-Type", "application/json")

 res, err := client.Do(req)
 if err != nil {
   fmt.Println(err)
   return
 }
 defer res.Body.Close()

 body, err := ioutil.ReadAll(res.Body)
 if err != nil {
   fmt.Println(err)
   return
 }
 fmt.Println(string(body))
}

可能更好的 go 方法是使用其中一個 wbe3 庫(例如 web3go -> https://medium.com/coinmonks/web3-go-part-1-31c68c68e20e

根據您的評論,我認為您要問兩件事:

  • 如何模擬帳戶?
  • 如何從模擬賬戶發送交易?

tl;dr 是 Richard 在他們的回答和評論中所說的:使用hardhat_impersonateAccountRPC 方法,然後使用 發送交易eth_sendTransaction,將from欄位設置為地址模擬帳戶。我將嘗試擴展這意味著什麼。


當您從錢包發送交易時,幕後發生的事情是這樣的:

  1. 錢包使用您的私鑰簽署交易。
  2. 簽名的交易可以使用eth_sendRawTransaction

這基本上適用於任何節點。

但是您也有eth_sendTransaction,您不發送已簽名的交易。相反,您發送一個對象,上面寫著“使用此值和數據從該地址向另一個地址發送交易”等。

顯然這在任何節點上都不起作用!如果是這樣,任何人都可以從任何地址發送交易。

但是有一些場景可以使用這種方法。例如,在像 Hardhat 網路這樣的開發節點中,一些地址是“解鎖的”。這些是npx hardhat node在您啟動節點時向您顯示的地址。eth_sendTransaction將接受使用這些地址之一作為from欄位的呼叫。幕後發生的事情是,Hardhat 節點可以訪問地址的私鑰,因此它可以在探勘之前對其進行簽名。

您還可以使用這些地址的私鑰並通過簽署並發送相同的交易eth_sendRawTransaction。這兩種方法基本上沒有區別。

現在,正如我之前提到的,當您模擬帳戶時,hardhat_impersonateAccount您可以使用eth_sendTransaction模擬帳戶發送交易。但在幕後發生的事情是不同的。Hardhat 將看到該from地址被冒充並接受交易,即使它沒有正確簽名。這意味著包含該交易的區塊在技術上違反了共識規則。

而且,與解鎖帳戶不同的是,沒有等效的方法來執行此eth_sendRawTransaction操作,因為這意味著您擁有地址的私鑰(並且,如果您這樣做,則首先冒充該地址是沒有意義的) .

引用自:https://ethereum.stackexchange.com/questions/118284