[英]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.