El camino difícil de la mineria con Bitcoin

“Si alguna vez te has preguntado que es lo que realmente pasa con la minería de Bitcoins, llegaste al lugar correcto.”


El propósito de la minería.

Underc0de - Minería BTC

La minería de bitcoin es a menudo considerado como la forma de crear nuevos bitcoins. Pero eso realmente es, sólo un propósito secundario.

La principal importancia de la minería es asegurar que todos los participantes tengan una visión coherente de los datos de Bitcoin.

Como Bitcoin es un sistema distribuido de persona a persona (“peer to peer”), no hay una base de datos central que mantenga un registro de quién posee Bitcoins. En su lugar, el registro de todas las transacciones se distribuye a través de la red.

El principal problema con un registro de transacciones distribuidas es: ¿cómo evitar inconsistencias que podrían permitir a alguien generar el mismo Bitcoin dos veces?.

La solución en Bitcoin es minar las transacciones pendientes en un bloque de transacciones aproximadamente cada 10 minutos. Lo que los hace oficiales. Las transacciones conflictivas o inválidas no son permitidas en los bloques, entonces la doble minería es un problema resuelto.

Aunque las transacciones mineras en los bloques evitan el doble minado, esto representa nuevos problemas:

  • ¿Cómo evitar que las personas minen bloques aleatorios?
  • ¿Cómo se decide quien obtiene Bitcoins de un bloque minado?
  • ¿Cómo acuerda la red qué bloques son válidos?

Resolver estos problemas es la innovación clave de Bitcoin: La minería se hace muy, muy difícil debido a la técnica llamada “Proof Of Work”.

Underc0de - Minería BTC

Esta hace que se necesite una enorme cantidad de esfuerzo computacional para extraer un bloque, pero que sea fácil para los compañeros de la red verificar que un bloque ha sido exitosamente extraído.

Cada bloque minado hace referencia al bloque anterior, formado por una cadena ininterrumpida de nuevo al primer bloque Bitcoin.

Esta cadena de bloques asegura que todos estén de acuerdo en el registro de transacción. También asegura que nadie pueda alterar los bloques de la cadena, ya que volver a minar todos los bloques siguientes seria computacionalmente imposible.

Mientras nadie controle más de la mitad de los recursos computacionales del mundo, la minería seguirá siendo competitiva y nadie podrá controlar la cadena de bloques.

Como un efecto secundario, la minería añade nuevos Bitcoins al sistema. Por cada bloque minado, los mineros obtienen actualmente 25 Bitcoins, lo que alienta a los mineros a trabajar duro para minar los bloques.

Con la posibilidad de recibir dinero cada 10 minutos, hay muchas ganancias en la minería.


Como funciona la minería.

Underc0de - Como funciona la minería btc

La minería requiere una tarea que es muy difícil de realizar, pero fácil de verificar.

La mineria Bitcoin utiliza criptografía, con un algoritmo de hashing llamado “doble SHA-256”.

Un algoritmo de hash (como SHA-256, MD5, CRC32 entre muchos otros) toma un fragmento de datos como entrada (cualquier dato de cualquier longitud) y lo reduce a un valor de hash mas pequeño (en este caso 256 bits).

Con un hash criptográfico, no hay manera de obtener un valor de hash que desee sin intentar un montón de entradas (prueba y error).

Pero una vez que encuentra la entrada que de el valor hash que desea, es fácil para cualquiera verificar el hash.

Por lo tanto, el hash criptográfico se convierte en una buena manera de implementar “Proof Of Work” de Bitcoin.

Con más detalle, para extraer un bloque, primero recopila las transacciones nuevas en un bloque. A continuación, Hashea el bloque para formar un valor de hash del bloque de 256 bits (convertimos el bloque en un hash).

Si el hash comienza con ceros suficientes, el bloque se ha extraído con éxito, se envía a la red Bitcoin y el hash se convierte en el identificador del bloque.

La mayoría de las veces el hashing no tiene éxito (no retorna un hash que inicie con ceros) por lo que se modifica el bloque ligeramente y se vuelve a intentar una y otra vez miles de millones de veces. Aproximadamente cada 10 minutos alguien conseguirá minar un bloque, y el proceso comenzará de nuevo.

El siguiente diagrama muestra la estructura de un bloque específico y cómo es hasheado.

Underc0de - Estructura bitcoin

