Explique los principios de la minería de Bitcoin en detalle.

Se puede considerar la cadena de bloques como un libro de contabilidad público (lista) que registra todas las transacciones y que todos los participantes de la red Bitcoin consideran el registro autorizado de propiedad.

Bitcoin no tiene una organización central y casi todos los nodos completos tienen un libro de contabilidad público que puede considerarse como un registro certificado.

Hasta el momento, no ha habido ni un solo ataque exitoso a la cadena de bloques troncal, ni siquiera uno.

Los bitcoins se acuñan a un ritmo determinado pero lento mediante la creación de nuevos bloques. Se produce un nuevo bloque aproximadamente cada diez minutos, y cada nuevo bloque va acompañado de una cierta cantidad de nuevos Bitcoins creados desde cero. Se necesitan unos 4 años para extraer 210.000 bloques y la tasa de emisión de moneda se reduce en un 50.

En algún momento de 2016, después de que se "minara" el bloque 420.000, cayó a 12,5 BTC/bloque. Antes del bloque 13.230.000 (2137 minas), la tasa de emisión de nuevas monedas se "reducirá a la mitad" exponencialmente 64 veces. En ese momento, la cantidad de Bitcoins emitidos por bloque se convertirá en la unidad monetaria más pequeña de Bitcoin: 1 plex. Finalmente, después de 134,4 millones de bloques, todos los * * * 209999999769 millones de Bitcoins se liberarán por completo. En otras palabras, para 2140 habrá casi 210 mil millones de Bitcoins. Posteriormente, los nuevos bloques ya no contienen recompensas de Bitcoin y los ingresos de los mineros provienen de las tarifas de transacción.

Después de que cada nodo reciba las transacciones, las verificará antes de transmitirlas a toda la red y establecerá un grupo de transacciones para nuevas transacciones válidas en el orden correspondiente al recibirlas.

Al validar cada transacción, cada nodo debe compararse con una larga lista de criterios:

La sintaxis y la estructura de datos de la transacción deben ser correctas.

Las listas de entrada y salida no pueden estar vacías.

El tamaño en bytes de la transacción es menor que MAX_BLOCK_SIZE.

Cada valor de salida, así como la cantidad total, debe estar dentro del rango especificado (menos de 265.438 millones de monedas, mayor que 0).

No hay entradas con hash igual a 0 y n igual a -1 (las transacciones de Coinbase no deben retransmitirse).

NLockTime es menor o igual a INT_MAX.

El tamaño de bytes de la transacción es mayor o igual a 100.

El número de firmas en la transacción debe ser menor que el número máximo de operaciones de firma.

El script de desbloqueo (Sig) solo puede insertar números en la pila, y el script de bloqueo (Pubkey) debe ajustarse al formato isStandard (las transacciones no estándar serán rechazadas).

Debe existir una transacción coincidente en el grupo o en el bloque de sucursal principal.

Para cada entrada, si la salida a la que se hace referencia existe en cualquier transacción del grupo, la transacción será rechazada.

Para cada entrada, busque la transacción de salida a la que se hace referencia en la rama maestra y en el grupo de transacciones. Si a una transacción de salida le falta alguna entrada, se convierte en una transacción huérfana. Si la transacción coincidente no aparece en el grupo, se agrega al grupo de transacciones aisladas.

Para cada entrada, si la transacción de salida a la que se hace referencia es una salida de coinbase, la entrada debe tener al menos COINBASE_MATURITY (100) confirmaciones.

Para cada entrada, la salida referenciada debe existir y no consumirse.

Obtenga los valores de entrada utilizando la transacción de salida cotizada y verifique si cada valor de entrada y el valor total están dentro del rango especificado (menos de 265,438 0 millones de monedas, mayor que 0).

Si la suma de los valores de entrada es menor que la suma de los valores de salida, la transacción será abortada.

Si el costo de la transacción es demasiado bajo para ingresar un bloque vacío, la transacción será rechazada.

Cada secuencia de comandos de desbloqueo de entrada debe validarse con la secuencia de comandos de bloqueo de salida correspondiente.

Los siguientes nodos de minería se denominan nodo de minería a.

Los nodos mineros siempre están escuchando nuevos bloques propagados a la red Bitcoin. Estos bloques recién agregados tienen un significado especial para los nodos mineros. La competencia entre mineros termina con la proliferación de nuevos bloques, lo que es como anunciar quién es el ganador final. Para los mineros, obtener un nuevo bloque significa que los participantes ganan y pierden.

