# 04 - <font color="#F7A004">Minería</font>

:::info
_La minería es el proceso de intentar sumar un nuevo bloque de transacciones a la cadena de bloques._
:::
Es una competencia de toda la red donde cualquier nodo de la red puede trabajar para intentar sumar un nuevo bloque a la cadena.
Cuando se extrae un nuevo bloque, se transmite a toda la red, donde cada nodo lo verifica independientemente y lo suma a su cadena de bloques.

:::info
_Los nodos actualizan sus cadenas de bloques con el nuevo bloque._
:::
El sistema está diseñado para que se mine un nuevo bloque cada 10 minutos en promedio.
Tras asumar el nuevo bloque, cada nodo minero reinicia el proceso para intentar construir sobre este nuevo bloque en la cadena. Como resultado, la blockchain se actualiza cada un determinado tiempo por resultado colaborativo de los nodos de la red.
## 1️⃣ Método
> ¿Cómo funciona la minería?
_El proceso de minería inicia llenando un bloque candidato con transacciones de la mempool de su nodo._
Este bloque candidato es lo que vamos a intentar extraer en nuestra cadena de bloques (y luego enviarlo a todos los demás para que puedan sumarlo también a su cadena de bloques).

:::info
_Cada nodo mantiene una copia de las últimas transacciones en su mempool._
:::
A continuación, construimos un encabezado de bloque para este bloque candidato. Este es básicamente un breve resumen de todos los datos dentro del bloque, que incluye una referencia a un bloque existente en la cadena de bloques sobre el que queremos construir.

:::info
_Se hace referencia a un bloque anterior por su hash de bloque. Un resumen de todas las transacciones del bloque se encuentra en la raíz Merkle._
:::



>[!Important]
Ahora estamos listos para comenzar a minar este bloque.
Para hacer esto, pasamos el encabezado de bloque de este bloque por la función hash SHA-256 dos veces (llamada HASH256 para abreviar) y esperamos que el número que arroje sea menor que el objetivo actual.

:::info
_El objetivo es el número que el hash de su bloque debe obtener para sumar el bloque a la cadena de bloques._
:::
Si el hash del encabezado de bloque no es inferior al objetivo, puede continuar hasta incrementar el campo nonce en el encabezado. Esto le permite mantener el mismo encabezado básico, pero obtener un resultado hash completamente diferente.

:::info
_El proceso de minería consiste básicamente en hacer hashes de un encabezado de bloque tan rápido como sea posible para intentar ser el primer nodo en obtener un resultado lo suficientemente bajo._
:::
Y si tienes suerte, puedes terminar obteniendo un hash de bloque inferior al objetivo actual.
## 2️⃣ Sincronización
> ¿Cómo actualizan los nodos su blockchain?
_Si un minero puede obtener un hash de bloque para su bloque candidato por debajo del objetivo, transmitirá ese bloque al resto de la red_
A posterior, cada nodo confirmará que el encabezado del bloque tiene un hashes por debajo del objetivo y luego suma este bloque "minado" a su cadena de bloques.

:::info
_Arriba se ilustra como un bloque minado se transmite al resto de los nodos._
:::
A partir de aquí, cada nodo dejará de trabajar en su propio bloque candidato, construirá uno nuevo (con nuevas transacciones de su mempool) para construir sobre este nuevo bloque en la cadena.

:::info
_Los mineros incican de nuevo el preoceso de a intentar sumar un nuevo lote de transacciones a la cadena._
:::
Como resultado, los mineros trabajan constantemente de forma independiente (pero en colaboración) para ampliar la cadena de bloques con nuevos bloques de transacciones.
## 3️⃣ Prueba de Trabajo (PoW)
> ¿Qué se entiende por prueba de trabajo?
_El proceso de minería se lo conoce como prueba de trabajo._
El término "prueba de trabajo" se refiere simplemente al hecho de que se requiere trabajo para obtener un hash de bloque por debajo del objetivo. Y si usted puede, cualquier otra persona puede comprobar que se ha efectuado el trabajo confirmando que el hash del bloque que ha construido es efectivamente inferior al objetivo.
En otras palabras, la función hash se usa como una forma de demostrar que ha efectuado una cantidad requerida de "trabajo" en su bloque.
> [!Important]
La prueba de trabajo implica escanear (buscar mediante prueba/error) un valor llamado nonce que, que al ser combinado con los datos del bloque (procesado con la función hash SHA-256), de como resultado el hash del bloque, que incia con una determinada cantidade de ceros al principio de si presentación binaria. Cuanto mas ceros se requieren mas cuesta encontrar ese valor, por lo tanto requiere mas trabajo.
## 4️⃣ Mineros
> ¿Quién puede minar bloques?
_Cualquier nodo conectado a un hardware de minado puede intentar minar un bloque y cada nodo tiene una posibilidad de tener éxito._
Esto implica que tenemos una competencia a nivel de red donde cualquier nodo de la red podría ser el que sume el siguiente lote de transacciones a la cadena de bloques.
➡️ ¿Y qué hace el nodo minero?
1. Toma transacciones válidas de la mempool.
2. Arma un bloque candidato.
3. Prueba distintas soluciones de hash hasta encontrar un nonce que cumpla con el objetivo de dificultad.
4. Si lo obtiene, mina un bloque nuevo y lo transmite a la red.

