C Führen Sie Solidity Smart Contracts mit EVM auf der 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 führt Solidity Smart Contracts in Ethereum-Netzwerken aus. Die EVM wurde durch das Hyperledger Burrow-Projekt erstellt und in Hyperledger Fabric integriert. Mit diesem Projekt können Sie eine Blockchain-Plattform mit Hyperledger Fabric-Berechtigung verwenden, um mit Ethereum-Smart Contracts zu interagieren, die in einer EVM-kompatiblen Sprache wie Solidity geschrieben wurden.

Die folgenden Schritte beschreiben den Prozess der Ausführung eines Solidity Smart Contracts auf einer bereitgestellten Oracle Blockchain Platform:
  1. Laden Sie das EVM-Kettencodepackage von der Oracle Blockchain Platform-Konsole herunter.
  2. Stellen Sie den EVM-Kettencode auf einem Kanal bereit.
  3. Generieren Sie mithilfe der Remix-IDE Bytecode für einen Solidity-Smart-Vertrag.
  4. Stellen Sie den Smart Contract-Bytecode im bereitgestellten EVM-Kettencode bereit. Verwenden Sie die vom Deployment zurückgegebene Adresse, um Transaktionen zu senden.
Die Schritte in diesem Thema wurden mit dem EVM-Chaincodepackage getestet, das über die Oracle Blockchain Platform-Konsole verfügbar ist und möglicherweise nicht mit anderen Releases funktioniert.

Laden Sie das EVM Chaincode- und das Fab3-Package herunter

Öffnen Sie auf der Registerkarte Entwicklungstools der Oracle Blockchain Platform-Konsole den Bereich Anwendungsentwicklung, und klicken Sie auf EVM-Chaincodepackage herunterladen. Sie müssen ein Admin-Benutzer sein, um die Datei herunterzuladen.

EVM Chaincode auf Oracle Blockchain Platform bereitstellen

Nachdem Sie das EVM Chaincode-Package heruntergeladen haben, stellen Sie es auf Oracle Blockchain Platform bereit.

  1. Melden Sie sich bei der Oracle Blockchain Platform-Konsole an.
  2. Klicken Sie auf der Registerkarte Chaincodes auf Neuen Chaincode bereitstellen.
  3. Wählen Sie Schnell-Deployment, und geben Sie die folgenden Informationen ein:
    • Packagelabel: Geben Sie eine Beschreibung des Chaincode-Packages ein.
    • Chaincode-Sprache: GoLang.
    • Chaincode-Name: Geben Sie den Namen des Chaincodes ein. Beispiel: Geben Sie soliditycc ein.
    • Version: v1.
    • Init-required: Lassen Sie diese Option deaktiviert.
    • Kanal: Wählen Sie die Kanäle aus, in denen Sie den Chaincode installieren möchten.
    • Ist Paketkettencode: Lassen Sie diese Option deaktiviert.
    • Chaincode-Quelle: Laden Sie das zuvor heruntergeladene Package evmcc.zip hoch.
    Weitere Informationen zum Schnell-Deployment-Assistenten und Einschränkungen für Felder wie Packagelabel und Chaincode-Name finden Sie unter Schnell-Deployment verwenden.

Nachdem Sie Ihre Informationen übermittelt haben, wird der EVM-Kettencode auf der Registerkarte Kettencodes angezeigt und als bereitgestellter Kettencode auf jedem Kanal aufgeführt, auf dem Sie ihn installieren möchten.

Solidity Smart Contract erstellen und kompilieren

  1. Öffnen Sie die browserbasierte Remix-IDE: https://remix.ethereum.org/.
  2. Wenn Sie bereits einen Solidity Smart-Vertrag geschrieben haben, importieren Sie ihn in Remix.
  3. Wenn Sie keinen Solidity-Smart-Vertrag geschrieben haben, erstellen Sie eine Solidity-Datei (.sol) in Remix 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 in der Solidity-Dokumentation bereitgestellten Simple Storage-Beispielcode verwenden: Solidity: Einführung in Smart Contracts
    • Sie können den für dieses Beispiel verwendeten Beispielcode verwenden. Dieser nimmt string name als Eingabe an und druckt dieselbe Ausgabezeichenfolge mit set(name) und get():
      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;
          }
      }
      
    Möglicherweise wird eine Fehlermeldung angezeigt, dass die Standardcompilerversion nicht mit der in Ihrem Smart Contracts angegebenen Version übereinstimmt.
  4. Erstellen Sie Ihren Smart-Vertrag. Öffnen Sie das Solidity Compiler-Bedienfeld in Remix, stellen Sie sicher, dass Ihre Smart Contract-Registerkarte geöffnet ist, um sie als kompilierte Datei auszuwählen, und stellen Sie die Compiler-Version auf die neueste Version 4 ein. X-Version, und klicken Sie auf Kompilieren.
    Screenshot des Smart Contracts für den Test Solidity in der Remix Compiler-Ansicht.

  5. Klicken Sie nach der Kompilierung der Datei auf das Symbol Bytecode, um den Bytecode als JSON-Dokument in die Zwischenablage zu kopieren.
  6. Fügen Sie den kopierten Bytecode in einen Texteditor ein, und speichern Sie ihn.

