Erste Schritte mit Ethereum Smart Contract Development


Ein Ethereum-Vertrag besteht aus einer Code-Zeichenfolge und Daten zu einer bestimmten Kontoadresse einer Ethereum-Blockchain. Vertragskonten können nicht nur miteinander kommunizieren, sondern auch fast alle derzeit verfügbaren Turing Complete-Berechnungen ausführen. Der Vertragscode in einer Ethereum-Blockchain liegt in einer bestimmten binären Form vor, die als EVM-Binärcode (Ethereum Virtual Machine) bezeichnet wird.

Verträge werden jedoch normalerweise in einer fortgeschrittenen Sprache entwickelt und geschrieben, die in Binärcode übersetzt und in die Blockchain hochgeladen wird. Bestehende erweiterte Ethereum-Entwicklungssprachen sind JavaScript-ähnliche Solidity-, Python-ähnliche Serpent- und Lisp-ähnliche LLL-Sprachen. In diesem Artikel wird die erste dieser Sprachen verwendet, Solidity.

Solidity ist eine objektorientierte fortgeschrittene Ethereum-Entwicklungssprache. Beeinflusst von C ++, Python und JavaScript unterstützt es statische Typen, Vererbung, Klassenbibliotheken und komplexe benutzerdefinierte Features. Ein typischer Vertragsentwicklungsprozess umfasst das Schreiben, Kompilieren, Veröffentlichen und Aufrufen.

Der Ethereum-Netzwerkbefehlszeilenclient bietet die Go-basierten Geth- und C ++ – basierten Eth-Befehlszeilentools. Geth wird hauptsächlich für die Webentwicklung und die Dapp-Front-End-Konstruktion verwendet, während Eth hauptsächlich für das GPU-Mining verwendet wird. Abgesehen von diesen Unterschieden sind die beiden Funktionen nahezu identisch. In diesem Artikel wird Geth verwendet, da es sowohl benutzerfreundlich als auch relativ weit verbreitet ist.

Lassen Sie uns zuerst ethereum installieren und starten, um mit diesem Tutorial zu beginnen. Sie können ethereum mit den folgenden Aktionen und brew mit dem folgenden Befehl installieren.

Brühhahn Ethereum / Ethereum
Brauen Sie installieren Ethereum

Führen Sie dann ethereum mit folgendem Befehl aus:

geth Konsole

Standardmäßig sind Sie mit dem Ethereum-Hauptnetzwerk verbunden. Das Hauptnetzwerk ist langsam und teuer, und Übertragungen, die Bereitstellung von Verträgen und Call-to-Contracts verbrauchen Ether (ETH), sodass es nicht direkt für die Entwicklung verwendet werden kann. Als Ergebnis möchten Sie ein privates Testnetzwerk aufbauen. Es muss ein privates Testnetzwerk eingerichtet werden, dessen einziges Mitglied Sie sind. Sie sind für alle Aufgaben verantwortlich, z. B. für die Blockgenerierung, die Transaktionsüberprüfung und die intelligente Vertragsausführung. Dies hilft, Verträge einfach und schnell zu niedrigen Kosten zu entwickeln.

Sie können verwenden genesis.json um den Genesis Block zu initialisieren und den datadir Verzeichnis:

geth --datadir ~ / .ethereum_private init ~ / dev / genesis.json

Die Datei genesis.json lautet wie folgt:

