# Protocolo Bitcoin

Bitcoin es un protocolo, proyecto de código abierto y red peer-to-peer que se utiliza como criptomoneda, sistema de pago y mercancía.
El sistema bitcoin usa la criptografía para controlar la creación y gestión descentralizada de fichas bitcoin, las cuales son consideradas activos digitales que sirven como medio de intercambio y almacén de valor.

## Software
### Programas cliente

Aunque existen monedas y billetes fabricados por particulares y empresas, normalmente para poder comerciar con bitcoines se utilizan programas cliente, que pueden ser aplicaciones nativas o aplicaciones web.

#### Aplicaciones nativas

Las aplicaciones nativas se instalan o se ejecutan directamente en ordenadores o en dispositivos móviles. También pueden ejecutarse automáticamente cuando el usuario clica en un navegador web sobre un enlace que cumple con el formato del URI scheme de bitcoin según la especificación registrada en IANA.
Bitcoin Core es el único programa que implementa totalmente el protocolo, protegiendo la red, y se considera la referencia en la que se apoyan el resto de clientes existentes. Bitcoin Core necesita descargar completamente la cadena de bloques y almacenarla localmente, que a diciembre de 2018 ocupa aproximadamente 200 GB, lo que puede llegar a tardar varios días. Su uso solo se recomienda para usuarios avanzados que deseen aportar a la estabilidad de la red.

#### Aplicaciones web

Las aplicaciones web solo necesitan de un navegador, y por tanto están accesibles desde todas las plataformas, ya sean de escritorio (Windows, Linux, Mac OS X) o móviles (Android, iPhone, BlackBerry, tabletas, etc).
Algunas aplicaciones web proporcionan seguridad adicional en el acceso a los bitcoines mediante la utilización de autenticación de dos factores con mensajes SMS, correo electrónico, dispositivos específicos y Google Authenticator.

### Comercio electrónico

Existen complementos para la mayor parte de las plataformas de comercio electrónico, como WordPress, Drupal, Zen Cart, PrestaShop, Magento y otras.
A partir de una única semilla, algunos comerciantes generan carteras deterministas cuyas direcciones Bitcoin se pueden asignar a un pagador diferente para simplificar su seguimiento. Se utiliza el término cartera determinista para indicar que todas las direcciones de esa cartera están completamente determinadas por la semilla. Es decir, es suficiente con proteger la semilla para generar consistentemente la misma secuencia de direcciones Bitcoin de las que se tiene el control. Las direcciones generadas por una única semilla son virtualmente ilimitadas.

### Programación

Bitcoin Core proporciona una API en JSON-RPC para acceder a la red Bitcoin. Es habitual que los desarrolladores prefieran programar en modo regtest, que permite desarrollar en una cadena de bloques privada con control total del entorno, creación de transacciones con confirmaciones instantáneas y sin necesidad de gastar bitcoines reales. o la red testnet (más cerca de la principal en cuanto a la experiencia), es una cadena de bloques publica idéntica al bitcoin pero con su propio tipo de direcciones, su propio registro de contabilidad y su propio ajuste de dificultad sencillo para los desarrolladores. En Testnet las direcciones no empiezan por “1” o “3” como en Bitcoin, sino por “m” o “2“. Ejemplos:
mvN7z3C3GNwTkeEY2tvAQzragtDoiQZ5CF / 2NEPMeQcRF7j3uZvQYqsEQxxdCqEnNgDyXd
BitcoinJ es una biblioteca popular para el lenguaje Java. Se conecta directamente a la red Bitcoin, no necesita de entidades de confianza y descarga una versión reducida de la cadena de bloques. Forma parte del código de Multibit y del Bitcoin Wallet para Android y Blackberry OS. También se puede acceder a BitcoinJ en Ruby a través de JRuby.
Pycoin es una biblioteca popular para Python. A su vez, BitcoinJS es una biblioteca popular para Javascript. Bitcore proporciona una API para acceder a la red Bitcoin a través de Javascript y Node.js.

## Protocolo

El protocolo Bitcoin se apoya sobre la pila de protocolos TCP/IP aprovechando los servicios de TCP a través del puerto 8333. A partir de este protocolo se construye una red de nodos superpuesta a Internet. Los nodos de la red forman una red de pares donde todos los nodos pueden igualmente proveer y consumir servicios mientras colaboran vía un servicio de consenso.

