Welche Vorteile bietet die Verwendung von string
Datentypen bytes32
zur Darstellung von Textdaten ? Es scheint, dass mein Vertrag in eine Gasmangel-Ausnahme gerät, wenn ich die Datenstrukturen von bytes32
auf ändere string
.
string
statt bytes32
?Für Zeichenfolgendaten beliebiger Länge (UTF-8) verwenden string
, die länger als 32 Byte sind. Frontends können eine lange Zeichenfolge einfacher mithilfe von Methoden wie web3.toAscii oder UTF-8 (wenn Probleme behoben sind) decodieren, anstatt die Logik von UTF-8 zu implementieren, die eine Reihe von bytes32
.
Verwenden Sie als Faustregel
bytes
für Rohbytedaten beliebiger Länge undstring
für Zeichenfolgendaten beliebiger Länge (UTF-8). Wenn Sie die Länge auf eine bestimmte Anzahl von Bytes begrenzen können, verwenden Sie immer eine vonbytes1
bis,bytes32
da diese viel billiger sind.
Zeichenfolgenliterale können auch hilfreich oder praktisch sein:
Zeichenfolgenliterale werden entweder mit doppelten oder einfachen Anführungszeichen ("foo" oder "bar") geschrieben ...
Zeichenfolgenliterale unterstützen Escapezeichen wie \n, \xNN und \uNNNN. \xNN nimmt einen Hex-Wert und fügt das entsprechende Byte ein, während \uNNNN einen Unicode-Codepunkt nimmt und eine UTF-8-Sequenz einfügt.
bytes32
statt string
?Beantwortet in Warum verwenden Solidity-Beispiele den Typ bytes32 anstelle von Zeichenfolgen?
bytes32
verbraucht weniger Gas, weil es in ein einzelnes Wort des EVM passt, und string
ist ein Typ mit dynamischer Größe, der aktuelle Einschränkungen in Solidity hat (z. B. kann nicht von einer Funktion zu einem Vertrag zurückgegeben werden).
Wie der andere Beitrag sagte, möchten Sie nur Zeichenfolgen für dynamisch zugewiesene Daten verwenden, da Byte32 sonst eine bessere Leistung erbringt. Bytes32 wird auch beim Gas besser sein. Wenn Sie damit herumspielen möchten, habe ich eine kleine Geige daraus gebaut https://ethfiddle.com/70ipaEIFdk
Byte verwendet 21465 Gas
String verwendet 21897 Gas
pragma solidity ^0.4.18;
contract SampleOverflow {
string constant statictext = "HelloStackOverFlow";
bytes32 constant byteText = "HelloStackOverFlow";
function getString() payable public returns(string){
return statictext;
}
function getByte() payable public returns(bytes32){
return byteText;
}
}
Holen Sie sich die Zeichenfolge https://ethfiddle.com/70ipaEIFdk
bytes32 bedeutet Zeichenfolge mit maximaler Länge 32. Es benötigt weniger Speicher als Zeichenfolge für die gleiche Länge der Zeichenfolge.
Wenn Ihre Daten also nicht mehr als 32 Bytes (32 Wörter) umfassen, verwenden Sie bytes32.
Wenn die Länge der Zeichenfolge nicht definiert ist, verwenden Sie einfach bytes
.
auch byte8, byte16, byte32 sind alle verfügbar. Sie können alle gemäß den Bedingungen verwenden.
Mikko Ohtamaa
eth
ätherisch
eth
Kurz
Clemens Walter
eth