C Ejecuta contratos inteligentes de Solidity con EVM en Oracle Blockchain Platform

Puede ejecutar contratos inteligentes Solidity con una máquina virtual (EVM) de Ethereum desplegada como código de cadena en Oracle Blockchain Platform.

El EVM ejecuta contratos inteligentes Solidity en las redes Ethereum. El EVM se creó a través del proyecto Hyperledger Burrow y se integró en Hyperledger Fabric. Este proyecto le permite utilizar una plataforma de blockchain con permiso de Hyperledger Fabric para interactuar con contratos inteligentes de Ethereum escritos en un lenguaje compatible con EVM, como Solidity.

Los siguientes pasos describen el proceso de ejecución de un contrato inteligente Solidity en una instancia aprovisionada de Oracle Blockchain Platform:
  1. Descargue el paquete de código de cadenas de EVM desde la consola de Oracle Blockchain Platform.
  2. Despliegue el código de cadenas de EVM en un canal.
  3. Generar código de byte para un contrato inteligente Solidity mediante el IDE Remix.
  4. Despliegue el código de byte de contrato inteligente en el código de cadenas de EVM desplegado. Utilice la dirección devuelta por el despliegue para enviar transacciones.
Los pasos de este tema se han probado con el paquete de código de cadenas de EVM que está disponible en la consola de Oracle Blockchain Platform y puede que no funcione con otras versiones.

Note:

Si el código de cadena se instaló anteriormente en una instancia de Hyperledger Fabric v1.4.7, debe seguir funcionando como se esperaba cuando la instancia se actualice a Hyperledger Fabric v2.x.

Descargue el código de cadenas de EVM y el paquete Fab3

En el separador Herramientas de desarrollador de la consola de Oracle Blockchain Platform, abra el panel Desarrollo de aplicaciones y, a continuación, haga clic en Descargar el paquete de código de cadenas de EVM. Debe ser un usuario administrador para descargar el archivo.

Despliegue de EVM Chaincode en Oracle Blockchain Platform

Después de descargar el paquete de código de cadenas de EVM, lo despliega en Oracle Blockchain Platform.

  1. Conéctese a la consola de Oracle Blockchain Platform.
  2. En el separador Códigos de cadenas, haga clic en Desplegar un nuevo código de cadenas.
  3. Seleccione Despliegue rápido e introduzca la siguiente información:
    • Etiqueta de paquete: introduzca una descripción del paquete de código de cadena.
    • Idioma de código de cadena: GoLang.
    • Nombre de código de cadena: introduzca el nombre del código de cadena. Por ejemplo, introduzca soliditycc.
    • Versión: v1.
    • Init-required: deje esta opción sin seleccionar.
    • Canal: seleccione los canales en los que desea instalar el código de cadenas.
    • Es un código de cadena empaquetado: deje esta opción sin seleccionar.
    • Origen de código de cadena: cargue el paquete evmcc.zip que ha descargado anteriormente.
    Para obtener más información sobre el asistente de despliegue rápido y las restricciones en campos como Etiqueta de paquete y Nombre de código de cadena, consulte: Uso de despliegue rápido.

Después de enviar la información, el código de cadenas de EVM está visible en el separador Códigos de cadenas y aparece como un código de cadenas desplegado en cada canal en el que ha seleccionado instalarlo.

Cree y compile su contrato inteligente de solidez

  1. Abra el IDE de Remix basado en explorador: https://remix.ethereum.org/.
  2. Si ya tiene un contrato inteligente Solidity escrito, impórtelo en Remix.
  3. Si no tiene un contrato inteligente de Solidity escrito, cree un archivo de Solidity (.sol) en Remix y realice una de las siguientes acciones:
    • Si está familiarizado con Solidity, puede crear su propio archivo de contrato inteligente.
    • Puede utilizar el código de ejemplo de almacenamiento simple que se proporciona en la documentación de solidez: Solidez: Introducción a contratos inteligentes
    • Puede utilizar el código de ejemplo que se utiliza para este ejemplo, que toma string name como entrada e imprime lo mismo que la cadena de salida mediante set(name) y 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;
          }
      }
      
    Es posible que aparezca un mensaje de error que indica que la versión del compilador por defecto no coincide con la versión especificada en el contrato inteligente.
  4. Compile su contrato inteligente. Abra el panel Compilador de solidez en Remix, asegúrese de que el separador de contrato inteligente esté abierto para seleccionarlo como el archivo que se está compilando, defina la versión del compilador en la versión 4 más reciente. X version y haga clic en Compile.
    Captura de pantalla del contrato inteligente Solidity de prueba en la vista Remix Compiler.

  5. Después de compilar el archivo, haga clic en el icono Código de byte para copiar el código de byte como documento JSON en el portapapeles.
  6. Pegue el código de byte copiado en un editor de texto y guárdelo.

Despliegue del contrato inteligente

En el código de byte copiado, la sección que necesita es el campo "object". Este es el código de byte de EVM de un contrato inteligente de muestra.
"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 general, la EVM espera dos argumentos:
  • Dirección to.
  • El input que es necesario en las transacciones de Ethereum.

