Die EVM kann Speicher zurückfordern, indem sie das Schlüsselwort „delete“ in Solidity verwendet.
Der Speicher wird jedoch erweitert, wenn mehr durch das Schlüsselwort „new“ zugewiesen wird, richtig? Werden auch lokale Variablen im Speicher abgelegt?
Wann schrumpft der Speicher, sodass sich der Speicher nicht weiter ausdehnt?
Nein. Der Speicherverbrauch während einer einzelnen EVM-Ausführung/Vertragsausführung steigt immer nur an.
Entsprechend wird Ihnen Benzin berechnet, wenn Sie die Menge des verwendeten Speichers erhöhen, aber Sie erhalten keine Rückerstattung, wenn Sie die Menge verringern. Wie Sie sagen, unterscheidet sich dies von der Speicherung.
In Bezug auf das Gelbe Papier ist die Speichergröße in Worten mu_i
. Immer wenn dies neu berechnet wird, ist es immer in Bezug auf max(mu_i, current_memory_access)
- es ist also monoton; es geht nie unter.
Noch interessanter ist, dass das Lesen des Speichers (nicht das Schreiben darauf) die Menge des verwendeten Speichers erhöhen kann, mu_i
. Sie werden also für die Erweiterung des Speichers in Rechnung gestellt, wenn Sie nur über die aktuelle Speicherobergrenze hinaus lesen. Siehe die Definition von MLOAD
im Yellow Paper.
Solidity speichert hauptsächlich lokale Variablen im Speicher, verwendet aber manchmal den Stack für Zwischenwerte.
Shuzheng
delete
das auch für Speichervariablen, dh kann man damit Speicher auf "Null" setzen?Benjaminion
delete
funktioniert mit Speichervariablen; es setzt es einfach auf Null.Shuzheng