Aufsetzen einer lokalen Ethereum Test-Blockchain

Dieses Tutorial wird laufend erweitert und verbesser. The letzte Version gibt es in diesem Wiki: http://tech.lab.carl.pro/kb/ethereum/testnet_setup_de, und die englischsprachige Version gibts dort ebenfalls: http://tech.lab.carl.pro/kb/ethereum/testnet_setup.

♦ Version: 1, 24/09/2015

♦ License: Beerware Version 42++

Introduction

Das Einrichten eines lokalen Ethereum-Testnetzwerks ist äußerst nützlich zum “Rumspielen”, um “kostenlose” Contract-Tests durchzuführen und während des Entwickeln eines Produktes. Und mehr noch: es geht recht schnell und problemlos.

Auf dieser Seite habe ich ein von mehreren möglichen Installationsprozeduren beschrieben. Das Ziel war es vor allen Dingen eine gut dokumentierte Anleitung zu erstellen. Daher ist die Seite am Ende recht lang geworden. Ohne die ganzen Diskussionen könnte man die Einrichtung auf nur 4 Kommandos reduzieren.

Um mehr zu den Fachausdrücken zu erfahren, empfehle ich diese Seite in English: Technical Blockchain Encyclopaedia. An einer deutschsprachigen Version arbeite ich gerade.

Anmerkung: Ξ (Xi Gross) ist das Währungssymbol für Ether. ≢ benutze ich im Test-Ether oder nicht gültiges Falsch-Ether zu bezeichnen, wenn der Unterschied wichtig ist.

Installationsprozedur

Voraussetzung: UBUNTU, Mint oder eine andere auf UBUNTU basierende Linux-Version, und alle Ethereum-Klientanwendungen installiert und funktionsfähig.

1) Blockchain Datenbank- und Ethereum-Konto-Verzeichnis

In der Standardeinstellung installieren die (Linux) Ethereum-Klientanwendungen das Dateiverzeichnis im “Home”-Verzeichnis des Benutzers, in einem Verzeichnis das “.ethereum” heißt. Es ist möglich, den Klientanwendungen ein alternatives Datenverzeichnis zu spezifizieren, aber in diesem Tutoriell habe ich eine einfachere Methode gewählt: ein alternatives Linux-Benutzerkonto.

Das Einrichten eines Benutzerkontos unter Linux ist sehr einfach und im Terminalfenster kann man einfach mit dem ‘su‘-Kommando zwischen den Konten wechseln.

Sollte ein alternatives Datenverzeichnis vorgezogen werden, müssen bei allen nachfolgenden Ethereum-Kommandos das folgende Parameter hinzugefügt werden: “– -datadir <Datenverzeichnis>”.

Nachfolgend benutzen wir das Benutzerkonto ‘testnet1‘ um die lokale Blockchain zu verwalten. Der Benutzer sollte angelegt werden, bevor die hier beschriebene Prozedur ausgeführt wird.

2) Spezifischer ‘Genesis Block’

Herunter laden: customgenesis.json

Der ‘Genesis Block’ ist der Startblock der Blockchain(Blockketten)-Datenbank. Es ist der erste Block, Block 0, der einzige Block, der keine Referenz zu einem Vorgängerblock hat. Der ‘Genesis Block’ ist ebenfalls ein kryptographisch gültiger Blockchain-Block und definiert in unserem Falle die Betriebsparameter unserer lokalen Blockchain.

Mehr Informationen zum ‘Genesis Block’ sind hier zu finden: The Genesis Block (in English).

Um unsere lokale Blockchain aufzusetzen benötigen wir unseren eigenen ‘Genesis Block’. Da wir keine Schwerstarbeit beim Minen (kryptographische Blockerzeugung) leisten wollen – dh. Single-threaded CPU mining, und wir nicht durch Begrenzungen in Gas und Gaspreise in unseren Tests aufgehalten werden wollen, benutzen wir diesen Block um die Blockchain-Parameter richtig einzustellen.

