Blog de Amazon Web Services (AWS)

Desplegando contratos inteligentes en la blockchain de Ethereum haciendo uso de AWS Managed Blockchain

Por: Juan Miguel Bermúdez Mieles, Arquitecto de Soluciones en Amazon Web Services para Sector Público. 

Hoy en día, se usa blockchain en una amplia gama de industrias y sectores. Desde la gestión de la cadenas de suministros hasta la protección de la propiedad intelectual haciendo uso de los tokens no fungibles (NFT), pasando por el voto electrónico¹, la atención médica, la logística y mucho más, la blockchain ha abierto un mundo de posibilidades. Su capacidad para crear registros inmutables, transparentes y verificables ha permitido aumentar la eficiencia, reducir los costos y fortalecer la confianza en diversos procesos y sistemas.

Uno de los mayores beneficios de la blockchain radica en su carácter descentralizado. A diferencia de los sistemas tradicionales, donde una entidad centralizada controla y valida las transacciones, la blockchain permite la participación de múltiples nodos distribuidos en una red. Esto implica que no hay una autoridad única, lo que aumenta la seguridad y la resistencia frente a posibles ataques o manipulaciones. Además, la tecnología blockchain garantiza la integridad de los datos almacenados, lo que genera confianza entre los participantes de la red.

En los últimos años, hemos sido testigos de avances significativos en la evolución de la blockchain. La adopción de Ethereum ha llevado la tecnología a un nuevo nivel, permitiendo la programación de contratos inteligentes y la creación de aplicaciones descentralizadas (DApps). Esta nueva generación de blockchain ha abierto muchas posibilidades en términos de automatización, gobernanza y tokenización de activos.

Hoy, haciendo uso de Amazon Managed Blockchain, que es un servicio totalmente administrado que facilita la adhesión a redes públicas o la creación y administración de redes privadas escalables mediante el uso de los marcos populares de código abierto como Hyperledger Fabric y Ethereum.  Podemos interactuar con la Mainnet de Ethereum aprovechando las características brindadas por el servicio de Amazon Managed Blockchain, con el cual desplegaremos un nodo que nos permita interactuar con esta red.

Aprovisionamiento de un nodo

