首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不使用etherjs的情况下模拟本地分叉的帐户

如何在不使用etherjs的情况下模拟本地分叉的帐户
EN

Ethereum用户
提问于 2022-01-07 23:06:57
回答 3查看 2.3K关注 0票数 2

所有教程都展示了如何使用“硬帽子”和“以太”来模拟帐户。在我的例子中,我创建了一个本地的mainnet叉并运行测试,并使用golang创建了TX,所以我很想知道如何不使用etherjs来模拟。

EN

回答 3

Ethereum用户

发布于 2022-01-07 23:41:04

硬硬参考中提到的是json调用的参数。这是独立于以太,可以执行与任何http客户端在任何语言。

使用cUrl的示例

代码语言:javascript
复制
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 (由邮递员自动生成)的示例:

代码语言:javascript
复制
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)。

票数 3
EN

Ethereum用户

发布于 2022-01-08 21:29:59

根据你的评论,我认为你有两件事要问:

  • 我如何冒充一个帐户?
  • 如何从模拟帐户发送事务处理?

tl;dr是Richard在回答和注释中所说的:使用hardhat_impersonateAccount RPC方法,然后用eth_sendTransaction发送事务,将from字段设置为模拟的地址帐户。我试着详述一下这意味着什么。

当你用钱包发送交易时,下面发生的事情是:

  1. 钱包用你的私钥签交易。
  2. 可以使用eth_sendRawTransaction将签名的事务发送到节点。

这基本上适用于任何节点。

但是您也有一个eth_sendTransaction,在这里您不发送一个签名的事务。相反,您将发送一个对象,该对象显示“从此地址发送事务到此另一个地址,并具有此值和数据”等。

显然,这在任何节点上都是行不通的!如果是的话,任何人都可以从任何地址发送交易。

但是,在某些情况下,可以使用此方法。例如,在开发节点(如“硬帽”网络)中,有些地址是“未锁定的”。这些是npx hardhat node在启动节点时向您显示的地址。使用其中一个地址作为eth_sendTransaction字段的from调用将被接受。遮罩下的情况是,硬帽子节点可以访问地址的私钥,因此它可以在挖掘它之前对其进行签名。

您还可以使用这些地址的私钥,并通过签名和用eth_sendRawTransaction发送事务来发送相同的事务。这两种方法基本上没有区别。

现在,正如我前面提到的,当您用hardhat_impersonateAccount模拟一个帐户时,您可以使用eth_sendTransaction从模拟帐户发送事务。但是在引擎盖下发生的事情是不一样的。即使from地址没有正确地签名,也会看到它是模拟的,并接受事务。这意味着包含该事务的块在技术上违反了协商一致规则。

而且,与未锁定的帐户不同的是,在eth_sendRawTransaction中没有类似的方法,因为这意味着您拥有地址的私钥(如果有,那么首先模拟地址是没有意义的)。

票数 1
EN

Ethereum用户

发布于 2022-02-20 20:02:07

我也面临着同样的问题,并找到了解决办法:

代码语言:javascript
复制
// 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" });
票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/118284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档