Der ‘Genesis Block’ beschreibt nicht mit welcher Blockchain sich ein Miner über das Netzwerk verbindet. Ein Miner kann an jeder Blockchain arbeiten. Dies hängt nur davon ab, an welches (physische) Netzwerk der Miner sich anhängt, dh. welche ‘Peers’ er auswählt. Um mehrere Blockchains parallel zu betreiben, benutzen wir den ‘Network ID‘. Dadurch brauchen wir nicht allen Minern die richtigen Netzwerk-Endpunkte zu definieren und können den Discovery-Modus benutzen (automatisches Peer-Finden). Als Konsequenz können wir den selben ‘Genesis Block’ für alle Testnetzwerke benutzen.

{
    "nonce": "0x0000000000000042", 
    "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", 
    "difficulty": "0x4000", 
    "alloc": {},
    "coinbase": "0x0000000000000000000000000000000000000000", 
    "timestamp": "0x00", 
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", 
    "extraData": "Custem Ethereum Genesis Block", 
    "gasLimit": "0xffffffff"
}

 

mixhashEin Hash-Wert, der, zusammen mit der nonce, der kryptographische Beweis ist, dass genug Rechenkraft zu Erzeugung dieses Blocks aufgewendet wurde.

Die Kombination von nonce und mixhash muss den Bedingungen gerecht werden, die im Yellowpaper, 4.3.4. Block Header Validity, (44), beschrieben sind, damit der Block, von diesem Gesichtspunkt aus, als gültig anerkannt wird.

Praktisch ist dieser Wert eine reduzierte Repräsentation (via Fowler–Noll–Vo Methode) der Liste der Datenwerte, die vom Ethash-Algorithmus aus der DAG-Datendatei ausgewählt wurden. Die Auswahl erfolgt nach Parametern, die im Ethash' Hashimoto Algorithmus definiert sind, und die vom vorherigen Blockchain-Block abhängen - dadurch sind die Blöck auch kryptographisch verifizierbar miteinander verbunden. Der angewendete mixhash wird für jede Blockmining-Iteration (Durchlauf) neu erzeugt, was den erwünschten hohen I/O-Durchsatz erzeugt (ASIC-Resistenz). Der im Block enthaltene Wert ist der (reduzierte) mixhash-Wert, der letztendlich zum erfolgreichen Block geführt hat.

Der Grund für die Anwesenheit dieses Wertes im finalen Block ist die Tatsache, dass er so Teil des parentHash des nächsten Blockes wird und dadurch ein potenzieller Angreifer die vorherigen DAG-Daten benötigt, um einen gefälschten Block zu erzeugen.
nonceEin Hash-Wert, der, zusammen mit dem mixhash, der kryptographische Beweis ist, dass genug Rechenkraft zu Erzeugung dieses Blocks aufgewendet wurde.

Die Kombination von nonce und mixhash muss den Bedingungen gerecht werden, die im Yellowpaper, 4.3.4. Block Header Validity, (44), beschrieben sind, damit der Block, von diesem Gesichtspunkt aus, als gültig anerkannt wird.

Die nonce ist der kryptographisch sichere Mining Proof-of-Work, der mit angemessener Sicherheit beweist, dass der gültige Block mit dem geforderten Mindestrechenaufwand gefunden wurde. (Siehe auch Yellowpager, 11.5. Mining Proof-of-Work).

Der finale nonce-Wert ist das Resultat desjenigen Miningprozessdurchlaufs, in dem der Algorithmus den Wert gefunden hat, der die Bedingung des Mining Targets (Miningziel) entspricht. Das Mining Target ist eine kryptographische Bedingung, die ein Block erfüllen muss um potentiel gültig zu sein und die direkt abhängig von der aktuellen Difficulty (Schwierigkeit) ist.
difficultyDie Difficulty erlaubt es die Schwierigkeit für das Finden eines Blockes, der dem Mining Target gerecht wird, festzulegen. Dieses Mining Target, eine kryptographische jedoch einfache Bedingung, kann beim Mining aus der Difficulty des vorherigen Blocks und seines Timestamps, seinem Erzeugungszeitpunkt, abgeleitet werden. Je höher die Difficulty, desto (statistisch) mehr Rechenoperationen muss ein Miner durchführen, um einen gültigen Block zu finden. Dieser Parameter wird dazu verwendet, die Blockerzeugungsfrequenz in einem gewünschten Bereich zu halten.

