Firma de datos con ECDSA

Estaba leyendo sobre las matemáticas detrás de bitcoins en este artículo , y una cosa que parece que no puedo entender es cómo se usa dicho algoritmo para firmar "datos". ¿Qué son exactamente estos "datos"? ¿Es mi bitcoin? Si es así, ¿cómo se representa exactamente un bitcoin en términos de datos? Digamos que tengo 5 bitcoins en mi billetera Coinbase que quiero enviar a mi amigo. ¿Cómo se traduciría eso en todo el proceso de "obtener la clave privada y firmar sus datos con ella" como se describe en el artículo?

Lo siento si esta es una pregunta demasiado novata, soy nuevo en los conceptos de criptografía. ¡Gracias de antemano!

Respuestas (2)

Cada Bitcoin que existe hoy existe como una salida de transacción no gastada (UTXO) en la cadena de bloques de Bitcoin. Es decir, la salida de una transacción confirmada existente que aún no se ha consumido como entrada de alguna otra transacción.

Coinbase tiene una colección de UTXO que representan los Bitcoins que tienen. Cuando le dice a Coinbase que haga un pago de Bitcoin a alguien desde su billetera, ellos eligen uno o más de esos UTXO para realizar el pago.

Luego forman una porción de datos que reclama esos UTXO y crea un nuevo UTXO que le da los Bitcoins al destinatario y otro que le devuelve cualquier cambio. Es esa porción de datos que firman con la clave para cada UTXO que gastan con ese pago.

Una vez que se confirma la transacción, el nuevo UTXO para el destinatario son los Bitcoins que le enviaste. Cuando ven que UTXO aparece en la cadena de bloques, saben que les pagó. Luego pueden formar una transacción que gasta ese UTXO para transferir esos Bitcoins a otra persona.

A coinse describe por 3 cosas.

  • El punto de salida: el txidíndice de salida y en la transacción de creación. Identifica explícitamente las monedas que se gastan
  • La cantidad
  • El scriptPubKey

Para gastar una moneda, crea una transacción especificando el punto de salida como entrada. Usted especifica algunos destinos (conocidos como salidas). A scriptPubKeymenudo requiere que proporcione una firma que autentique el gasto.

ECDSA especifica tomar h = H(m) mod n, donde H(m) es un algoritmo hash, y usar estos datos para calcular una firma mediante una clave privada. Tu pregunta es ¿Qué es m?

m(los datos que se firman) es una transacción serializada de acuerdo con las banderas SIGHASH que determinan qué partes se comprometen en la firma.

  • SIGHASH_ALL confirma la transacción completa como 'datos', por lo que si alguno de esos datos cambia (alguien agrega una entrada o cambia un destino), la firma se invalida.
  • SIGHASH_NONE captura todo menos las salidas (el índice de salida se redimensiona a cero). Esto garantiza que la firma sea válida siempre que las entradas sigan siendo las mismas. Las salidas se pueden cambiar a voluntad.
  • SIGHASH_SINGLE captura una entrada y una salida. Cualquier otra cosa puede cambiar sin invalidar la firma.
  • SIGHASH_ANYONECANPAY se puede aplicar sobre los otros tipos de sighash. Solo se firma una entrada (la tuya), y las salidas.

Las banderas SIGHASH se agregan a la firma, lo que permite que otros repitan el procedimiento realizado durante la firma.

Hay algunas otras modificaciones: - Los scripts de entrada se establecen en cero, ya que las firmas no pueden firmarse a sí mismas. - se txout.scriptPubKeyagrega como txin.scriptSigpara este vin (la parte desde el último OP_CODESEPARATOR) - al final, hashTypeCodese agrega la (bandera sighash de 4 bytes)

Para obtener más detalles sobre este proceso, lea esta página y la imagen: https://en.bitcoin.it/wiki/OP_CHECKSIG

El testigo segregado incluye una modificación a la forma en que mse deriva. Ver BIP 143: https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki