Ich habe eine Anwendung geschrieben, um mich mit der lokalen Blockchain zu verbinden. Hier ist der Code:
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();
Die Anweisung console.log(web3.eth.accounts[1]);
gibt zurück undefined
, wo sie die zweite Kontoadresse zurückgeben sollte. Kann mir jemand helfen, das Problem mit diesem Code zu verstehen. Ich verwende die Version 1.0.0-beta.34 von web3.
Vielen Dank im Voraus
Kannst du bitte auch einfach anrufen console.log(web3)
statt web3.eth.accounts[1]
nur um sicherzugehen, dass web3 wirklich eingestellt ist und den richtigen Provider nutzt?
BEARBEITEN:
Nachdem ich die Dokumentation ( http://web3js.readthedocs.io/en/1.0/index.html ) erneut überprüft hatte, bemerkte ich, dass sie sich in 1.0.0-beta von web3 ziemlich stark geändert haben.
Die web3.eth.accounts enthalten Funktionen zum Generieren von Ethereum-Konten und Signieren von Transaktionen und Daten.
Es gibt also keine Möglichkeit, mit den Konten der Knoten von der Funktion aus zu interagieren web3.eth.accounts
.
Aber:
Das Paket web3-eth-personal ermöglicht es Ihnen, mit den Konten des Ethereum-Knotens zu interagieren.
Um das Abrufen von Konten zu erreichen, können Sie Folgendes tun:
web3.eth.personal.getAccounts().then(res => console.log(res[0]))
Nur um Sie wissen zu lassen: Sie können die Vertragsfunktion nicht so aufrufen, wie Sie es versuchen ... wenn Sie dies über den Code tun möchten, müssen Sie die Transaktion signieren.
Stellen Sie zunächst sicher, dass Sie sich in der richtigen Kette befinden. Wenn Ihr zweites Konto nicht vorhanden ist, könnten Sie mit der falschen Ketten-ID, dem falschen Netzwerk usw. verbunden sein. Überprüfen Sie dann Ihre Konten. Wenn Sie einen lokalen Host verwenden, bestätigen Sie Ihre Coinbase und Etherbase mit
eth.defaultAccount=eth.coinbase
Haben Sie versucht, den IPC-Anbieter anstelle von http zu verwenden? Hier ist ein Beispiel:
var web3 = new Web3(new Web3.providers.IpcProvider('/home/you/yourchain/datadir/geth.ipc', require('net')));
Sie können immer noch eine Verbindung mit Ihrer lokalen Hostadresse herstellen, aber Sie können sie auf die Datei verweisen, die Ihre Kette ausführt, und rufen Sie über IPC/RPC auf.
Stellen Sie sicher, dass alle RPC-Flags wie corsdomain „*“ in Ihrer lokalen Kette sowie „personal,eth,web3,net“ aktiviert sind.
Stellen Sie zunächst sicher, dass Sie über eine Anzahl von Konten verfügen .
web3.eth.accounts[0]
ist das erste Konto in der Reihe von Konten.
web3.eth.accounts[1]
Abrufen des zweiten Kontos des Netzwerks.
Bestätigen Sie mit web3.eth.coinbase
, es darzustellenaccount[0]
Überprüfen Sie, ob die Endpunktverbindung wahr ist.
Web3.providers.HttpProvider("http://localhost:7545"));
console.log(Web3);
Wenn dies keinen Fehler auslöst und die web3-bezogene Konsolenausgabe anzeigt, ist Ihr Endpunkt wahr.
Prüfen Sie anschließend, ob Ihr Codeschnipsel korrekt ist.
Nur web3.eth.accounts[] funktioniert nicht in der Beta-Version von web3 v 1.xx. Ich habe es mit der Funktion web3.eth.getAccounts() versucht und sie dann in einer Variablen mit dem Namen accounts gespeichert und versucht, accounts[1] zu verwenden, und es hat auch funktioniert.
K Kolluru
Kai Kälberer
web3.eth.accounts
vollständig geändert wurde. Um die Konten zu erhalten, habe ich einfach Folgendes getan:web3.eth.personal.getAccounts().then(res => console.log(res[0]))