Ich habe den folgenden in Remix generierten Solidity-Code minimiert, um das Problem zu demonstrieren. Dieser Code warnt davor, dass die test001.reger-Funktion unendlich viel Gas benötigt, was offensichtlich durch den Code nicht möglich ist.
Könnte jemand feststellen, was das Problem wirklich ist?
Ich habe mehrere Versionen der Aufrufsequenz des Remote-Aufrufs ausprobiert, und alle haben das gleiche Problem. (Andere Versionen sind im Funktionscode unten auskommentiert dargestellt.)
pragma solidity ^0.4.17;
contract test002 {
address[] AddressList;
event ItemAdded(address, address);
function getItemCount() public view returns(uint) {return(AddressList.length);}
function getItem(uint index) public view returns(address) {return(AddressList[index]);}
function addItem(address inItem) public {
AddressList[AddressList.length] = inItem;
ItemAdded(this, inItem);
}
}
contract test001 {
address AA;
event Creation(address, address);
function test001() public {
AA = new test002();
Creation(address(this), AA);
}
function register() public {
// option 1
// test002(AA).addItem(address(this));
// option 2
// test002 A = test002(AA);
// A.addItem(this);
// option 3
test002 A = test002(AA);
A.addItem(address(this));
}
}
Ich glaube, das ist nur eine Einschränkung des Solidity-Compilers. Jeder Aufruf zu einem anderen Vertrag löst diese Warnung aus, da Solidity nicht weiß, wie viel Gas der andere Vertrag benötigt.
Hier ist es technisch möglich, dass der Compiler per statischer Analyse erkennt, dass die von Ihnen verwendete Adresse immer aus new test002()
dem Konstruktor stammt, aber das ist eigentlich ein ziemlich schwieriger Schluss. Der Solidity-Compiler ist nicht so schlau, also gibt er auf und sagt, dass Sie einen anderen Vertrag aufrufen und daher das erforderliche Gas zur Kompilierungszeit nicht bestimmt werden kann.
Es ist sicher, die Warnung einfach zu ignorieren.
BEARBEITEN
Behebung des Fehlers, den Sie im Kommentar erwähnt haben.
Diese Zeile versucht immer, über das Ende eines Arrays hinaus zu schreiben:
AddressList[AddressList.length] = inItem;
Sie müssen entweder zuerst die Länge des Arrays erweitern, wie folgt:
AddressList.length += 1
AddressList[AddressList.length - 1] = inItem;
oder (besser) einfach verwenden push
:
AddressList.push(inItem);
Les
Benutzer19510
Benutzer19510
Les