Las siguientes instrucciones pueden generar costos relacionados a la infraestructura de AWS.

  1. En la consola de Amazon Web Services en el panel de búsqueda escribimos Amazon Managed Blockchain.
  2. Hacemos clic en Amazon Managed Blockchain.
  3. Hacemos clic en el botón de unirse a la red pública.

  1. En el apartado de Red pública de Ethereum seleccionamos Ethereum Mainnet en Red de cadena de bloques.
  2. En configuración del nodo, seleccionamos el tipo de instancia de la cadena de bloques que se desea unir a la red como un nodo y elegimos la zona de disponibilidad. (Para alta disponibilidad es ideal desplegar al menos dos nodos en distintas zonas de disponibilidad.
  3. Hacemos clic en crear nodo.

Veremos el nodo que se ha iniciado, y se verá el estado en Creando, qué luego de aproximadamente 30 minutos pasará a Disponible.

Acceso basado en token

Para poder interactuar con nuestro nodo previamente desplegado es necesario usar un token. Y es que la forma habitual de acceder a las API de RPC de Ethereum desde Managed Blockchain es mediante Signature Version 4 (SIGv4), un mecanismo de código de autenticación de mensajes (HMAC) basado en hash que se utiliza para autenticar las llamadas al SDK de AWS. Este ofrece varias funciones de seguridad, como la posibilidad de establecer el vencimiento de una solicitud en el momento de la firma y la firma explícita de la carga útil por solicitud.

Si bien SigV4 ha sido la principal forma de autorizar las solicitudes, plantea desafíos de interoperabilidad con las herramientas comunitarias establecidas (como Ethers.js, HardHat MetaMask, The Graph, Chainlink, POKT Network y Ethereum ETL) que se basan en una conexión directa a un punto de conexión RPC de Ethereum y no están diseñadas para crear y adjuntar una firma de AWS SIGv4 a las solicitudes. Los clientes han confiado en el middleware o en los proxies personalizados que son capaces de firmar solicitudes en pleno vuelo desde aplicaciones que utilizan las herramientas de desarrollo de Ethereum a nodos alojados en una cadena de bloques gestionada. El acceso basado en tokens, (nuevo método de acceso para los nodos de Ethereum en una cadena de bloques gestionada), presenta una solución a este problema de interoperabilidad al permitir a los clientes utilizar de forma opcional un token para acceder a su nodo en lugar de una firma SIGv4. Estos tokens, o accesores, ahora se pueden proporcionar como parte del objeto de solicitud para los endpoints.

Petición de un token

  1. Nos dirigimos a Acceso basado en token y hacemos clic en Novedad

Conexión a la Mainnet a tráves del Nodo

Para conectarnos e interactuar con la blockchain de Ethereum (Mainnet) haremos uso de la herramienta web3 para Python, pero antes debemos establecer la ruta de conexión a la red por medio del endpoint HTTP de nuestro nodo.

Formato de endpoint HTTP

https://id-del-nodo-minusculas.t.ethereum.managedblockchain.us-east-1.amazonaws.com/<ruta-de-la-api-de-consenso>?billingtoken=token-de-acceso

Por ejemplo:

https://nd-6eaj5va43jggnpxouzp7y47e4y.t.ethereum.managedblockchain.us-east-1.amazonaws.com/eth/v1/beacon/genesis?billingtoken=n-MWY63ZJZU5HGNCMBQER7IN6OIU

Para obtener el token, hacemos clic en el ID de acceso de nuestro Token y copiamos debajo del campo token

La conexión se puede realizar desde cualquier terminal, editor de código, notebook Jupyper o ipython, se debe tener python3 instalado.

Creación del ambiente de desarrollo

python3 -m venv venv

Activación del ambiente

Linux, Mac

. venv/bin/activate

Windows

venv/scripts/activate

Luego que el ambiente esté activo, instalamos las dependencias

pip install web3

Creación de la conexión

La conexión se puede realizar desde cualquier terminal, editor de código, notebook Jupyper o ipython, se debe tener instaladas las dependencias en este caso web3.

import json
from web3 import Web3

# 1. Seleccionamos la región
aws_region = "us-east-1"
# 2. Copiamos el ID del Nodo
node_id = "nd-x1x1x1x1x1xx1x1x1x1x1xx1x1x1x1x"
# 3. Copiamos el Token de nuestro acceso basado en token
accessor_token = "0zx00000xx0xx00000000000000xxxxxxx-Z0Z"
endpoint_https = f"https://{node_id}.t.ethereum.managedblockchain.{aws_region}.amazonaws.com/?billingtoken={accessor_token}"
# 4. Instanciamos la clase Web3
w3 = Web3(Web3.HTTPProvider(endpoint_https))

# 5. Se prueba la conexión
w3.is_connected()
# Retorna un True, si se pudo establecer la conexión de lo contrario False

Salida retornada por la sentencia w3.is_connected():

True

Al ser un red decentralizada, los cambios no suceden de forma rápida por lo que nuestro nodo podría no estar sincronizado. Para verificar la sincronización ingresamos el siguiente comando:

# Verificar que esté sincronizado nuestro nodo
w3.eth.syncing
# Retorna False si no está sincronizada

Si nuestro nodo NO está sincronizado la sentencia w3.eth.syncing retornará un valor de False, en caso contrario se recibirá un objeto parecido al siguiente, donde se encuentran campos como currentBlockque representa el número del último bloque o bloque actual, startingBlock que es el bloque en el que se inició la importación,highestBlockque representa el bloque más alto estimado.

AttributeDict({
'currentBlock': 17712411,
'healedBytecodeBytes': '0x0',
'healedBytecodes': '0x0',
'healedTrienodeBytes': '0x0',
'healedTrienodes': '0x0',
'healingBytecode': '0x0',
'healingTrienodes': '0x0',
'highestBlock': 17713637,
'startingBlock': 17711971,
'syncedAccountBytes': '0x0',
'syncedAccounts': '0x0',
'syncedBytecodeBytes': '0x0',
'syncedBytecodes': '0x0',
'syncedStorage': '0x0',
'syncedStorageBytes': '0x0'})

Con la conexión previamente creada y verificada la sincronía, podemos ejecutar los siguientes comandos para interactuar con la blockchain.

Obtener la dirección (Pública) del último minador de bloques

address=w3.eth.get_block('latest')['miner']
address

La sentenciaaddress en nuestro código nos retornaría la siguiente cadena que representa la dirección del último minador:

'0xeBec795c9c8bBD61FFc14A6662944748F299cAcf'

Desplegando nuestro contrato inteligente

Hasta aquí ya tenemos conexión con la Mainnet de Ethereum a través de nuestro nodo desplegado en Amazon Managed Blockchain, aunque para desplegar un contrato inteligente debemos contar con nuestra propia dirección pública, llave privada y ether para pagar los fees a los mineros que registran las transacciones en los bloques. Antes veamos un poco la definición de fee, gas, wei y ether:

  • Fee: En el contexto de la blockchain, el término «fee» se refiere a la tarifa o comisión que se paga por realizar una transacción en una red blockchain. Esta tarifa generalmente se paga en forma de criptomoneda y se utiliza para incentivar a los mineros o validadores de la red a procesar y confirmar la transacción. Las tarifas pueden variar según la congestión de la red y la prioridad de la transacción.
  • Gas: En Ethereum, el término «gas» se utiliza para medir la cantidad de recursos computacionales necesarios para ejecutar una operación o un contrato inteligente en la red. Cada operación tiene asignado un costo de gas, que se paga en forma de ether, la criptomoneda nativa de la red Ethereum. El gas es utilizado para controlar y limitar el uso excesivo de recursos en la red y para evitar ataques de denegación de servicio. Cuanto más compleja o costosa sea una operación, mayor será su consumo de gas.
  • Wei: Wei es la unidad más pequeña de valor en Ethereum. Es la denominación más básica de ether y representa una fracción muy pequeña de esta criptomoneda. Un ether se compone de 10^18 unidades de wei. En otras palabras, 1 ether equivale a 1 quintillón de wei. Generalmente, al realizar transacciones en Ethereum, los valores se expresan en ether, pero para cálculos más precisos o en casos de microtransacciones, se utilizan unidades más pequeñas como el wei.
  • Ether: Ether (ETH) es la criptomoneda nativa de la red Ethereum. Al igual que otras criptomonedas, se utiliza como medio de intercambio y almacenamiento de valor en la red. Sin embargo, a diferencia de Bitcoin, Ethereum va más allá de ser solo una criptomoneda y proporciona una plataforma para la ejecución de contratos inteligentes y la creación de aplicaciones descentralizadas (DApps). Ether se utiliza para pagar las tarifas de transacción, el costo del gas y también puede utilizarse como un activo para inversiones o intercambios en el ecosistema de Ethereum.

Tomando como ejemplo la dirección del último minador del bloque vamos a ver cuanto saldo tiene en su poder, para esto nos apoyamos en el siguiente comando:

balance = w3.eth.get_balance(account=address)
balance

y la salida es (A la hora de ejecutar el comando):

17412139095174006530126

Este saldo está dado en Wei, para pasarla a Ether usamos el siguiente comando

Web3.from_wei(balance, "ether")

Y la salida en Ether es:

17412.139095174006530126

La información es real, por cierto…

Creación de una llave privada y dirección pública

Como lo mencionamos con anterioridad, necesitaremos una dirección pública, una llave privada y por supuesto, saldo. Para esto crearemos nuestra propia llave privada y con ella crearemos una cuenta en la blockchain de Ethereum. Con el siguiente código crearemos nuestra llave privada (Se debe guardar, en un lugar seguro y nunca compartir) que nos servirá para crear nuestra llave (dirección) pública en la red.

import secrets
priv = secrets.token_hex(32)
private_key = "0x" + priv

Con el siguiente código crearemos la cuenta haciendo uso de la llave, de la siguiente manera:

acct = w3.eth.account.from_key(private_key)
print("Address:", acct.address)

La dirección de la cuenta recientemente creada es:

0xD3F1940946aC2930E5D7a31775887e636C6296c3

Para verificar el saldo de nuestra nueva cuenta:

account_balance = w3.eth.get_balance(account=acct.address)
account_balance

Y el saldo es,0Wei.

Si deseamos incorporar saldo, comprarlo con nuestras monedas locales podemos hacer uso de wallets recomendadas por Ethereum o podemos siempre pedirle a un buen amigo.

Para registrar la dirección en una de las Wallets, debemos disponer de nuestra llave privada, importamos la llave privada y se podrá tener la dirección pública de la cuenta para añadirle saldo desde acá. Ya con algo de saldo en nuestra nueva cuenta, debemos esperar a que los cambios del nodo donde se conecta nuestra cartera sea sincronizada con nuestro nodo por lo que podemos hacer uso del comando de sincronizar w3.eth.syncingsi regresa Falsehay que esperar a que esté sincronizado y poder ver nuestro nuevo saldo con el comando w3.eth.get_balance(account=acct.address).

account_balance = w3.eth.get_balance(account=acct.address)
account_balance

Y el nuevo saldo es de 8863924565277336Wei, en Ether serían aproximadamente0.0089Ether. Para convertir de Wei a Gwei o Ether puedes usar esta herramienta.

Trabajando con un contrato inteligente

Antes de empezar a trabajar con un contrato inteligente veamos que es un contrato inteligente según wikipedia. Un contrato inteligente (en inglés smart contract) es un programa informático que facilita, asegura, hace cumplir y ejecuta acuerdos registrados entre dos o más partes (por ejemplo personas u organizaciones). Como tales ellos les ayudarían en la negociación y definición de tales acuerdos que causarán que ciertas acciones sucedan como resultado de que se cumplan una serie de condiciones específicas. Un contrato inteligente es un programa que vive en un sistema no controlado por ninguna de las partes, o sus agentes, y que ejecuta un contrato automático el cual funciona como una sentencia if-then (si-entonces) de cualquier otro programa de ordenador. Con la diferencia de que se realiza de una manera que interactúa con activos reales. Cuando se dispara una condición pre-programada, no sujeta a ningún tipo de valoración humana, el contrato inteligente ejecuta la cláusula contractual correspondiente.

Teniendo claro el concepto de lo que se entiende por contrato inteligente; el contrato inteligente con el que vamos a interactuar es un ejemplo de Compra remota segura que encontraremos en la documentación de Vyper. Antes de entrar en detalle del contrato mencionaremos algunos conceptos a tener en cuenta, como lo son el ABI y el Bytecode.

  • Vyper: Es un lenguaje de programación específicamente diseñado para desarrollar contratos inteligentes en la plataforma Ethereum. Se destaca por su enfoque en la seguridad y la legibilidad del código. Vyper simplifica la sintaxis y restringe ciertos aspectos del lenguaje para evitar ambigüedades y reducir los errores. Está diseñado para ser menos propenso a vulnerabilidades y facilitar la auditoría de contratos inteligentes.
  • ABI (Application Binary Interface): La ABI es la interfaz binaria de una aplicación o un contrato inteligente en la blockchain. Define cómo interactuar con un contrato inteligente, especificando los métodos disponibles, sus parámetros y tipos de datos, así como las estructuras de datos utilizadas. La ABI es esencial para que los usuarios o aplicaciones externas puedan interactuar y comunicarse con un contrato inteligente de forma segura y confiable.
  • Bytecode: Es una forma de código de máquina que se utiliza en la plataforma Ethereum. Cuando un contrato inteligente se compila en Ethereum, el código fuente se traduce a bytecode, que es una secuencia de instrucciones ejecutables entendidas por la máquina virtual de Ethereum (EVM). El bytecode representa la versión compilada del contrato inteligente y se ejecuta en la EVM cuando se invoca una función o se realiza una transacción en el contrato.

El ejemplo que usaremos hace referencia a una compra remota segura donde dos personas interactuaran para la compraventa de un articulo. Dicho contrato se define de la siguiente manera:

  • El vendedor ofrece un articulo a la venta y deposita el 2 veces su valor. El saldo es 2x valor.
    • El vendedor puede reclamar su deposito y cerrar la venta si no han comprado aún el articulo (Abort)
  • El comprador paga el articulo a su valor establecido (Purchase), aunque adicionalmente debe dejar un deposito (seguro) igual al valor del articulo. El saldo es 4x valor.
  • El vendedor envía el articulo.
  • El comprador confirma recepción del articulo (Received).
    • El deposito se le regresa 1x valor.
    • El deposito (2x valor) + valor del articulo (1x valor) es regresado al vendedor
    • El balance es 0

Instalando Vyper y compilando el contrato

Teniendo el código de ejemplo guardado con la extensiónvypor ejemplosafe-remote-purchase.vy hacemos instalación de vyper con pip de la siguiente forma:

pip install vyper

Con la ayuda de la librería vyper, podemos compilar nuestros contratos haciendo uso del binario o el binario mas el ABI, nos apoyamos de una nueva terminal, activamos el entorno de desarrollo con. venv/bin/activate

vyper safe-remote-purchase.vy > bytecode.bin
vyper -f abi safe-remote-purchase.vy > abi.json

Con los comandos anteriormente usados sea crean el bytecode y el ABI, los cuales, serán usados.

En nuestro código ejecutamos los siguientes comandos:

# Obtenemos nuestro bytecode del archivo
bytecode_file = open ('bytecode.bin','r')
bytecode = bytecode_file.read()
bytecode = bytecode[2:-1]
bytecode
# Obtenemos nuestra abi del archivo
abi_file = open('abi.json', 'r')
abi = json.loads(abi_file.read())
abi

Estas variables serán usadas para el despliegue del contrato.

Salidas del Bytecode y de la ABI respectivamente:

346001811690506101b057348060011c905060005533600155600160035561018061002f61000039610180610000f36003361161000c57610168565b60003560e01c6364edfbf08118610051576004361061016e576003541561016e576000548060011b818160011c1861016e579050341861016e57336002556000600355005b3461016e576335a063b48118610080576004361061016e576003541561016e57600154331861016e57600154ff005b6383a6deb581186100cb576004361061016e5760035461016e57600254331861016e5760045461016e57600160045560006000600060006000546002546000f11561016e57600154ff005b633fa4f24581186100ea576004361061016e5760005460405260206040f35b6308551a538118610109576004361061016e5760015460405260206040f35b637150d8ae8118610128576004361061016e5760025460405260206040f35b636a5e26508118610147576004361061016e5760035460405260206040f35b6312fa6feb8118610166576004361061016e5760045460405260206040f35b505b60006000fd5b600080fda165767970657283000307000b005b600080fd
[{
    "stateMutability": "payable",
    "type": "constructor",
    "inputs": [],
    "outputs": []
}, {
    "stateMutability": "nonpayable",
    "type": "function",
    "name": "abort",
    "inputs": [],
    "outputs": []
}, {
    "stateMutability": "payable",
    "type": "function",
    "name": "purchase",
    "inputs": [],
    "outputs": []
}, {
    "stateMutability": "nonpayable",
    "type": "function",
    "name": "received",
    "inputs": [],
    "outputs": []
}, {
    "stateMutability": "view",
    "type": "function",
    "name": "value",
    "inputs": [],
    "outputs": [{
        "name": "",
        "type": "uint256"
    }]
}, {
    "stateMutability": "view",
    "type": "function",
    "name": "seller",
    "inputs": [],
    "outputs": [{
        "name": "",
        "type": "address"
    }]
}, {
    "stateMutability": "view",
    "type": "function",
    "name": "buyer",
    "inputs": [],
    "outputs": [{
        "name": "",
        "type": "address"
    }]
}, {
    "stateMutability": "view",
    "type": "function",
    "name": "unlocked",
    "inputs": [],
    "outputs": [{
        "name": "",
        "type": "bool"
    }]
}, {
    "stateMutability": "view",
    "type": "function",
    "name": "ended",
    "inputs": [],
    "outputs": [{
        "name": "",
        "type": "bool"
    }]
}]

Desplegando el contrato

Inicializamos el contrato y lo asignamos a la variablesafe_purchase, de la siguiente manera:

safe_purchase = w3.eth.contract(abi=abi, bytecode=bytecode)
safe_purchase

la salida es: web3._utils.datatypes.Contract

Obtenemos el precio del gas, con el siguiente código:

gas_price = w3.eth.gas_price
gas_price

Hay diversas estrategias para reducir el precio del gas² que permitan máximizar la utilidad de las operaciones en la red de Ethereum, en este caso obtenemos el precio actual del gas y lo asignamos a la variablegas_price.

Establecemos el nonce de nuestra cuenta:

nonce = w3.eth.get_transaction_count(acct.address)
nonce

Procedemos a construir la transacción.

Nota: Se puede omitir el campo gas y dejar que la misma construcción de la transacción determine la cantidad de gas a ser usada. Una cantidad más baja de gas haría que nuestro contrato no sea aceptado rápidamente lo que nos daría un error de timeout. El costo por desplegar un contrato según las páginas amarillas de Ethereum es de 32000 por lo que lo establecemos en la transacción.

Podemos establecer el precio del producto tasado en500Wei, añadiendo su valor dos veces (1000 Wei). Para este caso, no sé tomará y se dejará en un valor de 0, ya que no se usarán dos cuentas cómo establece el ejercicio.

transaction = safe_purchase.constructor().build_transaction(
    {
        "gasPrice": gas_price,
        "from": address,
        "nonce": nonce,
        "gas": 32000,
        # 'value': w3.to_wei(1000, 'wei'),
    }
)
transaction

Salida:

{
    'value': 0,  'chainId': 1, 
    'gasPrice': 16823783950, 
    'from': '0xD3F1940946aC2930E5D7a31775887e636C6296c3', 
    'nonce': 1, 
    'gas': 32000,
    'data': '0x346001811690506101b057348060011c905060005533600155600160035561018061002f61000039610180610000f36003361161000c57610168565b60003560e01c6364edfbf08118610051576004361061016e576003541561016e576000548060011b818160011c1861016e579050341861016e57336002556000600355005b3461016e576335a063b48118610080576004361061016e576003541561016e57600154331861016e57600154ff005b6383a6deb581186100cb576004361061016e5760035461016e57600254331861016e5760045461016e57600160045560006000600060006000546002546000f11561016e57600154ff005b633fa4f24581186100ea576004361061016e5760005460405260206040f35b6308551a538118610109576004361061016e5760015460405260206040f35b637150d8ae8118610128576004361061016e5760025460405260206040f35b636a5e26508118610147576004361061016e5760035460405260206040f35b6312fa6feb8118610166576004361061016e5760045460405260206040f35b505b60006000fd5b600080fda165767970657283000307000b005b600080fd',
    'to': b''
}

Ya creada la transacción, procedemos a firmarla con nuestra llave privada (No compartir la llave, nunca)

signed_transaction = w3.eth.account.sign_transaction(
    transaction,
    private_key=private_key
)

Habiendo sido firmada nuestra transacción obtenemos el hash de la transacción:

transaction_hash = w3.eth.send_raw_transaction(
    signed_transaction.rawTransaction
)
transaction_hash
HexBytes('0xdb074dcaa8764579a1bb69edb7f82ef073991a7728cd2dc9cdc99f85892a32e1')

Esperamos el recibo de la transacción:

transaction_receipt = w3.eth.wait_for_transaction_receipt(
    transaction_hash=transaction_hash
)

De acuerdo a la ocupación de los mineros y al gas establecido al momento de crear la transacción, esta será aceptada o no. Si es aceptada podemos ver el recibo así:

transaction_receipt

Interactuando con el contrato

Para interactuar con el contrato (sea como vendedor o comprador) debemos tener la dirección del mismo transaction_receipt.contractAddress, y la ABI (ya creada con anterioridad). Se puede hacer de la siguiente manera:

contract_instance = w3.eth.contract(
    address=transaction_receipt.contractAddress,
    abi=abi
)

Para cancelar el contrato podemos hacerlo mediante el siguiente código, estableciendo la dirección del vendedor en este caso la dirección corresponde a la nuestra por haber desplegado el contrato.

contract_instance.functions.abort().call({'from': acct.address})

Si quisiéramos interactuar cómo compradores tendríamos que invocar los métodos purchaseo receivedde la siguiente manera:

contract_instance.functions.purchase().call(
    {
        'from': acct_two.address, 'value': w3.toWei(1000, 'wei')
    }
)
contract_instance.functions.received().call({'from': acct_two.address})

Siendo acct_two.address la dirección del comprador.

Así es como con Amazon Managed Blockchain podemos interactuar con la blockchain de Ethereum a través de sus nodos, lo que nos brinda la capacidad de desplegar contratos inteligentes y aprovechar los beneficios de esta tecnología revolucionaria. Con la integración de Amazon Managed Blockchain, obtenemos una conexión directa y confiable lo que nos ofrece un mundo de posibilidades para aprovechar las características únicas de la blockchain, como la transparencia, la inmutabilidad y la seguridad, al desplegar contratos inteligentes.

Para recapitular, el despliegue de contratos inteligentes nos permite crear aplicaciones descentralizadas, automatizar procesos y establecer acuerdos digitales confiables sin la necesidad de intermediarios. Gracias a la simplicidad y escalabilidad de Amazon Managed Blockchain, podemos aprovechar al máximo las capacidades de la blockchain de Ethereum sin lidiar directamente con la complejidad técnica de configurar y mantener nuestra propia infraestructura blockchain.

Eliminación de recursos

Se recomienda eliminar los recursos creados por guía de este blog, para evitar costo innecesarios.

En la consola de AWS navegamos hasta el servicio de Amazon Managed Blockchain y buscamos acceso basado en token, seleccionamos el previamente creado y le damos clic en eliminar. Luego en redes, ingresamos a redes públicas, y procedemos a eliminar el nodo creado en red de Ethereum.

¹ Donde ver resultados elecciones Guatemala

² Estrategias para reducir los costes del gas


Sobre el autor

Juan Miguel Bermúdez Mieles es arquitecto de soluciones en Amazon Web Services para Sector Público. Juan Miguel apoya a distintas entidades e instituciones públicas en Centro América y el Caribe en la adopción de nuevas tecnologías y prácticas que permitan el mejoramiento de sus servicios.

 

 

 

 

Revisores técnicos

 

Forrest Colyer es arquitecto gerente de soluciones web3/blockchain en AWS. Cuenta con 8 años de experiencia trabajando junto a clientes tanto en soluciones de blockchain privadas lideradas por consorcios como en soluciones de cadenas de bloques públicas que abordan casos de uso relacionados con las NFT y las DeFi. Él trabaja directamente con las partes interesadas desde técnicas hasta empresariales para identificar los casos de uso de la blockchain e implementar soluciones de alto impacto.

 

 

 

 

 

Arturo Minor Bahena es un arquitecto de soluciones de prototipos ubicado en la Ciudad de México. Le gusta el aire libre y viajar, y le interesan las ciencias de la computación, los idiomas y la tecnología. Trabaja en AWS para ayudar a los clientes a innovar, desarrollar y visualizar nuevas soluciones.