我在使用Truffle测试我可以退出合同时遇到问题。这是一个非常简单的测试,但在调用下面的withdrawBalance
函数之后。当我稍后使用web3.eth.getBalance
时,余额保持不变。
我还可以看到,在Ganache中owner
没有收到ETH。
但是,如果我从withdrawBalance
方法返回余额。它实际上是0.
contract Room {
address public owner = msg.sender;
function withdrawBalance() public {
require(msg.sender == owner);
owner.transfer(this.balance);
}
}
测试文件:
it('should allow withdrawls to original owner', function () {
var meta;
return Room.deployed()
.then(instance => {
meta = instance;
return web3.eth.getBalance(meta.address);
})
.then((balance) => {
// Assertion passes as previous test added 6 ETH
assert.equal(balance.toNumber(), ONE_ETH * 6, 'Contract balance is incorrect.');
return meta.withdrawBalance.call();
})
.then(() => {
return web3.eth.getBalance(meta.address);
})
.then((balance) => {
// Assertion fails. There is still 6 ETH.
assert.equal(balance.toNumber(), 0, 'Contract balance is incorrect.');
});
});
我的问题是:
答案 0 :(得分:1)
您使用return meta.withdrawBalance.call();
代替return meta.withdrawBalance.sendTransaction();
。
.call()
在您的EVM中本地运行并且是免费的。您在自己的计算机上运行所有计算,执行后的任何更改都将恢复为初始状态。
要实际更改区块链的状态,您需要使用.sendTransaction()
。这需要天然气,因为矿工因执行交易时的计算而获得奖励。
汇总:
ETH未被撤回。