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 exécute des contrats intelligents Solidity sur 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 autorisée par Hyperledger Fabric pour interagir avec les contrats intelligents Ethereum écrits dans un langage compatible avec la gestion de la valeur acquise tel que Solidity.
- Téléchargez l'ensemble de code de chaîne EVM à partir de la console Oracle Blockchain Platform.
- Déployer le code de chaîne de valeur sur un canal.
- Générez un bytecode pour un contrat intelligent Solidity à l'aide de l'IDE Remix.
- 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.
Note :
Si votre code de chaîne a déjà été installé sur une instance Hyperledger Fabric v1.4.7, il doit continuer de fonctionner comme prévu lors de la mise à niveau de l'instance vers Hyperledger Fabric v2.x.Télécharger le code de chaîne EVM et l'ensemble Fab3
Dans l'onglet Outils pour développeurs de la console Oracle Blockchain Platform, ouvrez le volet Développement d'applications, puis cliquez sur Télécharger l'ensemble de code de chaîne EVM. Vous devez être un administrateur pour télécharger le fichier.
Déployer du code de chaîne de valeur EVM sur Oracle Blockchain Platform
Après avoir téléchargé l'ensemble de code de chaîne de valeur EVM, vous le déployez sur Oracle Blockchain Platform.
- Connectez-vous à la console Oracle Blockchain Platform.
- Dans l'onglet Code de chaîne, cliquez sur Déployer un nouveau code de chaîne.
- 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.
- Est du code de chaîne emballé : Laissez ce code désélectionné.
- Source de code de chaîne : Chargez l'ensemble
evmcc.zip
que vous avez téléchargé précédemment.
Après avoir soumis vos informations, le code de chaîne de valeur EVM est visible dans l'onglet Code de chaîne et est répertorié comme 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
- Ouvrez l'environnement IDE Remix basé sur le navigateur : https://remix.ethereum.org/.
- Si vous avez déjà un contrat intelligent Solidity écrit, importez-le dans Remix.
- 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 êtes familier avec Solidity, vous pouvez créer votre propre fichier de contrat intelligent.
- Vous pouvez utiliser l'exemple de code de stockage simple fourni dans la documentation Solidité : Solidité : Présentation des contrats intelligents
- Vous pouvez utiliser l'exemple de code utilisé pour cet exemple, qui prend
string name
en tant qu'entrée et imprime la même chose que la chaîne de sortie à l'aide deset(name)
etget()
: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; } }
- Compilez votre contrat intelligent. Ouvrez le panneau Compilateur Solidité dans Remix, assurez-vous que votre onglet de contrat intelligent est ouvert pour le sélectionner comme le fichier en cours de compilation, réglez la version du compilateur à la version 4 la plus récente. Version X et cliquez sur Compile.
- Une fois le fichier compilé, cliquez sur l'icône Octecode pour copier l'octet en tant que document JSON dans le presse-papiers.
- Collez l'octecode copié dans un éditeur de texte et enregistrez-le.
Déployer le contrat intelligent
"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",
- Adresse
to
. - Le
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.
- 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 portant le nomsoliditycc
: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}'
- 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.
Dans cet exemple, l'adresse du contrat intelligent est66b92979bb66d645371b3247177e4b2513cb9834
.
- En utilisant une valeur de hachage de la méthode et des paramètres d'entrée.
- 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 hachage de l'exécution de la fonction pour exécuter une transaction. Pour ce faire, il est simple d'exécuter les fonctions de l'environnement IDE Remix, puis de copier le hachage à partir des journaux de transactions :
- Dans l'environnement IDE de remixage, 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.
Une fois le déploiement terminé, le contrat doit être répertorié dans la liste Contrats déployés. - Développez le contrat dans la liste Contrats déployés. Les fonctions de contrat intelligent sont répertoriées.
- Sert à exécuter une transaction. Pour l'exemple fourni, entrez oracle, puis cliquez sur Définir.
- La fenêtre Terminal affiche les journaux de transactions. Si les journaux de transactions sont réduits au minimum, 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 à côté. Enregistrez cette valeur au même emplacement que votre adresse de contrat, en supprimant le0x
principal. - 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.
Par exemple, à l'aide de cURL :--data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<setfunctionexecutionhash>"]}'
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"]}'
- 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 :
- 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.
- Cliquez sur obtenir. Extrayez et enregistrez l'entrée de la transaction comme vous l'avez fait avec la transaction définie, en supprimant la
0x
principale. - Vous pouvez 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.
Par exemple, dans cURL :--data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<getfunctionexecutionhash>"]}'
Les données utiles retournées contiendront la ressource interrogée - dans l'exemple de cas, la chaînecurl -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"]}'
oracle
.
L'exemple de données utiles suivant illustre une autre façon d'envoyer une transaction à l'aide d'une entrée encodée au format hexadécimal.
{
"chaincode": "<evmcc-ccid>",
"args": [
"<smart-contract-address>",
"<hexadecimal-encoded-method-and-input-parameters>"
],
"sync": true
}
Interagir avec un 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 l'entrée et d'obtenir la sortie dans un format lisible (non encodé en hexadécimal) au lieu d'un code octet. Cliquez sur l'icône ABI (à côté de l'icône Octecode) dans le panneau Compilateur de solidité 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 mettant en oeuvre le remplacement de méthode et la surcharge de méthode n'est pas prise en charge à partir du mandataire fab3
, uniquement à partir du mandataire REST. L'exemple de données utiles 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 données utiles 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
}
Configuration des montants de gaz
Vous pouvez configurer la quantité de gaz à l'aide des méthodes setGasAmount
et getGasAmount
, comme illustré dans les exemples de données utiles suivants.
{
"chaincode": "<evmcc-ccid>",
"args": [
"setGasAmount",
"<gas-amount>"
],
"sync": true
}
{
"chaincode": "<evmcc-ccid>",
"args": [
"getGasAmount"
],
"sync": true
}