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 de chaîne sur Oracle Blockchain Platform.

L'EVM gère des contrats intelligents Solidity dans les réseaux Ethereum. La gestion de la valeur acquise 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 avec autorisation Hyperledger Fabric pour interagir avec les contrats intelligents Ethereum écrits dans un langage compatible avec la gestion de la valeur acquise, tel que Solidity. Voir : Code de chaîne de valeur acquise Hyperledger Fabric.

Les étapes suivantes décrivent le processus d'exécution d'un contrat intelligent Solidity sur une instance provisionnée d'Oracle Blockchain Platform :
  1. Chargez l'ensemble de code de chaîne EVM dans Oracle Blockchain Platform.
  2. Déployer le code de chaîne de valeur sur un canal.
  3. Générez un bytecode pour un contrat intelligent Solidity à l'aide de l'IDE Remix.
  4. Déployer le code octet de contrat intelligent dans le code de chaîne de valeur acquise déployé. Utilisez l'adresse retournée par le déploiement pour envoyer des transactions.
Les étapes de cette rubrique ont été testées avec fabric-chaincode-evm:release-0.4 et peuvent ne pas fonctionner avec d'autres versions.

Configurer le paquetage de code de chaîne EVM

Avant de déployer le contrat intelligent, vous devez configurer le paquetage de code de chaîne EVM. Suivez les étapes suivantes pour créer le dossier de l'ensemble de code de chaîne.

  1. Télécharger l'ensemble de code de chaîne EVM (fichier .zip) à partir du référentiel GitHub suivant : Code de chaîne EVM Hyperledger Fabric.
  2. Extraire le fichier téléchargé fabric-chaincode-evm-release-0.4.zip.
  3. Dans les fichiers extraits, naviguez jusqu'au répertoire fabric-chaincode-evm-release-0.4/evmcc.
  4. Supprimez le fichier go.sum et le répertoire vendor.
  5. Fournissez tous les modules Go dépendants à l'aide de la commande go mod :
    go mod tidy
    go mod vendor
  6. Naviguez jusqu'au répertoire fabric-chaincode-evm-release-0.4/emvcc/vendor/github.com/hyperledger.
  7. Créez le répertoire fabric-chaincode-evm/evmcc dans le répertoire /hyperledger.
  8. Déplacez les dossiers suivants du répertoire fabric-chaincode-evm-release-0.4/evmcc vers le répertoire fabric-chaincode-evm-release-0.4/evmcc/vendor/github.com/hyperledger/fabric-chaincode-evm/evmcc :
    • /address
    • /event
    • /eventmanager
    • /mocks
    • /statemanager
    La structure de répertoires ressemble à la capture d'écran suivante lorsque vous avez terminé :
    Capture d'écran présentant la structure de répertoires modifiée décrite dans les étapes précédentes.

  9. Compressez le dossier fabric-chaincode-evm-release-0.4/evmcc de niveau supérieur au format .zip et renommez-le. Les étapes suivantes utilisent evmcc.zip comme nom d'exemple.

Déployer du code de chaîne de valeur EVM sur Oracle Blockchain Platform

Après avoir créé l'ensemble de code de chaîne EVM, déployez-le sur Oracle Blockchain Platform.

  1. Connectez-vous à la console Oracle Blockchain Platform.
  2. Dans l'onglet Codes de chaîne, sélectionnez Déployer un nouveau code de chaîne.
  3. Sélectionnez Déploiement rapide et entrez les informations suivantes :
    • Étiquette d'ensemble : Entrez la description de l'ensemble de code de chaîne.
    • Langage de code de chaîne : GoLang.
    • Nom du code de chaîne : Entrez le nom du code de chaîne. Entrez, par exemple, soliditycc.
    • Version : v1.
    • Init-required (Init-requis) : Laissez cette option non sélectionnée.
    • Canal : Sélectionnez les canaux dans lesquels vous voulez installer le code de chaîne.
    • Source du code de chaîne : Chargez l'ensemble evmcc.zip que vous avez créé au cours des étapes précédentes.
    Pour plus de détails sur l'Assistant Déploiement rapide et sur les restrictions appliquées aux champs tels que Étiquette d'ensemble et Nom du code de chaîne, voir : Utiliser le déploiement rapide.

Une fois que vous avez soumis vos informations, le code de chaîne de gestion de valeur acquise est visible dans la page Codes de chaîne et est répertorié en tant que code de chaîne déployé sur chaque canal sur lequel vous avez sélectionné de l'installer.

