Подключение к локальной цепочке блоков с помощью web3 и HttpProvider

Я написал приложение для подключения к локальному блокчейну. Вот код:

var Web3 = require('web3');
var contract = require('./PublishService_abi.js');
var PublishServiceContract;
var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:7545"));

function init() {
  //initializing web3 to access blockchain
  initweb3();
}

async function initweb3() {
    try {
        /*//To make sure not to overwrite the already set provider when in mist, check first if the web3 is available
        if (typeof web3 !== 'undefined') {
                web3 = await new Web3(web3.currentProvider);
            console.log("inside if");
        } else {
            // create an instance of web3 using the HTTP provider
                web3 = await new Web3(new Web3.providers.HttpProvider("http://localhost:7545"));
            console.log("inside else");
        }*/
        console.log(web3.eth.accounts[1]);
        var PublishServiceContractAddress = "0x0da136781e562e28fb1c0b3efc8ce9d8b4e226f2";
        PublishServiceContract = await new web3.eth.Contract(contract,PublishServiceContractAddress);
        //console.log(PublishServiceContract.options.jsonInterface); 
        await addServiceProducer1("LC1","SP1","location:inside;reading:degree","scattr","ngac");
    }
    catch(err) {
        console.log(err);
    }
}

async function addServiceProducer1(s1,s2,s3,s4,s5) {
    try{
        console.log(s1 +"\n" + s2 +"\n" + s3 +"\n" + s4 +"\n" + s5 +"\n" );
        const instance = await PublishServiceContract.methods.addEntry(s1,web3.eth.accounts[1],s2,s3,s4,s5).send({from:web3.eth.accounts[1]});
        console.log("sp details added successfully");
    }
    catch(err) {
        console.log(err);   
    }
}

init();

Оператор console.log(web3.eth.accounts[1]);возвращает undefined, где он должен возвращать адрес второй учетной записи. Может кто-нибудь помочь мне понять проблему с этим кодом. Я использую версию web3 1.0.0-beta.34.

заранее спасибо

Ответы (4)

Не могли бы вы также просто позвонить, console.log(web3)а не web3.eth.accounts[1]просто убедиться, что web3 действительно настроен и использует правильного провайдера?

РЕДАКТИРОВАТЬ:

После повторной проверки документов ( http://web3js.readthedocs.io/en/1.0/index.html ) я заметил, что в 1.0.0-beta web3 они довольно сильно изменились.

Web3.eth.accounts содержит функции для создания учетных записей Ethereum и подписи транзакций и данных.

Таким образом, нет возможности взаимодействовать с учетными записями узлов из web3.eth.accountsфункции.

Но:

Пакет web3-eth-personal позволяет вам взаимодействовать с учетными записями узла Ethereum.

Итак, чтобы получить учетные записи, вы можете сделать что-то вроде:

web3.eth.personal.getAccounts().then(res => console.log(res[0]))


Также просто чтобы вы знали: вы не сможете вызывать функцию контракта, как вы пытаетесь... если вы хотите сделать это из кода, вам нужно будет подписать транзакцию.

Привет, я закомментировал этот блок if-else. Я думаю, вы пропустили, чтобы заметить это. Да, проблема в том, что я не могу получить доступ к провайдеру. даже я попробовал console.log(web3.eth), и вы можете найти вывод консоли здесь: github.com/katkol/Share/blob/master/web3_eth_log.txt
Извините за это, как вы сказали, я пропустил это. Поэтому я только что перепроверил документы web3-beta и заметил, что они web3.eth.accountsполностью изменены. Чтобы получить учетные записи, я сделал следующее:web3.eth.personal.getAccounts().then(res => console.log(res[0]))

Сначала убедитесь, что вы находитесь в правильной цепочке. Если вашей второй учетной записи нет, возможно, вы подключены к неправильному идентификатору цепочки, сети и т. д. Затем проверьте свои учетные записи. Если вы используете локальный хост, подтвердите свои coinbase и etherbase с помощью

eth.defaultAccount=eth.coinbase

Вы пробовали использовать провайдера ipc вместо http? Вот пример:

var web3 = new Web3(new Web3.providers.IpcProvider('/home/you/yourchain/datadir/geth.ipc', require('net')));

Вы по-прежнему можете подключиться, используя свой локальный адрес хоста, но вы можете указать его на файл, в котором запущена ваша цепочка вызовов через ipc/rpc.

Убедитесь, что в вашей локальной сети включены все флаги rpc, такие как corsdomain "*", а также "personal,eth,web3,net".

Привет, я попытался подключиться к этой цепочке с помощью трюфеля и развернул контракт с учетной записи 1, поэтому я не думаю, что проблема с идентификатором цепочки. Попробую и с ipc.

Прежде всего, убедитесь, что у вас есть количество учетных записей .
web3.eth.accounts[0]является первой учетной записью в массиве учетных записей.
web3.eth.accounts[1]получить вторую учетную запись сети.

подтвердите с web3.eth.coinbase, это представляетaccount[0]

Дополнение к ответу

проверьте, является ли соединение конечной точки истинным.

Web3.providers.HttpProvider("http://localhost:7545"));
            console.log(Web3);

Если это не вызывает никаких ошибок и не показывает вывод консоли, связанный с web3, то ваша конечная точка верна.
После этого проверьте правильность вашего фрагмента кода.

Привет, я использую тестовую сеть ganache. Он имеет 10 аккаунтов с балансом 100 эфиров. Я также пытался распечатать учетную запись eth0, используя web3.eth.accounts[0], она также возвращает значение undefined.

Только web3.eth.accounts[] не работает в бета-версии web3 v 1.xx. Я попытался использовать функцию web3.eth.getAccounts(), а затем сохранил ее в переменной с именем учетных записей и попытался использовать учетные записи [1], и это тоже сработало.