In unserem lokalen Testnetzwerk stellen wir diesen Wert sehr gering ein, damit wir schnell und einfach neue Blöcke finden, da dieses nötig ist um Transaktionen in der Blockchain auszuführen.
allocErlaubt es die neue Blockchain mit einer Menge von mit Ether vorgefüllten Konten zu initialisieren. Dieses Mechanismus wurde eingeführt, um das Ether, welches in der Vorverkauf-Crowdfunding-Kampagne verkauft wurde, beim offiziellen Ethereum Start den Eigentümern zuzuweisen. Da wir in unserem Testnetz sehr schnell Minen können, benötigen wir diesen Mechanismus nicht.
coinbaseDie Ethereum-Adresse, die die Blockerzeugungs- und Transaktionseinbindungsbelohnung erhält. Wenn ein Miner einen gültigen Block findet, erhält er einen festgelegten Etherbetrag als Entlohnung (derzeit 5 Ether für einen Hauptblock, see also Uncle). Wenn ein Miner Transaktionen ausführt und das Resultat in die Blockchain einbindet, erhält er ebenfalls die Ausführungskosten erstattet (siehe Gas, Gaspreis). All diese Einkünfte wurden für diesen Block auf die angegebene coinbase-Adresse überwiesen. Diese muss kein lokales Konto sein. In der Dokumentation wird dieser Wert oft als "beneficiary" (Begünstigter) beschrieben, im Netz taucht auch der Begriff "etherbase" auf.

Im Genesis Block kann dort jeder valide Wert stehen, da dieser durch die coinbase-Adresse des Miners bestimmt wird, der den Block gefunden hat. The 0x0000-Adresse existiert in der Blockchain und ist quasi ein "Ether-Sink", eine Adresse auf die keiner Zugriff hat und deren Ether verloren ist.
timestampEin skalarer Wert, der den Erzeugungszeitpunkt des Blockes definiert. Dieser Wert ist das Resultat der Unix' time()-Funktion.

Dieser Wert spielt eine wichtige Rolle in der Aufrechterhaltung der Netzwerk-Homöostase in Bezug auf die Blockerzeugungsfrequenz. Je kleiner der Abstand zwischen zwei erzeugten Blöcken ausfällt, desto stärker erhöht sich die Mining Difficulty (siehe oben). Dies führt dazu, dass sich die statistische Zeit zwischen dem Finden neuer gültiger Blöcke erhöht. Wird der Zeitabstand zwischen zwei neuen Block hingegen grösser, wird die Difficulty entsprechend reduziert. Dadurch wird die Frequenz der Blockerzeugung in einem gewollten Rahmen gehalten.

Der timestamp wird ebenfalls benötigt um die Reihenfolge der Blöcke in der Blockchain zu validieren (Yellowpaper, 4.3.4. (43)) und er ist ebenfalls Teil des Parent-Blockes, wodurch er kryptographisch in the Kette eingewebt wird.

NB. Die Homöostase bezeichnet die Aufrechterhaltung eines Gleichgewichtszustandes eines offenen dynamischen Systems durch einen internen regelnden Prozess. Sie ist damit ein Spezialfall der Selbstregulation von Systemen.
parentHashDer Keccak 256-bit Hash-Wert des Vorgängerblocks, einschliesslich der nonce and des mixhash. Dieser Zeiger auf den Vorgängerblocks definiert die Block-Kette. Da er später Teil des nächsten parentHashes wird, ist die BlockSequenz kryptographisch verwebt.
extraData32 Bytes freier Platz, den der Miner verwenden kann um schlaue Sachen in der Blockchain zu verewigen.
gasLimitEin skalarer Wert, der die maximale Menge an Gas bezeichnet, die eine Transaktion, die Teil dieses Blockes ist, verbrennen durfte. Wird in den nächsten Block übertragen, wenn nicht vom Netwerk verändert.

Die Geek-Werte in dem oben gezeigten ‘Genesis Block’ stammen aus dem offiziellen Genesis Block-Konstruktionsskript der Ethereum Frontier Release, der 1sten offiziellen Veröffentlichung. Die Daten erfüllen die Anforderungen einer Validation, wie beschrieben in den Spezifikationen.

3) Installationsprozedur

Die hier beschriebene Prozedur ist nur eine möglich Variante. Anstelle mehrerer geth-Kommandos kann mal ebenso gut alles innerhalb eines oder zwei Schritten erledigen. Persönlich bevorzuge ich die Unterteilung, damit man hinterher alles gut passend in Skripte stecken kann.

