Conexión a blockchain local usando web3 y HttpProvider

Escribí una aplicación para conectarme a la cadena de bloques local. Aquí está el código:

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();

El extracto console.log(web3.eth.accounts[1]);devuelve undefined, donde debería devolver la segunda dirección de cuenta. ¿Puede alguien ayudarme a entender el problema con este código? Estoy usando la versión 1.0.0-beta.34 de web3.

gracias de antemano

Respuestas (4)

¿Puedes simplemente llamar console.log(web3)en lugar de web3.eth.accounts[1]solo para asegurarte de que web3 está realmente configurado y usando el proveedor correcto?

EDITAR:

Después de volver a revisar los documentos ( http://web3js.readthedocs.io/en/1.0/index.html ) noté que en 1.0.0-beta de web3 cambiaron bastante.

El web3.eth.accounts contiene funciones para generar cuentas Ethereum y firmar transacciones y datos.

Por lo tanto, no hay forma de interactuar con las cuentas de los nodos desde web3.eth.accountsla función.

Pero:

El paquete web3-eth-personal le permite interactuar con las cuentas del nodo Ethereum.

Entonces, para lograr obtener cuentas, puede hacer algo como:

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


También solo para informarle: no podrá llamar a la función de contrato como lo está intentando ... si desea hacer esto desde el código, deberá firmar la transacción.

Hola, comenté ese bloque if-else. Creo que no te diste cuenta de eso. Sí, el problema es que no puedo acceder al proveedor. incluso probé console.log (web3.eth) y puede encontrar la salida de la consola aquí: github.com/katkol/Share/blob/master/web3_eth_log.txt
Lo siento por eso, como dijiste, lo pasé por alto. Así que volví a revisar los documentos de web3-beta y noté que web3.eth.accountshabía cambiado por completo. Para obtener las cuentas solo hice lo siguiente:web3.eth.personal.getAccounts().then(res => console.log(res[0]))

Primero verifique que está en la cadena correcta. Si su segunda cuenta no está allí, podría estar conectado a la ID de cadena, red, etc. incorrecta. Luego verifique sus cuentas. Si está utilizando un host local, confirme su coinbase y etherbase con

eth.defaultAccount=eth.coinbase

¿Has intentado usar el proveedor de ipc en lugar de http? Aquí hay un ejemplo:

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

Todavía puede conectarse usando su dirección de host local, pero puede señalarlo al archivo que ejecuta su cadena y una llamada a través de ipc/rpc.

Asegúrese de que todas las marcas de rpc, como corsdomain "*", estén habilitadas en su cadena local, así como "personal,eth,web3,net".

Hola, intenté conectarme a esta cadena usando truffle e implementé un contrato desde la cuenta 1, así que no creo que haya ningún problema con la identificación de la cadena. Probaré con ipc también.

En primer lugar, asegúrese de tener varias cuentas .
web3.eth.accounts[0]es la primera cuenta en la matriz de cuentas.
web3.eth.accounts[1]recuperar la segunda cuenta de la red.

confirmar con web3.eth.coinbase, representaaccount[0]

Adición en la respuesta

compruebe si la conexión del punto final es verdadera.

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

Si esto no arroja ningún error y muestra la salida de la consola relacionada con web3, entonces su punto final es verdadero.
Después de esto, compruebe si su fragmento de código es correcto.

Hola, estoy usando la red de prueba de ganache. Tiene 10 cuentas con 100 de saldo ether. Traté de imprimir la cuenta eth0 también usando web3.eth.accounts[0], también está devolviendo indefinido.

Solo web3.eth.accounts[] no funciona en la versión beta de web3 v 1.xx. Probé con la función web3.eth.getAccounts() y luego la almacené en una var cuentas con nombre e intenté usar las cuentas [1] y también funcionó.