C Exécuter des contrats intelligents Solidity avec EVM sur Oracle Blockchain Platform

Vous pouvez exécuter des contrats intelligents Solidity avec une machine virtuelle Ethereum (EVM) déployée en tant que code chaîne sur Oracle Blockchain Platform.

L'EVM exécute des contrats intelligents Solidity dans les réseaux Ethereum. La machine virtuelle électronique a été créée dans le cadre du projet Hyperledger Burrow et intégrée à Hyperledger Fabric. Ce projet vous permet d'utiliser une plate-forme de chaîne de blocs autorisée Hyperledger Fabric pour interagir avec des contrats intelligents Ethereum écrits dans un langage compatible EVM tel que Solidity.

Les étapes suivantes décrivent le processus d'exécution d'un contrat intelligent Solidity sur une instance Oracle Blockchain Platform provisionnée :
  1. Téléchargez le package de code chaîne EVM à partir de la console Oracle Blockchain Platform.
  2. Déployez le code chaîne EVM sur un canal.
  3. Générez le code exécutable pour un contrat intelligent Solidity à l'aide de l'IDE Remix.
  4. Déployez le code exécutable du contrat intelligent dans le code chaîne EVM déployé. Utilisez l'adresse renvoyée par le déploiement pour envoyer des transactions.
Les étapes de cette rubrique ont été testées avec le package de code chaîne EVM disponible à partir de la console Oracle Blockchain Platform et peuvent ne pas fonctionner avec d'autres versions.

Remarques :

Si votre code chaîne a déjà été installé sur une instance Hyperledger Fabric v1.4.7, il doit continuer à fonctionner comme prévu lorsque votre instance est mise à niveau vers Hyperledger Fabric v2.x.

Téléchargement du code chaîne EVM et du package Fab3

Dans l'onglet Outils de développement de la console Oracle Blockchain Platform, ouvrez le panneau Développement d'applications, puis cliquez sur Télécharger le package de code chaîne EVM. Vous devez être administrateur pour télécharger le fichier.

Déployer le code chaîne EVM sur Oracle Blockchain Platform

Après avoir téléchargé le package de code chaîne EVM, vous le déployez sur Oracle Blockchain Platform.

  1. Connectez-vous à la console Oracle Blockchain Platform.
  2. Dans l'onglet Codes chaîne, cliquez sur Déployer un nouveau code chaîne.
  3. Sélectionnez Déploiement rapide et entrez les informations suivantes :
    • Etiquette de package : entrez la description du package de code chaîne.
    • Langage de code chaîne : GoLang.
    • Nom de code chaîne : entrez le nom du code chaîne. Par exemple, saisissez soliditycc.
    • Version : v1.
    • Init-required : laissez cette option désélectionnée.
    • Canal : sélectionnez les canaux où installer le code chaîne.
    • Est un code chaîne packagé : ne sélectionnez pas cette option.
    • Source de code chaîne : téléchargez le package evmcc.zip que vous avez téléchargé précédemment.
    Pour plus de détails sur l'assistant Déploiement rapide et les restrictions sur des champs tels que Etiquette de package et Nom de code chaîne, reportez-vous à Utilisation du déploiement rapide.

Une fois que vous avez soumis les informations, le code chaîne EVM est visible dans l'onglet Codes chaîne et répertorié en tant que code chaîne déployé sur chaque canal sur lequel vous avez choisi de l'installer.

Créer et compiler votre contrat Solidity Smart

  1. Ouvrez l'IDE Remix via navigateur : https://remix.ethereum.org/.
  2. Si vous avez déjà un contrat intelligent Solidity écrit, importez-le dans Remix.
  3. Si vous n'avez pas de contrat intelligent Solidity écrit, créez un fichier Solidity (.sol) dans Remix et effectuez l'une des opérations suivantes :
    • Si vous connaissez Solidity, vous pouvez créer votre propre fichier de contrat intelligent.
    • Vous pouvez utiliser l'exemple de code Simple Storage fourni dans la documentation Solidity : Solidity : Introduction to Smart Contracts
    • Vous pouvez utiliser l'exemple de code utilisé pour cet exemple, qui prend string name comme entrée et affiche la même chaîne que la chaîne de sortie à l'aide de set(name) et 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;
          }
      }
      
    Un message d'erreur peut s'afficher à propos de la version du compilateur par défaut qui ne correspond pas à la version que vous avez spécifiée dans votre contrat intelligent.
  4. Compilez votre contrat intelligent. Ouvrez le panneau Compilateur Solidity dans Remix, assurez-vous que l'onglet de votre contrat intelligent est ouvert pour le sélectionner comme fichier en cours de compilation, définissez la version du compilateur sur le 4 le plus récent. X, puis cliquez sur Compile.
    Capture d'écran du test du contrat intelligent Solidity dans la vue Compilateur Remix.

  5. Une fois le fichier compilé, cliquez sur l'icône Code exécutable pour copier le code exécutable en tant que document JSON dans le presse-papiers.
  6. Collez le code exécutable copié dans un éditeur de texte et enregistrez-le.

