La secuencia de comandos testigo para la salida en la transacción de éxito/tiempo de espera de HTLC es:
OP_IF
# Penalty transaction
<revocationpubkey>
OP_ELSE
`to_self_delay`
OP_CHECKSEQUENCEVERIFY
OP_DROP
<local_delayedpubkey>
OP_ENDIF
OP_CHECKSIG
Que ya existe una transacción de sanción. Mientras que en el HTLC ofrecido y las salidas HTLC recibidas en la transacción de compromiso, tenemos,
# To remote node with revocation key
OP_DUP OP_HASH160 <RIPEMD160(SHA256(revocationpubkey))> OP_EQUAL
...
¿Por qué no ponemos la revocación solo en las salidas HTLC-Timeout/Success?
Los HTLC tienen un tiempo de espera diferente ( cltv_expiry
) que el tiempo de espera regular que usamos para las transacciones de penalización ( to_self_delay
). Esa es la razón por la que usamos una etapa de transacción separada (HTLC éxito/HTLC tiempo de espera) para permitir que nuestra contraparte tenga suficiente tiempo para ejercer su derecho a obtener el saldo completo del canal en caso de que transmitamos el estado anterior del canal.
Para dar más detalles, cuando su contraparte le diga que agregue un HTLC, su versión de la transacción de compromiso tendrá 3 salidas:
to_self_delay
tiempo# 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_IF
# To local node via HTLC-success transaction.
OP_HASH160 <RIPEMD160(payment_hash)> OP_EQUALVERIFY
2 OP_SWAP <local_htlcpubkey> 2 OP_CHECKMULTISIG
OP_ELSE
# To remote node after timeout.
OP_DROP <cltv_expiry> OP_CHECKLOCKTIMEVERIFY OP_DROP
OP_CHECKSIG
OP_ENDIF
OP_ENDIF
Cuando proporciona la imagen previa de HTLC a su contraparte, la transacción se resuelve. Sin embargo, incluso después de la resolución exitosa del HTLC con su contraparte, digamos que decide engañarlos cerrando a la fuerza el estado anterior de la transacción de compromiso que contiene el HTLC. Tan pronto como publique esta transacción de compromiso, publica la transacción de éxito de HTLC que consume la OP_IF
parte dentro del archivo OP_ELSE
. Dado que la transacción exitosa de HTLC está consumiendo una salida que no está bloqueada en el tiempo, no está proporcionando suficiente tiempo para que su contraparte use su derecho de la clave de revocación que se encuentra en la salida de HTLC recibida. Esa es la razón por la que hay una segunda etapa, donde su gasto de la salida HTLC ofrecida para usted está bloqueado hasta queto_self_delay
que permite a su contraparte utilizar el secreto de revocación.
Ahora puede preguntarse por qué existe la revocación en la salida de HTLC recibida de la transacción de compromiso si se proporciona en las transacciones de éxito/tiempo de espera de HTLC. Tomemos el caso anterior para explicarlo. Agregó el HTLC y firmó la transacción de compromiso. Ese HTLC se liquidó cuando usted proporcionó la imagen previa a su contraparte y se revocó la transacción de compromiso que contenía ese HTLC. A pesar de eso, suponga que intenta transmitir la transacción de compromiso anterior que contiene el HTLC y se abstiene de publicar la transacción exitosa de HTLC. Si la revocación no existiera en la transacción de compromiso, la contraparte podría no ser capaz de recuperar sus fondos hasta que elcltv_expiry
que podría extenderse a cientos de bloques (un par de días) si hay varios saltos. Esto es engorroso ya que ese HTLC ya se liquidó (especialmente si hay una cantidad de HTLC previamente satisfechos), y la provisión de revocación en la transacción de compromiso permite que la contraparte los liquide de inmediato.
La parte de revocación está diseñada para que su contraparte nunca sufra por las acciones que decida tomar para engañarlos. La presencia de revocación en la transacción de compromiso y la transacción de éxito de HTLC/tiempo de espera de HTLC ayuda a proteger a los participantes de Lightning Network de los fraudes cometidos por sus pares.
Porque crearía una dependencia desagradable de los deltas de CLTV sobre el retraso de CSV o una seguridad reducida para los HTLC.
Tener la ruta de revocación en la transacción de la segunda etapa permite agotar el tiempo de espera de un HTLC (es decir, su compañero ya no puede canjearlo a través de una imagen previa) mientras deja intacto el período de revocación (CSV) para que usted sea castigado si hizo trampa.
El protocolo Lightning Network utiliza HTLC de dos etapas.
Por qué : permite usar delta de bloqueo de tiempo absoluto más corto que el delta de bloqueo de tiempo relativo utilizado para el modelo de seguridad fundamental (castigo), sin degradar el modelo de seguridad para las salidas HTLC.
Cómo : hacer que (básicamente) las salidas HTLC paguen a la ruta de revocación, las transacciones [tiempo de espera/éxito] solo se pueden transmitir después del bloque B
o al receptor con la preimagen. Haga que la transacción [tiempo de espera/éxito] pague solo después del vencimiento total del período de revocación (ya no hay ruta de preimagen aquí, si el receptor no hizo trampa, se le pagará ).
Más información sobre los HTLC de dos etapas en esta respuesta .
Porque la primera etapa vence al final del período de bloqueo de tiempo absoluto, que probablemente sea menor que el período de revocación.
Si la ruta de revocación no estaba presente en la segunda transacción (que en realidad es el objetivo de usar dos etapas), entonces reduciría drásticamente el período de revocación para las salidas HTLC o requeriría el uso de deltas CLTV increíblemente altos.
Tengo un canal contigo, y acordamos una to_self_delay
de 144 bloques (1 día para sancionar la emisión de un estado revocado) y una (temeraria) cltv_expiry_delta
de 6 bloques.
Acabo de intentar hacer un pago a través de nuestro canal. Agregamos una salida HTLC ofrecida a mi transacción de compromiso y una salida HTLC recibida a la suya.
Digamos que a alguien le pareció divertido no tomar sus tarifas insignificantes y en su lugar atascó al HTLC para meterse con nosotros. Después de 4 bloques, fallamos el HTLC, firmamos un nuevo par de transacciones de compromiso y continuamos con las operaciones. Más tarde me enteré de que en realidad bloqueaste el HTLC justo después de recopilar la preimagen.
No creamos nuevos estados a nuestro canal y la misma noche sufro un corte de energía, mi nodo se desconecta y no me doy cuenta hasta que estoy despierto (5 horas después).
En el momento exacto en que me desconecté, tomó la decisión absolutamente irracional de transmitir su antigua transacción de compromiso en la que todavía tiene una salida HTLC recibida firmada.
Su transacción se confirma y pasa los 6 bloques (todavía 4 horas hasta que me despierte), puede reclamar la salida con sus transacciones exitosas de HTLC.
4 horas más tarde, me despierto, vuelvo a poner en línea mi nodo respaldado continuamente y noto la brecha.
Antes de que pudiera tener el tiempo para sentirme desilusionado, decepcionado y lo suficientemente frustrado como para lanzar malas palabras a un alias aleatorio de color de Internet , mi nodo robó sus monedas de la salida de su transacción de compromiso to_self
, reclamó mi to_remote
salida y gastó su transacción de éxito HTLC.
Sin la ruta de revocación en la segunda etapa, mis monedas se perderían.
yyforyongyu
cltv_expiry
y luego cobrar el dinero a través del tiempo de espera de HTLC de todos modos. Entonces, ¿su punto es que no queremos que la contraparte espere tanto tiempo si hace trampa? No parece tener una buena razón para publicar este tx, aunque se puede desear un daño puro .Ugam kamat
yyforyongyu
to_self_delay
un tiempo antes de poder gastar el HTLC-success tx, mientras tanto, ¿la contraparte puede tomar el dinero a través de la revocación?Ugam kamat
to_self_delay
salida de éxito dentro del HTLC permite a la contraparte usar la revocación y luego gastar el dinero.yyforyongyu
Ugam kamat