En este articulo de research vamos a comunicarnos con la blockchain de ethereum para consultar ciertos parametros de smart contracts de una blockchain en python, de forma sencilla y para entusiastas de la programacion y las cryptomonedas.

Que es una blockchain

Una blockchain es un libro de contabilidad compartido, que ademas una vez añadida una entrada, es inmutable, por consecuencia facilita el proceso de registro de transacciones y de seguimiento de los activos digitales. Los activos digitales pueden ser bienes tangibles o intangibles. Cualquier elemento puede ser puede ser rastreado y comercializado en una red blockchain, reduciendo los riesgos y los costes para los involucrados.


A medida que se produce una transaccion se generan datos, que se añaden a el bloque. Estas transacciones o datos que añadimos a la cadena son inalterables, y muestran el movimiento de un activo. Un bloque de datos puede registrar toda la informacion que el desarollador necesite almacenar, incluso informacion de fuera de la blockchain mediante oraculos.


Todos los bloques estasn conectados entre si, teniendo el bloque actual una vinculacion con el anterior, y con el posterior. Estos bloques forman una cadena de datos a medida que los activos se mueven de una billetera a otra, los bloques confirman tanto el tiempo exacto de la transaccion y se una de forma segura a la cadena para evitar que se alteren o se inserten bloques invalidos.


Este proceso esta totalmente descentralizado, y se necesita un poder de el 51% de control sobre la red, para poder alterar de forma fraudulenta la cadena de bloques, cosa actualmente imposible.

Que es ETH

Ethereum es una cadena de bloques, y exapnde su uso a una gran variedad de aplicaciones de la misma, en base a smart contracts. Su moneda llamada ether es la segunda mas capitalizada del mercado y actualmente esta controlada por Vitálik Buterin

Que es un Smart Contract

Es un contrato inteligente, que se ejecuta y se cumple de forma atuomatica a partir de lo programado en su codigo. Su principal valor reside en la seguridad, la transparencia y la confianza entre los participes del contrato. Evitando falsificaciones, malentendidos ademas evitando intermediarios.
La idea fue propuesta en los años 90 por Nick Szabo. Los contratos inteligentes actuales, se almacenan en una blockchain, usualmente ethereum o binance smart chain, y por consecuencia no puede ser alterada, ademas de automatizar pagos y contrapartidas dentro del propio contrato.

Hipoteticos casos de uso basicos de Smart Contract

  • Recursos Humanos : Verificacion de experiencia laboral o validacion de titulos academicos. Y viceversa sobre el trato recibido por parte de la empresa
  • Propiedad Intelectual: Traspasar el registro de propiedad intelectual a una blockchain para ahorrar costes en los tribunales.
  • Salud: Trazabilidad de medicamentos, gestion de la cadena del frio, pasaportes sanitarios, intestigaciones de clinica… Las opciones tan limitadas como la capacidad de discurrir del ser humano
  • Elecciones;: Evitar fraude electoral, validacion de no-errores en las mismos, verificar identidad de los votantes etc…
  • Seguros : procesas y tramitar reclamaciones, y determinar con mayor exactitud el tipo de poliza, la prima y las garantias mas optimas a tu perfil

Teoria para interactuar con un smart contract

  • Usuario A inicia sesion en su monedero virtual.
  • Usuario A envia una transaccion de su monedero hacia la blockchain
  • La transaccion llega a la blockchain donde se confirma su veracidad e identidad
  • Se aprueba la transaccion
  • La transaccion incluye un codigo que define que tipo de transaccion debe ejecutarse (mediante llamadas .call())
  • La transaccion se añade como un bloque dentro de la blockchain

Aplicacion practica en Python

Para conectarnos a una blockchain de manera sencilla en Python, utilizaremos el protocolo JSON RPC. En la imagen posterior se observa un esquema clasico de infraestructura de red.

smart contracts en ethereum con python

Para poder enviar las peticiones JSON RPC y conectarnos a la blockchain de Ethereum (Podria ser Binance Chain, o Poligon entre otras) utilizaremos la libreria web3

from web3 import Web3
import requests

Lo que necesitaremos sera un nodo de infura para poder conectarnos a la red ETH. Tambien podriamos desplegar una instancia con ganache-cli y crear nuestra propia testnet, pero esa parte, la dejamos para mas adelante.

eth_url  = "https://rinkeby.infura.io/v3/8ffdbdfd42d4411983746f362c4e46cd"  # La direccion del nodo de infura

Creamos un objeto denominado eth3, nos conectamos a la blockchain y comprobamos que realmente estamos en ella

eth3 = Web3(Web3.HTTPProvider(eth_url))
print("Status ETH: " + str(eth3.isConnected()))
print("Last Block Minned on ETH : " + str(eth3.eth.blockNumber))

Una vez verificamos que estamos conectados a la red ETH. Neceistamos crear una funcion, que nos devuelva los ABI de una direccion de un contrato. En este caso vamos a utilizar la api de etherscan, y mediante la libreria request, eviamos una peticion para que nos lo mande, desde la funcion contract.getabi de etherscan

def get_abi(address):
    return_val = requests.get('https://api.etherscan.io/api', params={
                    "module": "contract",
                    "action": "getabi",
                    "address": address,
                    "apikey": "62YXXXSIA94HC9XXZNWWTGXXXXXX1PMQH5YSF9XNWYXXX91G"
                }).json()['result']
    return return_val

Una vez tenemos la funcion lista, fijamos la direccion del contrato a la direccion del contrato principal de Tether y guardamos dentro de la variable ABI, todo el abi de Tether en formato json, para su posterior uso.

contract_address = '0xdAC17F958D2ee523a2206206994597C13D831ec7'
ABI = get_abi(contract_address)

En este paso vamos a traer de la blockchain el contrato, para poder hacer peticiones y recibir respuestas. Cosas sencillas sin necesidad de tener que modificar nada en la blockchain o pagar gas.

contract = eth3.eth.contract(contract_address, abi=ABI)

En este punto ya podemos hacer consultas al contrato, como sus decimales, su max supply, su current supply, etc.. Que dejaremos en el tintero para que cada uno investigue, o esperar a la proxima publicacion para poder avanzar.