Para desplegar contratos inteligentes, el campo to es la dirección cero y input es el código de byte EVM compilado del contrato. Por lo tanto, se proporcionan dos argumentos para el comando invoke. El primero, que tradicionalmente se suponía que era un nombre de función dentro del código de cadena, ahora es 0000000000000000000000000000000000000000, y el segundo argumento es el código de byte de contrato inteligente Solidity.

  1. Para desplegar el contrato inteligente Solidity en Oracle Blockchain Platform, puede realizar la siguiente llamada de proxy REST para enviar los dos argumentos a EVM.
    {
        "chaincode": "<evmcc-ccid>",
        "args": [
            "0000000000000000000000000000000000000000",
            "<bytecode-of-the-smart-contract>"
        ],
        "timeout": 0,
        "sync": true
    }
    En el siguiente ejemplo se utiliza cURL para desplegar el contrato inteligente Solidity en Oracle Blockchain Platform con el nombre 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 respuesta payload de la transacción es la dirección del contrato para el contrato desplegado. Copie esta dirección y guárdela. La dirección del contrato se utiliza cuando se ejecutan funciones de contrato inteligente.
    Captura de pantalla de la llamada y respuesta de API que muestra la dirección del contrato inteligente en el campo de respuesta de carga útil.
    En este ejemplo, la dirección del contrato inteligente es 66b92979bb66d645371b3247177e4b2513cb9834.
Hay dos formas de interactuar con un contrato inteligente desplegado:
  1. Mediante el uso de un valor hash del método y los parámetros de entrada.
  2. Mediante el uso directo del nombre del método y los parámetros de entrada.

Interacción con el contrato inteligente mediante valores hash

Después de tener la dirección del contrato inteligente, puede usar las siguientes llamadas para interactuar con el contrato inteligente desplegado mediante el proxy REST.

Para ejecutar funciones, se utilizan transacciones de llamada y consulta, pero con diferentes parámetros. El contrato de ejemplo contiene dos funciones: get y set.

En estas transacciones, el campo to es la dirección del contrato y el campo input es el hash de ejecución de función concatenado con cualquiera de los argumentos necesarios.

Debe adquirir el hash de la ejecución de la función para ejecutar una transacción. Una forma sencilla de hacerlo es ejecutar las funciones del IDE Remix y, a continuación, copiar el hash de los logs de transacciones:

  1. En el IDE de mezcla, abra el panel Desplegar y ejecutar transacciones. Asegúrese de que el contrato esté seleccionado en el campo Contrato y haga clic en Desplegar.
    Captura de pantalla del contrato de solidez que se va a desplegar.

    Una vez finalizado el despliegue, el contrato debe aparecer en la lista Contratos desplegados.
  2. Amplíe el contrato en la lista Contratos desplegados. Se muestran las funciones de contrato inteligente.
  3. Ejecución de una transacción. Para el ejemplo proporcionado, introduzca oracle y, a continuación, haga clic en set.
  4. La ventana Terminal muestra los logs de transacciones. Si los logs de transacciones se minimizan, amplíelos haciendo clic en el log. Copie el valor del campo input (que es el hash de ejecución de función) haciendo clic en el icono situado junto a él. Guarde este valor en la misma ubicación que la dirección del contrato, eliminando la 0x inicial.
    Captura de pantalla de la página Despliegue en la que se muestran los valores de campo y transacción finalizados y que apunta al campo de entrada que contiene el valor hash de ejecución de la función.

  5. Después de tener el hash de ejecución de función y la dirección del contrato, puede ejecutar la transacción definida en Oracle Blockchain Platform mediante el hash y la dirección como argumentos de datos sin procesar.
    
    --data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<setfunctionexecutionhash>"]}'
    
    Por ejemplo, con 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. Abra la consola de Oracle Blockchain Platform y compruebe que la transacción se muestra en el libro mayor.

Para ejecutar otra transacción, como una consulta, mediante la función get del contrato inteligente, puede generar el hash de ejecución de función en Remix y, a continuación, combinarlo con la dirección del contrato:

  1. En Mezclar en el panel Desplegar y ejecutar transacciones, asegúrese de que el contrato siga apareciendo en Contratos desplegados. Si no es así, vuelva a desplegarlo.
  2. Haga clic en get. Recupere y guarde la entrada de la transacción como lo hizo con la transacción set, eliminando la 0x inicial.
    Captura de pantalla de la transacción get en Remix, aclarando que el campo de entrada contiene el hash de ejecución de función necesario.

  3. Puede utilizar este hash de transacción y la dirección del contrato para ejecutar una transacción de consulta en el código de cadena desplegado en Oracle Blockchain Platform.
    
    --data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<getfunctionexecutionhash>"]}'
    
    Por ejemplo, en 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 carga útil devuelta contendrá el activo que se consulta, en el caso del ejemplo, la cadena oracle.

La siguiente carga útil de ejemplo ilustra otra forma de enviar una transacción mediante una entrada codificada en formato hexadecimal.

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

Interacción con contratos inteligentes mediante nombres de métodos

Utilice el método opcional setAbi para definir una especificación de la interfaz binaria de aplicaciones (ABI), que le permite enviar entradas y obtener salidas en formato legible (no codificado hexadecimal) en lugar de código de byte. Haga clic en el icono ABI (junto al icono Código de byte) en el panel Compilador de solidez del IDE de remezcla para obtener la especificación de ABI. Los siguientes tipos de entrada están soportados para el formato de entrada legible: uint, string, address, bool, uint[], string[] y address[]. La ejecución de transacciones en contratos inteligentes que implantan la sustitución de métodos y la sobrecarga de métodos no está soportada desde el proxy fab3, solo desde el proxy REST. La siguiente carga útil de ejemplo utiliza el método setAbi para definir una especificación de ABI.

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

También puede realizar llamadas utilizando el nombre del método y los parámetros de entrada directamente, como se muestra en la siguiente carga útil de ejemplo.

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

Configuración de importes de gas

Puede configurar la cantidad de gas mediante los métodos setGasAmount y getGasAmount, como se muestra en las siguientes cargas útiles de ejemplo.

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