Bitcoin: un sistema de efectivo electrónico de igual a igual
Satoshi Nakamoto
satoshin@gmx.com
www.bitcoin.org
Resumen. Una versión puramente peer-to-peer de efectivo electrónico permitiría que los pagos en línea se envíen directamente de una parte a otra sin pasar por una institución financiera. Las firmas digitales proporcionan parte de la solución, pero los principales beneficios se pierden si aún se requiere un tercero de confianza para evitar el doble gasto. Proponemos una solución al problema del doble gasto utilizando una red peer-to-peer. La red marca el tiempo de las transacciones al convertirlas en una cadena continua de prueba de trabajo basada en hash, formando un registro que no se puede cambiar sin volver a hacer 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 grupo más grande de potencia de CPU. Siempre que la mayoría de la potencia de la CPU esté controlada por nodos que no cooperen para atacar la red, generarán la cadena más larga y superarán a los atacantes. La red en sí requiere una estructura mínima. Los mensajes se transmiten según el mejor esfuerzo, y los nodos pueden salir y volver a unirse a la red a voluntad, aceptando la cadena de prueba de trabajo más larga como prueba de lo que sucedió mientras no estaban.
1. Introducción
El comercio en Internet ha llegado a depender casi exclusivamente de las instituciones financieras que actúan como terceros de confianza para procesar los pagos electrónicos. Si bien el sistema funciona lo suficientemente bien para la mayoría de las transacciones, aún sufre 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 disputas. El costo de la mediación aumenta los costos de transacción, limitando el tamaño práctico mínimo de la transacción y eliminando la posibilidad de pequeñas transacciones casuales, y existe un costo más amplio en la pérdida de la capacidad de realizar pagos irreversibles por servicios irreversibles. Con la posibilidad de reversión, se extiende la necesidad de confianza. Los comerciantes deben desconfiar de sus clientes, acosándolos para obtener más información de la que de otro modo necesitarían. Un cierto porcentaje de fraude se acepta como inevitable. Estos costos e incertidumbres de pago pueden evitarse en persona mediante el uso de moneda física, pero no existe ningún mecanismo para realizar pagos a través de un canal de comunicaciones sin una parte confiable.
Lo que se necesita es un sistema de pago electrónico basado en pruebas criptográficas en lugar de confianza, que permita a dos partes dispuestas realizar transacciones directamente entre sí sin la necesidad de un tercero de confianza. Las transacciones que no son computacionalmente prácticas para revertir protegerían a los vendedores del fraude, y los mecanismos de depósito en garantía de rutina podrían implementarse fácilmente para proteger a los compradores. En este artículo, proponemos una solución al problema del doble gasto utilizando un servidor de marcas de tiempo distribuido punto a punto para generar una prueba computacional del orden cronológico de las transacciones. El sistema es seguro siempre que los nodos honestos controlen colectivamente más potencia de CPU que cualquier grupo cooperante 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 y agregándolos al final de la moneda. Un beneficiario puede verificar las firmas para verificar la cadena de propiedad.
El problema, por supuesto, es que el beneficiario no puede verificar que uno de los propietarios no gastó dos veces la moneda. Una solución común es introducir una autoridad central de confianza, o menta, que verifique cada transacción en busca de gastos dobles. Después de cada transacción, la moneda debe devolverse a la casa de la moneda para emitir una nueva moneda, y solo se confía en que las monedas emitidas directamente de la casa de la moneda no se gasten dos veces. El problema con esta solución es que el destino de todo el sistema monetario depende de la compañía que administra la casa de la moneda, y cada transacción debe pasar por ellos, al igual que un banco.
Necesitamos una manera para que el beneficiario sepa que los propietarios anteriores no firmaron ninguna transacción anterior. Para nuestros propósitos, la primera transacción es la que cuenta, por lo que no nos importan los intentos posteriores de gastar dos veces. La única forma de confirmar la ausencia de una transacción es conocer 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 confiable, las transacciones deben anunciarse públicamente [1] y necesitamos un sistema para que los participantes acuerden un historial único del orden en que se recibieron. El beneficiario necesita prueba de que en el momento de cada transacción, la mayoría de los nodos acordaron que fue el primero recibido.
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 para marcar con la fecha y publicando ampliamente el hash, como en un periódico o en una publicación de Usenet [2-5]. La marca de tiempo prueba que los datos deben haber existido en ese momento, obviamente, para ingresar al hash. Cada marca de tiempo incluye la marca de tiempo anterior en su hash, formando una cadena, y cada marca de tiempo adicional refuerza las anteriores.
4. Prueba de trabajo
Para implementar un servidor de marca de tiempo distribuido de igual a igual, 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 escanear un valor que, cuando se aplica un hash, como con SHA-256, el hash comienza con una cantidad de cero bits. El trabajo promedio requerido es exponencial en la cantidad de bits cero requeridos y se puede verificar 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 encuentra un valor que le da al hash del bloque los bits cero requeridos. Una vez que se ha gastado el esfuerzo de la CPU para que satisfaga la prueba de trabajo, el bloque no se puede cambiar sin volver a hacer el trabajo. Como los bloques posteriores se encadenan después de él, el trabajo para cambiar el bloque incluiría rehacer todos los bloques posteriores.
La prueba de trabajo también resuelve el problema de determinar la representación en la toma de decisiones por mayoría. Si la mayoría se basara en una dirección IP, un voto, podría ser subvertida por cualquiera capaz de asignar muchas direcciones IP. La prueba de trabajo es esencialmente una CPU, un voto. La decisión mayoritaria está representada por la cadena más larga, que tiene el mayor esfuerzo de prueba de trabajo invertido en ella. Si la mayoría de la potencia de la CPU está controlada por nodos honestos, la cadena honesta crecerá más rápido y superará a 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. Más adelante mostraremos que la probabilidad de que un atacante más lento lo alcance disminuye exponencialmente a medida que se agregan bloques posteriores.
Para compensar el aumento de la velocidad del hardware y el interés variable en ejecutar nodos a lo largo del tiempo, la dificultad de la prueba de trabajo se determina mediante un promedio móvil que apunta a una cantidad promedio de bloques por hora. Si se generan demasiado rápido, la dificultad aumenta.
5. Red
Los pasos para hacer funcionar la red son los siguientes:
1) Las nuevas transacciones se transmiten a todos los nodos.
2) Cada nodo recopila nuevas transacciones en un bloque.
3) Cada nodo trabaja para encontrar una prueba de trabajo difícil para su bloque.
4) Cuando un nodo encuentra una prueba de trabajo, transmite el bloque a todos los nodos.
5) Los nodos aceptan el bloque solo si todas las transacciones en él son válidas y aún no se han gastado.
6) 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 seguirán trabajando para extenderla. Si dos nodos transmiten versiones diferentes del siguiente bloque simultáneamente, algunos nodos pueden recibir uno u otro primero. En ese caso, trabajan en el primero que recibieron, pero guardan la otra rama en caso de que se haga más larga. El empate se romperá cuando se encuentre la siguiente prueba de trabajo y una rama se vuelva más larga; los nodos que estaban trabajando en la otra rama cambiarán a la más larga.
No es necesario que las transmisiones de transacciones nuevas lleguen a todos los nodos. Siempre que lleguen a muchos nodos, entrarán en un bloque en poco tiempo. Las transmisiones en bloque también toleran los mensajes perdidos. Si un nodo no recibe un bloque, lo solicitará cuando reciba el siguiente bloque y se dé cuenta de que perdió uno.
6. Incentivo
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 agrega un incentivo para que los nodos respalden la red y proporciona una forma de distribuir inicialmente monedas en circulación, ya que no existe una autoridad central para emitirlas. La adición constante de una cantidad constante de monedas nuevas es análoga a los mineros de oro que gastan recursos para agregar oro a la circulación. En nuestro caso, lo que se gasta es tiempo de CPU y electricidad.
El incentivo también se puede financiar 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 agrega 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 tarifas de transacción y estar completamente libre de inflación.
El incentivo puede ayudar a alentar a los nodos a permanecer honestos. Si un atacante codicioso puede reunir más potencia de CPU que todos los nodos honestos, tendría que elegir entre usarla para defraudar a la gente robándole sus pagos o usarla para generar nuevas monedas. Debería encontrar más rentable seguir las reglas, esas reglas que lo favorecen con más monedas nuevas que todos los demás juntos, que socavar el sistema y la validez de su propia riqueza.
7. Recuperación de espacio en disco
Una vez que la última transacción en una moneda está enterrada bajo suficientes bloques, las transacciones gastadas antes pueden descartarse para ahorrar espacio en el disco. Para facilitar esto sin romper el hash del bloque, las transacciones se codifican en un Merkle Tree [7][2][5], con solo la raíz incluida en el hash del bloque. Luego, los bloques viejos se pueden compactar cortando las ramas del árbol. Los hashes interiores no necesitan ser almacenados.
Un encabezado de bloque sin transacciones sería de unos 80 bytes. Si suponemos que se generan bloques cada 10 minutos, 80 bytes * 6 * 24 * 365 = 4,2 MB al año. Dado que los sistemas informáticos suelen venderse con 2 GB de RAM a partir de 2008, y la Ley de Moore predice el crecimiento actual de
1,2 GB por año, el almacenamiento no debería ser un problema incluso si los encabezados de los bloques deben mantenerse en la memoria.
8. Verificación de pago simplificada
Es posible verificar los pagos sin ejecutar un nodo de red completo. Un usuario solo necesita conservar una copia de los encabezados de bloque de la cadena de prueba de trabajo más larga, que puede obtener consultando 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. tiene una marca de tiempo. No puede verificar la transacción por sí mismo, pero al vincularla a un lugar en la cadena, puede ver que un nodo de la red la ha aceptado, y los bloques agregados después confirman que la red la ha aceptado.
Como tal, la verificación es confiable siempre que los nodos honestos controlen la red, pero es más vulnerable si un atacante domina la red. Si bien los nodos de la red pueden verificar las transacciones por sí mismos, el método simplificado puede ser engañado por las transacciones fabricadas por un atacante mientras el atacante pueda continuar dominando la red. Una estrategia para protegerse contra esto sería aceptar alertas de los nodos de la red cuando detectan un bloque no válido, incitando al software del usuario a descargar el bloque completo y alertando a las transacciones para confirmar la inconsistencia. Las empresas que reciben pagos frecuentes probablemente querrán ejecutar sus propios nodos para una seguridad más independiente y una verificación más rápida.
9. Combinar y dividir el valor
Aunque sería posible manejar monedas individualmente, sería complicado hacer 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 anterior más grande o varias entradas que combinan cantidades más pequeñas y, como máximo, dos salidas: una para el pago y otra para devolver el cambio, si lo hubiera, al remitente.
Cabe 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 existe la necesidad de extraer una copia independiente completa del historial de una transacción.
10. Privacidad
El modelo bancario tradicional logra un nivel de privacidad al limitar el acceso a la información a las partes involucradas y al tercero de confianza. La necesidad de anunciar públicamente todas las transacciones excluye este método, pero aún se puede mantener la privacidad interrumpiendo el flujo de información en otro lugar: 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 a nadie. Esto es similar al nivel de información publicado por las bolsas de valores, donde se hace público el tiempo y el tamaño de las transacciones individuales, la "cinta", pero sin decir quiénes fueron las partes.
Como firewall adicional, se debe usar un nuevo par de claves para cada transacción para evitar que se vinculen a un propietario común. Cierta vinculación sigue siendo inevitable con las transacciones de entradas múltiples, que necesariamente revelan que sus entradas eran propiedad del mismo propietario. El riesgo es que si se revela el propietario de una clave, la vinculación podría revelar otras transacciones que pertenecían al mismo propietario.
11. Cálculos
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 abre el 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 no válida como pago, y los nodos honestos nunca aceptarán un bloque que los 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 la cadena atacante se puede caracterizar como un paseo aleatorio binomial. El evento de éxito es la cadena honesta que se extiende en un bloque, aumentando su ventaja en +1, y el evento de falla es la cadena del atacante que se extiende en un bloque, reduciendo la brecha en -1.
La probabilidad de que un atacante se ponga al día con un déficit dado es análoga al problema de la ruina del jugador. Supongamos que un jugador con crédito ilimitado comienza con un déficit y juega potencialmente un número infinito de intentos para tratar de alcanzar el punto de equilibrio.
Dada nuestra suposición de que p > q, la probabilidad cae 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 hacia adelante desde el principio, sus posibilidades se vuelven cada vez más pequeñas a medida que se queda atrás.
Ahora consideramos cuánto tiempo debe esperar el destinatario de una nueva transacción antes de estar lo suficientemente seguro de que el remitente no puede cambiar la transacción. Asumimos que el remitente es un atacante que quiere hacer creer al destinatario que le pagó por un tiempo, y luego cambiarlo para pagarse a sí mismo después de que haya pasado un tiempo. El receptor recibirá una alerta cuando eso suceda, pero el remitente espera que sea demasiado tarde.
El receptor genera un nuevo par de claves y entrega la clave pública al remitente poco antes de firmar. Esto evita que el remitente prepare una cadena de bloques con anticipación trabajando en ella continuamente hasta que tenga la suerte de avanzar lo suficiente y luego ejecutar la transacción en ese momento. Una vez que se envía la transacción, el remitente 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 los bloques z se hayan vinculado después. No sabe 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.
12. Conclusión
Hemos propuesto un sistema para transacciones electrónicas sin depender de la confianza. Comenzamos con el marco habitual de monedas hechas a partir de firmas digitales, que proporciona un fuerte control de propiedad, pero está incompleto sin una forma de evitar el doble gasto. Para resolver esto, propusimos una red peer-to-peer que utiliza la prueba de trabajo para registrar un historial público de transacciones que rápidamente se vuelve poco práctico desde el punto de vista computacional para que un atacante lo cambie si los nodos honestos controlan la mayoría de la potencia de la CPU. La red es robusta en su simplicidad no estructurada. Los nodos funcionan todos a la vez con poca coordinación. No es necesario identificarlos, ya que los mensajes no se enrutan a ningún lugar en particular y solo deben entregarse en la medida de lo posible. Los nodos pueden salir y volver a unirse a la red a voluntad, aceptando la cadena de prueba de trabajo como prueba de lo que sucedió mientras no estaban. Votan con la potencia de su CPU, expresando su aceptación de bloques válidos trabajando para extenderlos y rechazando bloques no válidos negándose a trabajar en ellos. Todas las reglas e incentivos necesarios se pueden hacer cumplir con este mecanismo de consenso.
Referencias[1] W. Dai, "b-money", http://www.weidai.com/bmoney.txt, 1998.[2]H. Massias , XS Ávila, and J.-J. Quisquater , "Diseño de un servicio de sellado de tiempo seguro con requisitos mínimos de confianza", en el 20° Simposio sobre Teoría de la Información en el Benelux, mayo de 1999.[3] S. Haber, WS Stornetta , "Cómo aplicar un sello de tiempo a un documento digital", en Journal of Cryptology, vol 3, no 2, páginas 99-111, 1991.[4] D. Bayer, S. Haber, WS Stornetta , "Mejora de la eficiencia y confiabilidad del sellado de tiempo digital", In Sequences II: Methods in Communication, Security and Computer Science, páginas 329-334, 1993.[5] S. Haber, WS Stornetta , "Nombres seguros para cadenas de bits", en Actas de la 4.ª Conferencia ACM sobre seguridad informática y de las comunicaciones, páginas 28 a 35, abril de 1997.[6] A. Back, " Hashcash : una contramedida de denegación de servicio", http://www.hashcash.org/papers/hashcash.pdf, 2002.[7] RC Merkle, "Protocolos para criptosistemas de clave pública", In Proc. Simposio sobre seguridad y privacidad de 1980, IEEE Computer Society, páginas 122-133, abril de 1980.[8]W. Feller, "Introducción a la teoría de la probabilidad y sus aplicaciones", 1957.
Comprar bitcoins
Puedes comprar Bitcoin aquí .