C Führen Sie Solidity Smart Contracts mit EVM auf Oracle Blockchain Platform aus
Sie können Solidity-Smart Contracts mit einer Ethereum Virtual Machine (EVM) ausführen, die als Chaincode auf Oracle Blockchain Platform bereitgestellt wird.
Die EVM betreibt Smart Contracts in den Ethereum-Netzwerken. Die EVM wurde über das Hyperledger Burrow-Projekt erstellt und in Hyperledger Fabric integriert. Mit diesem Projekt können Sie eine Hyperledger Fabric-berechtigte Blockchain-Plattform verwenden, um mit Ethereum-Smart Contracts zu interagieren, die in einer EVM-kompatiblen Sprache wie Solidity geschrieben wurden. Siehe: Hyperledger Fabric EVM chaincode.
- Laden Sie das EVM Chaincode-Package in Oracle Blockchain Platform hoch.
- Stellen Sie den EVM-Chaincode auf einem Kanal bereit.
- Generieren Sie mit Remix IDE einen Bytecode für einen Solidity-Smart-Vertrag.
- Stellen Sie den Smart Contract-Bytecode im bereitgestellten EVM-Chaincode bereit. Verwenden Sie die vom Deployment zurückgegebene Adresse, um Transaktionen zu senden.
fabric-chaincode-evm:release-0.4 getestet und funktionieren möglicherweise nicht mit anderen Releases.
EVM Chaincode Package einrichten
Bevor Sie den Smart Contract bereitstellen können, muss das EVM-Chaincode-Paket vorbereitet werden. So erstellen Sie den Chaincode-Paketordner:
- Laden Sie das EVM-Chaincode-Paket (
.zip-Datei) aus dem folgenden GitHub-Repository herunter: Hyperledger Fabric EVM chaincode. - Extrahieren Sie die heruntergeladene Datei
fabric-chaincode-evm-release-0.4.zip. - Navigieren Sie in den extrahierten Dateien zu
fabric-chaincode-evm-release-0.4/evmcc. - Löschen Sie die Datei
go.sumund das Verzeichnisvendor. - Hersteller aller abhängigen Go-Module mit dem Komman
go mod:go mod tidy go mod vendor - Navigieren Sie zu
fabric-chaincode-evm-release-0.4/emvcc/vendor/github.com/hyperledger. - Erstellen Sie das Verzeichnis
fabric-chaincode-evm/evmccim Verzeichnis/hyperledger. - Verschieben Sie die folgenden Ordner aus dem Verzeichnis
fabric-chaincode-evm-release-0.4/evmccin das Verzeichnisfabric-chaincode-evm-release-0.4/evmcc/vendor/github.com/hyperledger/fabric-chaincode-evm/evmcc:/address/event/eventmanager/mocks/statemanager

- Komprimieren Sie den Ordner
fabric-chaincode-evm-release-0.4/evmccder obersten Ebene im Format.zip, und benennen Sie ihn um. In den folgenden Schritten wirdevmcc.zipals Beispielname verwendet.
EVM Chaincode auf Oracle Blockchain Platform bereitstellen
Nachdem Sie das EVM-Chaincode-Package erstellt haben, stellen Sie es auf Oracle Blockchain Platform bereit.
- Melden Sie sich bei der Oracle Blockchain Platform-Konsole an.
- Klicken Sie auf der Registerkarte Chaincodes auf Neuen Chaincode bereitstellen.
- Wählen Sie Schnellbereitstellung aus, und geben Sie die folgenden Informationen an:
- Packagelabel: Geben Sie eine Beschreibung des Chaincode-Packages ein.
- Chaincode-Sprache: GoLang
- Chaincode-Name: Geben Sie den Namen des Chaincodes ein. Beispiel: Geben Sie
solidityccein. - Version:
v1 - Init erforderlich: Lassen Sie dieses Kontrollkästchen deaktiviert.
- Kanal: Wählen Sie die Kanäle aus, in denen Sie den Chaincode installieren möchten.
- Chaincode-Quelle: Laden Sie das Package
evmcc.ziphoch, das Sie in den vorherigen Schritten erstellt haben.
Nachdem Sie Ihre Informationen übermittelt haben, ist der EVM-Chaincode auf der Registerkarte Chaincodes sichtbar und wird als bereitgestellter Chaincode auf jedem Kanal aufgeführt, auf dem Sie ihn installiert haben.
Solidity Smart Contract erstellen und kompilieren
- Öffnen Sie die browserbasierte Remix-IDE: https://remix.ethereum.org/.
- Wenn Sie bereits einen Solidity Smart-Vertrag geschrieben haben, importieren Sie ihn in Remix.
- Wenn kein Solidity Smart Contract geschrieben wurde, erstellen Sie in Remix eine Solidity-Datei (
.sol), und führen Sie einen der folgenden Schritte aus:- Wenn Sie mit Solidity vertraut sind, können Sie Ihre eigene Smart Contract-Datei erstellen.
- Sie können den Beispielcode "Simple Storage" in der Solidity-Dokumentation verwenden: Solidity: Introduction to Smart Contracts
- Sie können den für dieses Beispiel verwendeten Beispielcode verwenden, der
string nameals Eingabe verwendet und mitset(name)undget()dasselbe wie die Ausgabezeichenfolge ausgibt:pragma solidity ^0.4.0; contract Myname { string public yourName; function set(string name) public { yourName = name; } function get() public view returns (string) { return yourName; } }
- Kompilieren Sie Ihren Smart Contract. Öffnen Sie den Solidity Compiler-Bereich in Remix, stellen Sie sicher, dass Ihre Smart Contract-Registerkarte geöffnet ist, um sie als kompilierte Datei auszuwählen. Setzen Sie die Compilerversion auf die neueste 4. X-Version, und klicken Sie auf Kompilieren.