Sin embargo, el final de una ronda también representa el comienzo de la siguiente.

Después de verificar las transacciones, los nodos de Bitcoin agregarán estas transacciones a su propio grupo de memoria. El grupo de memoria, también conocido como grupo de transacciones, se utiliza para almacenar temporalmente registros de transacciones que aún no se han agregado al bloque.

El nodo A necesita asignar una prioridad a cada transacción en el grupo de memoria y seleccionar registros de transacciones con prioridades más altas para construir bloques candidatos.

Para que una transacción se convierta en una "prioridad superior", debe cumplir las siguientes condiciones: el valor de prioridad es mayor que 57.600.000. La generación de este valor depende de tres parámetros: Un Bitcoin (es decir, 654,380 mil millones. Cong), antigüedad de la cuenta de un día (654,38 0,44 bloques), tamaño de transacción 250 bytes:

Gt100.000.000 satoshis de alta prioridad * 144 bloques/250 bytes = 57.600.000

Los primeros 50 KB Los utilizados para almacenar transacciones en el bloque están reservados para transacciones de mayor prioridad. Los nodos darán prioridad a estas transacciones con la máxima prioridad al llenar estos 50k bytes, independientemente de si se incluyen las tarifas de minería. Este mecanismo permite que las transacciones de alta prioridad se procesen primero, incluso si no tienen tarifas de minero.

Luego, el nodo de minería A seleccionará aquellas transacciones que contengan la tarifa de minero más pequeña, las ordenará por "tarifa de minero por kilobyte" y priorizará las transacciones con tarifas de minero más altas para llenar los bloques restantes.

Si queda espacio en el bloque, el nodo minero A puede elegir aquellas transacciones que no incluyen tarifas de minero. Algunos mineros intentarán incorporar transacciones en bloques que no tienen tarifas de minero, mientras que otros pueden optar por ignorar estas transacciones.

Después de llenar un bloque, las transacciones restantes en el grupo de memoria se convierten en candidatas para el siguiente bloque. Debido a que estas transacciones todavía están en el mempool, a medida que se agregan nuevos bloques a la cadena, aumenta la profundidad de los UTXO a los que hacen referencia estas transacciones (es decir, la "edad del bloque" de la transacción). Debido a que el valor de prioridad de una transacción depende de la "edad del bloque" de su entrada, el valor de prioridad de esta transacción también aumenta. Finalmente, el valor de prioridad de la transacción sin tarifa de minería puede alcanzar el umbral de alta prioridad y incluirse en el bloque de forma gratuita.

UTXO (Salida de transacción no gastada): Cada transacción tiene varias entradas de transacción, es decir, el origen de los fondos, y varias salidas de transacciones, es decir, el destino de los fondos. En términos generales, cada transacción consume una entrada y produce una salida. La salida que produce es la "salida de transacción no utilizada", que es UTXO.

Edad del bloque: la "edad del bloque" de UTXO es la cantidad de bloques que han pasado desde que se registró el UTXO en la cadena de bloques, es decir, la profundidad del UTXO en la cadena de bloques.

La primera transacción en el bloque es una transacción especial llamada transacción de creación de monedas o transacción de bóveda de monedas. Esta transacción se compone de nodos mineros y se utiliza para recompensar a los mineros por sus contribuciones. Suponiendo que la recompensa de un bloque en este momento es de 25 Bitcoins, el nodo minero de A creará una transacción de "pagar 25,1 Bitcoins a la dirección de A (incluidos 0,1 Bitcoins para las tarifas del minero)" y generará La recompensa por la transacción se envía a su billetera. El monto de la recompensa por extraer un bloque es la suma de la recompensa de coinbase (25 nuevos Bitcoins) y las tarifas del minero por todas las transacciones en el bloque.

Cuando un nodo construye un bloque candidato, es el turno de la máquina minera de A de "minar" este nuevo bloque y resolver el algoritmo de prueba de carga de trabajo para que este bloque sea válido. La función hash SHA256 se utiliza en el proceso de minería de Bitcoin.

En términos más simples, un nodo minero lo intenta una y otra vez hasta que encuentra un ajuste aleatorio que lleva el hashrate por debajo de un objetivo específico. El resultado de la función hash no se puede conocer de antemano y no existe un patrón para obtener un valor hash específico. Por ejemplo, estás jugando al billar solo en la habitación y la bola blanca va del punto A al punto B. Sin embargo, cuando una persona abre la puerta y ve la bola blanca en el punto B, no sabe cómo llegar desde el punto. A al punto B de todos modos. Esta propiedad de la función hash significa que la única forma de obtener un valor hash es seguir intentándolo, modificando aleatoriamente la entrada cada vez, hasta que aparezca un valor hash adecuado.

