Ich teste die Solidität in Remix-Ideen mit einfachen Verträgen. Dies ist der Vertrag, den ich geschrieben habe:
contract mortal {
address owner;
function mortal() {
owner = msg.sender;
}
function kill(){
if(msg.sender == owner){
selfdestruct(owner);
}
}
}
contract Hello is mortal
{
string public message;
function Hello(){
message = 'This is the initial Message';
}
function getMessage() public constant returns(string){
return message;
}
function setNewMessage(string newMessage) public payable {
message = newMessage;
}
}
Beim Betrachten von Details erhalte ich unendliche Gasschätzungen für jede dieser Funktionen.
{
"Creation": {
"codeDepositCost": "243200",
"executionCost": "infinite",
"totalCost": "infinite"
},
"External": {
"getMessage()": "infinite",
"kill()": "30636",
"message()": "infinite",
"setNewMessage(string)": "infinite"
}
}
Erläutern Sie bitte, warum ich unendliche gasEstimates für diese Funktionen erhalte und wie ich diesen Fehler vermeiden kann.
Der Vertrag lässt sich gut kompilieren:
pragma solidity ^0.4.15;
contract mortal {
address owner;
function mortal() public {
owner = msg.sender;
}
function kill() public {
if (msg.sender == owner) {
selfdestruct(owner);
}
}
}
contract Hello is mortal {
string public message;
function Hello() public {
message = 'This is the initial Message';
}
function getMessage() public constant returns(string) {
return message;
}
function setNewMessage(string newMessage) public payable {
message = newMessage;
}
}
aber dann kommen die warnungen...
aber es reicht/bestätigt auf Ropsten ganz gut..
und die Methodenaufrufe funktionieren auch gut.
Dies kann nur ein Fehler in der statischen Analyse des Compilers sein.
bytes32
oder eine beliebige Anzahl von Bytes anstelle von verwenden string
. Stellen Sie einfach sicher, dass die Bytes die erforderlichen Informationen unterstützen können. Sie können die Bytes dann einfach in Zeichenfolgen konvertieren. ethereum.stackexchange.com/questions/2519/…Ich vermute, das liegt daran, dass die Kosten für diese Funktionen tatsächlich unbegrenzt sind. Zeichenfolgen können beliebig lang sein, setNewMessage()
müssen also eine unbegrenzte Datenmenge speichern und eine unbegrenzte Datenmenge getMessage()
lesen.
Wenn Sie diese Warnung vermeiden möchten, müssen Sie einen Datentyp mit einer festen Obergrenze für seine Größe verwenden.
bytes32
wird die Warnung für mich entfernt.Dies liegt daran, dass Sie eine Zeichenfolge verwenden, die keine bestimmte Größe hat, dh es handelt sich um einen ungebundenen Datentyp. Sie können bytes32 anstelle von string verwenden, um die Gaskosten für den Ausführungscode zu begrenzen, da solidity es als 32-Bit-Literal betrachtet.
Schomari
mortal
vertragAhsan Jamal