Wie definiert die Datei genesis.json den Anfangszustand der Blockchain?

Ich verstehe, dass der Zustand von Ethereum seine Konten ist, entweder EOAs oder Verträge.

Aber die Datei genesis.json gibt keine Konten an; stattdessen definiert es zB difficultyund gas-limit(Block).

Warum sehe ich also oft, dass genesis.json den Anfangszustand einer Ethereum-basierten Blockchain definiert?

Antworten (1)

Wenn Sie eine neue Ethereum-Kette starten, ist es möglich, Benutzerkonten und -guthaben und sogar Verträge im Genesis-Block anzugeben, sodass die Blockchain mit einem gewissen Status startet.

Ein Beispiel ist Quorum mit QuorumChain-Konsens. Dies verwendet den Genesis-Block, um einen Kontakt zu erstellen, ihn zu initialisieren und einige Konten mit Salden zu erstellen. Es gibt kein Proof-of-Work-Mining in Quorum, also wird kein Ether erstellt; es muss alles im Genesis-Block angegeben werden und die Gesamtversorgung ist für immer festgelegt.

Sehen Sie sich hier ein Beispiel dafür an , das in der folgenden Datei genesis.json abgeschnitten dargestellt wird . Der "alloc"-Block erstellt zuerst einen Vertrag an der Adresse 0x20 und initialisiert seinen Speicher. Die nächsten Zeilen initialisieren einige Kontoadressen mit großen Ether-Salden (Private-Chain).

{
  "alloc": {
    "0x0000000000000000000000000000000000000020": {
      "code": "606060405236156100c45760e060020a60003504631290948581146100...<truncated>...",
      "storage": {
        "0x0000000000000000000000000000000000000000000000000000000000000001": "0x02",
        "0x0000000000000000000000000000000000000000000000000000000000000002": "0x04",
        "0x29ecdbdf95c7f6ceec92d6150c697aa14abeb0f8595dd58d808842ea237d8494": "0x01",
        "0x6aa118c6537572d8b515a9f9154be55a3377a8de7991cd23bf6e5ceb368688e3": "0x01",
        ...
      }
    },
    "0xed9d02e382b34818e88b88a309c7fe71e65f419d": {
      "balance": "1000000000000000000000000000"
    },
    "0xca843569e3427144cead5e4d5999a3d0ccf92b8e": {
      "balance": "1000000000000000000000000000"
    },
    "0x0fbdc686b912d7722dc86510934589e0aaf3b55a": {
      "balance": "1000000000000000000000000000"
    },
    ...
   }
  },
  "coinbase": "0x0000000000000000000000000000000000000000",
  "config": {
    "homesteadBlock": 0
  },
  "difficulty": "0x0",
  "extraData": "0x",
  "gasLimit": "0x2FEFD800",
  "mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578",
  "nonce": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp": "0x00"
}

In der öffentlichen Mainnet-Ethereum-Kette haben Sie Recht, dass der ursprüngliche Zustand grundsätzlich leer war, aber das schränkt die Verwendung des Genesis-Blocks zum Erstellen von Zuständen in anderen Ketten nicht ein.

Vielen Dank - also erstellt diese genesis.json Vertragskonten, was per Definition ein Zustand ist. Werden die Konten in diesem Fall durch die Initialisierung von Konten mit Ether erstellt?
"Werden die Konten in diesem Fall durch Initialisieren von Konten mit Ether erstellt?" - Ja. Natürlich müssen Sie die privaten Schlüssel kennen, um die Konten zu verwenden: Die Kontoadressen in der genesis.json-Datei wurden zuvor generiert und die privaten Schlüssel wie gewohnt gespeichert. Sobald die Blockchain läuft, existieren sie einfach mit 10^27 Wei und können als normale EOAs verwendet werden.
@benjaminion Sie erwähnten eine feste Versorgung, wo wird diese Menge festgelegt?