从另一个合约调用合约功能时,以太坊交易错误

时间:2018-06-19 21:27:16

标签: ethereum solidity geth kaleido

在Remix和Ganache中,遵循智能合约可以正常工作。但是不适用于像Kaleido或Azure这样的私有以太坊区块链。我想念什么。当我打电话给setA时,它消耗了所有气体,然后失败了。

pragma solidity ^0.4.24;

contract TestA {
    uint public someValue;

    function setValue(uint a) public returns (bool){
        someValue = a;
        return true;
    }
}

contract TestB {
    address public recentA;

    function createA() public returns (address) {
        recentA = new TestA();
        return recentA;
    }

    function setA() public returns (bool) {
        TestA(recentA).setValue(6);
        return true;
    }
}

3 个答案:

答案 0 :(得分:1)

我在Kaleido尝试了您的合同,发现即使呼叫数量非常大的eth_estimateGas也会导致“断气”。

我更改了setValue跨合同调用以设置gas值,然后我可以调用setA,并且估计setA的gas仅显示31663。

recentA.setValue.gas(10000)(6);

我怀疑这种EVM行为与零价汽油的许可链有关。但是,这是猜测,因为我还没有研究内部结构。

我还在kaleido-go中添加了eth_estimateGas和对Solidity文件中多个合同的支持,以防它有所帮助: https://github.com/kaleido-io/kaleido-go

  

其他人在合同中遇到“断气”调用的另一种可能性-在Geth中,如果require调用在被叫合同中失败,则错误报告为“断气”(而不是“恢复执行”) ,或require失败的详细原因)。

答案 1 :(得分:0)

您正在达到每个区块允许使用的气体限制。有关气体限制的信息包含在每个块中,因此您可以检查区块链中当前的值。目前在以太坊MainNet上,GasLimit(每块)约为800万(请参见此处https://etherscan.io/blocks

要解决此问题,您可以使用修改后的创世纪文件启动区块链。尝试增加创世文件中的gasLimit参数的值,该参数指定每个区块处理的最大气体量。尝试"gasLimit": "8000000"

答案 2 :(得分:0)

尝试丢弃合同setValue中的TestA方法的返回语句。

pragma solidity ^0.4.24;

contract TestA {
    uint public someValue;

    function setValue(uint a) public {
        someValue = a;
    }
}