C Esegui contratti smart Solidity con EVM su Oracle Blockchain Platform

Puoi eseguire gli smart contract Solidity con una EVM (Ethereum Virtual Machine) distribuita come codice concatenato su Oracle Blockchain Platform.

L'EVM esegue contratti intelligenti Solidity nelle reti Ethereum. L'EVM è stato creato attraverso il progetto Hyperledger Burrow e integrato in Hyperledger Fabric. Questo progetto consente di utilizzare una piattaforma blockchain autorizzata da Hyperledger Fabric per interagire con gli smart contract di Ethereum scritti in un linguaggio compatibile con EVM come Solidity.

I passi riportati di seguito descrivono il processo di esecuzione di uno smart contract Solidity su Oracle Blockchain Platform con provisioning eseguito:
  1. Scarica il pacchetto di codici concatenati EVM dalla console di Oracle Blockchain Platform.
  2. Distribuire il codice concatenato EVM su un canale.
  3. Genera bytecode per uno smart contract Solidity utilizzando l'IDE Remix.
  4. Implementa il bytecode dello smart contract nel codice concatenato EVM distribuito. Utilizzare l'indirizzo restituito dalla distribuzione per inviare le transazioni.
I passi di questo argomento sono stati testati con il package di codice concatenato EVM disponibile nella console di Oracle Blockchain Platform e potrebbero non funzionare con altre release.

Nota

Se il codice concatenato è stato installato in precedenza su un'istanza Hyperledger Fabric v1.4.7, dovrebbe continuare a funzionare come previsto quando l'istanza viene aggiornata a Hyperledger Fabric v2.x.

Scarica il codice concatenato EVM e il package Fab3

Nella scheda Strumenti sviluppatore della console di Oracle Blockchain Platform, aprire il riquadro Sviluppo applicazioni, quindi fare clic su Scarica il package codice concatenato EVM. Per scaricare il file è necessario essere un utente amministratore.

Distribuisci EVM Chaincode su Oracle Blockchain Platform

Dopo aver scaricato il package di codice concatenato EVM, è possibile distribuirlo su Oracle Blockchain Platform.

  1. Eseguire il login alla console di Oracle Blockchain Platform.
  2. Nella scheda Codici di catena fare clic su Distribuisci un nuovo codice concatenato.
  3. Selezionare Distribuzione rapida e immettere le informazioni riportate di seguito.
    • Etichetta package: immettere una descrizione per il package del codice concatenato.
    • Lingua codice di connessione: GoLang.
    • Nome codice di catena: immettere il nome del codice di catena. Ad esempio, immettere soliditycc.
    • Versione: v1.
    • Init-required: lasciare deselezionata questa opzione.
    • Canale: selezionare i canali in cui si desidera installare il codice concatenato.
    • Codice concatenato in package: non selezionare questa opzione.
    • Origine codice di connessione: caricare il package evmcc.zip scaricato in precedenza.
    Per ulteriori dettagli sulla procedura guidata Distribuzione rapida e sulle limitazioni relative a campi quali Etichetta package e Nome codice di connessione, vedere: Usa distribuzione rapida.

Dopo aver sottomesso le informazioni, il codice concatenato EVM è visibile nella scheda Codici di catena ed è elencato come codice concatenato distribuito su ciascun canale su cui è stato selezionato l'installazione.

Crea e compila il tuo contratto smart Solidity

  1. Apri l'IDE Remix basato sul browser: https://remix.ethereum.org/.
  2. Se hai già un contratto intelligente Solidity scritto, importalo in Remix.
  3. Se non si dispone di uno smart contract Solidity scritto, creare un file Solidity (.sol) in Remix ed eseguire una delle seguenti operazioni:
    • Se hai familiarità con Solidity puoi creare il tuo file smart contract.
    • È possibile utilizzare il codice di esempio Simple Storage fornito nella documentazione Solidity: Solidity: Introduction to Smart Contracts
    • È possibile utilizzare il codice di esempio utilizzato per questo esempio, che utilizza string name come input e stampa come stringa di output utilizzando set(name) e 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;
          }
      }
      
    È possibile che venga visualizzato un messaggio di errore relativo alla versione predefinita del compilatore che non corrisponde alla versione specificata nello smart contract.
  4. Compila il tuo smart contract. Aprire il pannello Compilatore Solidity in Remix, assicurarsi che la scheda del contratto intelligente sia aperta per selezionarla come file da compilare, impostare la versione del compilatore sul 4 più recente. Versione X e fare clic su Compila.
    Acquisizione dello schermo del test Solidity smart contract nella vista Remix Compiler.

  5. Dopo aver compilato il file, fare clic sull'icona Bytecode per copiare il bytecode come documento JSON negli Appunti.
  6. Incollare il bytecode copiato in un editor di testo e salvarlo.