¿Se requieren los siguientes parámetros

? ¿Versión en bloque

? Valor hash del último bloque: prev_hash.

? El valor del árbol hash de la transacción que se escribirá: merkle_root.

? Hora de actualización: ntime

? Dificultad actual: nbits

El proceso de minería es encontrar x para hacer

sha 256(sha 256(version prev _ hash merkle _ root ntime nbits x)) lt; /p >

El rango de valores de x en la fórmula anterior es 0 ~ 2^32, y el objetivo se puede obtener de acuerdo con la dificultad actual.

Por ejemplo, imagina un juego en el que las personas siguen tirando un par de dados para obtener menos de una determinada cantidad de puntos. En el primer partido, el objetivo era 12. Mientras no saques dos seises, ganas. Entonces el próximo objetivo es el 11. Los jugadores sólo necesitan sacar menos de 10 para ganar, pero también es bastante simple. Si el objetivo se reduce a 5 después de algunas partidas. Más de la mitad de los dados lanzados ahora suman más de 5 puntos, por lo que no son válidos. A medida que el objetivo se hace más pequeño, el número de veces que tiras los dados aumenta exponencialmente si quieres ganar. Al final, cuando el objetivo es 2 (el menor número de puntos posible), con una media de 36 o 2 lanzamientos, sólo una persona puede ganar.

Como se mencionó anteriormente, el objetivo determina la dificultad, lo que a su vez afecta el tiempo necesario para resolver el algoritmo de prueba de trabajo. Entonces la pregunta es: ¿Por qué se puede ajustar este valor de dificultad? ¿Quién se ajustará? ¿Cómo ajustar?

En promedio, se genera un bloque de Bitcoin cada 10 minutos. Este es el latido del Bitcoin y es la base de las tasas de emisión de divisas y la velocidad de las transacciones. Debe permanecer sin cambios no sólo en el corto plazo, sino durante décadas. Durante este período, el rendimiento de la computadora aumenta rápidamente. Además, las personas y las computadoras involucradas en la minería cambian constantemente. Para mantener el ritmo de producción de nuevos bloques en 10 minutos, la dificultad de extracción debe ajustarse de acuerdo con estos cambios. De hecho, la dificultad es un parámetro dinámico que se ajusta periódicamente para lograr el objetivo de un nuevo bloque cada 10 minutos. En pocas palabras, la dificultad se establece en 10 minutos, independientemente de la capacidad de minería.

Entonces, ¿cómo funciona este ajuste en una red completamente descentralizada? Los ajustes de dificultad se producen de forma independiente y automática en cada nodo completado. Cada 2016 bloques (bloques generados cada 2 semanas), todos los nodos ajustan la dificultad. La fórmula de ajuste de dificultad se obtiene comparando el tiempo que tardaron los últimos bloques de 2016 con 20160 minutos (dos semanas, el tiempo esperado que tardarían estos bloques a un ritmo de 10 minutos). Ajusta la dificultad (o la hace más difícil o más fácil) según la relación entre la duración real y la duración esperada. En pocas palabras, si la red descubre que la velocidad de generación de bloques es superior a 10 minutos, aumentará la dificultad. Si lo encuentras más lento de 10 minutos, la dificultad se reducirá.

Para evitar que la dificultad cambie demasiado rápido, el rango de ajuste para cada ciclo debe ser menor que un factor (un valor de 4). Si el rango a ajustar excede 4 veces, ajuste 4 veces. Debido a que el desequilibrio del ciclo seguirá existiendo en los próximos 2.065.438 06 bloques, se realizarán más ajustes de dificultad en el próximo ciclo. Por lo tanto, pueden ser necesarios 2016 ciclos de bloques para igualar las enormes diferencias en el poder y la dificultad del hashing.

Por ejemplo, el nodo A está minando actualmente 277, 365, 438 06 bloques. Una vez que el nodo minero A complete el cálculo, enviará inmediatamente este bloque a todos sus nodos vecinos. Después de recibir y validar este nuevo bloque, estos nodos continuarán propagando este bloque. A medida que este nuevo bloque se propaga a través de la red, cada nodo lo agregará a su propia copia de la cadena de bloques como el bloque 277,316 (el bloque principal es 277,315). Cuando los nodos mineros reciben y verifican este nuevo bloque, abandonan sus cálculos anteriores para construir este bloque con la misma altura e inmediatamente comienzan a calcular el siguiente bloque en la cadena de bloques.

