私人以太坊网络无法识别发件人帐户

Posted

技术标签:

【中文标题】私人以太坊网络无法识别发件人帐户【英文标题】:Sender account not recognized on private ethereum network 【发布时间】:2019-03-19 16:24:11 【问题描述】:

我目前正在使用 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 客户端的设备上,但这会引发此异常。

我哪里错了?在与它进行交易之前,我应该在某处注册新创建的帐户吗?我在这里遗漏了一些重要信息吗?

谢谢!

【问题讨论】:

【参考方案1】:

如果您想使用 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 上收听

【讨论】:

【参考方案2】:

您指的是尚未完全发布的 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.x.x 的当前文档。

您很可能正在使用 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: Build Dapps In Ethereum Blockchain

这是一张折扣券:QAUS8657

【讨论】:

【参考方案3】:

我在我的项目中遇到了同样的问题。我的问题是因为我没有使用相同的 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]);

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

【讨论】:

以上是关于私人以太坊网络无法识别发件人帐户的主要内容,如果未能解决你的问题,请参考以下文章

“应用程序将无法检索通知。推送服务:无法识别发件人帐户”

如何使用以太坊从reactjs中的metamask帐户注销

使用Azure Ethereum PoA解决方案模板在以太坊网络上设置初始以太网

为啥在尝试从节点脚本部署以太坊智能合约时出现“无效发件人”(-32000)?

CryptoCurrency NODE.js Web3 以太坊 - 无法连接到 TESTRPC

问题以太坊私链连接钱包报错解决汇总