### Direcciones

Todo participante de la red Bitcoin tiene una cartera electrónica que contiene un número arbitrario de claves criptográficas. A partir de la clave pública, se obtiene la dirección Bitcoin, que funciona como la entidad remitente y receptora para todos los pagos. Su clave privada correspondiente autoriza el pago solo para ese usuario. Las direcciones no tienen ninguna información sobre su dueño, son generalmente anónimas y no requieren de ningún contacto con los nodos de la red para su generación. Un participante de la red Bitcoin puede tener varias direcciones de Bitcoin.
Las direcciones son secuencias alfanuméricas aleatorias de 33 caracteres de longitud, en formato legible para personas, como puede verse en este ejemplo: 1LtU9rMsQ41rCqsJAvMtw89TA5XT2dW7f9. Utilizan una codificación en Base58, que resulta de eliminar los siguientes seis caracteres del sistema Base64: 0 (cero), I (i mayúscula), O (o mayúscula), l (L minúscula), + (más) y / (barra). De esta forma, se componen únicamente de caracteres alfanuméricos que se distinguen entre sí en cualquier tipo de letra. Las direcciones Bitcoin también incluyen una suma de verificación de 32 bits para detectar cambios accidentales en la secuencia de caracteres.

### Transacciones

Los bitcoines contienen la dirección pública de su dueño. Cuando un usuario A transfiere algo a un usuario B, A entrega la propiedad agregando la clave pública de B y firmando con su clave privada. A entonces incluye esos bitcoines en una transacción, y la difunde a los nodos de la red P2P a los que está conectado. Estos nodos validan las firmas criptográficas y el valor de la transacción antes de aceptarla y retransmitirla. Este procedimiento propaga la transacción de manera indefinida hasta alcanzar a todos los nodos de la red P2P. Finalmente la transacción es validada por un nodo minero y es incluida en un bloque de transacciones que es agregado a la cadena de bloques. Una vez que se encuentra en la cadena de bloques y ha sido confirmada por un número suficiente de bloques subsecuentes, la transacción es una parte permanente de la cadena de bloques y es aceptada por todos los participantes.
En la validación de una transacción se verifica la existencia de fondos suficientes. Para ello se tendría que recorrer toda la cadena de bloques hasta encontrar el que contiene la transacción origen. Después se tendría que recorrer todos los bloques posteriores para asegurar que esa transacción no se ha utilizado anteriormente. Todo este proceso requeriría recursos computacionales importantes. Para optimizarlos, los nodos crean una tabla de salidas de transacción no gastadas (UTXO, del inglés unspent transaction output) que funciona como una caché. Una UTXO solo puede ser gastada por un dueño específico (el que posee la clave privada), está almacenada en la cadena de bloques y es reconocida por toda la red. Los nodos de la red llevan un seguimiento de las UTXO. Para ello realizan un barrido de la cadena de bloques verificando las transacciones y se anotan en esta caché las transacciones de salida que no se han gastado. Para cada transacción se borran de la caché las transacciones de entrada y se añaden las de salida dejando la caché como una lista actualizada de todas las transacciones de salida utilizables. Con esta lista ya no es necesario recorrer nuevamente la cadena de bloques, basta con verificar si la transacción de salida que se quiere usar está en la caché .
El concepto de balance total de un usuario no existe, solo existe un conjunto de UTXO distribuidas a lo largo de la cadena de bloques las cuales pueden ser transferidas por el usuario que posea la clave privada. Los programas de cartera calculan el balance al recorrer la cadena de bloques y agregar cada UTXO que le pertenezca al usuario.
Una UTXO puede tener un valor arbitrario y este valor es indivisible. Si una UTXO es mayor que el valor que se desea transferir, esta se debe consumir en su totalidad y el cambio correspondiente, otra UTXO, se debe generar en la transacción. Las UTXO gastadas en la transacción son llamadas entradas y las generadas por la misma transacción son llamadas salidas. La excepción a la cadena de salidas y entradas es un tipo especial de transacción llamada de acuñado o de coinbase, la cual es la primera transacción de cada bloque. Esta es colocada por el minero ganador y crea una nueva moneda que se entrega como recompensa por el minado.