(NB. Linien mit # sind Kommentare und werden nicht in Terminal kopiert.)

tasha@HOST:~$ # Aktuelles Terminal auf das testnet1 Benutzerkonto umschalten 
tasha@HOST:~$ #   su = "substitute user"
tasha@HOST:~$ #    - = Started eine "login shell", dh wechselt das ganze Benutzerprofil zu dem 
tasha@HOST:~$ #        des Zielbenutzer und führt ebenfalls die Initialisationsskripte aus.

tasha@HOST:~$ su - testnet1
 
testnet1@HOST:~$ # In unser Arbeitsverzeichnis wechseln (bitte erzeugen, mit Namen je nach Geschmack)
testnet1@HOST:~$ cd ~
testnet1@HOST:~$ cd testnet    
 
testnet1@HOST ~/testnet $ # Den Genesis Block erzeugen:
testnet1@HOST ~/testnet $ # (Falls er herunter geladen wurde, ist dieser Schritt nicht nötig)
testnet1@HOST ~/testnet $ nano customgenesis.json
testnet1@HOST ~/testnet $ # ... dann den oben beschriebenen Blockinhalt in die Datei kopieren.

testnet1@HOST ~/testnet $ # Aufruf des geth-Tools um die neue Ethereum-Umgebung aufzusetzen
testnet1@HOST ~/testnet $ # 
testnet1@HOST ~/testnet $ # Wenn das Ethereum-Datenverzeichnis keine Daten enthält, sollte geth
testnet1@HOST ~/testnet $ # die Nutzungsbedingungen anzeigen. Tut es das nicht, bitte die lokale 
testnet1@HOST ~/testnet $ # Installation überprüfen, da keine Blockchain-Datenbank für diesen 
testnet1@HOST ~/testnet $ # Benutzer (oder das angegebene Zielverzeichnis) existieren dürfte.
testnet1@HOST ~/testnet $ # 
testnet1@HOST ~/testnet $ # Der Netwerk-ID kann benutzt werden wenn mehrere Blockchain-Klienten
testnet1@HOST ~/testnet $ # an verschiedenen Blockchains im lokalen Netz arbeiten, und wir später
testnet1@HOST ~/testnet $ # den "Discovery"-Modus der Tools benutzen wollen.
testnet1@HOST ~/testnet $ #
testnet1@HOST ~/testnet $ # Diese Operation startet nicht das Mining, sondern setzt nur die Umgebung
testnet1@HOST ~/testnet $ # auf. Wenn das Tool seine Arbeit nach einigen Sekunden beendet hat, es 
testnet1@HOST ~/testnet $ # mit CTRL+C oder dem Kommando 'exit' verlassen.

testnet1@HOST ~/testnet $ geth --genesis customgenesis.json --networkid 1100 -nodiscover -maxpeers 0  console
 
=======================================
Disclaimer of Liabilites and Warranties
=======================================
 
THE USER EXPRESSLY KNOWS AND AGREES THAT THE USER IS USING THE ETHEREUM PLATFORM AT THE USER’S SOLE
RISK. THE USER REPRESENTS THAT THE USER HAS AN ADEQUATE UNDERSTANDING OF THE RISKS, USAGE AND
INTRICACIES OF CRYPTOGRAPHIC TOKENS AND BLOCKCHAIN-BASED OPEN SOURCE SOFTWARE, ETH PLATFORM AND ETH.
THE USER ACKNOWLEDGES AND AGREES THAT, TO THE FULLEST EXTENT PERMITTED BY ANY APPLICABLE LAW, THE
DISCLAIMERS OF LIABILITY CONTAINED HEREIN APPLY TO ANY AND ALL DAMAGES OR INJURY WHATSOEVER CAUSED
BY OR RELATED TO RISKS OF, USE OF, OR INABILITY TO USE, ETH OR THE ETHEREUM PLATFORM UNDER ANY CAUSE
OR ACTION WHATSOEVER OF ANY KIND IN ANY JURISDICTION, INCLUDING, WITHOUT LIMITATION, ACTIONS FOR
BREACH OF WARRANTY, BREACH OF CONTRACT OR TORT (INCLUDING NEGLIGENCE) AND THAT NEITHER STIFTUNG
ETHEREUM NOR ETHEREUM TEAM SHALL BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR
CONSEQUENTIAL DAMAGES, INCLUDING FOR LOSS OF PROFITS, GOODWILL OR DATA. SOME JURISDICTIONS DO NOT
ALLOW THE EXCLUSION OF CERTAIN WARRANTIES OR THE LIMITATION OR EXCLUSION OF LIABILITY FOR CERTAIN
TYPES OF DAMAGES. THEREFORE, SOME OF THE ABOVE LIMITATIONS IN THIS SECTION MAY NOT APPLY TO A USER.
IN PARTICULAR, NOTHING IN THESE TERMS SHALL AFFECT THE STATUTORY RIGHTS OF ANY USER OR EXCLUDE
INJURY ARISING FROM ANY WILLFUL MISCONDUCT OR FRAUD OF STIFTUNG ETHEREUM.
 
Do you accept this agreement? [y/N] y
 
I0920 08:59:31.695411   10724 flags.go:405] WARNING: No etherbase set and no accounts found as default
I0920 08:59:31.695693   10724 database.go:73] Alloted 16MB cache to /home/testnet1/.ethereum/chaindata
I0920 08:59:31.787327   10724 database.go:73] Alloted 16MB cache to /home/testnet1/.ethereum/dapp
I0920 08:59:31.876773   10724 backend.go:291] Protocol Versions: [61 60], Network Id: 1100
I0920 08:59:31.877152   10724 backend.go:303] Successfully wrote genesis block. New genesis hash = 6e92f8b23bcdfdf34dc813cfaf1d84b71beac80530506b5d63a2df10fe23a660
I0920 08:59:31.877198   10724 backend.go:328] Blockchain DB Version: 3
I0920 08:59:31.877317   10724 chain_manager.go:237] Last block (0) 6e92f8b23bcdfdf34dc813cfaf1d84b71beac80530506b5d63a2df10fe23a660 TD=16384
I0920 08:59:31.887129   10724 cmd.go:125] Starting Geth/v1.1.0/linux/go1.4.2
I0920 08:59:31.887308   10724 server.go:311] Starting Server
I0920 08:59:31.887480   10724 backend.go:557] Server started
I0920 08:59:31.887528   10724 server.go:552] Listening on [::]:30303
I0920 08:59:31.887985   10724 ipc_unix.go:104] IPC service started (/home/testnet1/.ethereum/geth.ipc)
instance: Geth/v1.1.0/linux/go1.4.2
 datadir: /home/testnet1/.ethereum
