Как сделать вызовы функций внешнего контракта из одного контракта в другой?

Мне трудно понять документацию по вызову внешней функции из одного контракта в другой. В этом уроке есть пример:

contract InfoFeed {
  function info() returns (uint ret) { return 42; }
}
contract Consumer {
  InfoFeed feed;
  function setFeed(address addr) { feed = InfoFeed(addr); }
  function callFeed() { feed.info.value(10).gas(800)(); }
}

Который работает, когда я запускаю его из тумана.

Я пытаюсь написать этот контракт:

contract Auditor is owned {
    growId public grower_IDs;
    mapping (address => bool) public approvedGrows;

    function Auditor(address GID){
        grower_IDs = growId(GID);
        grower_IDs.transferOwenership(this);
    }

    function approveGrower(address target){
        if (approvedGrows[target] == true) throw;
        else approvedGrows[target] = true;
    }

    function issueGrowerID(address target) {
        if (approvedGrows[target] == true && grower_IDs.balanceOf.value(10).gas(1000)(target) == 0) {
            grower_IDs.makeID.value(10).gas(1000)(target);
        }
        else throw;
    }

}

После того, как вы передадите право собственности (полный исходный код указан внизу) контракта Groer_ID Аудитору, вы сможете утвердить адрес, но я получаю ошибку «Слишком низкий внутренний газ», если я пытаюсь выпустить токен ID. Проблема в этой строке grower_IDs.makeID.value(10).gas(1000)(target);, которая имеет ту же форму, что и пример feed.info.value(10).gas(800)();, который не вызывает ошибку. Я не очень понимаю, для чего предназначен .value() при выполнении этого вызова. Есть ли способ запустить его с неопределенным количеством газа?

Полный источник:

contract owned {
    address public owner;
    bool disabled;
    function owned() {
        owner = msg.sender;
        disabled = false;
    }

    modifier onlyOwner {
        if (msg.sender != owner) throw;
    }

    modifier disableable {
        if (disabled == true) throw;
    }
    function trasferOwnership(address newOwner) onlyOwner {
        owner = newOwner;
    }

    event DisabledToggle(bool dis);

    function disable() onlyOwner {
        disabled = true;
        DisabledToggle(true);
    }

    function enable() onlyOwner {
        disabled = false;
        DisabledToggle(false);
    }


}

contract growId is owned {
    string public name;
    string public symbol;
    uint8 public decimals;
    mapping (address => uint256) public balanceOf;

    function growId() {
        name = "growId";
        symbol = "GID";
        decimals = 1;
    }

    function isOwner() returns (bool ret) {
        if (msg.sender == owner) return true;
    }

    function makeID(address target) onlyOwner {
        balanceOf[target] += 1;
        Transfer(0, target, 1);
    }

    function transfer(address _to) disableable {
        if (balanceOf[msg.sender] < 1 || balanceOf[_to] + 1 < balanceOf[_to])
        throw;

        if(msg.sender == owner){
            balanceOf[msg.sender] -= 1;
            balanceOf[_to] += 1;
            Transfer(msg.sender, _to, 1);
        }

        if(_to == owner){
            balanceOf[msg.sender] -= 1;
            balanceOf[_to] += 1;
            Transfer(msg.sender, _to, 1);
        }
        else throw;
    }

    event Transfer(address indexed from, address indexed to, uint256 value);
}

contract Auditor is owned {
    growId public grower_IDs;
    mapping (address => bool) public approvedGrows;

    function Auditor(address GID){
        grower_IDs = growId(GID);
        grower_IDs.transferOwenership(this);
    }

    function approveGrower(address target){
        if (approvedGrows[target] == true) throw;
        else approvedGrows[target] = true;
    }

    function issueGrowerID(address target) {
        if (approvedGrows[target] == true && grower_IDs.balanceOf.value(10).gas(1000)(target) == 0) {
            grower_IDs.makeID.value(10).gas(1000)(target);
        }
        else throw;
    }

}

Редактировать:

Процедура, которую я пробовал, заключается в том, чтобы сначала заключить контракт с GrowId, а затем аудитор использует адрес GrowId. После того, как я передаю право собственности на контракт с GrowId на адрес Аудитора, я добавляю одну из своих учетных записей в качестве утвержденного производителя. Ошибка возникает, когда я пытаюсь использовать функцию аудитора issueGrowerID. Эта функция вызывает функцию GrowerID grower_IDs.makeID(target). Я пробовал это с обоими , grower_IDs.makeID(target)и grower_IDs.value(x).gas(x)(target)он все еще говорит, что собственный газ слишком низок.

Адрес одобрен

Слишком низкий уровень внутреннего газа

.value()это когда вы хотите перевести вэй: я не думаю, что Аудитор хочет платить 10 вэй каждый раз, когда он звонит makeID. Попробуйте удалить .gas(), так как это ограничивает количество доступного газа, makeIDи эта соответствующая информация может помочь: ethereum.stackexchange.com/questions/551/…
Я включаю скриншоты того, что я получаю. Они были сделаны после внесения предложенных вами изменений. Ошибка одинакова в любом случае, собственный газ слишком низок.

Ответы (1)

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

На экране отправки транзакции в туманном кошельке gasзначение можно отредактировать. Увеличение его до чего-то большого (например, 2 миллиона) должно решить вашу проблему.

В итоге я объединил все это в один контракт, так как разные токены не обмениваются между пользователями, нам не нужно их отслеживать, и интерфейса достаточно.