Verbindung zur lokalen Blockchain über web3 und HttpProvider

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

Antworten (4)

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.

Hallo, ich habe diesen if-else-Block auskommentiert. Ich glaube, das ist dir entgangen. Ja, das Problem ist, dass ich nicht auf den Anbieter zugreifen kann. sogar ich habe console.log(web3.eth) ausprobiert und Sie können die Konsolenausgabe hier finden: github.com/katkol/Share/blob/master/web3_eth_log.txt
Tut mir leid, wie gesagt, ich habe es übersehen. Also habe ich gerade die Dokumentation von web3-beta erneut überprüft und festgestellt, dass dies web3.eth.accountsvollständig geändert wurde. Um die Konten zu erhalten, habe ich einfach Folgendes getan:web3.eth.personal.getAccounts().then(res => console.log(res[0]))

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.

Hallo, ich habe versucht, mich mit Truffle mit dieser Kette zu verbinden und einen Vertrag von Konto 1 bereitgestellt, also glaube ich nicht, dass es ein Problem mit der Ketten-ID gibt. Ich werde es auch mit IPC versuchen.

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]

Ergänzung zur Antwort

Ü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.

Hallo, ich verwende das Ganache-Testnetzwerk. Es hat 10 Konten mit 100 Ether Guthaben. Ich habe versucht, auch das eth0-Konto mit web3.eth.accounts[0] zu drucken, es gibt auch undefiniert zurück.

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.