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

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

La EVM ejecuta contratos inteligentes en las redes de Ethereum. La EVM se creó mediante el proyecto Hyperledger Burrow y se integró en Hyperledger Fabric. Este proyecto le permite utilizar una plataforma de cadena de bloques con permisos de Hyperledger Fabric para interactuar con contratos inteligentes de Ethereum escritos en un lenguaje compatible con EVM, como Solidity. Consulte: Hyperledger Fabric EVM chaincode.

Los siguientes pasos describen el proceso de ejecución de un contrato inteligente Solidity en una Oracle Blockchain Platform aprovisionada:
  1. Cargue el paquete de código de cadena de EVM en Oracle Blockchain Platform.
  2. Despliegue el código de cadenas de EVM en un canal.
  3. Genere un 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 cadena de EVM desplegado. Utilice la dirección devuelta del despliegue para enviar transacciones.
Los pasos de este tema se han probado con fabric-chaincode-evm:release-0.4 y puede que no funcionen con otras versiones.

Configuración del Paquete de Código de Cadena de EVM

Antes de desplegar el contrato inteligente, se debe preparar el paquete de código de cadena de EVM. Para crear la carpeta de paquetes chaincode:

  1. Descargue el paquete de código de cadena de EVM (archivo .zip) desde el siguiente repositorio GitHub: Hyperledger Fabric EVM chaincode.
  2. Extraiga el archivo descargado fabric-chaincode-evm-release-0.4.zip.
  3. En los archivos extraídos, vaya a fabric-chaincode-evm-release-0.4/evmcc.
  4. Suprima el archivo go.sum y el directorio vendor.
  5. Proporcione todos los módulos Go dependientes mediante el comando go mod:
    go mod tidy
    go mod vendor
  6. Vaya a fabric-chaincode-evm-release-0.4/emvcc/vendor/github.com/hyperledger
  7. Cree el directorio fabric-chaincode-evm/evmcc en el directorio /hyperledger.
  8. Mueva las siguientes carpetas del directorio fabric-chaincode-evm-release-0.4/evmcc al directorio fabric-chaincode-evm-release-0.4/evmcc/vendor/github.com/hyperledger/fabric-chaincode-evm/evmcc:
    • /address
    • /event
    • /eventmanager
    • /mocks
    • /statemanager
    La estructura de directorios es similar a la siguiente cuando se completa:
    Captura de pantalla en la que se muestra la estructura de directorios modificada descrita en los pasos anteriores.

  9. Comprima la carpeta fabric-chaincode-evm-release-0.4/evmcc de nivel superior en formato .zip y cámbiele el nombre. Los siguientes pasos utilizan evmcc.zip como nombre de ejemplo.

Despliegue de código de cadenas de EVM en Oracle Blockchain Platform

Después de crear el paquete de código de cadenas de EVM, despliéguelo en Oracle Blockchain Platform.

  1. Conéctese a la consola de Oracle Blockchain Platform.
  2. En el separador Códigos de Cadena, haga clic en Desplegar un Nuevo Código de Cadena.
  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 cadenas: GoLang
    • Nombre de código de cadena: introduzca el nombre del código de cadena. Por ejemplo, introduzca soliditycc.
    • Versión: v1
    • Inicio necesario: deje esta opción sin seleccionar.
    • Canal: seleccione los canales en los que desea instalar el código de cadena.
    • Origen de código de cadena: cargue el paquete evmcc.zip que ha creado en los pasos anteriores.
    Para obtener más información sobre el asistente de despliegue rápido y las restricciones en campos como Package Label y Chaincode Name, consulte: Uso de despliegue rápido.

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

Cree y compile su contrato inteligente de solidaridad

  1. Abra el IDE de Remix basado en explorador: https://remix.ethereum.org/.
  2. Si ya tiene un contrato inteligente de 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 Solidity: Solidity: Introduction to Smart Contracts
    • Puede utilizar el código de ejemplo que se está utilizando para este ejemplo, que toma string name como entrada e imprime la misma cadena que la 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 sobre la versión del compilador por defecto que no coincide con la versión especificada en el contrato inteligente.
  4. Compile su contrato inteligente. Abra el panel Compilador de Solidity en Remix, asegúrese de que su separador de contrato inteligente esté abierto para seleccionarlo como el archivo que se está compilando, establezca la versión del compilador en el 4 más reciente. Versión X 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:
  • La dirección to.
  • El input que es necesario en las transacciones Ethereum.

Para desplegar contratos inteligentes, el campo to es la dirección cero y input es el código de byte de 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, llame al código de cadena de EVM desplegado con estos dos argumentos mediante puntos finales de proxy REST.
    
    --data-raw '{"chaincode":"<chaincodename>","args":["<zeroaddress>","<EVMbytecode>"]}'
    
    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>:443/restproxy/api/v2/channels/<channelname>/transactions' \
    -H 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' \
    -H 'Content-Type: application/json' \
    --data-raw '{"chaincode":"soliditycc","args":["0000000000000000000000000000000000000000","608060405234801561....152d2820d3b5d784b3711119691d0029"],"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 de contrato se utiliza cuando ejecuta funciones de contrato inteligente.
    Captura de pantalla de la llamada y respuesta de API que muestra la dirección de contrato inteligente en el campo de respuesta de carga útil.
    En este ejemplo, la dirección de contrato inteligente es 66b92979bb66d645371b3247177e4b2513cb9834.

Interacción con el contrato inteligente

Después de tener la dirección de 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 en el 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 Solidity que se va a desplegar.

    Una vez finalizado el despliegue, el contrato se mostrará en la lista Contratos desplegados.
  2. Expanda el contrato en la lista Contratos desplegados. Se muestran las funciones de contrato inteligente.
  3. Ejecutar una transacción. En el ejemplo proporcionado, introduzca oracle y, a continuación, haga clic en set.
  4. La ventana Terminal muestra los logs de transacciones. Si se minimizan los logs de transacciones, expórtelos 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 su dirección de contrato, eliminando el valor 0x inicial.
    Captura de pantalla de la página Despliegue que muestra los valores de transacción y campo completados y apunta al campo de entrada que contiene el valor hash de ejecución de función.

  5. Después de tener el hash de ejecución de la 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 raw.
    
    --data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<setfunctionexecutionhash>"]}'
    
    Por ejemplo, mediante 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. 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 la función en Remix y, a continuación, combinarlo con la dirección del contrato:

  1. En Remix, 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 (Obtener). Recupere y guarde la entrada de la transacción como lo hizo con la transacción set, eliminando el 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 de 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>:443/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 va a consultar, en el caso de ejemplo, la cadena oracle.