1

遵循智能合约在 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;
    }
}
4

3 回答 3

1

我在 Kaleido 中尝试了你的合约,发现即使调用非常大的 eth_estimateGas 也会导致“气体不足”。

我更改了setValue跨合约调用以设置 gas 值,然后我能够调用 setA,估计 gassetA仅显示 31663。

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

我怀疑这种 EVM 行为与 gasprice 为零的许可链有关。但是,这是猜测,因为我还没有调查过内部结构。

我还添加了 eth_estimateGas,并在 Solidity 文件中支持多个合约,以防万一它有帮助: https ://github.com/kaleido-io/kaleido-go

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

于 2018-06-20T14:59:54.310 回答
0

您正在达到每个区块允许消耗的气体限制。每个区块中都包含有关 gas 限制的信息,因此您可以检查区块链中的这个值是多少。目前在以太坊主网上,GasLimit(每块)约为 800 万(见这里https://etherscan.io/blocks

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

于 2018-06-20T02:40:11.807 回答
0

尝试丢弃setValuecontract 中方法的 return 语句TestA

pragma solidity ^0.4.24;

contract TestA {
    uint public someValue;

    function setValue(uint a) public {
        someValue = a;
    }
}
于 2018-08-29T06:29:59.007 回答