{
"config": {
"chainId": 12345,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"nonce": "0x0000000000000033",
"timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0xffffffff",
"Schwierigkeit": "0x100",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": 0x333333333333333333333333333333333333333333
"alloc": {}
}

Im folgenden wird die chainid und gaslimit Konfigurationen sind angegeben. Das Ergebnis der Initialisierungseinreichung lautet wie folgt:

DIE INFO [02-13|16:08:23] Maximale Anzahl von Gleichaltrigen ETH = 25 LES = 0 total = 25
DIE INFO [02-13|16:08:23] Zugewiesener Cache und Datei-Handles database = / Users / shanyao / .ethereum_private / geth / chaindata cache = 16 handle = 16
DIE INFO [02-13|16:08:23] Schreiben eines benutzerdefinierten Genesis-Blocks
DIE INFO [02-13|16:08:23] Angehaltener Versuch von Speicherdatenbankknoten = 0 Größe = 0,00B Zeit = 7,737µs gcnodes = 0 gcsize = 0,00B gctime = 0s livenodes = 1 livesize = 0,00B
DIE INFO [02-13|16:08:23] Genesis-Statusdatenbank = chaindata hash = 76bc36… 4efba1 wurde erfolgreich geschrieben
DIE INFO [02-13|16:08:23] Zugewiesener Cache und Datei-Handles database = / Users / shanyao / .ethereum_private / geth / lightchaindata cache = 16 handle = 16
DIE INFO [02-13|16:08:23] Schreiben eines benutzerdefinierten Genesis-Blocks
DIE INFO [02-13|16:08:23] Angehaltener Versuch von Speicherdatenbankknoten = 0 Größe = 0,00B Zeit = 1,16µs GKnoten = 0 GKGröße = 0,00B GZT = 0s LKGröße = 1 LKG = 0,00B
DIE INFO [02-13|16:08:23] Genesis-Statusdatenbank = lightchaindata hash = 76bc36… 4efba1 wurde erfolgreich geschrieben

Starten Sie als Nächstes das private Netzwerk mit dem Datenverzeichnis und binden Sie eine Konsole über den prozessübergreifenden Kommunikationspfad (IPC-Pfad), wie unten gezeigt:

geth --fast --cache 512 --ipcpath ~ / Library / Ethereum / geth.ipc --networkid 12345 --datadir ~ / .ethereum_private console

Das Ergebnis ist wie folgt:

DIE INFO [02-13|16:09:20] Maximale Anzahl von Gleichaltrigen ETH = 25 LES = 0 total = 25
DIE INFO [02-13|16:09:20] Starten der Peer-to-Peer-Knoteninstanz = Geth / v1.8.2-stable / darwin-amd64 / go1.10
DIE INFO [02-13|16:09:20] Zugewiesener Cache und Datei-Handles database = / Users / shanyao / .ethereum_private / geth / chaindata cache = 384 handle = 1024
WARNEN [02-13|16:09:20] Upgrade der Datenbank zur Verwendung von Sucheinträgen
DIE INFO [02-13|16:09:20] Deduplizierung der Datenbank erfolgreich durchgeführt = 0
DIE INFO [02-13|16:09:20] Initialisierte Kettenkonfiguration config = "{ChainID: 123456 Homestead: 0 DAO: DAOSupport: false EIP150: EIP155: 0 EIP158: 0 Byzanz: Konstantinopel: Motor: unbekannt} "
DIE INFO [02-13|16:09:20] Festplattenspeicher für Ethash-Caches aktiviert dir = / Users / shanyao / .ethereum_private / geth / ethash count = 3
DIE INFO [02-13|16:09:20] Festplattenspeicher für Ethash-DAGs aktiviert dir = / Users / shanyao / .ethash count = 2
DIE INFO [02-13|16:09:20] Initialisierung der Ethereum-Protokollversionen[63 62]"network = 12345
DIE INFO [02-13|16:09:20] Zuletzt geladene lokale Headernummer = 0 Hash = 76bc36… 4efba1 td = 256
DIE INFO [02-13|16:09:20] Geladene letzte lokale vollständige Blocknummer = 0 Hash = 76bc36… 4efba1 td = 256
DIE INFO [02-13|16:09:20] Geladene letzte lokale schnelle Blocknummer = 0 Hash = 76bc36… 4efba1 td = 256
DIE INFO [02-13|16:09:20] Regenerierte lokale Transaktionsjournaltransaktionen = 0 Konten = 0
DIE INFO [02-13|16:09:20] Starten des P2P-Netzwerks
DIE INFO [02-13|16:09:22] UDP-Listener up self = enode: // 42b0eec728cad819259d9685807bf78105450b6b28cd39d70417aa65ffebd3ac744b63d0446174bc657c9a42de2f0f9b844d9f9589998c960177b844d5d5[::]: 30303
DIE INFO [02-13|16:09:22] RLPx-Listener up self = enode: // 42b0eec728cad819259d9685807bf78105450b6b28cd39d70417aa65ffebd3ac744b63d0446174bc657c9a42de2f0f9bc0f9589998c96015778[::]: 30303
DIE INFO [02-13|16:09:22] IPC-Endpunkt geöffnet url = / Users / shanyao / Library / Ethereum / geth.ipc
Willkommen in der Geth JavaScript-Konsole!
Beispiel: Geth / v1.8.2-stable / darwin-amd64 / go1.10
module: admin: 1.0 debug: 1.0 eth: 1.0 miner: 1.0 net: 1.0 personal: 1.0 rpc: 1.0 txpool: 1.0 web3: 1.0
>

Jetzt wurde das lokale private Ethereum-Netzwerk gestartet. Nachdem dies geschehen ist, können Sie das Netzwerk anzeigen. Geben Sie dazu ein Administrator So zeigen Sie die Netzwerkinformationen an:

> admin
{
datadir: "/Users/shanyao/.ethereum_private",
nodeInfo: {
enode: "enode: // 42b0eec728cad819259d9685807bf78105450b6b28cd39d70417aa65ffebd3ac744b63d0446174bc657c9a42de2f0f9bc0f9589998c960177b844d9 @[::]: 30303 ",
id: "42b0eec728cad819259d9685807bf78105450b6b28cd39d70417aa65ffebd3ac744b63d0446174bc657c9a42de2f0f9bc0f9589998c960177b844d5a962d8da9",
ip: "::",
listenAddr: "[::]: 30303 ",
name: "Geth / v1.8.2-stable / darwin-amd64 / go1.10",
Häfen: {
Entdeckung: 30303,
Zuhörer: 30303
},
Protokolle: {
eth: {
config: {...},
Schwierigkeit: 256,
Entstehung: "0x76bc36aeb54afba3cb6dc2a5d13818edabeb7f119f8bf61ee127854b624efba1",
head: "0x76bc36aeb54afba3cb6dc2a5d13818edabeb7f119f8bf61ee127854b624efba1",
Netzwerk: 12345
}
}
},
Gleichaltrigen: [],
addPeer: function (),
clearHistory: function (),
exportChain: function (),
getDatadir: function (Rückruf),
getNodeInfo: function (Rückruf),
getPeers: function (Rückruf),
importChain: function (),
removePeer: function (),
sleep: Funktion github.com/ethereum/go-ethereum/console. (* bridge) .Sleep-fm (),
sleepBlocks: Funktion github.com/ethereum/go-ethereum/console. (* bridge) .SleepBlocks-fm (),
startRPC: function (),
startWS: function (),
stopRPC: function (),
stopWS: function ()
}

Anschließend können Sie Ihre Knoten-URL wie folgt anzeigen:

> admin.nodeInfo.enode
"enode: // 42b0eec728cad819259d9685807bf78105450b6b28cd39d70417aa65ffebd3ac744b63d0446174bc657c9a42de2f0f9bc0f9589998c960177b844d5a962d8[::]: 30303 "

Hinweis: Sie müssen web3 eingeben, um alle Befehle und Strukturen anzuzeigen. Die Präfixe dieser Befehle sind "web3". Dies bedeutet, dass die Eingabe von "admin" dieselbe Auswirkung hat wie die Eingabe von "web3.admin".

Als nächstes können Sie ein Konto erstellen:

> personal.newAccount ("pk1")
"0xfb6565558c9fb3ef0eb657d5540bcd2859824e7f"
> personal.newAccount ("pk2")
"0x9652670122f63ea19398f93d088ccb458b16cbf7"

Der Primärschlüssel ist hier Ihr Kontopasswort, das Sie speichern müssen, da Sie es nicht wiederherstellen können, wenn es verloren gegangen ist.

Als Nächstes können Sie das Konto anzeigen:

> eth.accounts
["0xfb6565558c9fb3ef0eb657d5540bcd2859824e7f", "0x9652670122f63ea19398f93d088ccb458b16cbf7"]
> eth.accounts[0]
"0xfb6565558c9fb3ef0eb657d5540bcd2859824e7f"

Das zuerst erstellte Konto wird normalerweise als primäres Konto bezeichnet.

Überprüfen Sie nun den Kontostand:

> var primaryAccount = web3.eth.accounts[0]
nicht definiert
> web3.eth.getBalance (primaryAccount)
0

Wie Sie den Ergebnissen entnehmen können, beträgt der aktuelle Kontostand 0. Beginnen wir mit dem web3.miner.start () befehle und grabe eine Weile, um ein bisschen ETH zu verdienen:

> web3.miner.start ()
DIE INFO [02-13|16:29:24] Aktualisierte Mining-Threads threads = 0
DIE INFO [02-13|16:29:24] Preisschwelle des Transaktionspools aktualisierter Preis = 18000000000
DIE INFO [02-13|16:29:24] Mining-Betrieb starten
Null
> INFO [02-13|16:29:24] Neue Miningarbeitsnummer festschreiben = 1 txs = 0 oncles = 0 verstrichen = 187,297µs
DIE INFO [02-13|16:29:27] Neue Blocknummer = 1 Hash = f59c04… 83a194 erfolgreich versiegelt
DIE INFO [02-13|16:29:27] ? Mined Potential Block Number = 1 Hash = f59c04… 83a194
DIE INFO [02-13|16:29:27] Neue Miningarbeitsnummer festschreiben = 2 txs = 0 oncles = 0 verstrichen = 113,91µs
DIE INFO [02-13|16:29:27] Neue Blocknummer = 2 Hash = 09f545… b0230d erfolgreich versiegelt
DIE INFO [02-13|16:29:27] ? Mined Potential Block Number = 2 Hash = 09f545… b0230d

Öffnen Sie nach einer Weile ein anderes Fenster und beenden Sie den Abbau:

ali-186590cc4a7f-2: ethereum shanyao $ geth attach
Willkommen in der Geth JavaScript-Konsole!
Beispiel: Geth / v1.8.2-stable / darwin-amd64 / go1.10
Münzbasis: 0xfb6565558c9fb3ef0eb657d5540bcd2859824e7f
im Block: 99 (Mi, 13. Februar 2019 16:31:07 CST)
datadir: /Users/shanyao/.ethereum_private
module: admin: 1.0 debug: 1.0 eth: 1.0 miner: 1.0 net: 1.0 personal: 1.0 rpc: 1.0 txpool: 1.0 web3: 1.0
> web3.miner.stop ()
wahr

Überprüfen Sie anschließend den Kontostand erneut:

> web3.eth.getBalance (primaryAccount)
565000000000000000000

Lassen Sie uns zuerst schreiben. Um einen Vertrag mit dem Befehlszeilentool zu erstellen, müssen Sie zunächst einen einfachen "Hallo Welt" -Vertrag erstellen. Der Code lautet wie folgt:

Pragma-Solidität> = 0,4,22 <0,6,0;Vertrag Mortal {
/ * Variablenbesitzer vom Typ Adresse definieren * /
Adresse des Eigentümers;
/ * Dieser Konstruktor wird bei der Initialisierung ausgeführt und legt den Eigentümer des Vertrags fest * /
constructor () public {owner = msg.sender; }
/ * Funktion zur Einziehung der Mittel aus dem Vertrag * /
Funktion kill () public {if (msg.sender == owner) selfdestruct (msg.sender); }
}
Vertrag Greeter is Mortal {
/ * Variablenbegrüßung vom Typ string definieren * /
String Begrüßung;
/ * Dies wird ausgeführt, wenn der Vertrag ausgeführt wird * /
Konstruktor (Zeichenfolgenspeicher _greeting) public {
Gruß = _greeting;
}
/* Hauptfunktion */
Funktion greet () public view returniert (String-Speicher) {
Gruß zurück;
}
}

Aus dem Obigen können wir ersehen, dass zwei Verträge existieren, Greeter und Mortal. Greeter erbt von Mortal. Zusätzlich zur Kill-Funktion von Mortal wurde die Greet-Funktion hinzugefügt. Es ist zu beachten, dass der Vertrag in Ethereum standardmäßig unsterblich und unkontrolliert ist. Das heißt, sobald der Vertrag in der Blockchain implementiert ist, hat selbst der Autor des Vertrags nicht mehr das Recht, den Vertrag zu kontrollieren. Der Vertrag wird vom Autor festgelegt, aber die Ausführung des Vertrags und die von ihm erbrachten Dienstleistungen werden vom gesamten Ethereum-Netzwerk unterstützt. Solange das gesamte Netzwerk noch besteht, bleibt der Vertrag bestehen und läuft weiter. Der Vertrag kommt erst zustande, wenn ein Selbstzerstörungsprogramm geschrieben und ausgelöst wurde.

Der nächste Schritt ist das Kompilieren. Derzeit ist die bequemste Möglichkeit, einen Vertrag zu erstellen, die Online-Verwendung von IDE REMIX. Nachdem Sie den Code eingefügt haben, wird er automatisch wie folgt kompiliert:

Beachten Sie die ABI-, ByteCode- und andere wichtige Informationen in den Details der Kompilierungsergebnisse auf der rechten Seite. Das ABI (Application Binary Interface) sieht wie folgt aus:

[[
{
"konstant": falsch,
"Eingänge": [],
"name": "kill",
"Ausgänge": [],
"zahlbar": falsch,
"stateMutability": "nicht zahlbar",
"Typ": "Funktion"
},
{
"konstant": wahr,
"Eingänge": [],
"name": "greet",
"Ausgänge":[[
{
"Name": "",
"type": "string"
}
],
"zahlbar": falsch,
"stateMutability": "view",
"Typ": "Funktion"
},
{
"Eingänge":[[
{
"name": "_greeting",
"type": "string"
}
],
"zahlbar": falsch,
"stateMutability": "nicht zahlbar",
"Typ": "Konstruktor"
}
]

Der nächste Schritt ist die Bereitstellung. Speziell, WEB3DEPLOY ist der JS-Code des zu implementierenden Vertrags, der wie folgt lautet:

var _greeting = "Hallo Welt!"; / * var vom Typ string hier * /;
var greeterContract = web3.eth.contract ([{"Konstante":false"Eingaben":[{"constant":false"inputs":[], "name": "kill", "output":[], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"constant": true, "input":[], "name": "greet", "output":[{"name":"","type":"string"}], "payable": false, "stateMutability": "view", "type": "function"}, {"input":[{"name":"_greeting","type":"string"}], "payable": false, "stateMutability": "nonpayable", "type": "constructor"}]);
var greeter = greeterContract.new (
_Gruß,
{
von: web3.eth.accounts[0],
Daten: ‚0x608060405234801561001057600080fd5b506040516103c73803806103c78339810180604052602081101561003357600080fd5b81019080805164010000000081111561004b57600080fd5b8281019050602081018481111561006157600080fd5b815185600182028301116401000000008211171561007e57600080fd5b5050929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600190805190602001906100dc9291906100e3565b5050610188565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061012457805160ff1916838001178555610152565b82800160010185558215610152579182015b82811115610151578251825591602001919060010190610136565b5b50905061015f9190610163565b5090565b61018591905b80821115610181576000816000905550600101610169565b5090565b90565b610230806101976000396000f3fe608060405260043610610046576000357c01000000000000000000000000000000000000000000000000000000009004806341c0e1b51461004b578063cfae321714610062575b600080fd5b34801561005757600080fd5b5 06100606100f2565b005b34801561006e57600080fd5b50610077610162565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100b757808201518184015260208101905061009c565b50505050905090810190601f1680156100e45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610160573373ffffffffffffffffffffffffffffffffffffffff16ff5b565b606060018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101fa5780601f106101cf576101008083540402835291602001916101fa565b820191906000526020600020905b8154815290600101906020018083116101dd57829003601f168201915b505050505090509056fea165627a7a7230582083829c23804682d77517133b1aba64edd8cb8cc98a0f9cd40fc419024eb92ce00029' ,
Gas: "4700000"
}, Funktion (e, Vertrag) {
console.log (e, contract);
if (typeof contract.address! == 'undefined') {
console.log ('Vertrag abgebaut! Adresse:' + contract.address + 'transactionHash:' + contract.transactionHash);
}
})

Fügen Sie den Code in das Geth-Fenster ein und senden Sie ihn an das private Blockchain-Netzwerk. Vorher müssen Sie das Konto wie folgt entsperren:

> personal.unlockAccount (web3.eth.accounts[0], "pk1")
wahr

Andernfalls tritt der folgende Fehler auf: Fehler: Authentifizierung erforderlich: Passwort oder Freischaltung undefiniert. Das Ergebnis der Bereitstellung des Vertrags lautet wie folgt:

DIE INFO [02-13|17:15:47] Übermittelte Vertragserstellung fullhash = 0x5cafc176adea94dafee6ae1a6daa8b1ece894666ccac85f7858b16af5e15cdbe contract = 0x579756a30442b508e2F6A0a4b4D1F4d871f9B906

Dies weist darauf hin, dass die Vertragserstellungstransaktion übermittelt wurde, die Blockchain jedoch zu diesem Zeitpunkt noch nicht abgebaut wurde, sodass die Transaktion nicht in die Blockchain gepackt wurde und das gesamte Blockchain-Netzwerk nicht angezeigt werden kann. Hier müssen Sie das Mining erneut manuell starten (das Mining wird kontinuierlich im Hauptnetzwerk ausgeführt, ohne zu stoppen. Das private Testnetzwerk verfügt hier nur über einen Knoten. Zur Veranschaulichung müssen Sie das Mining jedes Mal manuell starten oder stoppen). Es ist in wenigen Sekunden zu sehen:

Vertrag abgebaut! Adresse: 0x579756a30442b508e2f6a0a4b4d1f4d871f9b906 TransaktionHash: 0x5cafc176adea94dafee6ae1a6daa8b1ece894666ccac85f7858b16af5e15cdbe

Dies zeigt an, dass der Vertrag im Blockchain-Netzwerk bereitgestellt wurde. Sie können durch überprüfen und bestätigen eth.getCode (greeter.address):

> eth.getCode (greeter.address)
„0x608060405260043610610046576000357c01000000000000000000000000000000000000000000000000000000009004806341c0e1b51461004b578063cfae321714610062575b600080fd5b34801561005757600080fd5b506100606100f2565b005b34801561006e57600080fd5b50610077610162565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100b757808201518184015260208101905061009c565b50505050905090810190601f1680156100e45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610160573373ffffffffffffffffffffffffffffffffffffffff16ff5b565b606060018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101fa5780601f106101cf576101008083540402835291602001916101fa565b820191906000526020600020905b8154815290600101906020018083116101dd57829 003601f168201915b5050505090509056fea165627a7a7230582083829c23804682d77517133b1aba64edd8cb8cc98a0f9cd40fc419024eb92ce00029 "

Jetzt kann der Vertrag ausgeführt werden.

Der nächste Schritt ist der Aufruf, den Sie wie folgt ausführen können:

> greeter.greet ();
"Hallo Welt!"

Dieser Aufrufprozess ändert den Blockchain-Status nicht, sodass er sofort zurückkehrt und kein Gas verbraucht.

Der letzte Schritt ist das Aufräumen. Der Vertragscode wird dauerhaft in der Blockchain gespeichert, sofern er nicht selbst zerstört wird. Daher müssen aufgegebene Verträge zerstört werden, was das Senden von Transaktionen an die Blockchain und das Bezahlen für die Ausführung erfordert. Zum Beispiel:

> personal.unlockAccount (web3.eth.accounts[0], "pk1")
wahr
> greeter.kill.sendTransaction ({from: eth.accounts[0]})
DIE INFO [02-13|19:43:17] Übermittelte Transaktion fullhash = 0xd66e3f444948f6bc7dfbfda1fb680c29c8173b061212d2457ef5553c71e8600c recipient = 0x579756a30442b508e2F6A0a4b4D1F4d871f9B906
"0xd66e3f444948f6bc7dfbfda1fb680c29c8173b061212d2457ef5553c71e8600c"

Zeigen Sie den Vertragscode wie folgt erneut an:

> eth.getCode (greeter.address)
"0x"

Damit ist der Vertragscode gelöscht.

Wenn Sie in diesem Blog mehr über den allgemeinen Prozess der Entwicklung von Ethereum-Verträgen erfahren, haben Sie jetzt ein Verständnis für den allgemeinen Prozess von Ethereum-Verträgen und können ein grundlegendes Verständnis vermitteln. Ausführlichere Tutorials finden Sie in der offiziellen Dokumentation zu Ethereum.

  1. Erstellen eines intelligenten Vertrags über die Befehlszeile
  2. Befehlszeilentools für das Ethereum-Netzwerk
  3. ETH-Dokumente (Verträge)
  4. Solidity-Dokumente

Coins Kaufen: Bitcoin.deAnycoinDirektCoinbaseCoinMama (mit Kreditkarte)Paxfull

Handelsplätze / Börsen: Bitcoin.de | KuCoinBinanceBitMexBitpandaeToro

Lending / Zinsen erhalten: Celsius NetworkCoinlend (Bot)

Cloud Mining: HashflareGenesis MiningIQ Mining

Werbung: Immobilienmakler HeidelbergMakler Heidelberg

By continuing to use the site, you agree to the use of cookies. more information

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close