:::info
_No obstante, aunque cualquiera puede intentar minar, poder efectuar cálculos de hash lo más rápido posible mejora sus posibilidades de minar con éxito el nuevo bloque._
:::

:::info
_La posibilidad de que cualquier persona encuentre una solución en cualquier momento es proporcional a la potencia de su equipo de minado._
:::
Como resultado, los mineros con mayor potencia de procesamiento (potencia de hash) tienen más probabilidades de minar un bloque que aquellos que no pueden hacerlo con la misma velocidad. Por lo tanto, aunque cualquiera puede minar, esto favorece a quienes cuentan con hardware de minado más potente, con mejores condiciones de infraestructura, electricidad y recursos.
## 5️⃣ Recompensa de Bloque
> ¿Cuál es el incentivo para minar bloques?
_Si puedes minar un bloque, puedes reclamar una recompensa de bloque ._
Veamos: al construir un bloque candidato, puedes colocar tu propia transacción especial en la parte superior del bloque. Esto se llama transacción Coinbase y te permite enviarte una cantidad fija de bitcoins que antes no existía.

:::info
_La transacción de coinbase es la primera transacción de un bloque._
:::
Si terminas minando este bloque, puedes obtener los bitcoins que reclamaste de la transacción de Coinbase después de que el bloque alcance los 100 bloques de profundidad en la cadena.
➡️ ¿Por qué hay que esperar 100 bloques?
1. Esta es una regla del protocolo de Bitcoin
2. Los bitcoins de la transacción Coinbase no pueden usarse hasta que tienen 100 confirmaciones (es decir, que haya 100 bloques encima en la cadena).
3. Previene que un minero reordene la cadena (ataque del 51%) para reescribir bloques y volver a minar el mismo bloque para cobrar dos veces.
4. Determina que la recompensa realmente pertenece a la cadena principal y no a una bifurcación huérfana.

:::info
_Por lo tanto, esta recompensa por bloque actúa como un incentivo para que los mineros minen nuevos bloques e intenten continuamente extender la cadena de bloques lo mas alta posible._
:::

:::info
_El envío de bitcoins que no existían anteriormente solo está permitido en la transacción de Coinbase. Esto convierte a esta transacción en la fuente de todos los bitcoins nuevos.
La presencia de la recompensa por bloque es el motivo por la que este proceso se denomina «minería». No obstante, desde un punto de vista técnico, la minería se centra principalmente en añadir nuevas transacciones a la blockchain._
:::
## 6️⃣ Intervalo
>¿Cuánto tiempo se tarda en minar un bloque?
_El sistema de minería está diseñado para que un minero en la red Bitcoin mine con éxito un nuevo bloque cada 10 minutos (en promedio)_

:::info
_El tiempo lo controla el objetivo , que es como un poste de limbo por debajo del cual debe pasar el hash de un bloque para que se le permita sumar a la cadena de bloques._
:::

:::info
_Cada nodo acuerda el valor objetivo para la altura actual de la cadena de bloques._
:::

> [!Important]
Este valor objetivo se ha truncado para su almacenamiento en el campo de bits del encabezado del bloque, y ese es el valor objetivo que realmente se usa durante la minería.

:::info
_Si los bloques se extraen más rápido de 10 minutos en promedio durante un período de dos semanas (por ejemplo, porque más mineros se unen a la red), el objetivo se ajustará hacia abajo para que sea más difícil minar un bloque y, por lo tanto, el tiempo promedio entre bloques vuelva a alrededor de 10 minutos._
:::

