¿Por qué las transacciones de compromiso no pueden ser simplemente HTLC en lugar de contratos revocables al tener la segunda mitad de la clave privada revocable? Quiero decir, ¿por qué molestarse en crear una clave pública revocable a partir de dos mitades de las claves privadas de Alice y Bob y al invalidar una transacción compartiendo la otra mitad, cuando tanto Alice como Bob podrían crear dos transacciones, ambas revocables con dos claves separadas conocidas solo por Alice? y Bob, que luego se canjearía para invalidar transacciones antiguas?
Tanto Alice (A) como Bob (B) crean transacciones opuestas:
TX_A:
5 BTC -> B
if RK_A
5 BTC -> B
else if 1k blocks later
5 BTC -> A
(Signed by B)
TX_B:
5 BTC -> A
if RK_B
5 BTC -> A
else if 1k blocks later
5 BTC -> B
(Signed by A)
Donde RK_A es la clave de revocación de A. Ahora bien, si TX_A y TX_B son válidos, ni B tiene RK_B ni A tiene RK_B. Por lo tanto, ambos pueden firmar sus respectivas transacciones y "salir" de este canal después de 1k bloques sin riesgo de perder todos sus BTC.
Sin embargo, una vez que tanto A como B deciden olvidarse del saldo anterior, tienen que invalidar TX_A y TX_B. Lo hacen cuando A revela RK_A a B y B revela RK_B a A. De esta manera, si, por ejemplo, A firma TX_A y lo transmite a la red de Bitcoin, B puede proporcionar RK_A y reclamar 5 BTC adicionales.
Ahora, el proceso de creación y revelación de RK_X parece estar involucrado y, por lo tanto, mi pregunta es, ¿por qué no simplemente tener algunos números aleatorios en lugar de RK_A y RK_B que solo A y B conocen y que luego se intercambian cuando TX_A y TX_B necesitan ser invalidado?
¿Por qué no simplemente tener algunos números aleatorios en lugar de RK_A y RK_B que solo A y B conocen y que luego se intercambian cuando TX_A y TX_B deben invalidarse?
Supongamos que la transacción está estructurada en la que A y B generan secretos aleatorios. Por cada revocación que suceda, los nodos deberán almacenar el secreto para cada compromiso que se firme. Cada HTLC ofertado y redimido, implica 2 revocaciones de compromiso. Entonces, un nodo tendrá que almacenar una enorme base de datos de todos los secretos, ordenándolos en la forma en que se firma la transacción. Con el método actual, tenemos un punto base a partir del cual se genera el secreto para que no tengamos que almacenar cada clave individualmente, sino derivarla en función de las revocation_basepoint
y per_commitment_secret
que se generan de forma determinista y se guardan de forma compacta .
¿Por qué las transacciones de compromiso no pueden ser simplemente HTLC en lugar de contratos revocables al tener la segunda mitad de la clave privada revocable?
Todas las transacciones relámpago se construyen de manera que sean completamente válidas en la cadena principal de Bitcoin. Si simplemente crea transacciones en las que las salidas se desbloquean con una imagen previa, entonces se abre a los ataques de intermediarios. En el caso de una liquidación en cadena, cuando se transmite la transacción que contiene esta entrada que se gasta solo con una imagen previa, entonces el nodo de retransmisión o el que extrae, conocerá esta imagen previa y simplemente cambiará las salidas de la transacción a los que se pagan a sí mismos. Esa es la razón por la que usamos la verificación de firma, de modo que la persona que gasta la entrada firme toda la transacción para que nada se pueda modificar.
Si se pregunta cómo se ofrecen los HTLC para pagos relámpago, no es tan simple como una simple clave privada. A continuación, se muestra un script que muestra el compromiso que la otra parte firma con una transacción que mantengo cuando ofrezco el HTLC.
# To remote node with revocation key
OP_DUP OP_HASH160 <RIPEMD160(SHA256(revocationpubkey))> OP_EQUAL
OP_IF
OP_CHECKSIG
OP_ELSE
<remote_htlcpubkey> OP_SWAP OP_SIZE 32 OP_EQUAL
OP_NOTIF
# To local node via HTLC-timeout transaction (timelocked).
OP_DROP 2 OP_SWAP <local_htlcpubkey> 2 OP_CHECKMULTISIG
OP_ELSE
# To remote node with preimage.
OP_HASH160 <RIPEMD160(payment_hash)> OP_EQUALVERIFY
OP_CHECKSIG
OP_ENDIF
OP_ENDIF
Si tenemos todas las salidas construidas de esta manera, entonces el tamaño de la transacción será innecesariamente grande y también tendrá una gestión de claves ineficiente como mencioné en la sección anterior.
revocationprivkey
también tendría que almacenarse para cada transacción, ya que per_commitment_secret
tendría que regenerarse para cada nueva transacción.
René Pickhardt
mono espacial
René Pickhardt