Litecoin resiste la aceleración de la GPU mediante el uso de una función hash basada en scrypt que requiere cierta cantidad de memoria para generar y verificar. El problema con esto es que el r
parámetro debe configurarse lo suficientemente alto como para que sea difícil usar una GPU, pero lo suficientemente bajo como para que los clientes con poca memoria (es decir, los teléfonos inteligentes) aún puedan verificar bloques de manera eficiente.
¿Existe una prueba de trabajo que requiera significativamente más memoria para generar una prueba de trabajo para un bloque que para verificar que un bloque contiene suficiente prueba de trabajo?
He oído hablar de dos enfoques posibles: compensación de tiempo-memoria con scrypt y un algoritmo hash de teoría de grafos que requiere mucha memoria para encontrar soluciones.
Creo que un proceso de minería que hiciera uso de muestreo estocástico de un gran conjunto de datos cumpliría con los requisitos que ha establecido. La cadena de bloques incluso proporciona un gran conjunto de datos para esto. Por ejemplo, digamos que cada nonce requiere que muestree aleatoriamente la cadena de bloques para seleccionar algunos bytes. Dado que usa muchos nonces durante la minería y no puede predecir qué datos necesitaría de la cadena de bloques, básicamente necesitaría tener toda la cadena de bloques (cualquier conjunto de datos acordado públicamente, en realidad) disponible durante la minería. Luego, la solución se puede verificar con una pequeña muestra de ese conjunto de datos y alguna prueba de que los datos están en el conjunto. Al usar el ejemplo de blockchain, probablemente necesite una cadena de encabezados de bloque y una rama Merkle para los datos de transacción seleccionados.
Otra forma de hacer esto sería usar un gran árbol merkle aleatorio . Digamos que alguien creó un árbol merkle de 2^31 valores aleatorios de 32 bytes. Al tener en cuenta que las ramas de merkle también deben almacenarse, esto es (1 + 2 + 2^2 + 2^3 + ... + 2^31) * 32 bytes
, o (2^32-1)*32 ~= 137.4 GB
de datos en total. Estos datos están disponibles públicamente para cualquier persona que realmente quisiera descargarlos y verificar la raíz de Merkle. La raíz de merkle se conocería como la raíz de merkle minera, y es una constante bien conocida y acordada. La minería implica muestrear este árbol merkle aleatorio y hashing, y al encontrar una solución exitosa, se proporciona la rama del árbol merkle, lo que demuestra que los datos que se muestrearon están realmente en el árbol merkle acordado públicamente.
En este esquema, se necesitan ~137,4 GB de memoria para minar, pero solo ~1 kB de datos para verificar una solución contra la raíz de merkle acordada públicamente.
Y los números obviamente podrían modificarse aquí para permitir que las personas extraigan sin renunciar a 137,4 GB de su disco duro. Habría que llegar a un equilibrio.
De hecho, me gusta más de esta manera, ahora que lo pienso, porque no tiene el efecto secundario de que la minería puede llevar más tiempo a medida que crece la cadena de bloques. Probablemente podría incluso tomar una instantánea de la cadena de bloques de bitcoin y usarla como un conjunto de datos verificable públicamente. Pero el método de la cadena de bloques esencialmente obliga a los nodos a ser nodos completos también, lo cual es interesante, por lo que es una compensación.
Editar: con una búsqueda rápida, encontré este documento que resuelve esencialmente el mismo problema con un método de muestreo estocástico diferente que involucra la paradoja del cumpleaños. Su solución es interesante porque implica crear su propio conjunto de datos cada vez. Pero esto puede no ser realmente algo bueno, ya que desalienta la reconstrucción de bloques cuando ingresan nuevas transacciones.
http://www.hashcash.org/papers/momentum.pdf
Una discusión relevante de bitcointalk sobre el algoritmo Momentum:
https://bitcointalk.org/index.php?topic=313479.0
Creo que es divertido cómo el aspecto de "impulso" (no poder actualizar Merkle después de que se crea por primera vez) se promociona como la característica definitoria del algoritmo, aunque en realidad es una desventaja bastante significativa, ya que retrasa la confirmación de todas las transacciones por 1 bloque. . También puede exacerbar el problema en el que los mineros no quieren extraer grandes bloques porque tardan mucho en propagarse. es decir, puede ser más rentable continuar minando con su pequeño bloque incluso después de haber oído hablar de un nuevo bloque en la red porque el impulso que ya tiene lo hace más fácil. Creo que el hecho de que el algoritmo PoW de bitcoin no tenga ningún impulso es en realidad una gran característica, ya que permite que las transacciones se confirmen rápidamente.
El uso de un conjunto de datos que no cambia, como en la solución que proporcioné anteriormente, proporciona los requisitos de memoria asimétrica deseados en el trabajo de trabajo/verificación, al mismo tiempo que evita el problema del impulso.
Dagger está destinado a requerir mucha memoria para crear, pero poca para verificar.
Mi "Ciclo Cuckoo" https://github.com/tromp/cuckoo es una prueba de trabajo teórica de gráfico vinculada a la memoria que es trivial de verificar y, AFAIK, es la única cuyo tiempo de ejecución está dominado por la latencia de la memoria.
amaclin
Nick ODell
amaclin
Nick ODell
There is no such thing as "verify hash function"
Claro que lo hay.But to verify it we should calculate the value
Di la compensación de memoria de tiempo con scrypt como ejemplo, por lo que es claramente posible.Janes
Nick ODell
Litecoin doesn't 'resist' GPU. Not even ASICs.
Es mejor que Bitcoin, al menos. Si tiene una redacción alternativa, siéntase libre de editar mi pregunta.Also: finding and verifying a hash are the same thing, only difference is that when verifying you only need to do the calculation once instead of billions of times.
Soy consciente de que SHA256 es así. ¿Podría haber algún sistema de prueba de trabajo que no sea SHA256 o que no esté basado en hashcash que cumpla con los requisitos que establecí?Janes
mago de ozzie
Nick ODell
Janes
CodesInChaos