:::info
_Cada nodo ajusta el objetivo independientemente, pero cada uno calculará el mismo objetivo si tienen la misma cadena de bloques._
:::
Como resultado, el objetivo se ajusta temporalmente para intentar mantener un intervalo de 10 minutos entre bloques nuevos minados. Esto nos permite tener un ritmo constante de nuevos bloques, además de una emisión constante de nuevos bitcoins en la red.
## 6️⃣ Objetivo
> ¿Por qué usamos el minado?
_El sistema de minería permite que las computadoras por medio de una red resuelvan conflictos sin la necesidad de una computadora central para resolverlos._
Bitcoin opera en una red de computadoras independientes, por lo que es posible crear dos transacciones conflictivas (enviando los mismos bitcoins a diferentes destinos) e insertarlas en distintos nodos de la red al mismo tiempo. Ciertos nodos recibirán primero la transacción A y otros la B.

:::info
_¿Cómo pueden todas las computadoras ponerse de acuerdo sobre qué transacción debe entrar a la cadena de bloques?_
:::
Gracias al mecanismo de minería, solo una de estas transacciones se suma a la blockchain.
Finalmente, uno de los nodos de la red extraerá un bloque de transacciones de su memoria y lo transmitirá al resto de la red. Cuando los nodos reciben este bloque, lo añaden a su cadena y eliminan cualquier transacción conflictiva de su memoria.

:::info
_Como resultado, el proceso de minería actúa como un mecanismo de clasificación de transacciones a través de una red de computadoras; los bloques minados tienen la palabra final sobre qué transacciones pertenecen a la cadena de bloques._
:::
Mejor aún, por el simple hecho de que cualquiera puede minar, ningún nodo en la red tiene control total sobre qué transacciones llegan a la cadena de bloques.
:::warning
_Un solo minero puede controlar qué transacciones se transfieren a la blockchain si puede adquirir la mayoría de la potencia minera. Esto se conoce como un ataque del 51%._
:::
## 7️⃣ Técnico
> ¿Cómo se extrae un bloque?
_Para minar un bloque, debes iniciar construyendo un encabezado de bloque para tu bloque candidato._
Por ejemplo, así es como habría iniciado el encabezado del bloque 100.000:

:::info
_Ahora que tienes un encabezado de bloque, intentas extraerlo mediante HASH256. Continúas incrementando el valor nonce para intentar obtener un resultado inferior al objetivo .
:::

Por ejemplo:

Eventualmente, es posible que encuentres un valor nonce que produce un resultado hash por debajo del objetivo:

El nonce es un campo de 4 bytes en orden de bytes little-endian.
El resultado de aplicar el hash del encabezado del bloque sin procesar mediante HASH256 aparecerá al revés al principio. Esto se debe a que los hashes de bloque se muestran en orden de bytes inverso en los exploradores de blockchain.
## 8️⃣ Comandos
> bitcoin-cli getblocktemplate
_Este comando toma transacciones de la mempool de su nodo y devuelve los datos que necesita para iniciar a extraer un nuevo bloque._
Lamentablemente, también hay que proporcionar una matriz compleja para especificar el tipo de plantilla de bloque que se desea (véase BIP22 ). Esto es lo que suelo usar:bitcoin-cli getblocktemplate '{"rules": ["segwit"]}'
:::info
_Este comando devuelve la información del encabezado del bloque de claves como previous block, time, y bits, pero deberá construir la raíz merkle usted mismo
:::
<font color="#F7A004">bitcoin-cli submitblock [hex] </font>
Envía un bloque sin procesar a la red.
Por ejemplo, este es el bloque génesis:

:::info
_Este es un bloque sin procesar completo. Debe incluir el encabezado del bloque, el recuento de transacciones y todos los datos sin procesar de las transacciones._
:::
<font color="#F7A004">bitcoin-cli getmininginfo</font>
Este comando devuelve información minera interesante.

:::info
_Si lo ejecuta bitcoin-cli getblocktemplatede antemano, también le mostrará cuántas transacciones de la mempool se están incluyendo actualmente en el siguiente bloque (en currentblocktx).
:::
➡️Recursos
https://en.bitcoin.it/wiki/Proof_of_work