La parte amarilla es el encabezado del bloque, seguido de las primeras transacciones que entran en el bloque. La primera transacción es la transacción especial “coinbase” que concede la recompensa de la minería al minero.

Las transacciones restantes son “transacciones Bitcoin estándar” moviéndose por ahí. Si la cabecera del hash comienza con ceros suficientes, el bloque se extrae con éxito. Para éste bloque, el hash que tiene éxito es:

0000000000000000e067a478024addfecdc93628978aa52d91fabd4292982a50

La cabecera de bloque contiene varios campos que describen el bloque.

  • El primer campo del bloque es la versión del protocolo.
  • Seguido por el hash del bloque anterior en la cadena de bloques, lo que garantiza que todos los bloques formen una secuencia ininterrumpida en la cadena de bloques. (Inconvenientemente, el hash se invierte en la cabecera).
  • El siguiente campo es la raíz Merkle, un hash especial de todas las transacciones en el bloque. También es parte clave de la seguridad de Bitcoin, garantiza las transacciones para que no se puedan cambiar una vez que son parte de un bloque.

Un pequeño programa para minar un bloque.

Underc0de - Minando un bloque

El programa en sí es bastante simple – la parte más difícil del código es calcular el objetivo de dificultad a partir de bits.

La siguiente tabla muestra los hash obtenidos de los valores nonce seleccionados.

El punto clave es que cada nonce genera un valor hash básicamente aleatorio.

De vez en cuando un nonce afortunado generará un hash que comienza con algunos ceros.

Para obtener una gran cantidad de ceros, es necesario probar un número exponencialmente grande de nonces.

Para este bloque, el nonce “ganador” es 856192328.

nonce hash
0 5c56c2883435b38aeba0e69fb2e0e3db3b22448d3e17b903d774dd5650796f76
1 28902a23a194dee94141d1b70102accd85fc2c1ead0901ba0e41ade90d38a08e
2 729577af82250aaf9e44f70a72814cf56c16d430a878bf52fdaceeb7b4bd37f4
3 8491452381016cf80562ff489e492e00331de3553178c73c5169574000f1ed1c
39 03fd5ff1048668cd3cde4f3fb5bde1ff306d26a4630f420c78df1e504e24f3c7
990 0001e3a4583f4c6d81251e8d9901dbe0df74d7144300d7c03cab15eca04bd4bb
52117 0000642411733cd63264d3bedc046a5364ff3c77d2b37ca298ad8f1b5a9f05ba
1813152 00000c94a85b5c06c9b06ace1ba7c7f759e795715f399c9c1b1b7f5d387a319f
19745650 000000cdccf49f13f5c3f14a2c12a56ae60e900c5e65bfe1cc24f038f0668a6c
243989801 0000000ce99e2a00633ca958a16e17f30085a54f04667a5492db49bcae15d190
856192328 0000000000000000e067a478024addfecdc93628978aa52d91fabd4292982a50

Debo señalar que los engañe por comenzar con un bloque que tendría éxito al ser minado.

La mayoría de los intentos de extraer un bloque fallarán por completo – ninguno de los valores de nonce tendrá éxito.

En ese caso, debe modificar el bloque ligeramente y volver a intentarlo.

La marca de tiempo se puede ajustar (razón por la cual la marca de tiempo en bloques minados es a menudo incorrecta).

Se pueden agregar nuevas transacciones al bloque, cambiando el hash Markle. La transacción “coinbase” puede ser modificada – esto resulta ser muy importante para las pools. Cualquiera de estos cambios dará lugar a hashes totalmente diferentes, así que los valores del nonce se pueden intentar otra vez.

El programa Python hace unos 42.000 hashes por segundo, que es un millón de veces más lento que el hardware utilizado por los mineros reales.

El programa tomaría en promedio cerca de 11 millones de años para minar un bloque mediante “rasguños”.


La minería es muy difícil.

Underc0de - El camino dificil de la minería

Con la dificultad actual, las chances de que un hash tenga éxito es un poco menos de uno en 10^19.

Encontrar un hash exitoso es más difícil que encontrar un determinado grano de arena de todos los granos de arena en la Tierra.

Para encontrar un hash cada diez minutos, la tasa de hashing a Bitcoin debe ser increíblemente grande.

En la actualidad, los mineros de la red Bitcoin están haciendo unos 25 millones de gigahashes por segundo.