coinbase: null
at block: 0 (Thu, 01 Jan 1970 01:00:00 CET)
modules: admin:1.0 db:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 shh:1.0 txpool:1.0 web3:1.0
> exit
I0920 08:59:35.111892   10724 chain_manager.go:459] Chain manager stopped
I0920 08:59:35.111913   10724 handler.go:165] Stopping ethereum protocol handler...
I0920 08:59:35.111933   10724 handler.go:175] Ethereum protocol handler stopped
I0920 08:59:35.111949   10724 transaction_pool.go:138] Transaction pool stopped
I0920 08:59:35.111969   10724 backend.go:686] Automatic pregeneration of ethash DAG OFF (ethash dir: /home/testnet1/.ethash)
I0920 08:59:35.126425   10724 database.go:167] flushed and closed db: /home/testnet1/.ethereum/chaindata
I0920 08:59:35.126590   10724 database.go:167] flushed and closed db: /home/testnet1/.ethereum/dapp
testnet1@HOST ~/testnet $
 

testnet1@HOST ~/testnet $ # Nun müssen wir ein Ethereum-Konto erzeugen, das wir als Mining-Coinbase
testnet1@HOST ~/testnet $ # benutzen und welches den nötigen Ether für unsere Tests bereithält.
testnet1@HOST ~/testnet $ # 
testnet1@HOST ~/testnet $ # Ohne diese Konto, angezeigt durch 'coinbase: null' in der obrigen 
testnet1@HOST ~/testnet $ # Ausgabe, wird geth kein Mining starten. Wenn nicht speziel angegeben 
testnet1@HOST ~/testnet $ # oder konfiguriert, benutzt geth das erste Konto in der Kontoliste.