Smart Contract bereitstellen

Im kopierten Bytecode ist der benötigte Abschnitt das Feld "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",
Im Allgemeinen erwartet die EVM zwei Argumente:
  • Die to-Adresse.
  • 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 dem Befehl invoke zwei Argumente zur Verfügung gestellt. Der erste, der traditionell ein Funktionsname innerhalb des Chaincodes sein sollte, ist jetzt 0000000000000000000000000000000000000000, und das zweite Argument ist der Solidity Smart Contract Bytecode.

  1. Um den Solidity Smart Contract auf Oracle Blockchain Platform bereitzustellen, können Sie den folgenden REST-Proxyaufruf ausführen, um die beiden Argumente an die EVM zu senden.
    {
        "chaincode": "<evmcc-ccid>",
        "args": [
            "0000000000000000000000000000000000000000",
            "<bytecode-of-the-smart-contract>"
        ],
        "timeout": 0,
        "sync": true
    }
    Im folgenden Beispiel wird cURL verwendet, um den Solidity-Smart-Vertrag mit dem Namen soliditycc in Oracle Blockchain Platform bereitzustellen. In den folgenden Beispielen horcht der REST-Proxy auf Port 7443. Dies ist der Standard für Oracle Blockchain Platform auf Oracle Cloud Infrastructure. Der Standard-REST-Proxyport für Oracle Blockchain Platform Enterprise Edition ist 443.
    curl -L -X POST 'https://<hostname>:7443/restproxy/api/v2/channels/<channelname>/transactions' \
    -H 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' \
    -H 'Content-Type: application/json' \
    --data-raw '{"chaincode":"<evmcc-ccid>","args":["0000000000000000000000000000000000000000","<bytecode-of-the-smart-contract>"],"timeout":0,"sync":true}'
  2. Die Antwort payload der Transaktion ist die Vertragsadresse für Ihren bereitgestellten Vertrag. Kopieren Sie diese Adresse und speichern Sie sie. Die Vertragsadresse wird verwendet, wenn Sie Smart Contracts ausführen.
    Screenshot des API-Aufrufs und der Antwort mit der Smart-Contract-Adresse im Payload-Antwortfeld.
    In diesem Beispiel lautet die Smart Contracts-Adresse 66b92979bb66d645371b3247177e4b2513cb9834.
Es gibt zwei Möglichkeiten, mit einem bereitgestellten Smart-Vertrag zu interagieren:
  1. Durch Verwendung eines Hash-Wertes der Methode und Eingabeparameter.
  2. Verwenden Sie den Methodennamen und die Eingabeparameter direkt.

Mit Smart Contract mit Hash-Werten interagieren

Nachdem Sie die Smart Contracts-Adresse angegeben haben, können Sie mit den folgenden Aufrufen über den REST-Proxy mit dem bereitgestellten Smart Contracts interagieren.

Um Funktionen auszuführen, verwenden Sie Aufruf- und Abfragetransaktionen 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ührungs-Hash, der mit einem der erforderlichen Argumente verkettet wird.

Sie müssen den Hash der Funktionsausführung abrufen, um eine Transaktion auszuführen. Eine einfache Möglichkeit besteht darin, die Funktionen in der Remix-IDE auszuführen und dann den Hash aus den Transaktionslogs zu kopieren:

  1. Ö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.
    Screenshot des bevorstehenden Solidity-Vertrags.

    Nach Abschluss des Deployments muss der Vertrag in der Liste Bereitgestellte Verträge aufgeführt werden.
  2. Blenden Sie den Vertrag in der Liste Bereitgestellte Verträge ein. Die Smart Contract-Funktionen werden aufgelistet.
  3. Transaktionen ausführen Geben Sie für das angegebene Beispiel oracle ein, und klicken Sie auf set.
  4. Im Terminalfenster werden die Transaktionslogs angezeigt. Wenn die Transaktionslogs minimiert sind, blenden Sie sie ein, indem Sie auf das Log klicken. Kopieren Sie den Wert des Feldes input (der Funktionsausführungs-Hash), indem Sie auf das Symbol daneben klicken. Speichern Sie diesen Wert an demselben Speicherort wie Ihre Vertragsadresse, und entfernen Sie die führende 0x.
    Screenshot der Seite "Deployment", auf der die abgeschlossenen Transaktions- und Feldwerte angezeigt werden und auf das Eingabefeld mit dem Hashwert für die Funktionsausführung zeigt.

  5. Nachdem Sie den Funktionsausführungs-Hash und die Vertragsadresse verwendet haben, können Sie die festgelegte Transaktion auf Oracle Blockchain Platform mit dem Hash und der Adresse als Raw-Datenargumente ausführen.
    
    --data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<setfunctionexecutionhash>"]}'
    
    Beispiel: Verwenden von cURL:
    curl -L -X POST 'https://<hostname>:7443/restproxy/api/v2/channels/<channelname>/transactions' \
    -H 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' \
    -H 'Content-Type: application/json' \
    --data-raw '{"chaincode":"soliditycc","args":["66b92979bb66d645371b3247177e4b2513cb9834","4ed3885e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000066f7261636c650000000000000000000000000000000000000000000000000000"]}'
    
  6. Öffnen Sie die Oracle Blockchain Platform-Konsole, und prüfen Sie, ob die Transaktion im Buch aufgeführt ist.

