【问题标题】:Ethereum Transaction Error while calling a contract function from another contract从另一个合约调用合约函数时出现以太坊交易错误
【发布时间】:2018-06-19 21:27:15
【问题描述】:

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

【问题讨论】:

    标签: ethereum solidity geth kaleido


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 我已按照您的建议修改了合同以包括汽油价格,但仍然无法正常工作。我仍然得到:状态 0x0 交易已开采但执行失败
    • 此问题现已在 Kaleido 中得到修复。 @MertOzdag - 创建新环境后不应遇到此问题。
    【解决方案2】:

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

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

    【讨论】:

    • 我已经修改了 genesis 文件并且它工作了。谢谢
    【解决方案3】:

    尝试丢弃合约TestAsetValue方法的return语句。

    pragma solidity ^0.4.24;
    
    contract TestA {
        uint public someValue;
    
        function setValue(uint a) public {
            someValue = a;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-15
      • 2021-07-26
      • 2019-01-17
      • 1970-01-01
      • 2017-07-20
      • 2016-02-28
      • 1970-01-01
      • 2018-03-15
      • 2018-12-09
      相关资源
      最近更新 更多