Esta página: Bloques dijo que la minería es en realidad para resolver un problema matemático, pero leer el algoritmo hash de bloques no es de mucha ayuda. También probé leer el código fuente de bitcoind, pero leer el código lleva mucho más tiempo que leer la documentación 🙂
Y he escrito un cliente json-rpc simple para llamar al método getwork () para obtener los «datos», pero ¿qué debería ¿Qué hago junto a estos «datos»?
¿Alguien podría explicar el proceso de minería en la vista del programador?
Comentarios
Respuesta
El algoritmo de minería es el siguiente:
-
Paso 0 – Recupere el hash del bloque anterior de la red.
-
Paso 1 – Reúna una lista de transacciones potenciales conocida como «bloque». Esta lista de transacciones proviene de la red bitcoin peer-to-peer.
- Paso 2: Calcule un hash para un bloque de transacciones potenciales junto con un número aleatorio.
- Paso 3: si el hash es mayor que el nivel de dificultad establecido actualmente, entonces ha extraído ese bloque. Si no es así, comience de nuevo desde el paso 1. Cualquier adición a la lista de transacciones del paso 1 junto con el cambio en el número aleatorio del paso 2 significa que existe la posibilidad de que el criterio se cumpla en la próxima ronda.
Desde la vista de un programador, el pseudocódigo podría verse así:
P := The hash of the previously mined block B := A block of transactions H := A hash function D := Difficulty Level 0 Retreive P 1 Construct/Modify B 2 IF H(P, B, Some Random Number) > D END 3 GOTO 1
Debo advertirle que hay algunas inexactitudes en esa descripción, pero en su mayor parte, eso debería ser lo suficientemente bueno. Y aquí hay algunas aclaraciones más útiles:
¿Qué «es un hash?
Un hash es una función que convierte datos en un número dentro de un cierto rango. El hash tiene la propiedad de que conocer su salida es esencialmente impredecible (dentro del rango dado). La función hash específica utilizada para la minería de bitcoins se aplica dos veces SHA256.
¿Cómo funciona el nivel de dificultad?
Esta naturaleza impredecible de la función hash significa que la introducción de datos aleatorios (la transacción + el número aleatorio) esencialmente producirá un número aleatorio dentro de un cierto rango. Restringir aún más el rango de la salida deseada afecta la probabilidad de encontrarla en una sola ronda. Esto crea una forma de determinar probabilísticamente la frecuencia con la que se encontrará una solución en función del número de veces que se puede ejecutar el algoritmo en la red. Específicamente, cuando escuche el término «gigahashes» o «terahashes», esto se refiere a la cantidad de veces que se puede ejecutar el Paso 3. A medida que aumenta el número de hashes por segundo en toda la red, la red aumenta automáticamente la dificultad, de modo que se encontrará una solución en unos 10 minutos.
¿Qué sucede cuando se extrae un bloque?
Cuando se extrae un bloque, el minero envía el bloque a todos los demás mineros de la red como prueba de que ha Lo encontré. Este bloque contiene una lista de transacciones, el hash encontrado, el número aleatorio específico y una referencia al hash anterior. A medida que cada minero recibe el bloque recién extraído, elimina todas las transacciones que está extrayendo actualmente que existen dentro del bloque (porque ya se han confirmado en la cadena de bloques) y transmite el bloque a otros mineros que hacen lo mismo. la propagación ocurre bastante rápido.
Nota: el minero original del bloque recibe una tarifa de «minero», que es una recompensa que consiste en las monedas no gastadas de las transacciones, además de una recompensa de «base de monedas». La recompensa de la base de monedas comenzó en 50 bitcoins y se reduce a la mitad después de cada 210,000 bloques (aproximadamente una vez cada 4 años). La recompensa de la base de monedas eventualmente será tan pequeña que será minúscula en comparación con las tarifas de los mineros.
Comentarios
- La recompensa se reduce a la mitad cada 210000 bloques .- > Acabo de ver eso ahora y creo que está bien: bitcoinclock.com
- Oh , y la Dificultad se ajusta cada bloque de 2016 asumiendo que la red continuará operando con la tasa de hash promedio de dichos últimos bloques de 2016 y estableciendo la nueva dificultad de manera que esta tasa de hash resulte en un ciclo de bloque de aproximadamente 10 minutos.
- Podría estar equivocado, pero creo que el bloque también contiene el hash del último bloque. Y así es como los bloques se encadenan al revés, lo que lleva al término blockchain.
- @Murch, la dificultad se ajusta en realidad a cada bloque según el tiempo que tomó encontrar el bloque anterior, y en este punto, el la dificultad solo puede aumentar. Cada 2016 bloques, la dificultad se ajusta con respecto a los últimos bloques de 2016 y puede subir o bajar. Esto ayuda a protegerse contra caídas repentinas en la potencia de cálculo, que de otro modo resultarían en que el tiempo para encontrar un bloque aumentara a más de 10 minutos.
- @ Tarandeep-Gill, que ‘ s correcto! El hash del bloque anterior se codifica junto con la lista de transacciones. En realidad, esto me hace pensar que mi explicación del hash es un poco incompleta: la función hash específica no se aplica dos veces a SHA256 como se indica, sino que la función se aplica a varias partes del bloque (incluidas las transacciones y el hash del bloque anterior) En maneras diferentes. Esta es una de esas » inexactitudes » sobre las que te advertí. Me pregunto si puedes encontrar los demás …
Responder
El propósito de resolver un «rompecabezas» es (a) retrasar la extracción del bloque a un promedio de 10 minutos y (b) incurrir en costos del mundo real para extraer un bloque (gastando energía de la CPU, por lo tanto, energía). Los costos están ahí para evitar un ataque de Sybil (poner muchas máquinas mineras en funcionamiento para hacer un ataque del 51%).
El retraso se establece para permitir que un buen bloque se propague por todo el mundo a todos los demás mineros. , sin darle al minero que acaba de acuñar el nuevo bloque una ventaja inicial. Para eso, el tiempo de bloqueo (10 minutos) debe ser un orden de magnitudes mayor que el retardo de propagación (unos segundos).
Así que el tipo de rompecabezas es en cierto sentido irrelevante, también podría ser un Sudoku gigante.
Respuesta
Cualquier hash es un hash válido. La pregunta es si su hash cumple con nuestros criterios. Lo que hash son en realidad un par de cosas (volveremos a esto) que alineadas forman una cadena que es una cadena de una longitud específica. Luego, hash toda esa cadena. Piense en su hash resultante como un número. Lo que queremos es que el número resultante sea menor que un número objetivo. Así que es como lanzar un dado de mil millones de caras y obtener un número por debajo del número objetivo. Ese número objetivo se considera «dificultad». A medida que más personas lanzan el dado, reducimos el número objetivo para reducir la probabilidad cualquier tirada saldrá.
Lo más importante es que algunas de esas cosas que alineamos en la cadena que marcamos son cosas que estamos autorizados a ajustar. El hash no es exactamente como lanzar el dado porque si tenemos lo mismo una y otra vez, obtenemos el mismo resultado una y otra vez. Sin embargo, incluso un pequeño ajuste en el hash puede tener un gran impacto en el resultado del hash. El elemento principal que podemos manipular se llama «nonce». Básicamente, elegimos un nonce para usar en la cadena, aplicamos el hash a toda la cadena y vemos lo que obtenemos. Si el hash no es correcto, modificamos el nonce e intentamos de nuevo . El nonce en sí no es muy grande, por lo que hay un número limitado de variaciones del nonce que puede probar. El siguiente elemento que podemos cambiar es una marca de tiempo. También se nos permite mover la marca de tiempo. Cada movimiento de la marca de tiempo nos permite volver a recorrer todo el conjunto de posibles valores de nonce. Repetimos este proceso de agotar las posibilidades de nonce, luego moviendo la marca de tiempo una y otra vez hasta el hash resultante es menor que el número objetivo de dificultad.
Cuando eso sucede, proclamamos al mundo que esta marca de tiempo más este nonce funcionan para resolver el bloque. Otros lo validan como verdadero y se agrega al cadena de bloques. Un bloque se considera «Validado» una vez que tiene un cierto número de bloques «profundo» en la cadena de bloques, lo que significa que es un bloque histórico en comparación con el bloque actual. La validación es un nombre poco apropiado aquí porque no es que no se sepa que el bloque sea válido. Lo que estamos validando es la prueba del trabajo, lo que significa que una vez que ese bloque histórico está enterrado lo suficiente, la cantidad de esfuerzo involucrado para crear esa historia es insuperable para que alguien más intente crear una variación diferente de la historia. Tendrían que crear su propia versión de ese bloque (la única razón es escribir en su propia versión de las transacciones, es decirrobar monedas) luego resolverlo ellos mismos, luego resolver el siguiente bloque y el siguiente y así sucesivamente y «ponerse al día» con todos los demás. Esto significa que tendrían que superar al mundo en el juego de tirar los dados. Tal vez una vez en la historia del universo, alguien podría tener suerte en el momento con dos o tres bloques consecutivos, pero ¿con los 120 bloques que la mayoría de los grupos e intercambios mineros requieren ahora? No va a pasar nunca.
but what should I do next to this "data"?
Aquí ‘ una implementación de referencia breve. github.com/jgarzik/pyminer/blob/master/pyminer.pyexplain the mining process in programmer's view
es una pregunta bastante amplia. ¿Qué problema específico está tratando de resolver?