Solidität: Wie könnte ich den Gasverbrauch komplexer Strukturen verringern?

Struktur ist sehr teuer, wie hier angegeben: Es scheint extrem teuer zu sein, wenn der Strukturtyp gespeichert wird.

https://www.cryptocompare.com/coins/guides/what-is-the-gas-in-ethereum/ :

sstore 100 Bezahlt für einen normalen SSTORE-Vorgang (manchmal verdoppelt oder erlassen).

[Q] Was hat entschieden, es zu verdoppeln?

Zum Beispiel habe ich folgende Struktur in einer Bibliothek definiert: Die folgende Operation insert()kostet fast 150.000 Gas . Speichern stringund uintunter byteder Struktur.

Lib.sol

library Lib {
  struct job {
    string      hash;  // string hash_index_folderType;
    uint       index;  //
    byte  folderType;  //
  }
}

Beispiel.sol

import "./Lib.sol"
contract Example{
   using Lib for Lib.data;
   function insert( string key, byte folderType ){
     uint currentIndex = cluster.jobStatus[jobKey].length;
     cluster.submittedJobs.push( Lib.job({hash: key, index: 
   currentIndex, folderType: folderType }) );
  }
}

Ich weiß, dass das Speichern von Daten der teuerste Vorgang in einem Smart Contract ist.

Aber wie wir wissen, steigt der Ether weiter (sprang von 50 $ auf 240 $, was bedeutet, dass die Speicherkosten um das Fünffache gestiegen sind) und die Speicherpreise steigen auch für die Kunden schnell, da der Mining-Preis nicht sinkt. Also bin ich auf der Suche nach der kompaktesten und effizientesten Art, Speicher zu nutzen.

=> Während der Äther stieg, warum sinkt der Gaspreis nicht für die Erinnerung?

[F] Meine Frage bezieht sich auf das Speichern in der structBibliothek, und wenn ich sie unter derselben Datei mit den insert()vorhandenen speichere, verringert sich dadurch der Gasverbrauch? Wenn nicht: Ist es eine gute Idee, alle Variablen zu kombinieren, indem Sie sie an eine Zeichenfolge anhängen und sie als einzelne Zeichenfolgenvariable anstelle einer Struktur speichern, könnte dies helfen, den Gasverbrauch zu verringern?

Als Beispiel:

import "github.com/Arachnid/solidity-stringutils/strings.sol";
string hash_index_folderType = key.toSlice().concat(currentIndex.toSlice().concat(folderType.toSlice());

Antworten (1)

  1. Die Gasbetriebskosten können von seinen Parametern abhängen. Zum Beispiel kostet das Schreiben einiger Nicht-Null-Daten in einen Speicher eine andere Menge an Gas als das Schreiben von Null-Daten. Wenn Sie Nicht-Null-Daten leeren, wird Ihnen sogar Gas zurückerstattet.
    Aktuelle Gaspreise.
    Übrigens ist es nicht die beste Idee, Zeichenfolgen mit variabler Länge in einer Struktur zu speichern.
  2. Es scheint, dass der Grund dafür ist, dass jeder den von Ethereum-Kunden vorgeschlagenen Standard-Gaspreis wie Nebel oder Parität verwendet, so dass der „Markt“ der Transaktionen mit Transaktionen mit hohen Gaspreisen überfüllt ist.
    Der einzige Zweck des Gaspreises besteht darin, die Kosten des Bergmanns für die Abwicklung Ihrer Transaktion zu messen, sodass er vollständig von den Bergleuten bestimmt wird. Heutzutage stammt der größte Teil der Kopfgelder der Bergleute aus der Blockbelohnung (5 ETH) und die Bergleute kümmern sich nicht wirklich um Transaktionsgebühren. Aufgrund der Belohnung wäre das Mining wirtschaftlich rentabel, selbst wenn der Gaspreis auf 0 gesetzt wird. Und es gibt keinen wirklichen Zusammenhang zwischen dem ETH/USD-Preis und den Transaktionskosten. Daher ist es höchst unwahrscheinlich, dass der Preis sinken wird, bis der Proof-of-Stake-Konsensalgorithmus eingeführt oder die Art und Weise geändert wird, wie der vom Kunden vorgeschlagene Preis berechnet wird.