Я написал приложение для подключения к локальному блокчейну. Вот код:
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.
заранее спасибо
Не могли бы вы также просто позвонить, 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]))
Также просто чтобы вы знали: вы не сможете вызывать функцию контракта, как вы пытаетесь... если вы хотите сделать это из кода, вам нужно будет подписать транзакцию.
Сначала убедитесь, что вы находитесь в правильной цепочке. Если вашей второй учетной записи нет, возможно, вы подключены к неправильному идентификатору цепочки, сети и т. д. Затем проверьте свои учетные записи. Если вы используете локальный хост, подтвердите свои 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".
Прежде всего, убедитесь, что у вас есть количество учетных записей .
web3.eth.accounts[0]
является первой учетной записью в массиве учетных записей.
web3.eth.accounts[1]
получить вторую учетную запись сети.
подтвердите с web3.eth.coinbase
, это представляетaccount[0]
проверьте, является ли соединение конечной точки истинным.
Web3.providers.HttpProvider("http://localhost:7545"));
console.log(Web3);
Если это не вызывает никаких ошибок и не показывает вывод консоли, связанный с web3, то ваша конечная точка верна.
После этого проверьте правильность вашего фрагмента кода.
Только web3.eth.accounts[] не работает в бета-версии web3 v 1.xx. Я попытался использовать функцию web3.eth.getAccounts(), а затем сохранил ее в переменной с именем учетных записей и попытался использовать учетные записи [1], и это тоже сработало.
К Коллуру
Кай Кэлберер
web3.eth.accounts
полностью изменены. Чтобы получить учетные записи, я сделал следующее:web3.eth.personal.getAccounts().then(res => console.log(res[0]))