Ошибка транзакции Ethereum при вызове функции контракта из другого контракта

Следующий смарт-контракт отлично работает в 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;
    }
}

person Mert Ozdag    schedule 19.06.2018    source источник


Ответы (3)



Я попробовал ваш контракт в Калейдо и обнаружил, что даже вызов eth_estimateGas с очень большими числами приводил к «недостатку газа».

Я изменил кросс-контрактный вызов setValue, чтобы установить значение газа, и затем я смог вызвать setA, и оценка газа для setA показала всего 31663.

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

Я подозреваю, что такое поведение EVM связано с разрешенными цепочками с нулевой ценой газа. Однако это предположение, так как я не исследовал внутренности.

Я также добавил eth_estimateGas и поддержку нескольких контрактов в файле Solidity в kaleido-go здесь, если это будет полезно: https://github.com/kaleido-io/kaleido-go

Еще одна возможность для других, столкнувшихся с вызовами «кончились газы» между контрактами. В Geth, если вызов require завершается неудачно в вызываемом контракте, об ошибке сообщается как «кончилось газ» (а не «выполнение отменено» или подробная причина для require не получается).

person Peter Broadhurst    schedule 20.06.2018
comment
Я изменил договор, включив в него цену на газ, как вы предложили, но он все равно не работает. Я все еще получаю: статус 0x0 Транзакция добыта, но выполнение не выполнено - person Mert Ozdag; 20.06.2018
comment
Эта проблема исправлена ​​в Kaleido. @MertOzdag - вы не должны сталкиваться с проблемой после создания новой среды. - person Vinod; 02.08.2018

Попробуйте отказаться от оператора return метода setValue в контракте TestA.

pragma solidity ^0.4.24;

contract TestA {
    uint public someValue;

    function setValue(uint a) public {
        someValue = a;
    }
}
person Xavier.Zhang    schedule 29.08.2018