我一直在为改变合同状态的调用方法而挣扎。例如,以以下合同为例:
contract C {
uint[] numbers;
function initNumbers() {
numbers.push(1);
numbers.push(2);
}
function stateChanger(uint a) {
numbers.push(a);
}
}部署之后,必须将initNumbers()方法作为事务调用/发送:
c.initNumbers({from:eth.accounts[0],gas:400000});因为它改变了块链上的状态(执行写操作)。
如何调用第二个具有参数但同时更改状态(将其存储在合同中)的方法?
我尝试了以下方法,但得到了一个BigNumber异常:
c.stateChanger({from:web3.eth.accounts[0],gas:400000}).call(3);堆栈跟踪是:
/usr/lib/node_modules/web3/node_modules/bignumber.js/bignumber.js:1209
throw error;
^
BigNumber Error: new BigNumber() not a number: [object Object]
at raise (/usr/lib/node_modules/web3/node_modules/bignumber.js/bignumber.js:1177:25)
at /usr/lib/node_modules/web3/node_modules/bignumber.js/bignumber.js:1165:33
at new BigNumber (/usr/lib/node_modules/web3/node_modules/bignumber.js/bignumber.js:193:67)
at new BigNumber (/usr/lib/node_modules/web3/node_modules/bignumber.js/bignumber.js:203:25)
at toBigNumber (/usr/lib/node_modules/web3/lib/utils/utils.js:367:12)
at Object.toTwosComplement (/usr/lib/node_modules/web3/lib/utils/utils.js:378:21)
at formatInputInt [as _inputFormatter] (/usr/lib/node_modules/web3/lib/solidity/formatters.js:40:38)
at SolidityType.encode (/usr/lib/node_modules/web3/lib/solidity/type.js:179:17)
at /usr/lib/node_modules/web3/lib/solidity/coder.js:86:29
at Array.map (native)发布于 2016-08-01 08:05:14
我的回答和Bokky相似:
cContract = web3.eth.contract(cContractABI).at(cContractEthAddress);
cContract.initAddrs({from:web3.eth.accounts[0],gas:utils.DEFAULT_TX_COST});其中cContract是定义契约的Javascript对象。一个关键的注意事项是确保调用状态更改方法的帐户始终保持足够的平衡,否则方法调用将中止,以太将丢失。
https://ethereum.stackexchange.com/questions/7557
复制相似问题