【问题标题】:Private Network : web3.eth.getAccounts() always send empty array专用网络:web3.eth.getAccounts() 总是发送空数组
【发布时间】:2018-10-11 12:02:03
【问题描述】:

我正在运行一个私有以太坊网络。我确实使用https://aws.amazon.com/blockchain/templates/

整个设置已经完成。 AWS 上的东西看起来设置正确。现在,我正在尝试创建帐户并检索所有这些帐户。为此,我使用以下方法。

Web3Service.js

var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider(process.env.NETWORK_URL));

exports.getAccounts = function () {
    return web3.eth.getAccounts();
};

exports.createAccount = function () {
    return web3.eth.accounts.create();
};

app.js

var newAccount = await  web3Service.createAccount();
console.log('newAccount ', newAccount);

var accounts = await  web3Service.getAccounts();
console.log('accounts ', accounts);

我根本没有遇到任何错误。但在web3Service.getAccounts(); 的响应中,[] 数组始终为空。

我已经验证了 Etherium 设置。所有节点都运行良好。

您可以在这里找到整个代码库:blockchain-node Sample entire codebase

【问题讨论】:

    标签: ethereum web3js web3


    【解决方案1】:

    web3.eth.accounts.create 将为您提供以太坊地址和私钥。为了使新帐户可用于节点,您必须将新帐户信息存储在节点的密钥库中。

    当你调用create时,你会得到一个像这样的对象(from the docs):

    web3.eth.accounts.create();
    > {
        address: "0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01",
        privateKey: "0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709",
        signTransaction: function(tx){...},
        sign: function(data){...},
        encrypt: function(password){...}
    }
    

    使用encrypt 函数生成encrypted keystore。这是需要与节点一起存储的内容,以便可以通过web3.eth.getAccounts 检索。该位置会因节点客户端、操作系统以及是否在启动节点时覆盖密钥库位置而异(例如,Linux 上的默认 Geth 位置是 ~/.ethereum/keystore)。

    【讨论】:

    • 嗯。您的意思是在创建帐户后,我必须编写一些生成密钥库并将该密钥库复制到`Linux 上的 Geth 位置是 ~/.ethereum/keystore` 的函数?他们必须有某种方式自动做到这一点。
    • 有一些实用程序 API 可用于存储特定节点的密钥(即,github.com/yondonfu/truffle-keystore-provider 用于 Truffle...请注意,这不是我的仓库,我不担保它。我只是发布我找到的第一个。),但我不确定是否有一个通用的适用于所有节点客户端
    【解决方案2】:

    经过努力找到了解决办法:

    Web3Service.js

    /**
     *
     * Accounts Functions
     */
    
    exports.createAccount = function () {
        /* *
         * Create Account Local Machine Only.
         * It will not return in web3.eth.getAccounts(); call
         */
        return web3.eth.accounts.create();
    };
    
    exports.createPersonalAccount = function (password) {
        /* *
         * Create Account in Node.
         * web3.eth.getAccounts();
         */
        return web3.eth.personal.newAccount(password);
    };
    

    app.js

    var personalAccount = await web3Service.createPersonalAccount('123456789');
    console.log('personalAccount ', personalAccount);
    
    var accounts = await  web3Service.getAccounts();
    console.log('accounts ', accounts);
    

    更新来源:Working Source Code

    他们没有明确地对密钥库做任何事情。

    使用这个 --rpcapi db,eth,net,web3,personal 标志启动您的 Geth。有必要。否则,您将面临错误。

    【讨论】:

    • 当您使用web3.eth.personal.newAccount 时,您将无法再访问该帐户的私钥,这将导致您以后遇到其他问题(请参阅stackoverflow.com/q/50083957/8474917)。此外,将个人 API 暴露给您的 Geth 节点会带来安全风险。虽然您的回答可能有助于创建帐户并通过 getAccoounts 检索帐户,但您也引入了其他几个潜在问题。
    • 是的,没错。但我仍然可以在需要时使用新帐户签署交易。我的场景需要一个 Node 上的帐户才能与 Node 上的另一个帐户进行交易。这就是为什么我找到了一种简单的方法来获取个人帐户的原因。
    猜你喜欢
    • 1970-01-01
    • 2020-01-17
    • 2019-07-19
    • 2021-03-24
    • 2021-12-18
    • 2020-02-29
    • 2023-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多