En Mist puedes llamar funciones de contratos de dos maneras:
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 bar
y 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
Establecer la cuenta predeterminada debería ayudar con la escritura del contrato en su casoweb3.eth.defaultAccount=web3.eth.accounts[0]
usuario1623521
usuario1623521