NodeJS+web3: la lectura de un contrato funciona, ¿qué hay de escribir en un contrato? [duplicar]

En Mist puedes llamar funciones de contratos de dos maneras:

  • En el panel izquierdo, para llamar a funciones que leen de un contrato (el resultado es inmediato).
  • En el panel derecho, para llamar a funciones que escriben en un contrato (para esto se realiza una nueva transacción, por lo que le pide que desbloquee la cuenta y se gasta algo de gasolina).

Quiero saber cómo hacer el equivalente con web3 de nodejs.

En el primer caso, ya lo logré, con algo como esto, por ejemplo, cuando se llama a la función que quiero llamar foo(), recibe una cuenta (cadena) y devuelve un uint256:

var Web3 = require('./node_modules/web3/lib/web3');
var fs = require('fs');

// dont override global variable
if (typeof window !== 'undefined' && typeof window.Web3 === 'undefined') {
   window.Web3 = Web3;
}

module.exports = Web3;

var web3 = new Web3();
web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545'));

var theAddressWhereMyContractLives = "0xbb9bc244d798123fde783fcc1c72d3bb8c189413";
var abiContractContent = fs.readFileSync('./bin/Token.abi', 'utf8' );
var abiJsonContract = JSON.parse(abiContractContent);
var daoTokenContract = web3.eth.contract(abiJsonContract); 
var contractInstance = daoTokenContract.at(theAddressWhereMyContractLives);

var accounts = web3.eth.accounts;
accounts.forEach(function(account) {
    var result = contractInstance.foo(account);
}

Sin embargo, no sé cómo hacer esto para escribir en un contrato. Porque, si lo hago de la misma manera (digamos que se llama a la función que no es de solo lectura bary recibe una dirección y un número):

contractInstance.bar(account, 1);

me sale este error:

/home/myuser/Documents/Code/ethContractPlayground/node_modules/web3/lib/web3/formatters.js:271
    throw new Error('invalid address');
    ^

Error: invalid address
    at inputAddressFormatter (/home/myuser/Documents/Code/ethContractPlayground/node_modules/web3/lib/web3/formatters.js:271:11)
    at inputTransactionFormatter (/home/myuser/Documents/Code/ethContractPlayground/node_modules/web3/lib/web3/formatters.js:97:20)
    at /home/myuser/Documents/Code/ethContractPlayground/node_modules/web3/lib/web3/method.js:89:28
    at Array.map (native)
    at Method.formatInput (/home/myuser/Documents/Code/ethContractPlayground/node_modules/web3/lib/web3/method.js:88:32)
    at Method.toPayload (/home/myuser/Documents/Code/ethContractPlayground/node_modules/web3/lib/web3/method.js:114:23)
    at Eth.send [as sendTransaction] (/home/myuser/Documents/Code/ethContractPlayground/node_modules/web3/lib/web3/method.js:139:30)
    at SolidityFunction.sendTransaction (/home/myuser/Documents/Code/ethContractPlayground/node_modules/web3/lib/web3/function.js:133:26)
    at SolidityFunction.execute (/home/myuser/Documents/Code/ethContractPlayground/node_modules/web3/lib/web3/function.js:219:37)
    at Object.<anonymous> (/home/myuser/Documents/Code/ethContractPlayground/approver_test.js:57:18)

Y supongo que esto es normal, porque no envié una transacción. Supongo que necesito descubrir la forma de llamar bar(account,1)dentro de la carga útil de inputData de una transacción. ¿Cómo hacerlo con nodejs+web3? Gracias

Respuestas (1)

Establecer la cuenta predeterminada debería ayudar con la escritura del contrato en su casoweb3.eth.defaultAccount=web3.eth.accounts[0]

gracias por la respuesta, pero solo ayuda parcialmente, quiero decir, la excepción ya no se lanza, pero no veo la transacción en la cadena de bloques
a veces aparece, a veces no, meh