Fehler beim Erstellen eines Vertrags - bezogen auf die Zuordnung

Wenn ich einen ABC_Creator-Vertrag erstelle. Es gibt den folgenden Fehler. Der Code funktioniert gut für die Absicht. Ich frage mich, warum dieser Fehler angezeigt wird, was der ungültige Opcode ist und was getan werden kann, um ihn loszuwerden. Danke,

Geben Sie hier die Bildbeschreibung ein

pragma solidity ^0.4.17;

contract ABC {

    bytes32 public name;
    uint public value;

    function ABC(bytes32 _name, uint _val) public {
        name = _name;
        value = _val;
    }
}

contract ABC_Creator {

    ABC localABC;
    mapping (bytes32 => address[]) public abcMap;
    event Log(bytes32, uint);

    function createABC(bytes32 _name, uint _val) public {
        localABC = new ABC(_name, _val);
        abcMap[_name].push(localABC);
    }

    function getABCList(bytes32 _name) public {

        uint len = abcMap[_name].length;
        for (uint i = 0; i < len; i++) {
            Log(ABC(abcMap[_name][i]).name(), ABC(abcMap[_name][i]).value());
        }

    }


}

Antworten (2)

Ich habe damit herumgespielt und nichts offensichtlich Falsches am Vertrag gefunden, also denke ich, dass Sie sich auf die Methode hinter den Kulissen konzentrieren könnten, die Sie verwenden, um den Vertrag aufzurufen (nicht gezeigt).

Ihr Code ist kompakt und ich war angespannt, um klar zu verstehen, was mich erwartet. Insbesondere das, uint _valwas beide Verträge wollen, könnte für Verwirrung sorgen.

Sie können den ungültigen OPCODE einfach generieren, indem Sie das Ende eines Arrays verlassen. Sie müssen also vorsichtig sein, was Sie verlangen.

Halten:

 1. ABC_Creator.createABC("rob",10)
 2. ABC_Creator.abcMap("rob",10)

Invalid Opcode. 

 3. ABC_Creator.abcMap("rob",0)

address: 0xf71...

Was ist passiert?

Es nahm ein localABC("rob",10)(konvertierbar in 0xf71....) und schob es auf das Array in abcMapbei " rob", was bedeutet, dass es jetzt ein 1-Zeilen-Array in gibt abcMap["rob"]. Es ist also in Ordnung, nach der ersten Reihe zu fragen, abcMap["rob"]aber es ist nicht in Ordnung, nach einer anderen Reihe zu fragen. Sie können das mit einer kleinen Funktion bestätigenreturn abcMap[_name].length;

Was ist mit der passiert 10? Es wurde wie angewiesen an ABCdas at weitergeleitet .0xf71...

Hauptmitnahme. Sehen Sie sich die anstößige Anfrage genau an. Ist es vernünftig?

Hier funktioniert es:

Geben Sie hier die Bildbeschreibung ein

Ich hoffe es hilft.

Danke @RobHitchens. Danke für den Einblick, war sehr hilfreich.

ABC_Creator sollte einen Konstruktor haben.

Danke @LSong, was wäre der Inhalt des Konstruktors. Müssen wir das Mapping initialisieren, wie?