Es decir, cada segundo alrededor de 25.000.000.000.000.000 bloques son hasheados.

El único propósito de encontrar un pequeño hash es hacer la minería difícil, que es fundamental para la seguridad de Bitcoin.

La minería es financiada principalmente por la recompensa de 25 bitcoin por bloque, y ligeramente por los honorarios de transacción (aproximadamente 0.1 bitcoin por bloque).

Dado que la recompensa de la minería actualmente funciona a alrededor de $15.000 por bloque, que paga por un montón de hardware. Por transacción, los mineros están recibiendo alrededor de $34 en la recompensa de la minería y $0.10 en honorarios (stats).


Minando con un pool.

Underc0de - Minando con un pool

Debido a que la minería es tan difícil, normalmente se hace en los pools de minería, donde un grupo de mineros comparte el trabajo y comparte las recompensas.

Si mina por usted mismo, puede que tenga éxito en minar un bloque y conseguir 25 Bitcoins cada pocos años.

Por la minería como parte de una pool, podría conseguir una fracción de un Bitcoin cada día, que para la mayoría de la gente es preferible.

Los pool de minería, una técnica interesante para ver cuánto trabajo están haciendo los mineros.

Ellos envían un bloque para ser minado y obtener actualizaciones de un minero cada vez que un minero obtiene una solución parcial.

Cada solución parcial demuestra que el minero está trabajando duro en el problema y le da al minero una parte de la recompensa final cuando alguien logra minar el bloque.

Por ejemplo: Si la minería de Bitcoin requiere un hash comenzando con 15 ceros, el grupo de minería puede pedir hashes comenzando con 10 ceros, lo que es un millón de veces más fácil.

Dependerá del hardware, un minero podría encontrar tal solución cada pocos segundos o unas pocas veces por hora.

Eventualmente, una de estas soluciones comenzará con no sólo 10 ceros, sino 15 ceros, minando con éxito un bloque y ganando la recompensa para el pool.

La recompensa se divide en función del recuento de acciones de cada minero como una fracción del total, y el operador de la piscina toma un pequeño porcentaje por gastos generales.

La mayoría de las veces alguien fuera del pool mina un bloque primero. En ese caso, el operador del pool envía nuevos datos y los mineros comienzan a minar el nuevo bloque.

Las personas en un pool pueden ponerse nerviosas si pasa un largo tiempo sin un pago debido a la “mala suerte de la mineria”.


Stratum: La comunicación entre un pool y los mineros.

Underc0de - Stratum

Vamos a ver en detalle la comunicación entre un minero y el pool.

La comunicación entre el pool y los mineros es interesante. la pool debe proveer trabajo eficientemente a los mineros y recolectar sus resultados rápidamente.

El pool debe asegurarse de que los mineros no están duplicando el trabajo y asegurarse que los mineros no pierdan el tiempo trabajando en un bloque que ya ha sido minado.

Un tema importante para las pools mineras es cómo apoyar a los mineros rápidos.

El nonce en el encabezado es demasiado pequeño para los mineros rápidos ya que ellos recorrerán todos los valores posibles más rápido de lo que la piscina puede proveer nuevos bloques.

La solución es permitir que los mineros actualicen la transacción “coinbase” para que puedan poner nonces adicionales ahí.

Esto hace la mineria más complicada debido a que después de construir la transacción “coinbase” el minero debe recalcular el arbol de hash Merkle y luego intentar minar el bloque.

Vamos a mirar el protocolo de la pool de minería Stratum que es utilizado por muchas otras pools. (Algunos protocolos alternativos son los protocolos Getwork y Getblocktemplate).

El siguiente programa de Python utiliza el protocolo Stratum para realizar una solicitud de minería en el grupo de minería GHash.IO y muestra los resultados.

La siguiente información es lo que el grupo de minería devuelve a través de la red en respuesta al programa anterior.

Dado que el protocolo Stratum utiliza JSON-RPC, los resultados son ASCII legible en lugar de los paquetes binarios utilizados por la mayoría de Bitcoin.