Déployer le contrat intelligent

Dans le code exécutable copié, la section dont vous avez besoin est le champ "object". Il s'agit du code exécutable EVM d'un exemple de contrat intelligent.
"object": "608060405234801561001057600080fd5b50610410806100206000396000f30060
8060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463
ffffffff1680634ed3885e1461005c5780636d4ce63c146100c5578063d97d663014610155575b600080fd5b34801561
006857600080fd5b506100c3600480360381019080803590602001908201803590602001908080601f01602080910402
602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101
e5565b005b3480156100d157600080fd5b506100da6101ff565b60405180806020018281038252838181518152602001
91508051906020019080838360005b8381101561011a5780820151818401526020810190506100ff565b505050509050
90810190601f1680156101475780820380516001836020036101000a031916815260200191505b509250505060405180
910390f35b34801561016157600080fd5b5061016a6102a1565b60405180806020018281038252838181518152602001
91508051906020019080838360005b838110156101aa57808201518184015260208101905061018f565b505050509050
90810190601f1680156101d75780820380516001836020036101000a031916815260200191505b509250505060405180
910390f35b80600090805190602001906101fb92919061033f565b5050565b6060600080546001816001161561010002
03166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615
6101000203166002900480156102975780601f1061026c57610100808354040283529160200191610297565b82019190
6000526020600020905b81548152906001019060200180831161027a57829003601f168201915b505050505090509056
5b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190
818152602001828054600181600116156101000203166002900480156103375780601f1061030c576101008083540402
83529160200191610337565b820191906000526020600020905b81548152906001019060200180831161031a57829003
601f168201915b505050505081565b828054600181600116156101000203166002900490600052602060002090601f01
6020900481019282601f1061038057805160ff19168380011785556103ae565b828001600101855582156103ae579182
015b828111156103ad578251825591602001919060010190610392565b5b5090506103bb91906103bf565b5090565b61
03e191905b808211156103dd5760008160009055506001016103c5565b5090565b905600a165627a7a72305820a990d4
0b57c66329a32a18e847b3c18d6c911487ffadfed2098e71e8cafa0c980029",
En général, l'EVM attend deux arguments :
  • Adresse to.
  • Le input nécessaire dans les transactions Ethereum.

Pour déployer des contrats intelligents, le champ to correspond à l'adresse zéro et input au code exécutable EVM compilé du contrat. Par conséquent, deux arguments sont fournis à la commande invoke. Le premier, qui était traditionnellement censé être un nom de fonction à l'intérieur du code chaîne, est maintenant 0000000000000000000000000000000000000000, et le deuxième argument est le code exécutable du contrat intelligent Solidity.

  1. Pour déployer le contrat intelligent Solidity sur Oracle Blockchain Platform, vous pouvez effectuer l'appel proxy REST suivant pour envoyer les deux arguments à l'EVM.
    {
        "chaincode": "<evmcc-ccid>",
        "args": [
            "0000000000000000000000000000000000000000",
            "<bytecode-of-the-smart-contract>"
        ],
        "timeout": 0,
        "sync": true
    }
    L'exemple suivant utilise cURL pour déployer le contrat intelligent Solidity vers Oracle Blockchain Platform avec le nom soliditycc :
    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. La réponse payload de la transaction est l'adresse du contrat pour le contrat déployé. Copiez cette adresse et enregistrez-la. L'adresse du contrat est utilisée lorsque vous exécutez des fonctions de contrat intelligent.
    Capture d'écran de l'appel d'API et de la réponse indiquant l'adresse du contrat intelligent dans le champ de réponse de la charge utile.
    Dans cet exemple, l'adresse du contrat intelligent est 66b92979bb66d645371b3247177e4b2513cb9834.
Il existe deux façons d'interagir avec un contrat intelligent déployé :
  1. En utilisant une valeur de hachage de la méthode et des paramètres d'entrée.
  2. En utilisant directement le nom de la méthode et les paramètres d'entrée.

Interagir avec le contrat intelligent à l'aide de valeurs de hachage

Une fois que vous disposez de l'adresse du contrat intelligent, vous pouvez utiliser les appels suivants pour interagir avec le contrat intelligent déployé via le proxy REST.

