¿Puede un minero de Bitcoin generar hashes SHA2 en datos arbitrarios?

1

No estoy preguntando por el diseño de bitcoin ... pero estoy interesado en la capacidad de hash de un minero de bitcoin.

Para ser breve : ¿los mineros de bitcoin (o algunos de ellos) aceptan entradas personalizables y las procesan en bloque (en lugar de aceptar más instrucciones de alto nivel y la minería funciona automáticamente)?

La verdadera pregunta es, he leído algunos artículos sobre un esquema de firma de criptografía post-cuántica, el esquema de firma Merkle (MSS):

Esta nueva forma de hacer una firma digital requiere que se calculen muchos hash, por ejemplo:

  1. una sola firma de una sola vez (OTS) requiere al menos 512 veces de hashes si usamos SHA-256 con un tamaño de salida de 512*256/8=16kBytes .

    Si se desea una salida más pequeña, lo que requiere un compromiso de memoria de tiempo, por ejemplo. para reducir el tamaño en casi 8, requiere 2^8 * (256 / 8) = 8192 hashes con un tamaño de salida de aproximadamente 256 * 256 / 8 / 8 = 1024 Bytes ; para reducir en 16, requiere 2^16 * (256 / 16) = 1048576 hashes con un tamaño de salida de aproximadamente 512 bytes.

  2. cada firma de MSS consta de varias OTS, que están autenticadas por árboles binarios encadenados (la OTS en una hoja se usa para autenticar la clave pública raíz del árbol subyacente), que significa, para n árboles existen n OTS que deben hacerse.

  3. para calcular la clave pública raíz del árbol, puede ser necesario hacer un hash de todo el árbol: con los niveles de m , se necesitan aproximadamente 2 hash de ^ m.

Y finalmente, de esta manera se puede lograr una vida de n*m (el límite de hacer la firma). Por ejemplo: si se están diseñando las firmas de 2^80 , con n=4, m=20 y una compensación con 16, para el peor de los casos se requieren hashes de 4*1048576 + 4*2^20=8388608 (pero con un tamaño de salida atractivo de (256*256/16*4+80*256)/8=4608Bytes en comparación con los algoritmos populares).

Este requisito parece demasiado alto para el software (OpenSSL puede hacer eso en 3 segundos, pero si una firma toma 3 segundos, ¿por qué deberíamos diseñar una vida útil de 2^80 signos?), pero para hardware como los mineros de bitcoin, parece Todavía es demasiado fácil (no estoy seguro, nunca he jugado con eso). Así que he estado considerando la posibilidad de adaptar un minero de bitcoin en una aceleración de hardware para tal algoritmo de firma. Para hacerlo, es necesario alimentar al minero con los insumos que queremos que calcule. ¿Es esto posible? (Creo que debería, ya que deberían al menos permitir que algunos parámetros relacionados con el usuario se personalicen en pruebas de hashcash ...)

    
pregunta Lucifer Orichalcum 20.02.2015 - 02:46
fuente

1 respuesta

1
  

¿Los mineros de bitcoin (o algunos de ellos) aceptan entradas personalizables y las procesan de forma masiva (en lugar de aceptar más instrucciones de alto nivel y la minería funciona automáticamente)?

Los mineros de Bitcoin generalmente toman un parámetro llamado "objetivo" y "encabezado" y devuelven un overce + overflow. No creo que sea posible hacer un hash X veces, lo que resulta en un resultado predecible (por ejemplo, desea comparar hashes). El juego de Bitcoin es uno de "encontrar un número más bajo" y "hacer hash lo más rápido posible hasta que lo hagas".

Sí, Bitcoin está literalmente comparando la salida de SHA2 de dos valores como BigInteger y solo debería regresar cuando se encuentre esto. (Tal vez lo que necesites sea posible, pero creo que esta función introduciría ineficiencias para el juego de Bitcoin y sería indeseable)

Esto es lo que sucede dentro de los mineros de bitcoin:

Nota: el paso 3 y 4 es el hardware de Bitcoin, el resto es su controlador personalizado

Paso 1

En un nivel alto, el software de minería toma una lista de transacciones activas y luego las agrupa en algo llamado "bloque".

O dicho de manera más precisa: El software del minero cubre todas las transacciones en una vista de resumen llamada "raíz de merkle", y la procesa, que es representativa de las transacciones.

Paso 2

Luego, el software de minería convierte esto en un formato binario llamado Block Header , que también hace referencia a los bloques anteriores (también llamada una cadena).

Field           Purpose                          Updated when...               Size (Bytes)
Version         Block version number             You upgrade the software and   4
                                                 it specifies a new version 

hashPrevBlock   256-bit hash of the previous     A new block comes in          32
                block header    
hashMerkleRoot  256-bit hash based on all        A transaction is accepted     32
                the transactions in the block       

Time            Current timestamp as seconds     Every few seconds              4
                since 1970-01-01T00:00 UTC  

Bits            Current target in compact format   The difficulty is adjusted   4

Nonce           32-bit number (starts at 0)       A hash is tried (increments)  4

Paso 3:

El hardware del minero cambia una pequeña parte de este bloque llamado "nonce".

Paso 4:

El encabezado del bloque tiene un hash y comparado con el Objetivo como si fuera simplemente un número grande como 10,000,000 > 7,000,000 (los números reales son mucho más grandes, y en hexadecimal). El objetivo se comprime y se almacena en cada bloque en un campo llamado bits.

Un objetivo expandido se ve así:

  Target   0000000000000083ef00000000000000000000000000000000000000000000000

Y el objetivo es asegurarse de que el hash SHA256 del bloque sea menor que este valor. En el siguiente ejemplo, " 83ee " es más pequeño que " 83ef "

Para simplificar este concepto, puedes disparar el objetivo contando los ceros iniciales (como lo explica la otra respuesta aquí). Aquí hay un ejemplo:

Aquí hay un ejemplo de un bloque con transacciones que puede ver en BlockChain.info. esquina de la página web para este hash:

   Hash 0000000000000083ee9371ddff055eed7f02348e4eda36c741a2fc62c85bc5cf

Ese hash anterior era de hoy y tiene 14 ceros iniciales. Comparemos eso con lo que se necesitaba hace 3 años con el bloque 100 que tiene 8 ceros a la izquierda.

   Hash 00000000a8ed5e960dccdf309f2ee2132badcc9247755c32a4b7081422d51899

Summary

Al final del día, todo lo que hace un minero es:

  1. tomar un encabezado de bloque como entrada
  2. Cambia el Nonce
  3. Probar si el hash del encabezado de bloque es menor que el objetivo. Si es así, ganas.
  4. Vaya al paso 2 (o vaya al paso 1 si alguien más ganó el bloqueo)
respondido por el random65537 20.02.2015 - 04:37
fuente

Lea otras preguntas en las etiquetas