El tercer paso en el * * * mecanismo de conocimiento de Bitcoin es verificar de forma independiente cada nuevo bloque por cada nodo de la red. Cuando un nuevo bloque se propaga a través de la red, cada nodo ejecutará una serie de pruebas para verificarlo y luego reenviarlo a sus pares.

Esto garantiza que solo se propaguen bloques de datos válidos a través de la red.

La verificación independiente de cada nodo de cada nuevo bloque garantiza que los mineros no puedan hacer trampa. En el capítulo anterior, vimos cómo los mineros registran las transacciones para obtener nuevos Bitcoins y las tarifas de transacción creadas en ese bloque. ¿Por qué los mineros no registran una transacción para obtener unos miles de Bitcoins? Esto se debe a que cada nodo verifica los bloques según las mismas reglas. Una transacción de Coinbase no válida invalida todo el bloque, lo que provoca que el bloque sea rechazado y, por lo tanto, la transacción no pasa a formar parte del libro mayor.

El paso final en el mecanismo de conocimiento descentralizado de Bitcoin es ensamblar bloques en una cadena utilizando la máxima prueba de trabajo. Una vez que un nodo valida el nuevo bloque, intentará conectar el nuevo bloque a la cadena de bloques existente y ensamblarlos.

Los nodos mantienen tres tipos de bloques:

El primero está conectado a la cadena principal,

El segundo es una rama (cadena de respaldo) de la cadena principal. ,

La tercera es que no se encuentra ningún bloque principal conocido en la cadena conocida.

A veces, la blockchain que extiende un nuevo bloque no es la cadena principal, como veremos en "Blockchain Forks" a continuación.

Si un nodo recibe un bloque válido pero su bloque principal no se encuentra en la cadena de bloques existente, entonces el bloque se considera un "bloque huérfano". Los huérfanos se mantienen en el grupo de huérfanos hasta que un nodo reciba su bloque principal. Una vez que el bloque principal se recibe y se conecta a la cadena de bloques existente, el nodo tomará el bloque huérfano del grupo de bloques huérfanos y lo conectará a su bloque principal como parte de la cadena de bloques. Cuando se extraen dos bloques en un breve intervalo de tiempo, los nodos pueden recibirlos en orden inverso y se producen bloques huérfanos.

Después de seleccionar la cadena de bloques más difícil, todos los nodos de toda la red finalmente alcanzan el conocimiento. Las diferencias temporales en la cadena eventualmente se resolverán a medida que se agregue más prueba de trabajo a la cadena. Los nodos mineros "votan" para elegir qué blockchain quieren expandir. Cuando extraen un nuevo bloque y extienden una cadena, el nuevo bloque en sí representa su voto.

Debido a que blockchain es una estructura de datos descentralizada, no siempre es consistente entre diferentes copias. Los bloques de datos pueden llegar a diferentes nodos en diferentes momentos, lo que da como resultado diferentes vistas de los nodos en la cadena de bloques. La solución es que cada nodo siempre elige e intenta expandir la cadena de bloques que representa la prueba de trabajo máxima acumulada, es decir, la cadena de dificultad más larga o acumulativa.

Una bifurcación ocurre cuando dos bloques candidatos quieren extender la cadena de bloques más larga al mismo tiempo. En circunstancias normales, se produce una bifurcación cuando dos mineros elaboran una solución de prueba de trabajo en un corto período de tiempo. Tan pronto como ambos mineros encuentran una solución en su bloque candidato, inmediatamente propagan su bloque "ganador" a la red, primero a los nodos vecinos y luego a toda la red. Cada nodo que reciba un bloque válido lo fusionará y expandirá la cadena de bloques. Si el nodo recibe posteriormente otro bloque candidato y ese bloque tiene el mismo bloque principal, el nodo conecta el bloque a la cadena candidata. Como resultado, algunos nodos reciben un bloque candidato, mientras que otros nodos reciben otro bloque candidato. En este momento, surgieron dos versiones diferentes de blockchain.

Antes de la bifurcación

Punto de inicio de la bifurcación

Vemos a dos mineros minando en dos bloques diferentes casi al mismo tiempo. Para facilitar el seguimiento de este evento de bifurcación, supongamos que hay un bloque de Canadá marcado en rojo y un bloque de Australia marcado en verde.

