Ich habe folgende Verträge:
pragma solidity ^0.4.17;
contract one{
uint firstNum;
uint secondNum;
uint thirdNum;
function getNumber(uint _num, uint _num2,uint _num3) public{
firstNum = _num;
secondNum = _num2;
thirdNum = _num3;
}
}
contract two{
uint firstNum;
uint secondNum;
uint thirdNum;
function getNumber(uint[3] numValues) public{
firstNum = numValues[0];
secondNum =numValues[1];
thirdNum = numValues[2];
}
}
Der einzige Unterschied ist buchstäblich die Eingabefunktion. Nun zu den Kosten:
Vertrag eine Kreation:
und Funktionsaufruf 1,2,3 als Eingabe:
Vertrag zwei Erstellung:
und Funktionsaufruf [1,2,3] als Eingabe:
Also ein paar Fragen ... warum ist es teurer? und warum verwenden Verträge wie 0x Arrays, anstatt sie einfach separat einzugeben?
Ihr Vertrag ist sehr einfach und die Ausführungskosten werden von den Lagerkosten dominiert.
Jede Lagerung uint
im Lager deines Vertrages verbraucht 20.000 Gas. Ihr Vertrag sieht vor, dass drei von ihnen 60000 Gas verbrauchen.
Arrays in Solidity benötigen etwas zusätzliche Verarbeitung, siehe Diving Into The Ethereum VM Part 3 – The Hidden Costs of Arrays (zur Prüfung auf Out-of-Bounds-Bedingungen). Daher werden Funktionen, die sie verwenden, länger dauern.
Dies trägt dazu bei, dass die Verträge größer und teurer in der Bereitstellung sind. Die Bereitstellung erfolgt jedoch nur einmal, sodass dies kein sehr ernstes Problem ist.
Einer der möglichen Gründe, warum 0x Arrays als Parameter verwendet, ist, dass die Verwendung zu vieler Parameter in einer Funktion einen Compiler-Fehler "Stack too deep" verursacht.
das Fett