testnet1@HOST ~/testnet $ geth account new
 
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase: 
Repeat Passphrase: 
Address: {6050679a421c13f6d76ed3cc0f8464ebc930a803}
 
testnet1@HOST ~/testnet $ # 

NB. Passwort nicht vergessen, da ohne dieses das Konto verloren ist.

The lokale Blockchain minen

Um mit der lokalen Test-Blockchain arbeiten zu können, benötigen wir einen aktiven Miner, der neue Blocks einfügt welche unsere Transaktionen und unseren Programmkode enthalten. Gleichzeitig erzeugen wir dadurch Ether, den wir beim Testen benötigen. Es macht dabei keinen Sinn den Miner permanent laufen zu lassen, da wir, bei der niedrigen Difficulty, immer neue Blöcke finden. Es macht ebenfalls keinen Sinn, etwas anderes als einen Single-Thread-Mining auf einer CPU einzusetzen.

Wenn der Miner das erste Mal gestartet wird, wird der DAG-Datenblock erzeugt und in eine Datei geschrieben. Dies dauert einige Minuten. Die Blockchain wird funktionsfähig, wenn die ersten 5 Blocks gefunden und validiert wurden (siehe Spezifikationen).

Wichtig: Das nachstehende Kommando öffnet verschiedene RPC/IPC-Schnittstellen, die einer Person, die sich mit der Maschine über das Netzwerk verbinden kann, vollen Zugriff auf den Miner und unser Ether-Wallet erlaubt. Das Kommando entfernt ebenfalls die CORS-Begrenzung. All dies ist natürlich eine sehr schlechte Idee, wenn wir in einem öffentlichen Netz mit der Produktions-Blockchain arbeiten.

testnet1@HOST ~/testnet $ # Startet den CPU Miner:
testnet1@HOST ~/testnet $ # - Arbeitet auf der lokalen Test-Blockchain
testnet1@HOST ~/testnet $ # - Bearbeitet unsere Transaktionen und fügt diese in die Blockchain ein
testnet1@HOST ~/testnet $ # - Erzeugt Test-Ether
testnet1@HOST ~/testnet $ # - Erzeugt den DAG-Datenblock
testnet1@HOST ~/testnet $ #
testnet1@HOST ~/testnet $ # Anmerkungen:
testnet1@HOST ~/testnet $ # - Eventuell Netzwerk-ID anpassen
testnet1@HOST ~/testnet $ # - SICHERHEIT: Öffnet RCP/IPC-Netzwerkschnittstellen!
testnet1@HOST ~/testnet $ 
testnet1@HOST ~/testnet $ geth --mine -rpccorsdomain "*" --ipcapi "admin,eth,miner" --rpcapi "eth,web3" --networkid 1100 -nodiscover -maxpeers 5 --minerthreads 1