Pour exécuter des fonctions, vous utilisez des transactions d'appel et d'interrogation mais avec des paramètres différents. L'exemple de contrat contient deux fonctions : get et set.

Dans ces transactions, le champ to est l'adresse du contrat et le champ input est le hachage d'exécution de fonction concaténé avec l'un des arguments requis.

Vous devez acquérir le hachage de l'exécution de la fonction pour exécuter une transaction. Pour ce faire, vous pouvez simplement exécuter les fonctions de l'IDE Remix, puis copier le hachage à partir des journaux de transactions :

  1. Dans l'IDE Remix, ouvrez le panneau Déployer et exécuter des transactions. Assurez-vous que votre contrat est sélectionné dans le champ Contrat, puis cliquez sur Déployer.
    Capture d'écran du contrat Solidity sur le point d'être déployé.

    Une fois le déploiement terminé, le contrat doit être répertorié dans la liste Contrats déployés.
  2. Développez le contrat dans la liste Contrats déployés. Les fonctions de contrat intelligent sont répertoriées.
  3. Exécuter une transaction. Pour l'exemple fourni, entrez oracle, puis cliquez sur set.
  4. La fenêtre Terminal affiche les journaux de transactions. Si les journaux de transactions sont réduits, développez-les en cliquant sur le journal. Copiez la valeur du champ input (qui est le hachage d'exécution de la fonction) en cliquant sur l'icône en regard. Enregistrez cette valeur au même emplacement que votre adresse de contrat, en supprimant le 0x de début.
    Capture d'écran de la page Déploiement affichant les valeurs de transaction et de champ terminées et pointant vers le champ d'entrée contenant la valeur de hachage de l'exécution de la fonction.

  5. Une fois que vous disposez du hachage d'exécution de fonction et de l'adresse du contrat, vous pouvez exécuter la transaction définie sur Oracle Blockchain Platform en utilisant le hachage et l'adresse comme arguments de données brutes.
    
    --data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<setfunctionexecutionhash>"]}'
    
    Par exemple, en utilisant 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. Ouvrez la console Oracle Blockchain Platform et vérifiez que la transaction est répertoriée dans le registre.

Pour exécuter une autre transaction, telle qu'une requête, à l'aide de la fonction get du contrat intelligent, vous pouvez générer le hachage d'exécution de fonction dans Remix, puis le combiner avec l'adresse du contrat :

  1. Dans Remix du panneau Déployer et exécuter des transactions, assurez-vous que votre contrat est toujours répertorié sous Contrats déployés. Sinon, redéployez-le.
  2. Cliquez sur Obtenir. Extrayez et enregistrez l'entrée de la transaction comme vous l'avez fait avec la transaction set, en supprimant le 0x de début.
    Capture d'écran de la transaction get dans Remix, en précisant que le champ d'entrée contient le hachage d'exécution de fonction requis.

  3. Vous pouvez utiliser ce hachage de transaction et l'adresse du contrat pour exécuter une transaction de requête sur le code chaîne déployé sur Oracle Blockchain Platform.
    
    --data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<getfunctionexecutionhash>"]}'
    
    Par exemple, dans 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"]}'
    
    La charge utile renvoyée contient la ressource en cours d'interrogation. Dans l'exemple, la chaîne oracle.

L'exemple de charge utile suivant illustre une autre façon d'envoyer une transaction à l'aide d'une entrée codée au format hexadécimal.

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

Interagir avec le contrat intelligent à l'aide de noms de méthode

Utilisez la méthode facultative setAbi pour définir une spécification d'interface binaire d'application (ABI), qui vous permet d'envoyer des entrées et d'obtenir des sorties au format lisible (et non au format hexadécimal) au lieu d'un code exécutable. Cliquez sur l'icône ABI (en regard de l'icône Bytecode) dans le panneau Compilateur Solidity de l'IDE Remix pour obtenir la spécification ABI. Les types d'entrée suivants sont pris en charge pour le format d'entrée lisible : uint, string, address, bool, uint[], string[] et address[]. L'exécution de transactions sur des contrats intelligents qui implémentent le remplacement de méthode et la surcharge de méthode n'est pas prise en charge à partir du proxy fab3, uniquement à partir du proxy REST. L'exemple de charge utile suivant utilise la méthode setAbi pour définir une spécification ABI.

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

Vous pouvez également effectuer des appels directement à l'aide du nom de la méthode et des paramètres d'entrée, comme indiqué dans l'exemple de charge utile suivant.

{
    "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
}

Configurer des montants de gaz

Vous pouvez configurer la quantité de gaz à l'aide des méthodes setGasAmount et getGasAmount, comme indiqué dans les exemples de charge utile suivants.

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