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
¿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.accounts
la 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.
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".
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]
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.
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ó.
K Kolluru
Kai Kalberer
web3.eth.accounts
había cambiado por completo. Para obtener las cuentas solo hice lo siguiente:web3.eth.personal.getAccounts().then(res => console.log(res[0]))