NodeJS+web3 — Чтение из контракта работает, как насчет записи в контракт? [дубликат]

В 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? Спасибо

Ответы (1)

Настройка defaultAccount должна помочь при написании контракта в вашем случае.web3.eth.defaultAccount=web3.eth.accounts[0]

спасибо за ответ, но это только частично помогает, я имею в виду, что исключение больше не выбрасывается, но я не вижу транзакцию в блокчейне
иногда появляется, иногда нет