Gibt es eine maximale Größe für Arrays in Solidity?

In meinem Solidity-Code definiere ich 3 Arrays mit etwa 700 Elementen darin. Wenn ich jedoch versuche, den Vertrag mit Geth bereitzustellen, erhalte ich die folgende Fehlermeldung:

Fehler: Übergroße Daten undefiniert

Wenn ich versuche, den Vertrag in Remix zu testen, sagt mir der Browser, dass er nicht genug Speicher hat.

Was sind die Grenzen von Solidity? Ist es nicht möglich, 3 Arrays mit nur 700 uint-Elementen zu haben?

Eines der Arrays sieht wie folgt aus:

int[] array1 = [28, 28, 28, 27, 28, 28, 28, 27, 27, 28, 28, 29, 30, 31, 31, 30, 30, 31, 31, 31, 30, 29, 28, 28, 28, 27, 27, 27, 27, 27, 27, 26, 27, 25, 25, 24, 24, 23, 23, 23, 23, 26, 27, 30, 30, 30, 31, 31, 31, 31, 31, 30, 30, 30, 29, 28, 28, 28, 28, 28, 28, 28, 26, 26, 26, 25, 25, 24, 24, 24, 23, 24, 27, 29, 32, 32, 33, 34, 34, 34, 34, 33, 33, 33, 33, 32, 32, 32, 32, 31, 31, 31, 30, 29, 29, 29, 28, 29, 29, 27, 26, 28, 28, 31, 32, 35, 35, 36, 37, 36, 36, 36, 36, 36, 36, 35, 34, 33, 32, 32, 33, 33, 32, 32, 31, 31, 30, 31, 28, 28, 29, 29, 29, 29, 31, 34, 36, 36, 35, 35, 34, 33, 33, 33, 33, 32, 32, 33, 33, 32, 32, 32, 32, 32, 32, 31, 31, 31, 31, 30, 29, 30, 30, 32, 35, 38, 38, 40, 43, 44, 44, 40, 39, 38, 38, 37, 37, 37, 36, 36, 36, 37, 33, 33, 33, 34, 34, 34, 34, 33, 32, 33, 33, 35, 35, 37, 37, 39, 40, 40, 37, 37, 36, 36, 36, 33, 34, 34, 34, 33, 34, 33, 33, 33, 33, 33, 33, 32, 32, 32, 32, 31, 30, 32, 32, 34, 35, 37, 37, 38, 37, 37, 39, 39, 39, 39, 36, 36, 37, 36, 33, 33, 33, 32, 32, 32, 33, 32, 31, 31, 31, 30, 30, 30, 29, 29, 30, 30, 33, 34, 36, 36, 38, 39, 39, 39, 38, 38, 37, 37, 37, 35, 34, 33, 34, 34, 34, 34, 34, 33, 33, 33, 32, 31, 31, 30, 29, 30, 30, 32, 34, 34, 34, 34, 35, 35, 36, 38, 38, 37, 35, 34, 34, 35, 33, 33, 33, 33, 34, 34, 33, 31, 31, 31, 31, 30, 30, 30, 32, 33, 36, 36, 37, 37, 36, 36, 37, 37, 37, 37, 35, 35, 34, 34, 34, 34, 34, 34, 34, 34, 32, 33, 31, 32, 32, 30, 30, 31, 31, 33, 35, 37, 37, 39, 39, 39, 39, 39, 39, 38, 38, 35, 33, 32, 32, 33, 33, 32, 32, 32, 31, 31, 30, 31, 30, 31, 31, 34, 37, 38, 38, 40, 40, 39, 39, 39, 39, 38, 38, 38, 37, 36, 36, 35, 35, 35, 34, 34, 34, 33, 33, 32, 32, 31, 30, 30, 30, 32, 33, 35, 35, 38, 39, 36, 36, 36, 35, 35, 34, 33, 32, 32, 31, 31, 31, 31, 30, 30, 30, 28, 27, 26, 26, 26, 25, 26, 28, 31, 32, 32, 34, 35, 37, 36, 36, 35, 35, 34, 33, 32, 30, 30, 31, 31, 31, 31, 31, 31, 30, 29, 28, 28, 28, 27, 29, 29, 30, 32, 33, 33, 34, 34, 36, 35, 36, 34, 34, 34, 34, 32, 32, 31, 31, 31, 31, 31, 32, 32, 31, 30, 30, 30, 30, 30, 31, 31, 34, 36, 39, 42, 40, 40, 40, 40, 41, 40, 40, 39, 37, 36, 36, 35, 36, 35, 35, 34, 34, 33, 34, 33, 33, 33, 32, 32, 34, 38, 40, 42, 42, 42, 42, 42, 41, 41, 41, 40, 38, 36, 36, 35, 35, 34, 34, 34, 34, 34, 33, 32, 32, 32, 32, 32, 32, 35, 37, 39, 39, 42, 41, 41, 40, 39, 37, 37, 36, 35, 35, 35, 35, 35, 35, 34, 33, 33, 33, 32, 32, 31, 31, 32, 32, 35, 37, 40, 40, 41, 40, 38, 38, 38, 37, 37, 37, 36, 35, 35, 34, 34, 34, 33, 33, 32, 32, 31, 30, 30, 30, 29, 28, 28, 29, 30, 31, 33, 33, 36, 36, 36, 36, 35, 35, 35, 35, 34, 32, 32, 32, 31, 31, 31, 31, 31, 29, 29, 29, 28, 28, 28, 27, 27, 28, 28, 30, 32, 33, 33, 34, 34, 34, 34, 33, 33, 33, 32, 32, 31, 30, 30, 30, 30, 30, 29, 28, 28, 28, 27, 27, 26, 26, 26, 28, 30, 32, 32, 34, 36, 34, 34, 34, 35, 33, 33, 33, 32, 31, 30, 30, 30, 30, 29, 29, 28, 27, 26, 26, 26, 25, 26, 28, 30, 33, 36, 38, 37, 38, 37, 36, 36, 35, 33, 33, 33, 33, 33, 33, 32, 31, 30, 30, 29, 29, 29, 29, 29, 29, 30, 30, 32, 34, 37, 37, 36, 36, 36, 36, 36, 36, 35, 35, 34, 34, 34, 34, 34, 33, 33, 32, 31, 30, 30, 30, 30, 30, 30, 30, 28, 28, 31, 32, 32, 33, 33, 34, 34, 34, 33, 33, 32, 31, 30, 30, 30, 29, 29, 29, 29, 29, 27, 26, 25, 25, 25, 25, 26, 26, 28, 30, 31, 33, 33, 34, 34, 34, 33, 33, 33, 34, 33, 32, 32, 30, 30, 30, 30, 29, 29, 28, 27, 27, 26, 26, 26, 25, 26, 26, 28, 31, 31, 31, 33, 36, 37, 36, 36, 35, 34, 33, 33, 33, 32, 31, 31, 31, 31, 30, 30, 30, 29, 29, 29, 28, 28, 28, 28, 30, 32, 35, 35, 38, 37, 36, 36, 36, 37, 38, 38, 37, 36, 35, 35, 35, 35, 34, 34, 33, 33, 32, 32, 31, 30, 30, 30, 29, 29, 30, 32, 34, 36, 36, 40, 40, 40, 40, 39, 39, 39, 39, 38, 38, 37, 36, 36, 36, 36, 36, 35, 35, 35, 33, 32, 31, 31, 31, 30, 30, 32, 35, 38, 38, 39, 40, 40, 40, 38, 40, 40, 40, 40, 41, 38, 38, 36, 36, 35, 34, 34, 34, 33];
Die Einschränkung ist so groß wie der Speicher. 2^256 Wörter. Aber können Sie tatsächlich den gesamten Speicher schreiben? Wahrscheinlich nicht, da SSTORE einer der teuersten OPCODEs ist. Sie werden höchstwahrscheinlich das Blockgaslimit erreichen
Was ist das Blockgaslimit? Sind es 4.700.000? Gibt es keine Möglichkeit es zu erhöhen?
Aktuell liegt er zwischen 6m und 7m iirc. Aber kann man das überhaupt bezahlen? Möglicherweise möchten Sie Ihren Vertrag so umgestalten, dass Sie nicht alles in der Kette speichern müssen. Vielleicht kann IPFS oder Swarm helfen?

Antworten (1)

die Grenze eines Arrays, seine 2^256-1.

In Ihrem Fall überschreiten Sie die Gasgrenzen, wenn Sie versuchen, den Vertrag mit 3 Arrays mit 700 Elementen bereitzustellen.

Im Beispiel hat das Ropsten-Netzwerk tatsächlich ein Gaslimit von 58.000.000 pro Block

Außerdem haben Sie ein Gaslimit in der Transaktion