I0920 09:21:12.555430   10823 database.go:73] Alloted 16MB cache to /home/testnet1/.ethereum/chaindata
I0920 09:21:12.636374   10823 database.go:73] Alloted 16MB cache to /home/testnet1/.ethereum/dapp
I0920 09:21:12.646307   10823 backend.go:291] Protocol Versions: [61 60], Network Id: 1100
I0920 09:21:12.646503   10823 backend.go:328] Blockchain DB Version: 3
I0920 09:21:12.646767   10823 chain_manager.go:237] Last block (0) 6e92f8b23bcdfdf34dc813cfaf1d84b71beac80530506b5d63a2df10fe23a660 TD=16384
I0920 09:21:12.654789   10823 cmd.go:125] Starting Geth/v1.1.0/linux/go1.4.2
I0920 09:21:12.655086   10823 server.go:311] Starting Server
I0920 09:21:12.655193   10823 server.go:552] Listening on [::]:30303
I0920 09:21:12.655394   10823 backend.go:640] Automatic pregeneration of ethash DAG ON (ethash dir: /home/testnet1/.ethash)
I0920 09:21:12.655456   10823 backend.go:647] checking DAG (ethash dir: /home/testnet1/.ethash)
I0920 09:21:12.655577   10823 backend.go:557] Server started
I0920 09:21:12.655900   10823 ipc_unix.go:104] IPC service started (/home/testnet1/.ethereum/geth.ipc)
I0920 09:21:12.655950   10823 miner.go:119] Starting mining operation (CPU=1 TOT=1)
I0920 09:21:12.656401   10823 worker.go:540] commit new work on block 1 with 0 txs & 0 uncles. Took 416.9µs
I0920 09:21:12.656481   10823 ethash.go:202] Generating DAG for epoch 0 (0000000000000000000000000000000000000000000000000000000000000000)
I0920 09:21:14.566221   10823 ethash.go:230] Still generating DAG: 0%
I0920 09:21:21.423904   10823 ethash.go:230] Still generating DAG: 1%
I0920 09:21:28.067961   10823 ethash.go:230] Still generating DAG: 2%
I0920 09:21:34.586718   10823 ethash.go:230] Still generating DAG: 3%
:
:
I0920 09:32:00.575130   10823 ethash.go:230] Still generating DAG: 98%
I0920 09:32:07.060124   10823 ethash.go:230] Still generating DAG: 99%
I0920 09:32:13.542035   10823 ethash.go:230] Still generating DAG: 100%
I0920 09:32:13.545446   10823 ethash.go:219] Done generating DAG for epoch 0, it took 11m0.888973073s
I0920 09:32:19.169934   10823 worker.go:322] ??  Mined block (1 / f6d6142d). Wait 5 blocks for confirmation
I0920 09:32:19.170407   10823 worker.go:540] commit new work on block 2 with 0 txs & 0 uncles. Took 405.197µs
I0920 09:32:19.170776   10823 worker.go:540] commit new work on block 2 with 0 txs & 0 uncles. Took 298.979µs
I0920 09:32:25.413322   10823 worker.go:322] ??  Mined block (2 / 41832182). Wait 5 blocks for confirmation
I0920 09:32:25.413782   10823 worker.go:540] commit new work on block 3 with 0 txs & 0 uncles. Took 384.003µs
I0920 09:32:25.414165   10823 worker.go:540] commit new work on block 3 with 0 txs & 0 uncles. Took 313.387µs
I0920 09:32:25.839043   10823 worker.go:322] ??  Mined block (3 / 4f82f814). Wait 5 blocks for confirmation
I0920 09:32:25.839470   10823 worker.go:540] commit new work on block 4 with 0 txs & 0 uncles. Took 367.068µs
I0920 09:32:25.839832   10823 worker.go:540] commit new work on block 4 with 0 txs & 0 uncles. Took 294.022µs
:
:

# Tastenkombination CTRL+C um das Tool sauber zu beenden.

^CI0920 09:32:59.097185   10823 cmd.go:134] Got interrupt, shutting down...
I0920 09:32:59.097329   10823 chain_manager.go:459] Chain manager stopped
I0920 09:32:59.097339   10823 handler.go:165] Stopping ethereum protocol handler...
I0920 09:32:59.097359   10823 handler.go:175] Ethereum protocol handler stopped
I0920 09:32:59.097370   10823 transaction_pool.go:138] Transaction pool stopped
I0920 09:32:59.097383   10823 backend.go:686] Automatic pregeneration of ethash DAG OFF (ethash dir: /home/testnet1/.ethash)
I0920 09:32:59.147738   10823 database.go:167] flushed and closed db: /home/testnet1/.ethereum/chaindata
I0920 09:32:59.147917   10823 database.go:167] flushed and closed db: /home/testnet1/.ethereum/dapp

Die local Blockchain benutzen

Nun wo das Testnetzwerk aufgesetzt ist, können wir Ethereum-Anwendungen darauf fahren und Test-Transaktionen ausführen. Die Bedingung ist jedoch, dass wir entweder im Kontext des “testnet1”-Benutzers arbeiten oder das entsprechende Datenverzeichnis an die Anwendungen und Klienten übergeben.

Wichtig: Damit ein Kommando effektiv in der Blockchain ausgeführt wird, muss ein Miner einen neuen Block finden. Jedes Mal!

testnet1@HOST ~/testnet $ geth attach
modules: admin:1.0 eth:1.0 miner:1.0

# Wieviel Ether ≢ habe ich?
> web3.fromWei(eth.getBalance(eth.coinbase),"ether")
611

 

Leave a Reply

Your email address will not be published. Required fields are marked *