簡體   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