Warum verwenden Solidity-Beispiele den Typ bytes32 anstelle von Zeichenfolgen?

In vielen Solidity-Beispielen, die ich gelesen habe und die Zeichenfolgen für Parameter oder Rückgabewerte verwenden, sehe ich, dass sie typisiert sind, als bytes32ob es einen stringTyp gäbe. Was ist der wahre Grund dafür? Vielen Dank.

Antworten (2)

2 Hauptgründe:

  1. Verträge können derzeit keine lesenstring , die von einem anderen Vertrag zurückgegeben werden.
  2. Die EVM hat eine Wortgröße von 32 Byte , ist also „optimiert“ für den Umgang mit Daten in Blöcken von 32 Byte. (Compiler wie Solidity müssen mehr Arbeit leisten und mehr Bytecode generieren, wenn die Daten nicht in Blöcken von 32 Bytes vorliegen, was effektiv zu höheren Gaskosten führt.)
Würde dies bedeuten, dass bei Verwendung von string anstelle von byte32 der Vertrag die Zeichenfolge in 32-Byte-Stücke aufteilen würde und dann eine unvorhersehbare Anzahl von Stücken und somit einen unvorhersehbaren Gasverbrauch in diesem Teil des Codes hätte?
Klingt für mich richtig, und der unvorhersehbare Gasverbrauch ist eine weitere gute Überlegung.

Ich habe einen Test auf dieser Seite https://ethfiddle.com/zLxE5Y-8B4

contract TestGas {
    string constant statictext = "Hello World";
    bytes11 constant byteText11 = "Hello World";
    bytes32 constant byteText32 = "Hello World";

    function  getString() payable public  returns(string){
        return statictext;
    }

    function  getByte11() payable public returns(bytes11){
        return byteText11;
    }

    function  getByte32() payable public returns(bytes32){
        return byteText32;
    }
}

Und die Funktion getStringverbrauchte 21875 Gas,

Funktion getByte11ausgegeben 21509 Gas,

Funktion getByte32ausgegeben 21487 Gas.

Wenn Ihre Zeichenfolgenlänge also fest ist, verwenden Sie einfach bytes32.

warum kostet der getByte11mehr Benzin als getByte32?
@SaadMalik Die EVM arbeitet mit 32-Byte-Wörtern. Wenn Ihre Daten kleiner als 32 Byte sind, wird jede Operation, die sich auf diese Daten bezieht, von 256 Bit auf 8 Bit herunterskaliert (32 Byte = 256 Bit), sodass EVM viel mehr Gas benötigt.