所有教程都展示了如何使用“硬帽子”和“以太”来模拟帐户。在我的例子中,我创建了一个本地的mainnet叉并运行测试,并使用golang创建了TX,所以我很想知道如何不使用etherjs来模拟。
发布于 2022-01-07 23:41:04
硬硬参考中提到的是json调用的参数。这是独立于以太,可以执行与任何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 (由邮递员自动生成)的示例:
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))
}更好的围棋方法可能是使用一个wbe3库(例如web3go -> https://medium.com/coinmonks/web3-go-part-1-31c68c68e20e)。
发布于 2022-01-08 21:29:59
根据你的评论,我认为你有两件事要问:
tl;dr是Richard在回答和注释中所说的:使用hardhat_impersonateAccount RPC方法,然后用eth_sendTransaction发送事务,将from字段设置为模拟的地址帐户。我试着详述一下这意味着什么。
当你用钱包发送交易时,下面发生的事情是:
eth_sendRawTransaction将签名的事务发送到节点。这基本上适用于任何节点。
但是您也有一个eth_sendTransaction,在这里您不发送一个签名的事务。相反,您将发送一个对象,该对象显示“从此地址发送事务到此另一个地址,并具有此值和数据”等。
显然,这在任何节点上都是行不通的!如果是的话,任何人都可以从任何地址发送交易。
但是,在某些情况下,可以使用此方法。例如,在开发节点(如“硬帽”网络)中,有些地址是“未锁定的”。这些是npx hardhat node在启动节点时向您显示的地址。使用其中一个地址作为eth_sendTransaction字段的from调用将被接受。遮罩下的情况是,硬帽子节点可以访问地址的私钥,因此它可以在挖掘它之前对其进行签名。
您还可以使用这些地址的私钥,并通过签名和用eth_sendRawTransaction发送事务来发送相同的事务。这两种方法基本上没有区别。
现在,正如我前面提到的,当您用hardhat_impersonateAccount模拟一个帐户时,您可以使用eth_sendTransaction从模拟帐户发送事务。但是在引擎盖下发生的事情是不一样的。即使from地址没有正确地签名,也会看到它是模拟的,并接受事务。这意味着包含该事务的块在技术上违反了协商一致规则。
而且,与未锁定的帐户不同的是,在eth_sendRawTransaction中没有类似的方法,因为这意味着您拥有地址的私钥(如果有,那么首先模拟地址是没有意义的)。
发布于 2022-02-20 20:02:07
我也面临着同样的问题,并找到了解决办法:
// Instantiate a contract:
const TetherToken = artifacts.require("TetherToken");
tetherToken = await TetherToken.new(1000, 'TetherToken', 'USDT', 20);
// Get methods signatures:
console.log(tetherToken.methods);
// Call method "approve" with two parameters from account 0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc:
await tetherToken.methods["approve(address,uint256)"](someAddress, 5, { from: "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc" });https://ethereum.stackexchange.com/questions/118284
复制相似问题