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