- Nachdem die Datei kompiliert wurde, klicken Sie auf das Symbol Bytecode, um den Bytecode als JSON-Dokument in die Zwischenablage zu kopieren.
- Fügen Sie den kopierten Bytecode in einen Texteditor ein, und speichern Sie ihn.
Smart Contract bereitstellen
"object". Dies ist der EVM-Bytecode eines Beispiel-Smart Contracts."object": "608060405234801561001057600080fd5b50610410806100206000396000f30060
8060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463
ffffffff1680634ed3885e1461005c5780636d4ce63c146100c5578063d97d663014610155575b600080fd5b34801561
006857600080fd5b506100c3600480360381019080803590602001908201803590602001908080601f01602080910402
602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101
e5565b005b3480156100d157600080fd5b506100da6101ff565b60405180806020018281038252838181518152602001
91508051906020019080838360005b8381101561011a5780820151818401526020810190506100ff565b505050509050
90810190601f1680156101475780820380516001836020036101000a031916815260200191505b509250505060405180
910390f35b34801561016157600080fd5b5061016a6102a1565b60405180806020018281038252838181518152602001
91508051906020019080838360005b838110156101aa57808201518184015260208101905061018f565b505050509050
90810190601f1680156101d75780820380516001836020036101000a031916815260200191505b509250505060405180
910390f35b80600090805190602001906101fb92919061033f565b5050565b6060600080546001816001161561010002
03166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615
6101000203166002900480156102975780601f1061026c57610100808354040283529160200191610297565b82019190
6000526020600020905b81548152906001019060200180831161027a57829003601f168201915b505050505090509056
5b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190
818152602001828054600181600116156101000203166002900480156103375780601f1061030c576101008083540402
83529160200191610337565b820191906000526020600020905b81548152906001019060200180831161031a57829003
601f168201915b505050505081565b828054600181600116156101000203166002900490600052602060002090601f01
6020900481019282601f1061038057805160ff19168380011785556103ae565b828001600101855582156103ae579182
015b828111156103ad578251825591602001919060010190610392565b5b5090506103bb91906103bf565b5090565b61
03e191905b808211156103dd5760008160009055506001016103c5565b5090565b905600a165627a7a72305820a990d4
0b57c66329a32a18e847b3c18d6c911487ffadfed2098e71e8cafa0c980029",- Die Adresse
to. - Die
input, die bei Ethereum-Transaktionen erforderlich ist.
Um Smart Contracts bereitzustellen, ist das Feld to die Nulladresse, und input ist der kompilierte EVM-Bytecode des Vertrags. Daher werden zwei Argumente für den Befehl invoke bereitgestellt. Der erste, der traditionell ein Funktionsname innerhalb des Chaincodes sein sollte, ist jetzt 0000000000000000000000000000000000000000, und das zweite Argument ist der Solidity smart contract bytecode.
- Um den Solidity-Smart Contract auf Oracle Blockchain Platform bereitzustellen, rufen Sie den bereitgestellten EVM-Chaincode mit diesen beiden Argumenten über REST-Proxyendpunkte auf.
--data-raw '{"chaincode":"<chaincodename>","args":["<zeroaddress>","<EVMbytecode>"]}'Im folgenden Beispiel wird cURL verwendet, um den Solidity-Smart Contract mit dem Namensolidityccin Oracle Blockchain Platform bereitzustellen.curl -L -X POST 'https://<hostname>:443/restproxy/api/v2/channels/<channelname>/transactions' \ -H 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' \ -H 'Content-Type: application/json' \ --data-raw '{"chaincode":"soliditycc","args":["0000000000000000000000000000000000000000","608060405234801561....152d2820d3b5d784b3711119691d0029"],"timeout":0,"sync":true}' - Die Antwort
payloadder Transaktion ist die Vertragsadresse für den bereitgestellten Vertrag. Kopieren Sie diese Adresse, und speichern Sie sie. Die Vertragsadresse wird verwendet, wenn Sie Smart Contract-Funktionen ausführen.
In diesem Beispiel lautet die Smart Contract-Adresse66b92979bb66d645371b3247177e4b2513cb9834.
Mit Smart Contract interagieren
Nachdem Sie die Smart Contract-Adresse eingerichtet haben, können Sie mit den folgenden Aufrufen über den REST-Proxy mit dem bereitgestellten Smart Contract interagieren.
Um Funktionen auszuführen, verwenden Sie aufrufende und abfragende Transaktionen, jedoch mit unterschiedlichen Parametern. Der Beispielvertrag enthält zwei Funktionen: get und set.
In diesen Transaktionen ist das Feld to die Vertragsadresse, und das Feld input ist der Funktionsausführungshash, der mit einem der erforderlichen Argumente verkettet ist.
Sie müssen den Hash der Funktionsausführung anfordern, um eine Transaktion auszuführen. Eine einfache Möglichkeit, dies zu tun, besteht darin, die Funktionen in der Remix-IDE auszuführen und dann den Hash aus den Transaktionslogs zu kopieren:
- Öffnen Sie in der Remix-IDE den Bereich Transaktionen bereitstellen und ausführen. Stellen Sie sicher, dass der Vertrag im Feld Vertrag ausgewählt ist, und klicken Sie auf Bereitstellen.