Um eine weitere Transaktion wie eine Abfrage mit der Funktion get des Smart Contracts auszuführen, können Sie den Funktionsausführungs-Hash in Remix generieren und dann mit der Vertragsadresse kombinieren:

  1. Stellen Sie unter "Remix" im Bereich Transaktionen bereitstellen und ausführen sicher, dass Ihr Vertrag weiterhin unter Bereitgestellte Verträge aufgeführt ist. Falls nicht, stellen Sie es erneut bereit.
  2. Klicken Sie auf get. Rufen Sie die Eingabe aus der Transaktion ab, und speichern Sie sie wie bei der Transaktion set. Entfernen Sie dabei die führende 0x.
    Screenshot der Get-Transaktion in Remix. Es wird klargestellt, dass das Eingabefeld den erforderlichen Funktionsausführungs-Hash enthält.

  3. Mit diesem Transaktions-Hash und der Vertragsadresse können Sie eine Abfragetransaktion für den Chaincode ausführen, der auf Oracle Blockchain Platform bereitgestellt ist.
    
    --data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<getfunctionexecutionhash>"]}'
    
    Zum Beispiel in cURL:
    curl -L -X POST 'https://<hostname>:7443/restproxy/api/v2/channels/<channelname>/chaincode-queries' \
    -H 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' \
    -H 'Content-Type: application/json' \
    --data-raw '{"chaincode":"soliditycc","args":["66b92979bb66d645371b3247177e4b2513cb9834","6d4ce63c"]}'
    
    Die zurückgegebene Payload enthält das abgefragte Asset - im Beispiel die Zeichenfolge oracle.

Die folgende Beispiel-Payload zeigt eine weitere Möglichkeit, eine Transaktion mit im hexadezimalen Format codierten Eingaben zu senden.

{
    "chaincode": "<evmcc-ccid>",
    "args": [
        "<smart-contract-address>",
        "<hexadecimal-encoded-method-and-input-parameters>"
    ],
    "sync": true
}

Mit Smart Contract mit Methodennamen interagieren

Verwenden Sie die optionale Methode setAbi, um eine ABI-(Application Binary Interface-)Spezifikation festzulegen, mit der Sie Eingaben senden und die Ausgabe im lesbaren (nicht hexadezimalcodierten) Format anstelle von Bytecode abrufen können. Klicken Sie im Solidity Compiler-Bereich in der Remix-IDE auf das Symbol ABI (neben dem Symbol Bytecode), um die ABI-Spezifikation abzurufen. Die folgenden Eingabetypen werden für das lesbare Eingabeformat unterstützt: uint, string, address, bool, uint[], string[] und address[]. Die Ausführung von Transaktionen in Smart Contracts, die Methodenüberschreibung und Methodenüberladung implementieren, wird vom Proxy fab3 nur vom REST-Proxy aus nicht unterstützt. Die folgende Beispiel-Payload verwendet die Methode setAbi, um eine ABI-Spezifikation festzulegen.

{
    "chaincode": "<evmcc-ccid>",
    "args": [
        "setABI",
        "<smart-contract-address>",
        "<abi-spec-of-smart-contract>" --> use the string format of the abi specification
    ],
    "sync": true
}

Sie können Aufrufe auch direkt mit dem Methodennamen und den Eingabeparametern ausführen, wie in der folgenden Beispiel-Payload dargestellt.

{
    "chaincode": "<evmcc-ccid>",
    "args": [
        "<smart-contract-address>",
        "<smart-contract-method-name>",
		"[<array-of-input-parameters>]", --> empty array if there are no input parameters.
		"[<string-array-of-input-types>]" --> this is optional and is needed when there is method overriding in the smart contract.
    ],
    "sync": true
}

Gasbeträge konfigurieren

Sie können die Gasmenge mit den Methoden setGasAmount und getGasAmount konfigurieren, wie in den folgenden Beispiel-Payloads gezeigt.

{
    "chaincode": "<evmcc-ccid>",
    "args": [
        "setGasAmount",
        "<gas-amount>"
    ],
    "sync": true
}
{
    "chaincode": "<evmcc-ccid>",
    "args": [
        "getGasAmount"
    ],
    "sync": true
}