Esto proporciona todos los datos necesarios para iniciar la minería como parte de la agrupación:

  • La primera línea es una respuesta del servidor del pool con los detalles de la suscripción.
    • Los primeros valores no son demasiado importantes.
    • El valor 4bc6af58 es el valor extranonce1 que se utiliza para construir el bloque.
    • Cada cliente obtiene un valor único para garantizar que todos los clientes de minería generan bloques únicos y no duplicar el trabajo.
    • El siguiente valor (4 bytes) es la longitud del valor de extranonce2_size que el minero pone en la “coinbase” durante la minería.
  • La segunda línea es un mensaje mining.set_difficulty a nuestro cliente.
    • Con una dificultad de 16. En comparación, la dificultad minera de Bitcoin es 3,129,573,174.52.
    • Por lo tanto, es aproximadamente 200 millones de veces más fácil obtener una participación en esta pool que tener éxito minando un bloque de forma independiente.
    • Es por eso que la gente se une a las pools.
  • La tercera línea es una notificación “mining.notify” a nuestro cliente.
    • Este mensaje define que bloque nosotros vamos a minar.
    • Hay una gran cantidad de datos devueltos en “params”, por lo que voy a explicar campo por campo.
job_id 58af8d8c
prevhash 975b9717f7d18ec1f2ad55e2559b5997b8da0e3317c803780000000100000000
coinb1 0100000001000000000000000000000000000000000000000000000000000000
0000000000ffffffff4803636004062f503253482f04428b055308
coinb2 2e522cfabe6d6da0bd01f57abe963d25879583eea5ea6f08f83e3327eba9806b
14119718cbb1cf04000000000000000000000001fb673495000000001976a914
80ad90d403581fa3bf46086a91b2d9d4125db6c188ac00000000
merkle_branch [“ea9da84d55ebf07f47def6b9b35ab30fc18b6e980fc618f262724388f2e9c591”, …]
version 00000002
nbits 19015f53
ntime 53058b41
clean_jobs false
  • El job_id se utiliza para identificar esta tarea de minería si el minero reporta éxito.

La mayoría de los campos se utilizan en la cabecera del bloque.

  • El prevhash es el hash del bloque anterior.
    • Al parecer, la mezcla de big-ending y little-endian no son lo suficientemente confusas entonces este valor hash también tiene cada bloque de 4 bytes invertido.
  • La versión es la versión de protocolo del bloque.
    • El nbits indica la dificultad del bloque.
      • El tiempo de timestamp no es necesariamente exacto.
  • Los campos coinb1 y coinb2 permiten al minero construir la transacción “coinbase” para el bloque.
    • Esta transacción se forma concatenando coinb1, el valor extranonce1 obtenido al inicio, el extranonce2 que el minero ha generado, y coinb2.
    • El resultado es una transacción en el protocolo Bitcoin.
  • La lista de hash merkle_branch permite al minero recalcular eficientemente el hash Merkle con la nueva transacción “coinbase”.
  • clean_jobs se utiliza si el minero necesita reiniciar los trabajos de minería.

Después de recibir estos datos, el minero puede comenzar a generar transacciones de “coinbase” y minería de bloques.


Creando un bloque para un pool

Underc0de - Creando un pool

Una vez que el minero ha recibido la información de la pool, es fácil formar la transacción de coinbase combinando:

  • coinb1
  • extranonce1
  • extranonce2
  • coinb2.

El siguiente diagrama muestra cómo la combinación de estos cuatro valores forman la transacción completa, con los nonces en el centro del script de coinbase. (El bloque siguiente es ligeramente diferente al descrito anteriormente).

Underc0de - combinación de estos cuatro valores forman la transacción completa

La estructura de la transacción coinbase es similar a una transacción regular, pero hay algunas diferencias importantes.

  • Una transacción normal transfiere Bitcoins de entradas (generalmente direcciones de origen) a salidas (normalmente direcciones de destino).
  • Una transacción coinbase está generando nuevos Bitcoins de la nada, en lugar de hacer una transferencia, por lo que la transacción es ligeramente diferente.

El hash de salida anterior y el índice son irrelevantes para la transacción coinbase.

El primer script es el scriptSig que firma la transacción para probar la propiedad de los Bitcoins entrantes.

En una transacción de coinbase, esto es irrelevante, por lo que en su lugar el campo se llama la “coinbase” y es en su mayoría son datos arbitrarios.

El campo “value” en la transacción coinbase es la recompensa de la minería de 25 bitcoin más cualquier bitcoins que sobran de las otras transacciones (los bitcoins que sobran se tratan como honorarios de minería).