Nach Abschluss des Deployments wird der Vertrag in der Liste Bereitgestellte Verträge aufgeführt. - Blenden Sie den Vertrag in der Liste Bereitgestellte Verträge ein. Die Smart-Contract-Funktionen werden aufgelistet.
- Transaktionen ausführen Geben Sie für das angegebene Beispiel oracle ein, und klicken Sie auf set.
- Im Terminalfenster werden die Transaktionslogs angezeigt. Wenn die Transaktionslogs minimiert sind, erweitern Sie sie, indem Sie auf das Log klicken. Kopieren Sie den Wert des Feldes
input(das der Hash für die Funktionsausführung ist), indem Sie auf das Symbol neben ihm klicken. Speichern Sie diesen Wert an demselben Standort wie Ihre Vertragsadresse, und entfernen Sie die führende0x.
- Nachdem Sie den Funktionsausführungshash und die Vertragsadresse angegeben haben, können Sie die festgelegte Transaktion auf Oracle Blockchain Platform mit dem Hash und der Adresse als Rohdatenargument ausführen.
Beispiel: Verwenden von cURL:--data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<setfunctionexecutionhash>"]}'curl -L -X POST 'https://<hostname>:443/restproxy/api/v2/channels/<channelname>/transactions' \ -H 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' \ -H 'Content-Type: application/json' \ --data-raw '{"chaincode":"soliditycc","args":["66b92979bb66d645371b3247177e4b2513cb9834","4ed3885e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000066f7261636c650000000000000000000000000000000000000000000000000000"]}' - Öffnen Sie die Oracle Blockchain Platform-Konsole, und prüfen Sie, ob die Transaktion im Ledger aufgeführt ist.
Um eine weitere Transaktion auszuführen, z.B. eine Abfrage mit der Funktion get des Smart Contracts, können Sie den Funktionsausführungshash in Remix generieren und dann mit der Vertragsadresse kombinieren:
- Stellen Sie im Remix im Bereich Transaktionen bereitstellen und ausführen sicher, dass Ihr Vertrag weiterhin unter Bereitgestellte Verträge aufgeführt ist. Falls nicht, stellen Sie die Ressource erneut bereit.
- Klicken Sie auf get. Rufen Sie die Eingabe aus der Transaktion ab, und speichern Sie sie wie bei der set-Transaktion, indem Sie die führende
0xentfernen.
- Mit diesem Transaktions-Hash und der Vertragsadresse können Sie eine Abfragetransaktion für den auf Oracle Blockchain Platform bereitgestellten Chaincode ausführen.
Beispiel für cURL:--data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<getfunctionexecutionhash>"]}'
Die zurückgegebene Payload enthält das abgefragte Asset - im Beispielfall die Zeichenfolgecurl -L -X POST 'https://<hostname>:443/restproxy/api/v2/channels/<channelname>/chaincode-queries' \ -H 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' \ -H 'Content-Type: application/json' \ --data-raw '{"chaincode":"soliditycc","args":["66b92979bb66d645371b3247177e4b2513cb9834","6d4ce63c"]}'oracle.