Wie führt man externe Vertragsfunktionsaufrufe von einem Vertrag zum anderen durch?

Es fällt mir schwer, die Dokumentation für einen externen Funktionsaufruf von einem Vertrag zum anderen zu verstehen. In diesem Tutorial gibt es ein Beispiel:

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)(); }
}

Was funktioniert, wenn ich es aus Nebel laufen lasse.

Ich versuche diesen Vertrag zu schreiben:

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;
    }

}

Nachdem Sie das Eigentum (vollständige Quelle unten enthalten) des Grower_ID-Vertrags an den Wirtschaftsprüfer übertragen haben, können Sie eine Adresse genehmigen, aber ich erhalte eine Fehlermeldung, dass das intrinsische Gas zu niedrig ist, wenn ich versuche, einen ID-Token auszustellen. Das Problem ist diese Zeile grower_IDs.makeID.value(10).gas(1000)(target);, die dieselbe Form wie das Beispiel feed.info.value(10).gas(800)();hat, das den Fehler nicht erhält. Ich verstehe nicht wirklich, wofür .value() bei diesem Aufruf ist. Gibt es eine Möglichkeit, ihn mit einer unbestimmten Gasmenge laufen zu lassen?

Vollständige Quelle:

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;
    }

}

Bearbeiten:

Das Verfahren, das ich versucht habe, besteht darin, zuerst den GrowId-Vertrag zu erstellen, dann den Prüfer, der die Adresse der GrowId verwendet. Nachdem ich das Eigentum am growId-Vertrag an die Adresse des Rechnungsprüfers übergeben habe, füge ich eines meiner Konten als zugelassenen Erzeuger hinzu. Der Fehler tritt auf, wenn ich versuche, die Auditor-Funktion zu verwenden issueGrowerID. Diese Funktion ruft die growerID-Funktion auf grower_IDs.makeID(target). Ich habe es mit beiden versucht grower_IDs.makeID(target)und grower_IDs.value(x).gas(x)(target)es heißt immer noch Eigengas zu niedrig.

Adresse genehmigt

Eigengas zu niedrig

.value()ist, wenn Sie Wei übertragen möchten: Ich glaube nicht, dass der Rechnungsprüfer jedes Mal, wenn er anruft, 10 Wei bezahlen möchte makeID. Versuchen Sie, es zu entfernen, .gas()da es die verfügbare Gasmenge begrenzt, makeIDund diese zugehörigen Informationen können hilfreich sein: ethereum.stackexchange.com/questions/551/…
Ich schließe Screenshots von dem ein, was ich bekomme. Diese wurden übernommen, nachdem Sie die von Ihnen vorgeschlagenen Änderungen vorgenommen hatten. Der Fehler ist in beiden Fällen derselbe, Eigengas zu niedrig.

Antworten (1)

Die Mist-Wallet versucht, die angemessene Gasmenge zu schätzen, die mit der Transaktion gesendet werden soll, aber sie ist nicht immer in der Lage, diese genau oder richtig zu schätzen.

Auf dem Bildschirm zum Senden von Transaktionen in der Mist-Wallet gaskann der Wert tatsächlich bearbeitet werden. Erhöhen Sie es auf etwas Großes (wie 2 Millionen), sollte Ihr Problem behoben sein.

Am Ende habe ich alles in einem Vertrag zusammengefasst, da die verschiedenen Token nicht zwischen Benutzern handelbar sind, wir sie nicht verfolgen müssen und die Schnittstelle ausreicht