Créer et compiler votre solide contrat intelligent

  1. Ouvrez l'environnement IDE Remix basé sur le 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 (fichier .sol) dans Remix et effectuez l'une des étapes suivantes :
    • Si vous connaissez Solidity, créez votre propre fichier de contrat intelligent.
    • Utilisez l'exemple de code SimpleStorage fourni dans la documentation sur Solidity : Solidity : Présentation de Smart Contracts
    • Utilisez l'exemple de code utilisé pour cet exemple, qui prend la valeur string name en tant qu'entrée et imprime la même valeur qu'une chaîne de sortie à l'aide des fonctions 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;
          }
      }
      
    Vous pouvez voir un message d'erreur indiquant que la version du compilateur par défaut ne correspond pas à la version que vous avez spécifiée dans votre contrat intelligent.
  4. Compilez votre contrat intelligent. Ouvrez le panneau Compilateur de solidité dans Remix, assurez-vous que votre onglet de contrat intelligent est ouvert pour le sélectionner en tant que fichier compilé, réglez la version du compilateur à la version 4 la plus récente. Version X, puis sélectionnez Compiler.
    Capture d'écran du test Solidity smart contract dans la vue Remix Compiler.

  5. Une fois le fichier compilé, sélectionnez l'icône Bytecode pour copier le bytecode en tant que document JSON dans le presse-papiers.
  6. Collez l'octecode copié dans un éditeur de texte et enregistrez-le.

Déployer le contrat intelligent

Dans l'octetcode copié, la section dont vous avez besoin est le champ "object". Il s'agit du bytecode 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, la gestion de la valeur acquise attend deux arguments :
  • Adresse to.
  • Code octet input nécessaire dans les transactions Ethereum.

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

  1. Pour déployer le contrat intelligent Solidity sur Oracle Blockchain Platform, vous pouvez effectuer l'appel de mandataire REST suivant pour envoyer les deux arguments à la gestion de la valeur acquise.
    {
        "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 dans Oracle Blockchain Platform avec le nom soliditycc.
    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":"<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 votre 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.
    Saisie d'écran de l'appel et de la réponse de l'API indiquant l'adresse du contrat intelligent dans le champ de réponse des données utiles.
    Dans cet exemple, l'adresse du contrat intelligent est 66b92979bb66d645371b3247177e4b2513cb9834.
Il existe deux façons d'interagir avec un contrat intelligent déployé.
  1. Interagissez en utilisant une valeur de hachage de la méthode et des paramètres d'entrée.
  2. Interagissez en utilisant directement le nom de la méthode et les paramètres d'entrée.

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

Une fois que vous avez l'adresse de contrat intelligent, vous pouvez utiliser les appels suivants pour interagir avec le contrat intelligent déployé au moyen du mandataire 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 la fonction concaténé avec l'un des arguments requis.

Vous devez acquérir le code de hachage de l'exécution de la fonction pour exécuter une transaction. Une façon simple de le faire est d'exécuter les fonctions dans l'IDE Remix, puis de copier le hachage à partir des journaux de transactions :

  1. Dans l'environnement 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 sélectionnez Déployer.
    Capture d'écran du contrat Solidity sur le point d'être déployé.

    Une fois le déploiement terminé, le contrat est 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. Sert à exécuter une transaction. Pour l'exemple fourni, entrez oracle, puis sélectionnez set.
  4. La fenêtre Terminal affiche les journaux de transactions. Si les journaux de transactions sont réduits au minimum, développez-les en sélectionnant le journal. Copiez la valeur du champ input (qui est le hachage d'exécution de fonction) en sélectionnant l'icône à côté de celui-ci. Enregistrez cette valeur dans le même emplacement que votre adresse de contrat, en supprimant le 0x principal.
    Capture d'écran de la page Deployment affichant les valeurs de transaction et de champ terminées et pointant vers le champ d'entrée contenant la valeur de hachage d'exécution de la fonction.

  5. Une fois que vous avez le hachage d'exécution de fonction et l'adresse du contrat, vous pouvez exécuter la transaction de jeu sur Oracle Blockchain Platform en utilisant le hachage et l'adresse comme arguments de données brutes.
    
    --data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<setfunctionexecutionhash>"]}'
    
    L'exemple suivant montre comment exécuter la transaction à l'aide de cURL :
    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"]}'
    
  6. Ouvrez la console Oracle Blockchain Platform et vérifiez que la transaction est listée dans le livre.

Pour exécuter une autre transaction telle qu'une interrogation à l'aide de la fonction get du contrat intelligent, vous pouvez générer le hachage d'exécution de la fonction dans Remix, puis la combiner à 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. Sélectionnez get (Obtenir). Extrayez et enregistrez l'entrée de la transaction comme vous l'avez fait avec la transaction jeu, en supprimant le 0x principal.
    Capture d'écran de la transaction get dans Remix, précisant que le champ d'entrée contient le hachage d'exécution de fonction requis.

  3. Utiliser ce code de hachage de transaction et l'adresse de contrat pour exécuter une transaction d'interrogation sur le code de chaîne déployé sur Oracle Blockchain Platform.
    
    --data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<getfunctionexecutionhash>"]}'
    
    L'exemple suivant montre comment exécuter la transaction à l'aide de cURL :
    curl -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"]}'
    
    Les données utiles retournées contiendront la ressource interrogée, qui dans l'exemple de cas est la chaîne oracle.