Distribuire il contratto smart

Nel bytecode copiato, la sezione necessaria è il campo "object". Questo è il bytecode EVM di uno smart contract di esempio.
"object": "608060405234801561001057600080fd5b50610410806100206000396000f30060
8060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463
ffffffff1680634ed3885e1461005c5780636d4ce63c146100c5578063d97d663014610155575b600080fd5b34801561
006857600080fd5b506100c3600480360381019080803590602001908201803590602001908080601f01602080910402
602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101
e5565b005b3480156100d157600080fd5b506100da6101ff565b60405180806020018281038252838181518152602001
91508051906020019080838360005b8381101561011a5780820151818401526020810190506100ff565b505050509050
90810190601f1680156101475780820380516001836020036101000a031916815260200191505b509250505060405180
910390f35b34801561016157600080fd5b5061016a6102a1565b60405180806020018281038252838181518152602001
91508051906020019080838360005b838110156101aa57808201518184015260208101905061018f565b505050509050
90810190601f1680156101d75780820380516001836020036101000a031916815260200191505b509250505060405180
910390f35b80600090805190602001906101fb92919061033f565b5050565b6060600080546001816001161561010002
03166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615
6101000203166002900480156102975780601f1061026c57610100808354040283529160200191610297565b82019190
6000526020600020905b81548152906001019060200180831161027a57829003601f168201915b505050505090509056
5b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190
818152602001828054600181600116156101000203166002900480156103375780601f1061030c576101008083540402
83529160200191610337565b820191906000526020600020905b81548152906001019060200180831161031a57829003
601f168201915b505050505081565b828054600181600116156101000203166002900490600052602060002090601f01
6020900481019282601f1061038057805160ff19168380011785556103ae565b828001600101855582156103ae579182
015b828111156103ad578251825591602001919060010190610392565b5b5090506103bb91906103bf565b5090565b61
03e191905b808211156103dd5760008160009055506001016103c5565b5090565b905600a165627a7a72305820a990d4
0b57c66329a32a18e847b3c18d6c911487ffadfed2098e71e8cafa0c980029",
In generale, l'EVM si aspetta due argomenti:
  • Indirizzo to.
  • Il input necessario nelle transazioni Ethereum.

Per distribuire gli smart contract, il campo to è l'indirizzo zero e input è il bytecode EVM compilato del contratto. Il comando invoke può quindi contenere due argomenti. Il primo, che tradizionalmente doveva essere un nome di funzione all'interno del codice concatenato, è ora 0000000000000000000000000000000000000000, e il secondo argomento è il bytecode dello smart contract Solidity.

  1. Per distribuire lo smart contract Solidity su Oracle Blockchain Platform, è possibile effettuare la chiamata proxy REST seguente per inviare i due argomenti all'EVM.
    {
        "chaincode": "<evmcc-ccid>",
        "args": [
            "0000000000000000000000000000000000000000",
            "<bytecode-of-the-smart-contract>"
        ],
        "timeout": 0,
        "sync": true
    }
    Nell'esempio seguente viene utilizzato cURL per distribuire lo smart contract Solidity in Oracle Blockchain Platform con il nome 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 risposta payload della transazione è l'indirizzo del contratto distribuito. Copiare l'indirizzo e salvarlo. L'indirizzo del contratto viene utilizzato quando si eseguono funzioni di smart contract.
    Screenshot della chiamata e della risposta API che mostra l'indirizzo dello smart contract nel campo di risposta del payload.
    In questo esempio, l'indirizzo dello smart contract è 66b92979bb66d645371b3247177e4b2513cb9834.
Esistono due modi per interagire con uno smart contract distribuito:
  1. Utilizzando un valore hash del metodo e dei parametri di input.
  2. Utilizzando direttamente il nome del metodo e i parametri di input.

Interazione con il contratto smart mediante valori hash

Dopo aver ricevuto l'indirizzo dello smart contract, è possibile utilizzare le chiamate riportate di seguito per interagire con lo smart contract distribuito tramite il proxy REST.