Finalmente, tanto las transacciones regulares como la transacción coinbase utilizan el segundo script (scriptPubKey) para especificar los destinatarios de los Bitcoins.

Una vez que se crea la transacción coinbase, el hash para esta transacción coinbase se combina con los datos merkle_branch del conjunto para generar el hash Merkle para todo el conjunto de transacciones.

Debido a la estructura del hash de Merkle (explicado más adelante), esto permite que el hash para el conjunto entero de transacciones sea recalculado fácilmente.

Por último, el encabezado de bloque se construye a partir del nuevo hash Merkle y los datos proporcionados por la agrupación, y el algoritmo hash puede iterar sobre los valores nonce en el encabezado, al igual que el programa Python anterior.

Una vez que todos los valores de nonce han sido probados, el minero incrementa la extranonce2, genera una nueva transacción de coinbase y continúa.

Underc0de - Minería bitcoin

Informar al pool del éxito

Underc0de - Pool exitoso

La dificultad para una pool es mucho mas baja que la dificultad minera original de Bitcoin (menos ceros iniciales requeridos), por lo que es mucho más fácil obtener una parte. Cuando un bloque es hasheado a la dificultad de la pool, se le envía un simple mensaje JSON:

Los parámetros son:

  • El nombre del trabajador
  • id de trabajo
  • extranonce2
  • tiempo y encabezado nonce.

Esta información es suficiente para que el grupo construya la transacción coincidente, el encabezado y verifique el bloque.

Si el hash cumple la dificultad de la pool, obtendrá una parte. Si el hash también cumple con la dificultad de Bitcoin, mucho más difícil, el bloque se ha extraído con éxito.

En este caso, la agrupación envía el bloque a la red de Bitcoin y a todo el mundo con acciones (que trabajó) se les paga como consecuencia.


Minería por diversión y ganancias

Underc0de - Minería por diversion

Basta con crear una cuenta en un grupo de minería como BTC Guild, descargar software de minería como cpuminer (minerd.exe) y ejecutar el software para iniciar la minería.

Para una pool con dificultad baja, debe obtener acciones en pocos minutos; en una pool con una dificultad mayor (como GHash.IO), puede tardar una hora o dos para obtener una parte, lo que es más frustrante.

Underc0de - Minería por diversión

La captura de pantalla muestra cómo se ve la minería a medida que se obtienen las acciones y los bloques son minados.

Tuve suerte y sólo me tomó un minuto para exitosamente obtener una porción de lo minado.

Un minuto después, alguien extrajo con éxito un bloque, por lo que la piscina le dice a todo el mundo que comience de nuevo.

Otro bloque fue extraído menos de un minuto después de que – aunque los bloques son 10 minutos aparte en promedio, los tiempos pueden variar extensamente.

Tomó 12 minutos para que mi próxima acción sea generada. Después de correr por un tiempo, gané 0,00000043 BTC, que es una pequeña fracción de un centavo.

La minería Bitcoin es una “carrera armamentista”.

Originalmente la gente podía minar con la CPU en una PC normal, pero eso no ha sido práctico por un tiempo.

La siguiente minería fue descargada a GPUs.

Ahora, la minería se hace con hardware ASIC de propósito especial, que está aumentando rápidamente en velocidad.

La minería con fines de lucro es muy competitiva, y necesitará buscar información en otro lugar.

Si desea probar la minería sólo por diversión, es posible que prefiera minar una moneda como Dogecoin en lugar de Bitcoin.

En primer lugar, Dogecoin utiliza un algoritmo de hash diferente que no funciona bien con hardware ASIC, por lo que no está tan desventajoso en comparación con los mineros profesionales.

En segundo lugar, porque dogecoins valen mucho menos que bitcoins, usted terminará para arriba con un número mucho mayor de dogecoins, que parece más rewarding.

Para la minería Dogecoin, he utilizado la piscina dogepool.pw algo arbitrariamente. El proceso es casi el mismo que la minería Bitcoin, excepto que se utiliza el algoritmo scrypt en lugar de sha256d. Hay muchos otros cryptocurrencies alternativos para elegir.


Agradecemos a Yuki por compartir la minería dese cero

Posts Relacionados

Comments

comments

Deja una respuesta

Tu email no será publicado. Los campos requeridos estan marcados con *
Puedes usar tags HTML y los atributos: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">