En el Bloque #1, sentamos la base teórica de las diferentes capas de una blockchain. En este Bloque #2, iremos buceando un poco entre estas capas para hacer un script sencillo en Python interactuando con la blockchain de Ethereum y Bitcoin.
Quería empezar con algo sencillo, una suerte de Hola Mundo, pero específicamente sobre un script de blockchain y me puse a pensar que podría ser algo parecido. Tenía que ser algo de un nivel básico, pero lo suficientemente interesante para poder entender la interacción entre un script y una blockchain. Terminé decidiendo que este script introductorio va a ser la consulta del balance de las billeteras de los creadores de cada red. Para Ethereum, vamos a ver cual es la cantidad de ether que posee Vitalik Buterin en 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 (o vitalik.eth) y en Bitcoin la cantidad de btc que posee Satoshi Nakamoto en 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa.
Antes de empezar a ver código, hay que aclarar como vamos a interactuar con la blockchain. Para poder hacer consultas a Blockchain necesitaremos conectarnos a través de un nodo. Ese nodo puede ser local, es decir, nosotros corremos un nodo en nuestra pc/servidor el cuál está conectado constantemente a la blockchain en tiempo real o podemos utilizar un servicio de un tercero el cual nos provee el nodo y nosotros nos conectaremos a la blockchain a través de el. Los proveedores suelen llamarlo Node As A Service (NaaS) ya que nos presta un nodo pagando únicamente por lo que usamos y evitando la parte técnica de montar un nodo propio.
Más adelante haré un benchmarking de los diferentes proveedores comparando sus diferentes servicios, pero cabe destacar que la mayoría tiene un free tier que podemos utilizar holgados para hacer estas pruebas. Hay que tener presente que para Bitcoin, posiblemente por los casos de uso para la cual fue pensada, no es tan común ver proveedores de NaaS.

Explicación de como funciona un Nodo as a Service en Ethereum – Fuente: INFURA
Ethereum – Hola Vitalik
La librería que utilizaremos es web3 y brinda amplios usos para interactuar con blockchain. El código puede verse en el Git de Bloque X:
https://github.com/fergmolina/BloqueX/blob/main/Bloque_2/ethereum.ipynb
Como verán el código es bastante sencillo:
- Se crea un objeto llamado Web3 el cual, utilizando nuestra URL del proveedor de NaaS se conecta a la blockchain de Ethereum
- Chequeamos que estemos conectados. En caso contraria, el script falla
- Chequeamos el balance de ether que tiene una billetera pasada por parámetro. Al crear una función llamada get_ether_balance y que recibe la wallet por parámetro, podemos reutilizarla para chequear diferentes billeteras.
- La función get_balance devuele la cantidad de tokens que tiene esa billetera en la red nativa. Si utilizaramos este mismo script en otra blockchain EVM compatible obtendriamos la cantidad de token nativo de esa red. Por ejemplo, si lo hicieramos en Polygon obtendriamos la cantidad de MATIC que tiene una wallet.
- El resultado de get_balance es en la minima unidad del token. Para el caso de Ethereum, esa unidad es Wei (10^-18 ETH) y es por eso que debemos hacer una conversión a ether utilizando la función fromWei y pasando por parametro ‘ether’
- Finalmente, se imprime el balance
| unidad | valor en wei | wei | valor en ether |
| wei | 1 wei | 1 | 10^-18 ETH |
| kwei | 10^3 wei | 1,000 | 10^-15 ETH |
| mwei | 10^6 wei | 1,000,000 | 10^-12 ETH |
| gwei | 10^9 wei | 1,000,000,000 | 10^-9 ETH |
| microether | 10^12 wei | 1,000,000,000,000 | 10^-6 ETH |
| milliether | 10^15 wei | 1,000,000,000,000,000 | 10^-3 ETH |
| ether | 10^18 wei | 1,000,000,000,000,000,000 | 1 ETH |
Tengan en cuenta que deben crear su propia cuenta en un NaaS y cambiar el URL del nodo por el suyo. Para este caso particular, recomiendo que utilicen INFURA, el cual tiene hasta 100 k de requests por día.
Bitcoin – Hola Satoshi
Primero y principal, hay que aclarar que nadie sabe exactamente cual o cuales son las wallets de Satoshi Nakamoto. Está socialmente aceptado que la wallet que obtuvo el reward por minar el bloque génesis de Bitcoin es su wallet y vamos a utilizar esa misma.
La librería que utilizaremos es bitcoincli. Es una librería que encapsula el software de Bitcoin Core, el cual proporciona diferentes funciones para interactuar con la blockchain como si fuese un nodo. Utilizaremos algunas de estas funciones para poder obtener el balance de la wallet de Satoshi. El código puede verse en:
https://github.com/fergmolina/BloqueX/blob/main/Bloque_2/bitcoin.ipynb
La lógica del código es la siguiente:
- Se crea un objeto llamado Bitcoin de la libreria bitcoincli, el cual es instanseado con los datos de nuestro nodo de Chainstack
- Se crean las variables de la wallet a la cual vamos a consultar. Hay dos formas de realizar las consultas: utilizando la address como hicimos en Ethereum o utilizando la Public Key. Espérenme un poco, ya les explicaré las diferencias.
- Se usa la función scantxoutset la cual uno puede pasarle un listado de wallets y debe colocar «start» como parámetro inicial
- Esta función devuelve un objeto con todas las unspent transaction output set (UTXO set) que traducido al español básico sería todo el BTC disponible que tiene una wallet para poder utilizar. La suma de todo ese listado de UTXO, nos da el total disponible que también viene calculado en el objeto como «total_amount«
- Finalmente, se imprime el balance
Parecería que el output final es el balance total de la wallet de Satoshi, pero hay que tener algunas consideraciones:
- Los bloques viejos pagaban sus rewards usando Pay to Public Key (p2pk), es decir, el reward del bloque era pagado a la Public Key de una wallet. Esto fue cambiando con el tiempo y el estándar actual es Pay to Public Key Hash (p2pkh). El problema es que la primera propuesta exponía la Public Key en el bloque y era susceptible a un futuro ataque de una Quantum Machine y pudiera obtener la Private Key. Es por esto que paulatinamente se cambio a p2pkh, la cual no expone la Public Key.
- scantxoutset no tiene en cuenta las transacciones p2pk, por lo que si uno utiliza la address 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa obtendrá un balance sin tener en cuenta los 50 BTC que se enviaron como reward del bloque génesis. Si uno utiliza la Public Key obtendrá el balance total
- ¿Intentaste usar la Public Key y aún te faltan los 50 BTC del bloque génesis? Esto ocurre porque por un problema de código (que no está claro si fue introducido adrede o no) que hace que el reward del bloque génesis haya quedado sin poderse utilizar ya que es obviado en el balance disponible de esa wallet
- Si aún no me crees, podes utilizar la address y la public key del bloque 10 y probar. Está agregado en el último bloque del script publicado.
Como mencioné más arriba, es difícil encontrar un NaaS para Bitcoin. Recomiendo utilicen Chainstack el cual provee conexión a una amplia gama de blockchain, incluyendo Bitcoin. Otra forma de hacer este script, podría haber sido utilizando una API de algún blockchain explorer los cuales ya tienen indexados todos estos balances y transacciones, pero perdía un poco la gracia.
Ahora si! Bienvenidos al misterioso mundo de Blockchain. Como te habrás dado cuenta a esta altura del partido, cada blockchain tiene sus particularidades y sus misterios. Ninguna es igual. Pero no te preocupes que en este blog iremos viendo como ir domándolas.

Deja un comentario