Hardhat 如何在不使用 etherjs 的情況下模擬本地分叉的帳戶
所有教程都展示瞭如何使用 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_impersonateAccount
RPC 方法,然後使用 發送交易eth_sendTransaction
,將from
欄位設置為地址模擬帳戶。我將嘗試擴展這意味著什麼。當您從錢包發送交易時,幕後發生的事情是這樣的:
- 錢包使用您的私鑰簽署交易。
- 簽名的交易可以使用
eth_sendRawTransaction
這基本上適用於任何節點。
但是您也有
eth_sendTransaction
,您不發送已簽名的交易。相反,您發送一個對象,上面寫著“使用此值和數據從該地址向另一個地址發送交易”等。顯然這在任何節點上都不起作用!如果是這樣,任何人都可以從任何地址發送交易。
但是有一些場景可以使用這種方法。例如,在像 Hardhat 網路這樣的開發節點中,一些地址是“解鎖的”。這些是
npx hardhat node
在您啟動節點時向您顯示的地址。eth_sendTransaction
將接受使用這些地址之一作為from
欄位的呼叫。幕後發生的事情是,Hardhat 節點可以訪問地址的私鑰,因此它可以在探勘之前對其進行簽名。您還可以使用這些地址的私鑰並通過簽署並發送相同的交易
eth_sendRawTransaction
。這兩種方法基本上沒有區別。現在,正如我之前提到的,當您模擬帳戶時,
hardhat_impersonateAccount
您可以使用eth_sendTransaction
模擬帳戶發送交易。但在幕後發生的事情是不同的。Hardhat 將看到該from
地址被冒充並接受交易,即使它沒有正確簽名。這意味著包含該交易的區塊在技術上違反了共識規則。而且,與解鎖帳戶不同的是,沒有等效的方法來執行此
eth_sendRawTransaction
操作,因為這意味著您擁有地址的私鑰(並且,如果您這樣做,則首先冒充該地址是沒有意義的) .