Ist das EVM-Speichermodell ein Wort-Array oder ein Byte-Array?

Das gelbe Papier sagt, dass das Speichermodell für die EVM ein wortadressiertes Byte-Array (YP 9.1) ist, aber wenn ich debug.traceTransaction in Geth ausführe, sieht der Speicher eher wie ein Array von Wörtern aus, vielleicht ein byteadressiertes Wort-Array . Hat sich dies zwischen dem YP und der tatsächlichen Implementierung geändert?

{
      depth: 1,
      gas: 3971707,
      gasCost: 3,
      memory: ["0000000000000000000000000000000000000000000000000000000000000000", "0000000000000000000000000000000000000000000000000000000000000000", "0000000000000000000000000000000000000000000000000000000000000060", "00000000000000000000000000000000000000000000000005d5349f8718c000"],
      op: "DUP1",
      pc: 2888,
      stack: ["00000000000000000000000000000000000000000000000000000000c6bd3052", "0000000000000000000000000000000000000000000000000000000000000080", "0000000000000000000000000000000000000000000000000000000000000060"],
      storage: {
        0000000000000000000000000000000000000000000000000000000000000006: "00000000000000000000000000000000000000000000000005d5349f8718c000"
      }

Antworten (2)

Ich sehe es als Byte-adressiertes Byte-Array.

Es ist sicherlich Byte-adressiert, da aufeinanderfolgende Integer-Adressen auf aufeinanderfolgende Bytes im Speicher verweisen.

Es ist wahr, dass Sie nur ein 32-Byte-Wort lesen können ( mloadliest 32 aufeinanderfolgende Bytes), aber Lesevorgänge sind nicht wortausgerichtet. mload(0)und mload(1)beide gültig sind und 31 Bytes gemeinsam haben. es ist also nicht wirklich ein Wort-Array.

Das Schreiben ist dasselbe, außer dass Sie auch ein einzelnes Byte mit speichern können mstore8.

Der einzige "Word-Array"-Aspekt, der mir einfällt, ist, dass beim Erweitern des Speichers immer auf ein Vielfaches von 32 Bytes aufgerundet wird. Und diese Tatsache ist nur für die Gasberechnung wichtig.

Danke. Nachdem Sie es so erklärt haben, habe ich mir den Code angesehen und er scheint mit Ihnen übereinzustimmen. Der Byte-adressierte Aspekt befindet sich in der opMload-Funktion /core/vm/instructions.go und der Byte-Array-Aspekt befindet sich in der Speicherstrukturdefinition in /core/vm/memory.go
Ja, ich weiß nicht, warum die YP sagt, es sei wortorientiert. Oberflächlich betrachtet scheint dies nicht richtig zu sein.
Wortadressiert bedeutet, dass jede Adresse ein Wort ist. Dh der Adressraum ist 2^256 da die Adresse ein Wort (256 Bit) ist. Es ist ein Byte-Array, bei dem jede Adresse auf ein einzelnes Byte zeigt, im Gegensatz zum Speicher, bei dem jede Adresse auf ein ganzes Wort zeigt.

Der Speicher ist ein wortadressiertes Byte-Array. Der Speicher ist ein wortadressiertes Wortarray.

Geth zeigt einfach den Speicher in 32-Byte-Segmenten an, was eine etwas seltsame Wahl ist, aber beim Lesen und Schreiben in den Speicher in der EVM kann auf jedes Byte unabhängig zugegriffen werdenmstore8

mload8ist kein gültiger Opcode. Lesespeicher liest immer 32 Bytes.
Ja, das ist richtig, guter Fang