Supongamos que hay una situación en la que un minero en Canadá encuentra la solución de prueba de trabajo para el bloque "rojo" y extiende la cadena de bloques en el bloque principal "azul". Casi al mismo tiempo, un minero australiano encontró la solución al bloque "verde" y amplió el bloque "azul". Así que ahora tenemos dos bloques: uno es el bloque "rojo" de Canadá; el otro es el bloque "verde" de Australia. Ambos bloques son válidos, contienen soluciones de carga de trabajo de prueba válidas y amplían el mismo bloque principal. Los dos bloques pueden contener transacciones casi idénticas, pero tienen algunas diferencias en el orden de las transacciones.

Los nodos en la red Bitcoin adyacentes a Canadá (proximidad topológica, no proximidad geográfica) recibirán los bloques "rojos" primero y construirán el bloque con mayor dificultad acumulativa. El bloque "rojo" es el último bloque de la cadena (azul-rojo), ignorando los bloques "verdes" que llegan más tarde. Por el contrario, los nodos más cercanos a Australia decidirán que el bloque "verde" gane y lo convertirán en el último bloque en extender la cadena de bloques (verde azulado), ignorando el bloque "rojo" que llega unos segundos después. Aquellos nodos que reciban el bloque "rojo" primero usarán inmediatamente ese bloque como bloque principal para generar un nuevo bloque candidato e intentarán encontrar una solución de prueba de trabajo para ese bloque candidato. De manera similar, los nodos que acepten un bloque "verde" comenzarán a generar nuevos bloques con ese bloque como vértice de la cadena y extenderán la cadena.

Las cuestiones divergentes casi siempre se resuelven dentro de un bloque. Parte de la potencia informática de la red se concentra en los bloques "rojos" como bloques principales y sobre ellos se construyen nuevos bloques; otra parte de la potencia informática se concentra en los módulos "verdes". Incluso si la potencia informática se divide equitativamente entre los dos bandos, un bando siempre encontrará una solución de prueba de trabajo y la difundirá antes que el otro. Para este ejemplo, podemos hacer una analogía. Si un minero que trabaja en un bloque "verde" descubre un bloque "rosa" y extiende la cadena de bloques (verde azulado-verde-rosa), inmediatamente propagará el nuevo bloque y toda la red considerará válido el bloque, como se muestra en la figura. arriba.

Todos los nodos que seleccionaron el bloque "verde" como ganador en la ronda anterior extenderán directamente la cadena en un bloque. Sin embargo, aquellos nodos que seleccionaron el bloque "rojo" como ganador ahora verán dos cadenas: "Verde-Rosa" y "Azul-Rojo". Como se muestra en la figura anterior, estos nodos establecerán la cadena "azul-verde-rosa" como la cadena principal y la cadena "azul-roja" como la cadena de respaldo según los resultados. Estos nodos aceptaron la nueva cadena, más larga, y se vieron obligados a cambiar su visión original de la cadena de bloques. A esto se le llama una nueva comprensión de la cadena. Debido a que el bloque "rojo" que era el bloque padre ya no está en la cadena más larga, sus bloques candidatos se han convertido en "bloques huérfanos", por lo que ahora cualquier minero que originalmente quisiera extender la cadena en la cadena "azul-roja" lo hará. todos se detienen. Toda la red reconoce la cadena "azul-verde-rosa" como la cadena principal, y el bloque "rosa" es el último bloque de esta cadena. Todos los mineros cambian inmediatamente los bloques principales de sus bloques candidatos generados a "rosa" para extender la cadena "verde azulado-rosa".

En teoría, es posible una bifurcación de dos bloques. Esto sucede cuando los mineros están en desacuerdo por un desacuerdo previo y las soluciones a dos bloques diferentes se encuentran casi simultáneamente. Sin embargo, la probabilidad de que esto suceda es baja. Las horquillas de un solo bloque ocurren todas las semanas, las horquillas de doble bloque son muy raras.

Bitcoin diseña el intervalo de bloqueo en 10 minutos, lo que es un compromiso entre una confirmación de transacción más rápida y una menor probabilidad de bifurcaciones. Intervalos de generación de bloques más cortos darán como resultado una compensación de transacciones más rápida y también conducirán a bifurcaciones de blockchain más frecuentes. Por el contrario, los intervalos más largos reducen el número de bifurcaciones pero dan como resultado tiempos de liquidación más largos.