Warum sollten Sie ein Array als Eingabe verwenden?

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:

  • Transaktionskosten: 102814 Gas.
  • Ausführungskosten: 37682 Gas.

und Funktionsaufruf 1,2,3 als Eingabe:

  • Transaktionskosten: 82106 Gas.
  • Ausführungskosten: 60258 Gas.

Vertrag zwei Erstellung:

  • Transaktionskosten: 121264 Gas.
  • Ausführungskosten: 51500 Gas.

und Funktionsaufruf [1,2,3] als Eingabe:

  • Transaktionskosten: 82296 Gas.
  • Ausführungskosten: 60448 Gas.

Also ein paar Fragen ... warum ist es teurer? und warum verwenden Verträge wie 0x Arrays, anstatt sie einfach separat einzugeben?

Antworten (1)

Ihr Vertrag ist sehr einfach und die Ausführungskosten werden von den Lagerkosten dominiert.

Jede Lagerung uintim 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.

Danke für die Rückmeldung. Der Winkel "Stapel zu tief" ist sinnvoll.