繁体   English   中英

私有 ethereum.network 无法识别发件人帐户

[英]Sender account not recognized on private ethereum network

我目前正在用 Solidity 开发一个 dApp,并且正在开发一个 web3 库来处理与它的通信。

我在 web3 中为新帐户创建和交易签名的过程而苦恼。 在我继续之前,值得注意的是我正在运行我自己的本地私有区块链(目前使用 Ganache)。

我的代码如下所示:

try{
    let a = web3.eth.accounts.create()
    let dataTx = someContract.methods.someMethod().encodeABI()
    let rawTx = {
        to: someContract._address,
        from: account.address,
        data: dataTx,
        gas: 10000000000
    }


    const transaction = web3.eth.accounts.signTransaction(rawTx, util.toBuffer(account.privateKey))
    web3.eth.sendTransaction(rawTx).then(console.log)
}
catch(e){
    console.log(e)
}

这里的问题是web3.eth.sendTransaction()方法引发了以下异常: Error: Returned error: sender account not recognized

我的理解是web3.eth.accounts用于管理本地帐户,而web3.eth.personal用于与客户端(例如 Geth)通信。 我希望保留我的应用程序在 web3 客户端设备上本地创建的帐户的私钥,但它会引发此异常。

我哪里错了? 我应该在运行交易之前在某处注册新创建的帐户吗? 我在这里缺少一些重要信息吗?

谢谢!

您指的是尚未完全发布的web3 1.0.0中的功能。 如果您访问https://web3js.readthedocs.io/en/1.0/getting-started.html,您会看到它们指出以下内容:

本文档正在开发中,尚未发布web3.js 1.0! 您可以在github.com/ethereum/wiki/wiki/JavaScript-API上找到web3 0.xx的当前文档。

很可能您正在使用0.20.x或类似的版本,因此请先检查一下。 要对此进行检查,请在浏览器中打开dApp,然后在控制台中键入以下内容:

web3.version.api

这应该显示您正在使用哪个版本。

我认为没有办法直接使用web3js 0.20.x创建帐户,但是您可以尝试将web3js更新为1.0.0-beta,然后尝试再次运行代码。 您可以在NPM中找到它-https: //www.npmjs.com/package/web3

如果您想了解有关Solidity和智能合约创建的更多信息,请查看我专门为此做的课程-Solidity Smart Contracts:在以太坊区块链中构建Dapps

这是折价券: QAUS8657

如果要使用Ganache提供的帐户以外的其他帐户,则必须启动Ganache以private_key,initial_balance形式提供帐户数据:

示例命令: ganache-cli --account 0xf38b5679751228eab7d9f3aa02bd0b0c0f7b44e448c0cfd410a1d7053efb6c56,123456789

它的输出是:

Ganache CLI v6.1.8(ganache-core:2.2.1)

可用帐户=================(0)0x44fa41e453654ccb365a358e994c764a37eea91f(〜0 ETH)

私钥=================(0)0xf38b5679751228eab7d9f3aa02bd0b0c0f7b44e448c0cfd410a1d7053efb6c56

汽油价格================== 20000000000

气体限制================== 6721975

聆听127.0.0.1:8545

我在我的项目中遇到了同样的问题。 我的问题是因为我没有使用相同的 web3 提供程序来创建合同变量。 示例代码:

const providerEth= new Web3.providers.HttpProvider(
    'HTTP://127.0.0.1:8545'
);
const web3Eth = new Web3(providerEth);
const contract= new web3Eth.eth.Contract(abi,address);

在这里,我们没有使用元掩码提供程序,尽管它们都在同一网络上,但它仍然无法识别该帐户。 所以你应该像这样创建合同

const web3Eth = new Web3(window.web3.currentProvider);
const contract= new web3Eth.eth.Contract(abi,address);

const accounts = await web3.eth.getAccounts();
var receipt=await contract.methods.transfer(receiver,amount).send({from:accounts[0]});

现在,您可以使用帐户地址调用智能合约功能。

我遇到过同样的问题。 它发生在我已经打开松露控制台的时候,之后我重新启动了我的甘纳许,因为我想开始干净。 为我修复的是停止松露控制台作业并重新启动它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM