Bitcoin: Un Sistema de Efectivo Electrónico Usuario-a-Usuario (parte 2)
4. Prueba-de-trabajo Para implementar un servidor de marcas de tiempo en una base usuario-a-usuario, necesitaremos utilizar un sistema de prueba-de-trabajo similar al Hashcash de Adam Back [6], en vez de un periódico o una publicación en Usenet. La prueba-de-trabajo envuelve la exploración de un valor que al calcular un hash, tal como SHA-256, el hash empiece con un número de bits en cero. El trabajo promedio requerido es exponencial en el número de bits puestos en cero requeridos y puede ser verificado ejecutando un solo hash.
7/1/20244 min read
4. Prueba-de-trabajo
Para implementar un servidor de marcas de tiempo en una base usuario-a-usuario, necesitaremos
utilizar un sistema de prueba-de-trabajo similar al Hashcash de Adam Back [6], en vez de un
periódico o una publicación en Usenet. La prueba-de-trabajo envuelve la exploración de un valor
que al calcular un hash, tal como SHA-256, el hash empiece con un número de bits en cero. El
trabajo promedio requerido es exponencial en el número de bits puestos en cero requeridos y
puede ser verificado ejecutando un solo hash.
Para nuestra red de marcas de tiempo, implementamos la prueba-de-trabajo incrementando un
nonce en el bloque hasta que un valor es encontrado que de el número requerido de bits en cero
para el hash del bloque. Una vez que el esfuerzo de CPU se ha gastado para satisfacer la pruebade-
trabajo, el bloque no puede ser cambiado sin rehacer todo el trabajo. A medida que más
bloques son encadenados después de este, el trabajo para cambiar el bloque incluiría rehacer
todos los bloques después de este.
La prueba-de-trabajo también resuelve el problema de determinar la representación en cuanto a
decisión por mayoría. Si la mayoría fuese basada en un voto por dirección IP, podría ser
subvertida por alguien capaz de asignar muchos IPs. Prueba-de-trabajo es esencialmente unCPU-
un-voto. La decisión de la mayoría es representada por la cadena más larga, la cual tiene la
prueba-de-trabajo de mayor esfuerzo invertido en ella. Si la mayoría del poder de CPU es
controlada por nodos honestos, la cadena honesta crecerá más rápido y pasará cualquier cadena
que esté compitiendo. Para modificar un bloque en el pasado, un atacante tendría que rehacer la
prueba-de-trabajo del bloque y de todos los bloques después y luego alcanzar y pasar el trabajo
de los nodos honestos. Luego demostraremos que la probabilidad de un atacante más lento de
alcanzar disminuye exponencialmente a medida que bloques subsecuentes son añadidos.
Para compensar por el incremento de velocidad de hardware y en el interés variante de corre
nodos en el tiempo, la dificultad de la prueba-de-trabajo es determinada por una media móvil
dirigida a un número promedio de bloques por hora. Si estos se generan muy rápido, la dificultad incrementa.
5. La Red
Los pasos para gestionar la red son como sigue:
1) Transacciones nuevas son emitidas a todos los nodos.
2) Cada nodo recolecta nuevas transacciones en un bloque.
3) Cada nodo trabaja en encontrar una prueba-de-trabajo difícil para su bloque.
4) Cuando un nodo encuentra una prueba-de-trabajo, emite el bloque a todos los nodos.
5) Los nodos aceptan el bloque si todas las transacciones en el bloque son válidas y no se han
gastado ya.
6) Los nodos expresan su aceptación del bloque al trabajar en crear el próximo bloque en la
cadena, utilizando el hash del bloque aceptado como el hash previo.
Los nodos siempre consideran la cadena más larga como la correcta y empiezan a trabajar en
extenderla. Si dos nodos emiten versiones diferentes del próximo bloque simultáneamente,
algunos nodos puede que reciban uno o el otro primero. En ese caso, trabajan en el primero que
reciban pero guardan la otra rama en caso de que esta se vuelva más larga. El empate se rompe
cuando la próxima prueba-de-trabajo es encontrada y una rama se vuelve más larga; los nodos
que estaban trabajando en la otra rama luego se cambian a la más larga.
3
Las emisiones de nuevas transacciones no necesariamente necesitan llegar a todos los nodos.
Tanto estas lleguen a muchos nodos, entrarán a un bloque antes de que pase mucho tiempo. Las
emisiones de bloques también son tolerantes a mensajes perdidos. Si un nodo no recibe un
bloque, lo va a pedir cuando reciba el próximo bloque y se de cuenta que se perdió uno.
6. Incentivo
Por convención, la primera transacción en el bloque es una transacción especial que comienza
una moneda nueva cuyo dueño es el creador del bloque. Esto agrega un incentivo para que los
nodos apoyen a la red, y provee una forma inicial de distribuir monedas en circulación, dado que
no hay una autoridad para crearlas. Esta adición estable de una cantidad constante de monedas
nuevas es análoga a mineros de oro gastando recursos para agregar oro a la circulación. En
nuestro caso, es el tiempo del CPU y la electricidad que se gasta.
El incentivo también puede ser fundado con costos de transacción. Si el valor de salida de una
transacción es menor que la entrada, la diferencia es una tarifa de transacción que se le añade al
valor de incentivo del bloque que contiene la transacción. Una vez que un número
predeterminado de monedas han entrado en circulación, el incentivo puede transicionar
enteramente a tarifas de transacción y ser completamente libre de inflación.
El incentivo puede ayudar a animar a los nodos a mantenerse honestos. Si un atacante egoísta
es capaz de reunir más potencia de CPU que todos los nodos honestos, este tendría que elegir
entre utilizarla para defraudar a la gente robando sus pagos de vuelta, o en utilizarla para generar
monedas nuevas. Debería encontrar más rentable jugar por las reglas, tales regla lo favorecen a el
con más monedas que a todos los demás combinados, que socavar el sistema y la validez de su
propia riqueza.
7. Reclamando Espacio en Disco
Una vez que la última transacción en una moneda es enterrada bajo suficientes bloques, las
transacciones gastadas antes de estas pueden ser descartadas para ahorrar espacio en disco. Para
facilitar esto sin romper el hash del bloque, las transacciones se les comprueba en un árbol
Merkle [7] [2] [5], con la única raíz incluida en el hash el bloque. Los bloques viejos pueden ser
compactados al sacar ramas del árbol. Los hashes interiores no necesitan ser guardados.
La cabecera de un bloque sin transacciones sería de unos 80 bytes. Si suponemos que cada
bloque es generado cada 10 minutos, 80 bytes 6 24 * 365 = 4.2MB por año. Con
computadoras generalmente vendiéndose con 2GB de RAM para el 2008, y la ley de Moore
prediciendo el crecimiento actual de 1.2GB por año, el almacenamiento no debe ser un problema
aun si las cabeceras de los bloques deben permanecer en memoria.