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,
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());
}
}
}
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 _val
was 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 abcMap
bei " 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 ABC
das at weitergeleitet .0xf71...
Hauptmitnahme. Sehen Sie sich die anstößige Anfrage genau an. Ist es vernünftig?
Hier funktioniert es:
Ich hoffe es hilft.
ABC_Creator sollte einen Konstruktor haben.
userDSSR