使用松露和Ganache

时间:2018-02-12 18:43:15

标签: ethereum solidity truffle

我在使用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.');
            });
    });

我的问题是:

  1. 我的测试是否有某种竞争条件?如何才能使余额检查正确?
  2. 为什么合同所有者不显示Ganache的ETH余额?或者真的是ETH没有被撤回。

1 个答案:

答案 0 :(得分:1)

您使用return meta.withdrawBalance.call();代替return meta.withdrawBalance.sendTransaction();

.call()在您的EVM中本地运行并且是免费的。您在自己的计算机上运行所有计算,执行后的任何更改都将恢复为初始状态。

要实际更改区块链的状态,您需要使用.sendTransaction()。这需要天然气,因为矿工因执行交易时的计算而获得奖励。

汇总:

  

ETH未被撤回。