En el mundo de las criptomonedas, un documento ha servido como el fundamento teórico y práctico para una revolución financiera: el White Paper de Bitcoin traducido al español, escrito por Satoshi Nakamoto. Este documento, titulado «Bitcoin: Un Sistema de Efectivo Electrónico Entre Pares», sentó las bases para lo que ahora conocemos como Bitcoin, la primera criptomoneda descentralizada. A continuación, presentamos una traducción al español de este influyente documento, manteniendo la esencia y el mensaje técnico de su versión original, que puedes consultar en bitcoin.org/bitcoin.pdf. Este análisis detallado proporciona una visión clara sobre la innovación detrás de Bitcoin y cómo ha revolucionado el concepto de dinero digital.
Bitcoin: Un Sistema de Efectivo Electrónico Entre Pares
Satoshi Nakamoto
satoshin@gmx.com
www.bitcoin.org
Resumen
Una versión puramente entre pares del efectivo electrónico permitiría que los pagos en línea se enviaran directamente de una parte a otra sin pasar por una institución financiera. Las firmas digitales ofrecen parte de la solución, pero los principales beneficios se pierden si todavía se requiere de una tercera parte de confianza para prevenir el doble gasto. Proponemos una solución al problema del doble gasto utilizando una red entre pares. La red marca temporalmente las transacciones al integrarlas en una cadena continua de prueba de trabajo basada en hash, formando un registro que no puede ser alterado sin rehacer la prueba de trabajo. La cadena más larga no solo sirve como prueba de la secuencia de eventos presenciados, sino también como prueba de que provino del mayor conjunto de poder de procesamiento de CPU. Mientras la mayoría del poder de CPU esté controlada por nodos que no cooperen para atacar la red, ellos generarán la cadena más larga y superarán a los atacantes. La red en sí misma requiere una estructura mínima. Los mensajes se difunden en un esfuerzo mejorado, y los nodos pueden dejar y reincorporarse a la red a voluntad, aceptando la cadena de prueba de trabajo más larga como prueba de lo que sucedió mientras estuvieron ausentes.
1. Introducción
El comercio en Internet ha llegado a depender casi exclusivamente de las instituciones financieras como terceras partes de confianza para procesar pagos electrónicos. Aunque el sistema funciona lo suficientemente bien para la mayoría de las transacciones, aún sufre de las debilidades inherentes del modelo basado en la confianza. Las transacciones completamente irreversibles no son realmente posibles, ya que las instituciones financieras no pueden evitar mediar en disputas. El costo de mediación incrementa los costos de transacción, limitando el tamaño práctico mínimo de transacción y eliminando la posibilidad de transacciones casuales pequeñas, y hay un costo más amplio en la pérdida de la capacidad de realizar pagos no reversibles por servicios no reversibles. Con la posibilidad de reversión, la necesidad de confianza se extiende. Los comerciantes deben desconfiar de sus clientes, molestándolos por más información de la que necesitarían de otra manera. Un cierto porcentaje de fraude es aceptado como inevitable. Estos costos e incertidumbres de pago se pueden evitar en persona utilizando moneda física, pero no existe un mecanismo para realizar pagos a través de un canal de comunicaciones sin una parte de confianza.
Lo que se necesita es un sistema de pago electrónico basado en la prueba criptográfica en lugar de la confianza, permitiendo a dos partes dispuestas a realizar transacciones directamente entre ellas sin la necesidad de una tercera parte de confianza. Transacciones que son computacionalmente imprácticas de revertir protegerían a los vendedores del fraude, y los mecanismos rutinarios de depósito en garantía podrían implementarse fácilmente para proteger a los compradores. En este documento, proponemos una solución al problema del doble gasto utilizando un servidor de marca de tiempo distribuido entre pares para generar una prueba computacional del orden cronológico de las transacciones. El sistema es seguro siempre y cuando los nodos honestos controlen colectivamente más poder de CPU que cualquier grupo cooperativo de nodos atacantes.
2. Transacciones
Definimos una moneda electrónica como una cadena de firmas digitales. Cada propietario transfiere la moneda al siguiente firmando digitalmente un hash de la transacción anterior y la clave pública del próximo propietario, añadiendo esto al final de la moneda. Un beneficiario puede verificar las firmas para confirmar la cadena de propiedad.
El problema, por supuesto, es que el beneficiario no puede verificar que uno de los propietarios no haya gastado la moneda dos veces. Una solución común es introducir una autoridad central de confianza, o casa de la moneda, que revise cada transacción en busca de doble gasto. Después de cada transacción, la moneda debe ser devuelta a la casa de la moneda para emitir una nueva moneda, y solo las monedas emitidas directamente por la casa de la moneda se confían en no ser gastadas dos veces. El problema con esta solución es que el destino de todo el sistema monetario depende de la empresa que administra la casa de la moneda, con cada transacción teniendo que pasar por ellos, al igual que un banco.
Necesitamos una manera para que el beneficiario sepa que los propietarios anteriores no firmaron transacciones anteriores. Para nuestros propósitos, la transacción más temprana es la que cuenta, por lo que no nos preocupamos por intentos posteriores de doble gasto. La única forma de confirmar la ausencia de una transacción es estar al tanto de todas las transacciones. En el modelo basado en la casa de la moneda, la casa de la moneda estaba al tanto de todas las transacciones y decidía cuál llegaba primero. Para lograr esto sin una parte de confianza, las transacciones deben ser anunciadas públicamente [1], y necesitamos un sistema para que los participantes acuerden una única historia del orden en que fueron recibidas. El beneficiario necesita pruebas de que, en el momento de cada transacción, la mayoría de los nodos estuvieron de acuerdo en que fue la primera recibida.
3. Servidor de Marca de Tiempo
La solución que proponemos comienza con un servidor de marca de tiempo. Un servidor de marca de tiempo funciona tomando un hash de un bloque de elementos a los que se les va a poner marca de tiempo y publicando ampliamente el hash, como en un periódico o una publicación de Usenet [2-5]. La marca de tiempo demuestra que los datos deben haber existido en ese momento, obviamente, para poder entrar en el hash. Cada marca de tiempo incluye la marca de tiempo anterior en su hash, formando una cadena, con cada marca de tiempo adicional reforzando las anteriores.
4. Prueba de Trabajo
Para implementar un servidor de marca de tiempo distribuido en una base entre pares, necesitaremos usar un sistema de prueba de trabajo similar al Hashcash de Adam Back [6], en lugar de publicaciones en periódicos o Usenet. La prueba de trabajo implica buscar un valor que, al ser hasheado, como con SHA-256, el hash comience con un número de bits cero. El trabajo promedio requerido es exponencial en el número de bits cero necesarios y puede ser verificado ejecutando un solo hash.
Para nuestra red de marca de tiempo, implementamos la prueba de trabajo incrementando un nonce en el bloque hasta que se encuentre un valor que dé al hash del bloque los bits cero requeridos. Una vez que se ha gastado el esfuerzo de la CPU para hacerlo satisfacer la prueba de trabajo, el bloque no puede ser cambiado sin rehacer el trabajo. A medida que se encadenan bloques posteriores después de él, el trabajo para cambiar el bloque incluiría rehacer todos los bloques posteriores a él.
La prueba de trabajo también soluciona el problema de determinar la representación en la toma de decisiones mayoritarias. Si la mayoría se basara en un sistema de «una dirección IP, un voto», podría ser subvertida por cualquiera capaz de asignar muchas direcciones IP. La prueba de trabajo es esencialmente un sistema de «un CPU, un voto». La decisión mayoritaria está representada por la cadena más larga, que tiene la mayor cantidad de esfuerzo de prueba de trabajo invertido en ella. Si una mayoría del poder de CPU es controlada por nodos honestos, la cadena honesta crecerá más rápido y superará cualquier cadena competidora. Para modificar un bloque anterior, un atacante tendría que rehacer la prueba de trabajo del bloque y todos los bloques posteriores, y luego alcanzar y superar el trabajo de los nodos honestos. Mostraremos más adelante que la probabilidad de que un atacante más lento alcance disminuye exponencialmente a medida que se agregan bloques subsiguientes.
Para compensar el aumento de la velocidad del hardware y el interés variable en ejecutar nodos con el tiempo, la dificultad de la prueba de trabajo se determina mediante un promedio móvil que apunta a un número promedio de bloques por hora. Si se generan demasiado rápido, la dificultad aumenta.
5. Red
Los pasos para operar la red son los siguientes:
1) Difusión de Nuevas Transacciones: Las nuevas transacciones se transmiten a todos los nodos.
2) Recolección de Transacciones en un Bloque: Cada nodo recopila nuevas transacciones en un bloque.
3) Búsqueda de la Prueba de Trabajo: Cada nodo trabaja en encontrar una prueba de trabajo difícil para su bloque.
4) Difusión del Bloque: Cuando un nodo encuentra una prueba de trabajo, transmite el bloque a todos los nodos.
5) Aceptación del Bloque: Los nodos aceptan el bloque solo si todas las transacciones en él son válidas y no se han gastado previamente.
6) Expresión de Aceptación y Creación del Siguiente Bloque: Los nodos expresan su aceptación del bloque trabajando en la creación del siguiente bloque en la cadena, utilizando el hash del bloque aceptado como el hash anterior.
Los nodos siempre consideran que la cadena más larga es la correcta y continuarán trabajando en extenderla. Si dos nodos transmiten diferentes versiones del siguiente bloque simultáneamente, algunos nodos pueden recibir primero una u otra. En ese caso, trabajan en la primera que recibieron, pero guardan la otra rama en caso de que se vuelva más larga. El empate se rompe cuando se encuentra la siguiente prueba de trabajo y una rama se vuelve más larga; los nodos que estaban trabajando en la otra rama entonces cambiarán a la más larga.
En la red de Bitcoin, la difusión de nuevas transacciones no necesita necesariamente llegar a todos los nodos. Mientras alcancen a muchos nodos, estas transacciones se incluirán en un bloque antes de mucho tiempo. Esta flexibilidad es clave para la eficiencia y la escalabilidad de la red.
La transmisión de bloques también es tolerante a la pérdida de mensajes. Si un nodo no recibe un bloque, lo solicitará cuando reciba el siguiente bloque y se dé cuenta de que se perdió uno anterior. Este mecanismo de «recuperación» asegura que incluso si hay interrupciones temporales o problemas en la red, la integridad y continuidad de la cadena de bloques se mantiene. Esto contribuye a la robustez y fiabilidad de la red Bitcoin, permitiendo que se adapte y funcione eficientemente incluso en condiciones no ideales.
En resumen, la red Bitcoin está diseñada para manejar eficientemente la difusión de información, asegurando que las transacciones y los bloques se propaguen de manera efectiva a través de la red, incluso en presencia de obstáculos técnicos, lo que representa un aspecto crucial de su diseño descentralizado y resistente.
6. Incentivos
En la red Bitcoin, hay un mecanismo de incentivo único e innovador para animar a los nodos a apoyar la red. Por convención, la primera transacción en un bloque es una transacción especial que inicia una nueva moneda propiedad del creador del bloque. Esto no solo incentiva la participación en la red sino que también proporciona un método para distribuir inicialmente las monedas en circulación, ya que no existe una autoridad central que las emita.
La adición constante de una cantidad fija de nuevas monedas es análoga a los mineros de oro que invierten recursos para agregar oro a la circulación. En nuestro caso, lo que se gasta es tiempo de CPU y electricidad. Este proceso se asemeja a la minería de recursos en el mundo real, recompensando el esfuerzo y la inversión de los participantes de la red.
Además, los incentivos también pueden ser financiados con tarifas de transacción. Si el valor de salida de una transacción es menor que su valor de entrada, la diferencia es una tarifa de transacción que se añade al valor de incentivo del bloque que contiene la transacción. Una vez que un número predeterminado de monedas haya entrado en circulación, el incentivo puede pasar completamente a las tarifas de transacción y estar completamente libre de inflación.
Este sistema de incentivos también ayuda a fomentar la honestidad entre los nodos. Si un atacante codicioso logra reunir más poder de CPU que todos los nodos honestos, tendría que elegir entre usarlo para defraudar a la gente robando sus pagos, o usarlo para generar nuevas monedas. Probablemente le resulte más rentable seguir las reglas, ya que estas le favorecen con más monedas nuevas que a todos los demás combinados, en lugar de socavar el sistema y la validez de su propia riqueza.
7. Recuperación de Espacio en Disco
En la red de Bitcoin, existe un método eficiente para recuperar espacio en disco, lo que es crucial para el mantenimiento y la escalabilidad de la red. Una vez que la última transacción en una moneda está suficientemente «enterrada» bajo bloques suficientes, las transacciones gastadas anteriores pueden ser descartadas para ahorrar espacio en disco. Para facilitar esto sin romper el hash del bloque, las transacciones se hashean en un Árbol de Merkle [7][2][5], incluyendo solo la raíz en el hash del bloque. Los bloques antiguos pueden compactarse eliminando ramas del árbol. No es necesario almacenar los hashes interiores.
Un encabezado de bloque sin transacciones sería de aproximadamente 80 bytes. Si suponemos que los bloques se generan cada 10 minutos, 80 bytes * 6 * 24 * 365 = 4.2MB por año. Teniendo en cuenta que los sistemas informáticos típicamente se vendían con 2GB de RAM en 2008, y la Ley de Moore predice un crecimiento actual de 1.2GB por año, el almacenamiento no debería ser un problema, incluso si los encabezados de los bloques deben mantenerse en memoria.
Este enfoque muestra la sofisticación y la eficiencia de diseño de Bitcoin. La capacidad de compactar y desechar datos antiguos sin comprometer la integridad y seguridad de la cadena de bloques subraya la combinación única de Bitcoin de innovación tecnológica y practicidad operativa, asegurando su viabilidad a largo plazo como sistema de transacciones digitales.
8. Verificación de Pagos Simplificada
En la red Bitcoin, existe una manera eficiente de verificar pagos sin necesidad de ejecutar un nodo completo de la red. Un usuario solo necesita mantener una copia de los encabezados de bloque de la cadena de prueba de trabajo más larga, lo cual puede obtener consultando a los nodos de la red hasta que esté convencido de que tiene la cadena más larga, y obtener la rama de Merkle que vincula la transacción con el bloque en el que está marcada temporalmente. El usuario no puede verificar la transacción por sí mismo, pero al vincularla con un lugar en la cadena, puede ver que un nodo de la red la ha aceptado, y los bloques agregados después de ella confirman aún más que la red la ha aceptado.
Esta forma de verificación es confiable mientras los nodos honestos controlen la red, pero es más vulnerable si la red es dominada por un atacante. Mientras que los nodos de la red pueden verificar las transacciones por sí mismos, el método simplificado puede ser engañado por transacciones fabricadas por un atacante, siempre y cuando el atacante pueda seguir dominando la red. Una estrategia para protegerse contra esto sería aceptar alertas de los nodos de la red cuando detecten un bloque inválido, lo que incitaría al software del usuario a descargar el bloque completo y las transacciones alertadas para confirmar la inconsistencia. Las empresas que reciben pagos frecuentes probablemente aún querrán ejecutar sus propios nodos para una seguridad más independiente y una verificación más rápida.
Este enfoque de verificación simplificada subraya la flexibilidad y accesibilidad de Bitcoin, permitiendo a los usuarios verificar transacciones con un menor compromiso de recursos, al tiempo que proporciona opciones para una mayor seguridad y autonomía para aquellos que lo requieren, como las empresas que manejan un volumen significativo de transacciones.
9. Combinando y Dividiendo Valor
En la red Bitcoin, aunque sería posible manejar monedas individualmente, sería poco práctico realizar una transacción separada por cada centavo en una transferencia. Para permitir que el valor se divida y combine, las transacciones contienen múltiples entradas y salidas. Normalmente, habrá una sola entrada de una transacción previa más grande o múltiples entradas que combinan cantidades menores, y como máximo dos salidas: una para el pago y otra para devolver el cambio, si lo hay, al emisor.
Es importante señalar que el «fan-out», donde una transacción depende de varias transacciones y esas transacciones dependen de muchas más, no es un problema aquí. Nunca es necesario extraer una copia completa e independiente del historial de una transacción. Este diseño permite una gran flexibilidad y eficiencia en la forma en que se manejan los valores dentro de la red, permitiendo transacciones complejas y variadas sin comprometer la eficiencia o la claridad en el seguimiento de la propiedad y el historial de transacciones.
Este enfoque en la combinación y división de valor subraya la naturaleza adaptable y sofisticada de Bitcoin, facilitando transacciones fluidas y versátiles, lo que es esencial para su funcionalidad como un sistema de efectivo electrónico entre pares. La capacidad de manejar transacciones de esta manera contribuye significativamente a la usabilidad y la practicidad de Bitcoin en una amplia variedad de aplicaciones financieras.
10. Privacidad
En el mundo de Bitcoin, se aborda la privacidad de una manera única, diferente al modelo bancario tradicional. Mientras que los bancos tradicionales logran un nivel de privacidad limitando el acceso a la información a las partes involucradas y a la tercera parte de confianza, Bitcoin adopta un enfoque distinto debido a la necesidad de anunciar todas las transacciones públicamente.
En Bitcoin, la privacidad se mantiene rompiendo el flujo de información en otro punto: manteniendo anónimas las claves públicas. El público puede ver que alguien está enviando una cantidad a otra persona, pero sin información que vincule la transacción con alguien específico. Esto es similar al nivel de información que liberan las bolsas de valores, donde se hace público el momento y el tamaño de las operaciones individuales, la «cinta», pero sin decir quiénes son las partes.
Como una capa adicional de seguridad, se debe utilizar un nuevo par de claves para cada transacción para evitar que se vinculen a un propietario común. Algunos enlaces todavía son inevitables con transacciones de múltiples entradas, que necesariamente revelan que sus entradas pertenecían al mismo propietario. El riesgo es que si se revela el propietario de una clave, el enlace podría revelar otras transacciones que pertenecían al mismo propietario.
Este enfoque en la privacidad subraya el equilibrio de Bitcoin entre transparencia y privacidad, proporcionando una visibilidad pública de las transacciones mientras protege la identidad de los individuos involucrados, un aspecto clave que lo distingue de los sistemas financieros tradicionales y fortalece su posición como una forma innovadora de moneda digital.
11. Cálculos
En la red Bitcoin, consideramos el escenario de un atacante que intenta generar una cadena alternativa más rápido que la cadena honesta. Incluso si esto se logra, no expone al sistema a cambios arbitrarios, como crear valor de la nada o tomar dinero que nunca perteneció al atacante. Los nodos no aceptarán una transacción inválida como pago, y los nodos honestos nunca aceptarán un bloque que las contenga. Un atacante solo puede intentar cambiar una de sus propias transacciones para recuperar el dinero que gastó recientemente.
La carrera entre la cadena honesta y una cadena atacante puede caracterizarse como un Paseo Aleatorio Binomial. El evento de éxito es que la cadena honesta se extienda por un bloque, aumentando su ventaja en +1, y el evento de fracaso es que la cadena del atacante se extienda por un bloque, reduciendo la brecha en -1.
La probabilidad de que un atacante se ponga al día desde un déficit dado es análoga a un problema de Ruina del Jugador. Supongamos que un jugador con crédito ilimitado comienza con un déficit y juega potencialmente un número infinito de pruebas para tratar de alcanzar el punto de equilibrio. Podemos calcular la probabilidad de que alguna vez alcance el punto de equilibrio, o que un atacante alguna vez se ponga al día con la cadena honesta, de la siguiente manera [8]:
- p = probabilidad de que un nodo honesto encuentre el próximo bloque
- q = probabilidad de que el atacante encuentre el próximo bloque
- qz = probabilidad de que el atacante se ponga al día desde z bloques detrás
Dada nuestra suposición de que p > q, la probabilidad disminuye exponencialmente a medida que aumenta el número de bloques que el atacante tiene que alcanzar. Con las probabilidades en su contra, si no da un salto afortunado al principio, sus posibilidades se vuelven ínfimas a medida que se queda más atrás.
Ahora consideramos cuánto tiempo necesita esperar el destinatario de una nueva transacción antes de estar suficientemente seguro de que el emisor no puede cambiar la transacción. Suponemos que el emisor es un atacante que quiere hacer creer al destinatario que le pagó por un tiempo, luego cambiarlo para pagarse a sí mismo después de que haya pasado algún tiempo. El receptor será alertado cuando eso suceda, pero el emisor espera que sea demasiado tarde.
El receptor genera un nuevo par de claves y le da la clave pública al emisor poco antes de firmar. Esto evita que el emisor prepare una cadena de bloques con anticipación trabajando en ella continuamente hasta que tenga la suerte de adelantarse lo suficiente, luego ejecutar la transacción en ese momento. Una vez que se envía la transacción, el emisor deshonesto comienza a trabajar en secreto en una cadena paralela que contiene una versión alternativa de su transacción.
El destinatario espera hasta que la transacción se haya agregado a un bloque y z bloques se hayan vinculado después de ella. Él no conoce la cantidad exacta de progreso que ha hecho el atacante, pero asumiendo que los bloques honestos tomaron el tiempo promedio esperado por bloque, el progreso potencial del atacante será una distribución de Poisson con valor esperado:
Para obtener la probabilidad de que el atacante todavía pueda alcanzar ahora, multiplicamos la densidad de Poisson para cada cantidad de progreso que podría haber hecho por la probabilidad de que pueda alcanzar desde ese punto:
Reorganizando para evitar sumar la cola infinita de la distribución…
Convirtiendo a código C…
#include <math.h>
double AttackerSuccessProbability(double q, int z)
{
double p = 1.0 - q;
double lambda = z * (q / p);
double sum = 1.0;
int i, k;
for (k = 0; k <= z; k++)
{
double poisson = exp(-lambda);
for (i = 1; i <= k; i++)
poisson *= lambda / i;
sum -= poisson * (1 - pow(q / p, z - k));
}
return sum;
}
Ejecutando algunos resultados, podemos ver que la probabilidad disminuye exponencialmente con z.
q=0.1
z=0 P=1.0000000
z=1 P=0.2045873
z=2 P=0.0509779
z=3 P=0.0131722
z=4 P=0.0034552
z=5 P=0.0009137
z=6 P=0.0002428
z=7 P=0.0000647
z=8 P=0.0000173
z=9 P=0.0000046
z=10 P=0.0000012
q=0.3
z=0 P=1.0000000
z=5 P=0.1773523
z=10 P=0.0416605
z=15 P=0.0101008
z=20 P=0.0024804
z=25 P=0.0006132
z=30 P=0.0001522
z=35 P=0.0000379
z=40 P=0.0000095
z=45 P=0.0000024
z=50 P=0.0000006
Resolviendo para P menor al 0.1%…
P < 0.001
q=0.10 z=5
q=0.15 z=8
q=0.20 z=11
q=0.25 z=15
q=0.30 z=24
q=0.35 z=41
q=0.40 z=89
q=0.45 z=340
12. Conclusión
Hemos propuesto un sistema para transacciones electrónicas que no depende de la confianza. Comenzamos con el marco habitual de monedas creadas a partir de firmas digitales, lo que proporciona un fuerte control de propiedad, pero es incompleto sin una forma de prevenir el doble gasto. Para resolver esto, propusimos una red entre pares que utiliza prueba de trabajo para registrar un historial público de transacciones que rápidamente se vuelve computacionalmente impracticable para un atacante cambiar si los nodos honestos controlan la mayoría del poder de CPU. La red es robusta en su simplicidad no estructurada. Los nodos trabajan todos a la vez con poca coordinación. No necesitan ser identificados, ya que los mensajes no se dirigen a ningún lugar en particular y solo necesitan ser entregados de la mejor manera posible. Los nodos pueden dejar y reincorporarse a la red a voluntad, aceptando la cadena de prueba de trabajo como prueba de lo que sucedió mientras estaban ausentes. Votan con su poder de CPU, expresando su aceptación de bloques válidos trabajando en extenderlos y rechazando bloques inválidos al negarse a trabajar en ellos. Cualquier regla e incentivo necesarios pueden ser impuestos con este mecanismo de consenso.
Este innovador sistema abre un nuevo camino en el mundo de las transacciones digitales, ofreciendo una solución descentralizada y segura que desafía los métodos tradicionales basados en la confianza y las instituciones centralizadas. Representa un cambio fundamental en el enfoque de las transacciones electrónicas, proporcionando un marco para operaciones financieras transparentes, eficientes y accesibles, democratizando así el acceso a la economía digital global.
Referencias
- W. Dai, «b-money,» 1998. Disponible en: http://www.weidai.com/bmoney.txt.
- H. Massias, X.S. Avila, y J.-J. Quisquater, «Design of a secure timestamping service with minimal trust requirements,» en el 20th Symposium on Information Theory in the Benelux, Mayo 1999.
- S. Haber, W.S. Stornetta, «How to time-stamp a digital document,» en Journal of Cryptology, vol 3, no 2, páginas 99-111, 1991.
- D. Bayer, S. Haber, W.S. Stornetta, «Improving the efficiency and reliability of digital time-stamping,» en Sequences II: Methods in Communication, Security and Computer Science, páginas 329-334, 1993.
- S. Haber, W.S. Stornetta, «Secure names for bit-strings,» en Proceedings of the 4th ACM Conference on Computer and Communications Security, páginas 28-35, Abril 1997.
- A. Back, «Hashcash – a denial of service counter-measure,» 2002. Disponible en: http://www.hashcash.org/papers/hashcash.pdf.
- R.C. Merkle, «Protocols for public key cryptosystems,» en Proc. 1980 Symposium on Security and Privacy, IEEE Computer Society, páginas 122-133, Abril 1980.
- W. Feller, «An introduction to probability theory and its applications,» 1957.