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 führt Smart Contracts von Solidity in Ethereum-Netzwerken aus. Die EVM wurde im Rahmen des Hyperledger Burrow-Projekts erstellt und in Hyperledger Fabric integriert. Dieses Projekt ermöglicht es Ihnen, eine Hyperledger Fabric-berechtigte Blockchain-Plattform zu verwenden, um mit Ethereum Smart Contracts zu interagieren, die in einer EVM-kompatiblen Sprache wie Solidity geschrieben wurden.

In den folgenden Schritten wird der Prozess zum Ausführen eines Solidity-Smart Contracts auf einer bereitgestellten Oracle Blockchain Platform beschrieben:
  1. Laden Sie das EVM Chaincode-Package von der Oracle Blockchain Platform-Konsole herunter.
  2. Stellen Sie den EVM-Kettencode auf einem Kanal bereit.
  3. Generieren Sie mit der Remix IDE den 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-Kettencodepackage getestet, das über die Oracle Blockchain Platform-Konsole verfügbar ist und möglicherweise nicht mit anderen Releases funktioniert.

Hinweis:

Wenn Ihr Chaincode zuvor auf einer Hyperledger Fabric v1.4.7-Instanz installiert wurde, sollte er beim Upgrade Ihrer Instanz auf Hyperledger Fabric v2.x wie erwartet weiter funktionieren.

Laden Sie den 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-Kettencodepackage 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 Schnelles Deployment aus, und geben Sie die folgenden Informationen ein:
    • Packagelabel: Geben Sie eine Beschreibung des Chaincodepackages ein.
    • Chaincode-Sprache: GoLang.
    • Chaincode-Name: Geben Sie den Namen des Chaincodes ein. Beispiel: Geben Sie soliditycc ein.
    • Version: v1.
    • Erforderlich: Lassen Sie diese Option deaktiviert.
    • Kanal: Wählen Sie die Kanäle aus, in denen Sie den Chaincode installieren möchten.
    • Ist "Packaged Chaincode": Lassen Sie diese Option deaktiviert.
    • Codequelle: Laden Sie das zuvor heruntergeladene Package evmcc.zip hoch.
    Weitere Einzelheiten zum Assistenten für das schnelle Deployment 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, den Sie für die Installation ausgewählt haben.

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 Smart-Vertrag für Solidity 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 Simple Storage-Beispielcode in der Solidity-Dokumentation verwenden: Solidity: Einführung in Smart Contracts
    • Sie können den Beispielcode verwenden, der in diesem Beispiel verwendet wird. Dabei wird string name als Eingabe verwendet und dieselbe Ausgabezeichenfolge mit set(name) und get() ausgegeben:
      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 Standard-Compilerversion nicht mit der Version übereinstimmt, die Sie in Ihrem Smart-Vertrag angegeben haben.
  4. Kompilieren Sie Ihren Smart-Vertrag. Öffnen Sie den Solidity Compiler-Bereich in Remix, stellen Sie sicher, dass Ihre Smart-Contract-Registerkarte geöffnet ist, um sie als die zu kompilierende Datei auszuwählen, und stellen Sie die Compiler-Version auf die neueste 4 ein. X Version und klicken Sie auf Kompilieren.
    Screenshot des Smart Contracts zum Testen von Solidity in der Remix Compiler-Ansicht.

  5. Nachdem die Datei kompiliert wurde, klicken Sie 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 Null-Adresse, und input ist der kompilierte EVM-Bytecode des Vertrags. Daher werden dem Befehl invoke zwei Argumente bereitgestellt. Der erste, der traditionell ein Funktionsname innerhalb des Chaincodes sein sollte, ist jetzt 0000000000000000000000000000000000000000, und das zweite Argument ist der Smart-Contract-Bytecode von Solidity.

  1. Um den Smart Contracts für Solidity 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 in Oracle Blockchain Platform mit dem Namen soliditycc bereitzustellen:
    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 den bereitgestellten Vertrag. Kopieren Sie diese Adresse, und speichern Sie sie. Die Vertragsadresse wird beim Ausführen von Smart Contracts verwendet.
    Screenshot des API-Aufrufs und der API-Antwort mit der Smart Contracts-Adresse im Payload-Antwortfeld.
    In diesem Beispiel lautet die Smart Contracts-Adresse 66b92979bb66d645371b3247177e4b2513cb9834.
Es gibt zwei Möglichkeiten, mit einem bereitgestellten Smart Contract zu interagieren:
  1. Mit einem Hash-Wert der Methode und Eingabeparameter.
  2. Verwenden Sie den Methodennamen und die Eingabeparameter direkt.

Mit Smart Contract über Hashwerte interagieren

Nachdem Sie die Smart Contracts-Adresse angegeben haben, können Sie die folgenden Aufrufe verwenden, um über den REST-Proxy mit dem bereitgestellten Smart Contracts zu 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 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:

  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 Solidity-Vertrags, der in Kürze bereitgestellt wird.

    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 Contracts werden aufgelistet.
  3. Transaktionen ausführen Geben Sie im angegebenen 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 Hash für die Funktionsausführung), indem Sie auf das Symbol neben dem Feld klicken. Speichern Sie diesen Wert an demselben Speicherort wie Ihre Vertragsadresse, und entfernen Sie die führende 0x.
    Screenshot der Seite "Deployment" mit den abgeschlossenen Transaktions- und Feldwerten und Verweis auf das Eingabefeld mit dem Hashwert für die Funktionsausführung.

  5. Nachdem Sie den Funktionsausführungs-Hash und die Vertragsadresse haben, können Sie die festgelegte Transaktion auf Oracle Blockchain Platform mit dem Hash und der Adresse als Rohdatenargumente ausführen.
    
    --data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<setfunctionexecutionhash>"]}'
    
    Beispiel mit 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 Hauptbuch 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 im Bereich Transaktionen bereitstellen und ausführen im Remix sicher, dass Ihr Vertrag weiterhin unter Bereitgestellte Verträge aufgeführt ist. Falls nicht, stellen Sie sie erneut bereit.
  2. 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 0x entfernen.
    Screenshot der Get-Transaktion in Remix, der klärt, 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 wird.
    
    --data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<getfunctionexecutionhash>"]}'
    
    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 Beispielfall die Zeichenfolge oracle.

Die folgende Beispiel-Payload veranschaulicht eine andere Möglichkeit, eine Transaktion mit einer Eingabe zu senden, die im Hexadezimalformat codiert ist.

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

Mit Smart Contract über Methodennamen interagieren

Verwenden Sie die optionale Methode setAbi, um eine Application Binary Interface-(ABI-)Spezifikation festzulegen, mit der Sie Eingaben und Ausgaben im lesbaren (nicht hexadezimalcodierten) Format anstatt im Bytecode senden können. Klicken Sie im Bereich "Solidity Compiler" 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 über den REST-Proxy 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 dargestellt.

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