В Mist вы можете вызывать функции контрактов двумя способами:
Я хочу знать, как сделать то же самое с web3.
В первом случае я уже преуспел, с чем-то вроде этого, например, когда функция, которую я хочу вызвать , вызывается foo()
, получает учетную запись (строку) и возвращает 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);
}
Однако я не знаю, как это сделать, чтобы написать контракт. Потому что, если я сделаю это таким же образом (допустим, функция не только для чтения вызывается bar
и получает адрес и номер):
contractInstance.bar(account, 1);
Я получаю эту ошибку:
/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)
И я думаю, это нормально, потому что я не отправлял транзакцию. Я предполагаю, что мне нужно выяснить способ вызова bar(account,1)
внутри полезной нагрузки inputData транзакции. Как это сделать с помощью nodejs+web3? Спасибо
Настройка defaultAccount должна помочь при написании контракта в вашем случае.web3.eth.defaultAccount=web3.eth.accounts[0]
пользователь1623521
пользователь1623521