TARDÍGRADOS

Ciencia en español -ʟᴀ ʀᴀᴢóɴ ᴇsᴛá ᴀʜí ғᴜᴇʀᴀ-

Archive for 27 febrero 2020

Iconos para bloques en la blockchain de bitcoin

Posted by Albert Zotkin en febrero 27, 2020

Ayer, mientras ganaba algunos miles de euros minando bitcoins, se me ocurrió una idea gráfica, para identificar mediante una imagen a cada uno de los bloques en la blockchain.
Como cada bloque posee tres hashes principales de 32 bytes cada uno: el hash propio del bloque, el del bloque inmediato anterior, y el de la raíz del árbol Merkle de las transacciones., se me ocurrió lo siguiente: cada dígito de cada uno de esos tres hashes podría ser un código de color de una terna RGB, rojo, verde y azul, para cada pixel de la imagen. Pongamos un ejemplo. Elijamos el Bloque Génesis, es decir, el primer bloque de bitcoin que fue minado por el propio Satoshi Nakamoto. El objeto JSON de este histórico bloque es:

{
        "0": {
                "hash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
                "version": 1,
                "previous_block": "0000000000000000000000000000000000000000000000000000000000000000",
                "merkle_root": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
                "time": 1231006505,
                "bits": 486604799,
                "fee": "0.00000000",
                "nonce": 2083236893,
                "n_tx": 1,
                "size": 285,
                "block_index": 0,
                "main_chain": true,
                "height": 0,
                "received_time": null,
                "relayed_by": null,
                "transactions": [
                        {
                                "double_spend": false,
                                "block_height": null,
                                "time": 1231006505,
                                "lock_time": 0,
                                "relayed_by": "0.0.0.0",
                                "hash": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
                                "tx_index": 0,
                                "version": 1,
                                "size": 204,
                                "inputs": [
                                        {
                                                "sequence": 4294967295,
                                                "script_sig": "04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73",
                                                "coinbase": true
                                        }
                                ],
                                "outputs": [
                                        {
                                                "n": 0,
                                                "value": "50.00000000",
                                                "address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
                                                "tx_index": 0,
                                                "script": "4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac",
                                                "spent": false
                                        }
                                ]
                        }
                ]
        }
}
Por lo tanto vemos que los tres hashes principales son:

                "hash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
                "previous_block": "0000000000000000000000000000000000000000000000000000000000000000",
                "merkle_root": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
los cuales son números de 64 dígitos en base hexadecimal, es decir, 32 bytes cada uno. Podemos diseñar una imagen en formato PNG de 64 x 64 pixels. Para ello vamos seleccionado ternas de dígitos para componer el RGB de cada pixel. Así tendremos que el primer pixel de nuestra imagen (posición superior izquierda será el RGB(4,0,0), porque 4 es el primer dígito en el hash de la Merkle root, y 0 para los otros dos. El siguiente pixel sería RGB(a,0,0), y los cuatro siguientes son RGB(5,0,0), RGB(e,0,0), RGB(1,0,0). Pero como esos dígitos son hexadecimales, sólo van desde el 0 al 15, en lugar de ir del 0 al 255, lo cual produciría un color bastante oscuro. Por lo tanto, le vamos a dar brillo a cada pixel duplicando cada componente RGB hasta completar el byte, es decir, sería como multiplicar por 17 cada componente (dígito hexadecimal). Así nuestros pixeles, con brillo serían: RGB(44,0,0), RGB(aa,0,0), RGB(55,0,0), RGB(ee,0,0), RGB(11,0,0), y el ultimo pixel de la imagen PNG sería el RGB(bb, 0, ff). Es decir, nuestra imagen PNG para el Bloque Génesis sería esta:

ID imagen del Bloque Génesis de Satoshi Nakamoto

O sea, podemos crear la imagen dinámicamente mediante lenguaje PHP, creando una función que tome como argumentos esos tres hashes del bloque en un array. Yo escribí el código para una función que haga eso. Esa función es la siguiente:

function ImageFromHash3($hash){
if(strlen($hash[0])!=64 && strlen($hash[1])!=64 && strlen($hash[2])!=64) return '';
// Create a 64 x 64 image
$image = imagecreatetruecolor(64, 64);
$n=0;
$r = str_split($hash[0],1);
$g = str_split($hash[1],1);
$b = str_split($hash[2],1);
				
for ($y = 0; $y < 64; $y+=8){
for ($x = 0; $x < 64; $x+=8) {						
imagefilledrectangle($image, $x, $y, $x+8, $y+8, 
imagecolorallocate($image, hexdec($r[$n])*17, hexdec($g[$n])*17, hexdec($b[$n])*17 ));			   		
$n ++;			
}				 
ob_start();
imagepng($image);
$im = ob_get_contents();
ob_end_clean();
imagedestroy($image);
return '<img src="data:image/png;base64,'.base64_encode($im).'" />';					
}
Y así, la podemos presentar en nuestra página web. Pongamos un ejemplo más. El ultimo bloque validado por la minería de bitcoin, hasta la fecha, tiene una altura de 619122 (la altura n de un bloque significa el orden, o sea, que existen n bloques antes que él en la blockchain). Este bloque de fecha 26/2/2020 22:16:32, posee los siguientes tres hashes:

                "hash": "0000000000000000001159ec899185ec8f056b7655bf7898fef186454efde94f",
                "previous_block": "00000000000000000008e901529a41ef9350ff42166c8abeea80f6e708a46463",
                "merkle_root": "1adeb8334f75e32a335b19005871b2be3ac5555c661ce17b81131b0c43579a61",

y ha sido minado por la pool ViaBTC. La imagen generada con nuestra función sería esta:

ID imagen del bloque con altura = 619122

Como vemos la imagen ha sido creada dinámicamente en formato PNG con el lenguaje de programación PHP, y los bytes del rawdata de la imagen están codificados en base64, mediante la función base64_encode. Y el rawdata está en la variable $im. Es decir:

data:image/png;base64,iVBORw0KGg
oAAAANSUhEUgAAAEAAAABACAIAAAAlC+
aJAAAACXBIWXMAAA7EAAAOxAGVKw4bAA
ABWklEQVRoge2awY2DMBRE8SoNeEvwlk
ALUAKUACUkJUAJSwlQApSwtOASQgnZBm
YOOU0szTsOlqOnL32bH0KsML8kr0nO9j
nfzDeSM77eXP9xWECNBdRYQE1oyIOd5A
+SZ5Kz86Ql+UXyieTFV8ACaiygxgJqAr
vfMxK5+Q+kUfcDPmmmDefj2OGNIj5piq
+ABdRYQI0F1NxShxt4feJ+f93xRn3Ebw
prj0+a8Txgvj/xOVCTwVPxFbCAGguosY
CaWyaDoS4PME9HgHnecP9eXvgeX1d4/6
WdYX7PeGJUfAUsoMYCaiygJgyRzGFIvJ
H+vZP5Tzrwe8JPIvOliPOm9jnwmVhAjQ
XUFC8QpucLPpgP8o9txn06Pb7x8hceJK
0jfk9oJ5z/zfh3i6+ABdRYQI0F1ISmwv
f4a1phnsg9Pi24f7P1MeMvRI+E8+3EXz
AVXwELqLGAGguo+Qen00MzJKmE8gAAAA
BJRU5ErkJggg==
Saludos, me siento como bloqueado ya 😛

Posted in Bitcoin, Criptomonedas, informática, Matemáticas | Etiquetado: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a Comment »

 
A %d blogueros les gusta esto: