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"
}
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 ( mload
liest 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.
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
mload8
ist kein gültiger Opcode. Lesespeicher liest immer 32 Bytes.
John Stanford
Benjaminion
Tjaden Hess