Per eseguire le funzioni, utilizzare le transazioni di richiamo e query, ma con parametri diversi. Il contratto di esempio contiene due funzioni: get e set.

In queste transazioni, il campo to è l'indirizzo del contratto e il campo input è l'hash di esecuzione della funzione concatenato con uno qualsiasi degli argomenti richiesti.

È necessario acquisire l'hash dell'esecuzione della funzione per eseguire una transazione. Un modo semplice per farlo è eseguire le funzioni nell'IDE Remix e quindi copiare l'hash dai log delle transazioni:

  1. Nell'IDE remix aprire il pannello Distribuisci ed esegui transazioni. Assicurarsi che il contratto sia selezionato nel campo Contratto e fare clic su Distribuisci.
    Screenshot del contratto Solidity che sta per essere distribuito.

    Al termine della distribuzione, il contratto deve essere elencato nell'elenco Contratti distribuiti.
  2. Espandere il contratto nell'elenco Contratti distribuiti. Vengono elencate le funzioni di smart contract.
  3. Eseguire una transazione. Per l'esempio fornito, immettere oracle, quindi fare clic su set.
  4. Nella finestra Terminale vengono visualizzati i log delle transazioni. Se i log delle transazioni sono ridotti a icona, espanderli facendo clic sul log. Copiare il valore del campo input (che è l'hash di esecuzione della funzione) facendo clic sull'icona accanto ad esso. Salvare questo valore nella stessa posizione dell'indirizzo del contratto, rimuovendo il valore 0x iniziale.
    Screenshot della pagina Distribuzione che mostra i valori di transazione e campo completati e che punta al campo di input contenente il valore hash dell'esecuzione della funzione.

  5. Dopo avere l'hash di esecuzione della funzione e l'indirizzo del contratto, è possibile eseguire la transazione set su Oracle Blockchain Platform utilizzando l'hash e l'indirizzo come argomenti di dati raw.
    
    --data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<setfunctionexecutionhash>"]}'
    
    Ad esempio, utilizzando 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. Apri la console di Oracle Blockchain Platform e verifica che la transazione sia elencata nel libro contabile.

Per eseguire un'altra transazione, ad esempio una query, utilizzando la funzione get dello smart contract, è possibile generare l'hash di esecuzione della funzione in Remix e quindi combinarlo con l'indirizzo del contratto:

  1. In Personalizza nel pannello Distribuisci ed esegui transazioni, assicurarsi che il contratto sia ancora elencato in Contratti distribuiti. In caso contrario, ridistribuirlo.
  2. Fare clic su get. Recuperare e salvare l'input dalla transazione come è stato fatto con la transazione set, rimuovendo il valore 0x iniziale.
    Screen capture of the get transaction in Remix, che chiarisce che il campo di input contiene l'hash di esecuzione della funzione richiesta.

  3. È possibile utilizzare questo hash transazione e l'indirizzo del contratto per eseguire una transazione di query sul codice concatenato distribuito su Oracle Blockchain Platform.
    
    --data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<getfunctionexecutionhash>"]}'
    
    Ad esempio 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"]}'
    
    Il payload restituito conterrà l'asset su cui viene eseguita la query. Nel caso di esempio, la stringa oracle.

Il seguente payload di esempio illustra un altro modo per inviare una transazione utilizzando input codificati in formato esadecimale.

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

Interazione con il contratto smart mediante i nomi dei metodi

Utilizzare il metodo facoltativo setAbi per impostare una specifica ABI (Application Binary Interface), che consente di inviare input e ottenere output in formato leggibile (non codificato con esadecimali) anziché bytecode. Fare clic sull'icona ABI (accanto all'icona Bytecode) nel pannello Compilatore di solidità nell'IDE remix per ottenere la specifica ABI. Per il formato di input leggibile sono supportati i tipi di input seguenti: uint, string, address, bool, uint[], string[] e address[]. L'esecuzione di transazioni su smart contract che implementano l'override del metodo e il sovraccarico del metodo non è supportato dal proxy fab3, solo dal proxy REST. Il seguente payload di esempio utilizza il metodo setAbi per impostare una specifica ABI.

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

È inoltre possibile effettuare chiamate utilizzando direttamente il nome del metodo e i parametri di input, come mostrato nel seguente payload di esempio.

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

Configurazione degli importi del gas

È possibile configurare la quantità di gas utilizzando i metodi setGasAmount e getGasAmount, come mostrato nei payload di esempio riportati di seguito.

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