El protocolo de pares del canal tiene tres fases: establecimiento, operación normal y cierre.
- Canal
- Definición de
channel_id
- Establecimiento de canal
- Cierre de canal
- Operación normal
- Reenvío de HTLCs
- Selección
cltv_expiry_delta
- Añadiendo un HTLC:
update_add_htlc
- Eliminando un HTLC:
update_fulfill_htlc
,update_fail_htlc
, yupdate_fail_malformed_htlc
- Confirmando actualizaciones hasta ahora:
commitment_signed
- Completar la transición al estado actualizado:
revoke_and_ack
- Actualizando Fees:
update_fee
- Retransmisión de mensaje
- Definición de
- Authors
Algunos mensajes usan un channel_id
para identificar el canal. Se deriva de la transacción de financiación mediante la combinación de funding_txid
y funding_output_index
, usando big-endian OR-exclusivo (es decir, funding_output_index
altera los últimos 2 bytes).
Antes del establecimiento del canal, se usa un temporal_channel_id
, que es un nonce aleatorio.
Tenga en cuenta que, dado que pueden existir temporal_channel_id
s duplicados de diferentes pares, las API que hacen referencia a los canales por su ID de canal antes de que se cree la transacción de financiación, son intrínsecamente inseguras. El único identificador proporcionado por el protocolo para un canal antes de que se haya intercambiado la creación de fondos es la tupla (source_node_id, destination_node_id, temporary_channel_id). Tenga en cuenta que las API que hacen referencia a los canales por su ID de canal antes de que se confirme la transacción de financiación, tampoco son persistentes; hasta que sepa la clave pública del script correspondiente a la salida de financiación, nada evita la duplicación de ID de canal.
Después de autenticar e inicializar una conexión (BOLT #8 y BOLT #1, respectivamente), puede comenzar el establecimiento del canal.
Esto consiste en que el nodo de financiación (financiador) envía un mensaje open_channel
, seguido por el nodo de respuesta (beneficiario) que envía accept_channel
. Con los parámetros del canal bloqueados, el financiador puede crear la transacción de financiación y ambas versiones de la transacción de compromiso, como se describe en BOLT #3.
Luego, el financiador envía el punto de partida de la salida de financiación con el mensaje funding_created
, junto con la firma de la versión del beneficiario de la transacción de compromiso. Una vez que el beneficiario conoce el punto de salida de la financiación, puede generar la firma para la versión del financiador de la transacción de compromiso y enviarla mediante el mensaje funding_signed
.
Una vez que el financiador del canal recibe el mensaje funding_signed
, debe transmitir la transacción de financiación a la red de Bitcoin. Después de enviar/recibir el mensaje funding_signed
, ambas partes deben esperar a que la transacción de financiación ingrese a la cadena de bloques y alcance la profundidad especificada (número de confirmaciones). Después de que ambos lados hayan enviado el mensaje channel_ready
, el canal se establece y puede comenzar la operación normal. El mensaje channel_ready
incluye información que se utilizará para construir pruebas de autenticación de canal.
+-------+ +-------+
| |--(1)--- open_channel ----->| |
| |<-(2)-- accept_channel -----| |
| | | |
| A |--(3)-- funding_created --->| B |
| |<-(4)-- funding_signed -----| |
| | | |
| |--(5)--- channel_ready ---->| |
| |<-(6)--- channel_ready -----| |
+-------+ +-------+
- donde el nodo A es el 'financiador' y el nodo B es el 'beneficiario'
Si esto falla en cualquier etapa, o si un nodo decide que los términos del canal ofrecidos por el otro nodo no son adecuados, el establecimiento del canal falla.
Tenga en cuenta que varios canales pueden operar en paralelo, ya que todos los mensajes del canal se identifican mediante un temporal_channel_id
(antes de que se cree la transacción de financiación) o un channel_id
(derivado de la transacción de financiación).
Este mensaje contiene información sobre un nodo e indica su deseo de configurar un nuevo canal. Este es el primer paso para crear la transacción de financiación y ambas versiones de la transacción de compromiso.
-
type: 32 (
open_channel
) -
data:
- [
chain_hash
:chain_hash
] - [
32*byte
:temporary_channel_id
] - [
u64
:funding_satoshis
] - [
u64
:push_msat
] - [
u64
:dust_limit_satoshis
] - [
u64
:max_htlc_value_in_flight_msat
] - [
u64
:channel_reserve_satoshis
] - [
u64
:htlc_minimum_msat
] - [
u32
:feerate_per_kw
] - [
u16
:to_self_delay
] - [
u16
:max_accepted_htlcs
] - [
point
:funding_pubkey
] - [
point
:revocation_basepoint
] - [
point
:payment_basepoint
] - [
point
:delayed_payment_basepoint
] - [
point
:htlc_basepoint
] - [
point
:first_per_commitment_point
] - [
byte
:channel_flags
] - [
open_channel_tlvs
:tlvs
]
- [
-
tlv_stream
:open_channel_tlvs
-
types:
- type: 0 (
upfront_shutdown_script
) - data:
- [
...*byte
:shutdown_scriptpubkey
]
- [
- type: 1 (
channel_type
) - data:
- [
...*byte
:type
]
- [
- type: 0 (
El valor chain_hash
indica la cadena de bloques exacta en la que residirá el canal abierto. Este suele ser el hash de génesis de la respectiva cadena de bloques.
La existencia de chain_hash
permite a los nodos abrir canales a través de muchas cadenas de bloques distintas, así como tener canales dentro de múltiples cadenas de bloques abiertas al mismo par (si es compatible con las cadenas de destino).
El temporary_channel_id
se usa para identificar este canal basado en pares hasta que se establece la transacción de financiación, momento en el que se reemplaza por el channel_id
, que se deriva de la transacción de financiación.
funding_satoshis
es la cantidad que el remitente está poniendo en el canal. push_msat
es una cantidad de fondos iniciales que el remitente entrega incondicionalmente al receptor. dust_limit_satoshis
es el umbral por debajo del cual no se deben generar salidas para el compromiso de este nodo o las transacciones de HTLC (es decir, los HTLC por debajo de esta cantidad más las tarifas de transacción de HTLC no se pueden aplicar en la cadena). Esto refleja la realidad de que las salidas pequeñas no se consideran transacciones estándar y no se propagarán a través de la red Bitcoin. channel_reserve_satoshis
es la cantidad mínima que el otro nodo debe mantener como pago directo. htlc_minimum_msat
indica el valor HTLC más pequeño que aceptará este nodo.
max_htlc_value_in_flight_msat
es un límite en el valor total de los HTLC pendientes, lo que permite que un nodo limite su exposición a los HTLC; De manera similar, max_accepted_htlcs
limita la cantidad de HTLC pendientes que puede ofrecer el otro nodo.
feerate_per_kw
indica la tasa de tarifa inicial en satoshi por 1000-weight (es decir, 1/4 de los 'satoshi por 1000 vbytes' que se usan normalmente) que este lado pagará por el compromiso y las transacciones HTLC, como se describe en [BOLT #3] (03-transactions.md#fee-calculation) (esto se puede ajustar más adelante con un mensaje update_fee
).
question: <> (¿1000-weight (es decir, 1/4 de los 'satoshi por 1000 vbytes' que se usan normalmente?)
to_self_delay
es el número de bloques que las salidas to-self
del otro nodo deben ser retardadas, usando los retrasos OP_CHECKSEQUENCEVERIFY
; este es el tiempo que tendrá que esperar en caso de fallo antes de redimir sus propios fondos.
funding_pubkey
es la clave pública en el script 2 de 2 del multisig resultado de la transacción de financiación.
Los diversos campos _basepoint
se utilizan para derivar claves únicas como se describe en BOLT #3 para cada transacción de compromiso. La variación de estas claves garantiza que el ID de transacción de cada transacción de compromiso sea impredecible para un observador externo, incluso si se ve una transacción de compromiso; esta propiedad es muy útil para preservar la privacidad cuando se externalizan transacciones de sanción a terceros.
first_per_commitment_point
es el punto por compromiso que se utilizará para la primera transacción de compromiso,
Solo el bit menos significativo de channel_flags
está definido actualmente: announce_channel
. Esto indica si el iniciador del flujo de fondos desea anunciar este canal públicamente en la red, como se detalla en BOLT #7 .
shutdown_scriptpubkey
permite que el nodo emisor se comprometa a dónde irán los fondos en el cierre mutuo, lo que el nodo remoto debe hacer cumplir incluso si un nodo se ve comprometido más adelante.
option_support_large_channel
es una función que se usa para que todos sepan que este nodo aceptará funding_satoshis
mayores o iguales a 2^24.
Dado que se transmite en el mensaje node_announcement
, otros nodos pueden usarlo para identificar a los pares dispuestos a aceptar un canal grande incluso antes de intercambiar el mensaje init
con ellos.
Channel types are an explicit enumeration: for convenience of future definitions they reuse even feature bits, but they are not an arbitrary combination (they represent the persistent features which affect the channel operation).
Los tipos de canales son una enumeración explícita: para conveniencia de futuras definiciones, reutilizan los feature bits
pares, pero no son una combinación arbitraria (representan las características persistentes que afectan la operación del canal).
Los tipos básicos definidos actualmente son:
- sin
features
(sin definir bits) option_static_remotekey
(bit 12)option_anchor_outputs
yoption_static_remotekey
(bits 20 y 12)option_anchors_zero_fee_htlc_tx
yoption_static_remotekey
(bits 22 y 12)
Cada tipo básico tiene las siguientes variaciones permitidas:
option_scid_alias
(bit 46)option_zeroconf
(bit 50)
El nodo emisor:
- DEBE asegurar que el valor
chain_hash
identifique la cadena en la que desea abrir el canal. - DEBE asegurarse de que
temporary_channel_id
sea único de cualquier otro ID de canal con el mismo par. - Si ambos nodos anunciaran
option_support_large_channel
::- PUEDE establecer
funding_satoshis
mayor o igual a 2^24 satoshi.
- PUEDE establecer
- De lo contrario:
- DEBE establecer
funding_satoshis
a menor que 2^24 satoshi.
- DEBE establecer
- DEBE configurar
push_msat
igual o menor que 1000 *funding_satoshis
. - DEBE establecer
funding_pubkey
,revocation_basepoint
,htlc_basepoint
,payment_basepoint
ydelayed_payment_basepoint
en claves públicas secp256k1 válidas en formato comprimido. - DEBE establecer
first_per_commitment_point
en el puntoper-commitment
que se usará para la transacción de compromiso inicial, derivado como se especifica en BOLT #3. - DEBE establecer
channel_reserve_satoshis
mayor o igual quedust_limit_satoshis
. - DEBE establecer bits indefinidos en
channel_flags
a 0. - si ambos nodos anunciaran la función
option_upfront_shutdown_script
:- DEBE incluir
upfront_shutdown_script
con unashutdown_scriptpubkey
válida según requierashutdown
scriptpubkey
, oshutdown_scriptpubkey
de longitud cero (por ejemplo0x0000
).
- DEBE incluir
- de lo contrario:
- DEBE incluir
upfront_shutdown_script
.
- DEBE incluir
- si incluye
open_channel_tlvs
:- DEBE incluir
upfront_shutdown_script
.
- DEBE incluir
- si se negocia
option_channel_type
:- DEBE establecer
channel_type
- DEBE establecer
- si incluye
channel_type
:- DEBE establecerlo en un tipo definido que represente el tipo que desea.
- DEBE utilizar el mapa de bits más pequeño posible para representar el tipo de canal.
- NO DEBE configurarlo en un tipo que contenga una
feature
que no se negoció. - si
announce_channel
estrue
(no0
):- NO DEBE enviar
channel_type
con el bitoption_scid_alias
establecido.
- NO DEBE enviar
El nodo emisor DEBE:
- Establecer
to_self_delay
suficiente para garantizar que el remitente pueda gastar irreversiblemente una salida de transacción de compromiso, en caso de mala conducta por parte del receptor. - establezca
feerate_per_kw
al menos a la tasa que estima que haría que la transacción se incluyera inmediatamente en un bloque. - establezca
dust_limit_satoshis
en un valor suficiente para permitir que las transacciones de compromiso se propaguen a través de la red de Bitcoin. - establezca
htlc_minimum_msat
en el valor mínimo que HTLC está dispuesto a aceptar de este par.
El nodo receptor DEBE:
- ignorar los bits no definidos en
channel_flags
. - si la conexión se ha restablecido después de recibir un
open_channel
, PERO antes de recibir un mensajefunding_created
:- aceptar un nuevo mensaje
open_channel
. - descartar el mensaje
open_channel
anterior.
- aceptar un nuevo mensaje
El nodo receptor PUEDE fallar en el canal si:
- Se negoció
option_channel_type
pero el mensaje no incluye unchannel_type
announce_channel
esfalso
(0
), pero desea anunciar públicamente el canal.funding_satoshis
es demasiado pequeño.- considera
htlc_minimum_msat
demasiado grande. - considera
max_htlc_value_in_flight_msat
demasiado pequeño. - considera
channel_reserve_satoshis
demasiado grande. - considera
max_accepted_htlcs
demasiado pequeño. - considera
dust_limit_satoshis
demasiado grande.
El nodo receptor DEBE fallar el canal si:
- el valor
chain_hash
se establece en un hash de una cadena que es desconocida para el receptor. push_msat
es mayor quefunding_satoshis
* 1000.to_self_delay
es excesivamente grande.max_accepted_htlcs
es mayor que 483.- considera
feerate_per_kw
demasiado pequeño para el procesamiento oportuno o irrazonablemente grande. funding_pubkey
,punto_base_revocación
,punto_base_htlc
,punto_base_pago
opunto_base_pago_retrasado
no son claves públicas secp256k1 válidas en formato comprimido.dust_limit_satoshis
es mayor quechannel_reserve_satoshis
.dust_limit_satoshis
es menor que354 satoshis
(ver BOLT 3).- el monto del financiador para la transacción de compromiso inicial no es suficiente para el [pago de la tarifa] completo (03-transactions.md#fee-payment).
- Los montos
to_local
yto_remote
para la transacción de compromiso inicial son menores o iguales achannel_reserve_satoshis
(ver BOLT 3). funding_satoshis
es mayor o igual a 2^24 y el receptor no admiteoption_support_large_channel
.- Admite
channel_type
ychannel_type
se configuró:- si
type
no es adecuado. - si
type
incluyeoption_zeroconf
y no confía en que el remitente abra un canal no confirmado.
- si
El nodo receptor NO DEBE:
- considerar los fondos recibidos, utilizando
push_msat
, como recibidos hasta que la transacción de financiación haya alcanzado la profundidad suficiente.
El requisito de que funding_satoshis
sea inferior a 2^24 satoshi fue un límite autoimpuesto temporal, mientras que las implementaciones aún no se consideraban estables, se puede eliminar anunciando option_support_large_channel
.
La reserva de canal está especificada por channel_reserve_satoshis
del par: se sugiere el 1% del total del canal. Cada lado de un canal mantiene esta reserva, por lo que siempre tiene algo que perder si intentara transmitir una transacción de compromiso anterior revocada. Inicialmente, esta reserva puede no ser satisfecha, ya que solo un lado tiene fondos; pero el protocolo asegura que siempre se avance hacia el cumplimiento de esta reserva, y una vez cumplida, se mantiene.
El remitente puede dar incondicionalmente fondos iniciales al receptor utilizando un push_msat
distinto de cero, pero incluso en este caso nos aseguramos de que el financiador tenga suficientes fondos restantes para pagar las tarifas y que una parte tenga alguna cantidad que pueda gastar (lo que también implica hay al menos una salida sin polvo). Tenga en cuenta que, como cualquier otra transacción en cadena (on-chain
), este pago no es seguro hasta que la transacción de financiación se haya confirmado lo suficiente (con el peligro de un doble gasto hasta que esto ocurra) y puede requerir un método separado para probar el pago a través de la confirmación on-chain
.
La tarifa_por_kw
generalmente solo le preocupa al remitente (quien paga las tarifas), pero también existe la tarifa pagada por las transacciones HTLC; por lo tanto, las tarifas excesivamente elevadas también pueden penalizar al destinatario.
Separar htlc_basepoint
de payment_basepoint
mejora la seguridad: un nodo necesita el secreto asociado con htlc_basepoint
para producir firmas HTLC para el protocolo, pero el secreto para payment_basepoint
puede estar almacenado en frío (cold storage
).
El requisito de que channel_reserve_satoshis
no se considere polvo
según dust_limit_satoshis
elimina los casos en los que todas las salidas
sería eliminado como polvo. Los requisitos similares en
accept_channel
asegura que ambos lados channel_reserve_satoshis
están por encima de ambos dust_limit_satoshis
.
El receptor no debe aceptar grandes dust_limit_satoshis
, ya que esto podría ser
utilizado en ataques de duelo (griefing attacks
), donde el compañero publica su compromiso con mucho
de polvo htlcs, que efectivamente se convierten en tarifas mineras.
Los detalles sobre cómo manejar una falla de canal se pueden encontrar en [BOLT 5: Falla de un canal] (05-onchain.md#failing-a-channel).
Este mensaje contiene información sobre un nodo e indica su aceptación del nuevo canal. Este es el segundo paso hacia la creación de la transacción de financiación y ambas versiones de la transacción de compromiso.
-
type: 33 (
accept_channel
) -
data:
- [
32*byte
:temporary_channel_id
] - [
u64
:dust_limit_satoshis
] - [
u64
:max_htlc_value_in_flight_msat
] - [
u64
:channel_reserve_satoshis
] - [
u64
:htlc_minimum_msat
] - [
u32
:minimum_depth
] - [
u16
:to_self_delay
] - [
u16
:max_accepted_htlcs
] - [
point
:funding_pubkey
] - [
point
:revocation_basepoint
] - [
point
:payment_basepoint
] - [
point
:delayed_payment_basepoint
] - [
point
:htlc_basepoint
] - [
point
:first_per_commitment_point
] - [
accept_channel_tlvs
:tlvs
]
- [
-
tlv_stream
:accept_channel_tlvs
-
types:
- type: 0 (
upfront_shutdown_script
) - data:
- [
...*byte
:shutdown_scriptpubkey
]
- [
- type: 1 (
channel_type
) - data:
- [
...*byte
:type
]
- [
- type: 0 (
El temporary_channel_id
DEBE ser el mismo que el temporary_channel_id
en
el mensaje open_channel
.
El remitente:
- si
channel_type
incluyeoption_zeroconf
:- DEBE establecer
minimum_ depth
en cero.
- DEBE establecer
- de lo contrario:
- DEBERÍA establecer
minimum_ depth
en un número de bloques que considere razonable para evitar el doble gasto de la transacción de financiación.
- DEBERÍA establecer
- DEBE configurar
channel_reserve_satoshis
mayor o igual quedust_limit_satoshis
del mensajeopen_channel
. - DEBE configurar
dust_limit_satoshis
menor o igual quechannel_reserve_satoshis
del mensajeopen_channel
. - si se negoció
option_channel_type
:- DEBE establecer
channel_type
enchannel_type
deopen_channel
- DEBE establecer
El receptor:
- si
minimum_depth
es irrazonablemente grande:- PUEDE rechazar el canal.
- si
channel_reserve_satoshis
es menor quedust_limit_satoshis
dentro del mensajeopen_channel
:- DEBE rechazar el canal.
- si
channel_reserve_satoshis
del mensajeopen_channel
es menor quedust_limit_satoshis
:- DEBE rechazar el canal.
- si se establece
channel_type
, ychannel_type
se estableció enopen_channel
, y no son tipos iguales:- DEBE rechazar el canal.
- si se negoció
option_channel_type
pero el mensaje no incluye unchannel_type
:- PUEDE rechazar el canal.
Otros campos tienen los mismos requisitos que sus contrapartes en open_channel
.
Este mensaje describe el punto de salida que el financiador ha creado para
las transacciones de compromiso inicial. Después de recibir la del compañero
firma, a través de funding_signed
, transmitirá la transacción de financiación.
- type: 34 (
funding_created
) - data:
- [
32*byte
:temporary_channel_id
] - [
sha256
:funding_txid
] - [
u16
:funding_output_index
] - [
signature
:signature
]
- [
El remitente DEBE establecer:
temporary_channel_id
igual quetemporary_channel_id
en el mensajeopen_channel
.funding_txid
al ID de transacción de una transacción no maleable,- y NO DEBE transmitir esta transacción.
funding_output_index
al número de salida de esa transacción que corresponde a la salida de la transacción de financiación, como se define en BOLT #3.signature
a la firma válida usando sufunding_pubkey
para la transacción de compromiso inicial, como se define en BOLT #3.
El remitente:
- al crear la transacción de financiación:
- DEBE usar solo entradas BIP141 (testigo segregado o
Segregated Witness
). - DEBERÍA asegurarse de que la transacción de financiación se confirme en los próximos 2.016 bloques.
- DEBE usar solo entradas BIP141 (testigo segregado o
El receptor:
- si la
signature
es incorrecta O no cumple con la regla LOW-S-estándar LOWS:- DEBE enviar un
warning
y cerrar la conexión, o enviar unerror
y fallar el canal.
- DEBE enviar un
funding_output_index
solo puede tener 2 bytes, ya que así es como se empaqueta en el channel_id
y se usa en todo el protocolo de chismes. El límite de 65.535 salidas no debería ser demasiado oneroso.
Una transacción con todas las entradas de Testigo Segregado no es maleable, de ahí la recomendación de transacción de financiación.
El financiador puede usar CPFP en una salida de cambio para garantizar que la transacción de financiamiento se confirme antes de 2.016 bloques, de lo contrario, el beneficiario puede olvidar ese canal.
Este mensaje le da al financiador la firma que necesita para la primera transacción de compromiso, por lo que puede transmitir la transacción sabiendo que los fondos puede ser canjeado, si es necesario.
Este mensaje introduce el channel_id
para identificar el canal. Se deriva de la transacción de financiación mediante la combinación de funding_txid
y funding_output_index
, usando big-endian OR-exclusivo (es decir, funding_output_index
altera los últimos 2 bytes).
- type: 35 (
funding_signed
) - data:
- [
channel_id
:channel_id
] - [
signature
:signature
]
- [
Ambos peers
:
- si
channel_type
estaba presente tanto enopen_channel
como enaccept_channel
:- Este es el
channel_type
(deben ser iguales, requerido arriba) - de lo contrario:
- si se negoció
option_anchors_zero_fee_htlc_tx
:- el
channel_type
esoption_anchors_zero_fee_htlc_tx
yoption_static_remotekey
(bits 22 y 12)
- el
- de lo contrario, si se negoció
option_anchor_outputs
:- el
channel_type
esoption_anchor_outputs
yoption_static_remotekey
(bits 20 y 12)
- el
- de lo contrario, si se negoció
option_static_remotekey
:- el
channel_type
esoption_static_remotekey
(bit 12)
- el
- de lo contrario:
- el
channel_type
está vacío
- el
- si se negoció
- DEBE usar ese
channel_type
para todas las transacciones de compromiso.
- Este es el
El remitente DEBE establecer:
channel_id
por OR exclusivo delfunding_txid
y elfunding_output_index
del mensajefunding_created
.signature
a la firma válida, utilizando sufunding_pubkey
para la transacción de compromiso inicial, como se define en BOLT #3.
El receptor:
- si la
signature
es incorrecta O no cumple con la regla LOW-S-estándarLOWS:- DEBE enviar una
warning
y cerrar la conexión, o enviar unerror
y falla el canal.
- DEBE enviar una
- NO DEBE transmitir la transacción de financiación antes de recibir un
funding_signed
válido. - al recibir un
funding_signed
válido:- DEBE transmitir la transacción de financiación.
Decidimos por option_static_remotekey
, option_anchor_outputs
ooption_anchors_zero_fee_htlc_tx
en este punto cuando primero tenemos que generarla transacción de compromiso. Los bits de características que se comunicaron en elintercambio de mensajes init
para la conexión actual determinar el canalformato de compromiso para el tiempo de vida total del canal. Incluso si es más tardela reconexión no negocia este parámetro, este canal continuaráuse option_static_remotekey
, option_anchor_outputs
ooption_anchors_zero_fee_htlc_tx
; no admitimos la "rebaja de categoría".option_anchors_zero_fee_htlc_tx
se considera superior aoption_anchor_outputs
, que de nuevo se considera superior aoption_static_remotekey
, y se favorece la superior si hay más de unase negocia.
Este mensaje (que solía llamarse funding_locked
) indica que la transacción de financiación tiene suficientes confirmaciones para el uso del canal. Una vez que ambos nodos han enviado esto, el canal entra en modo de funcionamiento normal.
Tenga en cuenta que el abridor es libre de enviar este mensaje en cualquier momento (ya que presumiblemente confía en sí mismo), pero el nodo que acepta normalmente esperaría hasta que la financiación haya alcanzado la minimum_depth
solicitada en accept_channel
.
-
type: 36 (
channel_ready
) -
data:
- [
channel_id
:channel_id
] - [
point
:second_per_commitment_point
] - [
channel_ready_tlvs
:tlvs
]
- [
-
tlv_stream
:channel_ready_tlvs
-
types:
- type: 1 (
short_channel_id
) - data:
- [
short_channel_id
:alias
]
- [
- type: 1 (
El remitente:
- NO DEBE enviar
channel_ready
a menos que sea el punto de salida proporcionado porfunding_txid
yfunding_output_index
en el mensajefunding_created
paga exactamentefunding_satoshis
al scriptpubkey especificado en BOLT #3. - si no es el nodo que abre el canal:
- DEBERÍA esperar hasta que la transacción de financiación haya alcanzado la
minimum_depth
antes de enviar este mensaje.
- DEBERÍA esperar hasta que la transacción de financiación haya alcanzado la
- DEBE establecer
second_per_commitment_point
en el puntoper-commitment
que se utilizará para la transacción de compromiso #1, derivada como se especifica en BOLT #3. - si se negoció
option_scid_alias
:- DEBE configurar
short_channel_id
alias
.
- DEBE configurar
- de lo contrario:
- PUEDE establecer
short_channel_id
alias
.
- PUEDE establecer
- si establece
alias
:- si el bit
announce_channel
se estableció enopen_channel
:- DEBERÍA establecer inicialmente
alias
en un valor no relacionado con elshort_channel_id
real.
- DEBERÍA establecer inicialmente
- de lo contrario:
- DEBE establecer
alias
en un valor no relacionado con elshort_channel_id
real.
- DEBE establecer
- NO DEBE enviar el mismo
alias
para múltiples pares o usar un alias que colisiona con unshort_channel_id
de un canal en el mismo nodo. - Siempre DEBE reconocer el
alias
como unshort_channel_id
para los HTLC entrantes a este canal. - si
channel_type
tieneoption_scid_alias
establecido:- NO DEBE permitir HTLC entrantes a este canal usando el
short_channel_id
real
- NO DEBE permitir HTLC entrantes a este canal usando el
- PUEDE enviar múltiples mensajes
channel_ready
al mismo par con diferentes valoresalias
.
- si el bit
- de lo contrario:
- DEBE esperar hasta que la transacción de financiación haya alcanzado la "profundidad_mínima" antes de enviar este mensaje.
Un nodo no financiador (fundee
):
- DEBE olvidar el canal si no ve la financiación correcta transacción después de un tiempo de espera de 2.016 bloques.
El receptor:
- PUEDE usar cualquiera de los
alias
que recibió, en los campos BOLT 11r
. - si
channel_type
tieneoption_scid_alias
establecido:- NO DEBE utilizar el
short_channel_id
real en los camposr
de BOLT 11.
- NO DEBE utilizar el
Desde el punto de espera de channel_ready
en adelante, cualquiera de los nodos PUEDEenvía un 'error' y falla el canal si no recibe una respuesta requerida delotro nodo después de un tiempo de espera razonable.
El que no financia puede simplemente olvidar que el canal existió alguna vez, ya que los fondos no están en riesgo. Si el beneficiario recordara el canal para siempre, esto crearía un riesgo de Denegación de Servicio; por lo tanto, se recomienda olvidarlo (incluso si la promesa de push_msat
es significativa). Si el beneficiario olvida el canal antes de que se confirme, el financiador deberá transmitir la transacción de compromiso para recuperar sus fondos y abrir un nuevo canal. Para evitar esto, el financiador debe asegurarse de que la transacción de financiamiento se confirme en los próximos 2.016 bloques.
El alias
aquí se requiere para dos casos de uso distintos. El primero es para enrutar pagos a través de canales que aún no están confirmados (ya que el short_channel_id
real se desconoce hasta la confirmación). El segundo es proporcionar uno o más alias para usar en canales privados (incluso una vez que esté disponible un short_channel_id
real).
Si bien un nodo puede enviar múltiples alias
, debe recordar todos los que ha enviado para poder usarlos en caso de que los HTLC entrantes los soliciten. El destinatario solo necesita recordar uno, para usar en las sugerencias de ruta r
en las facturas BOLT 11.
Los nodos pueden negociar un cierre mutuo de la conexión, que a diferencia de un cierre unilateral, les permite acceder a sus fondos inmediatamente y puede negociarse con tarifas más bajas.
El cierre ocurre en dos etapas:
-
un lado indica que quiere borrar el canal (y por lo tanto no aceptará nuevos HTLC)
-
una vez que se resuelven todos los HTLC, comienza la negociación final de cierre del canal.
+-------+ +-------+ | |--(1)----- shutdown ------->| | | |<-(2)----- shutdown --------| | | | | | | | <complete all pending HTLCs> | | | A | ... | B | | | | | | |--(3)-- closing_signed F1--->| | | |<-(4)-- closing_signed F2----| | | | ... | | | |--(?)-- closing_signed Fn--->| | | |<-(?)-- closing_signed Fn----| | +-------+ +-------+
Cualquiera de los nodos (o ambos) puede enviar un mensaje de shutdown
para iniciar el cierre, junto con la scriptpubkey
a la que se le quiere pagar.
- type: 38 (
shutdown
) - data:
- [
channel_id
:channel_id
] - [
u16
:len
] - [
len*byte
:scriptpubkey
]
- [
Un nodo emisor:
-
si no ha enviado un
funding_created
(si es un financiador) ofunding_signed
(si es un financiador):- NO DEBE enviar un
shutdown
- NO DEBE enviar un
-
PUEDE enviar un
shutdown
antes dechannel_ready
, es decir, antes de que la transacción de financiación haya alcanzado laminimum_depth
. -
si hay actualizaciones pendientes en la transacción de compromiso del nodo receptor:
- NO DEBE enviar un
shutdown
.
- NO DEBE enviar un
-
NO DEBE enviar múltiples mensajes de
shutdown
. -
NO DEBE enviar un
update_add_htlc
después de unshutdown
. -
si no quedan HTLC en ninguna de las transacciones de compromiso (incluidos los HTLC en polvo) y ninguna de las partes tiene pendiente
revoke_and_ack
para enviar:- NO DEBE enviar ningún mensaje de
actualización
después de ese punto.
- NO DEBE enviar ningún mensaje de
-
DEBERÍA fallar al enrutar cualquier HTLC agregado después de haber enviado
shutdown
. -
si envió un
shutdown_scriptpubkey
de longitud distinta de cero enopen_channel
oaccept_channel
:- DEBE enviar el mismo valor en
scriptpubkey
.
- DEBE enviar el mismo valor en
-
DEBE establecer
scriptpubkey
en una de las siguientes formas:OP_0
20
20 bytes (versión 0 paga para presenciar hash de clave pública), OOP_0
32
32 bytes (versión 0 pago para presenciar hash de secuencia de comandos), O- si (y solo si) se negocia
option_shutdown_anysegwit
:
OP_1
aOP_16
inclusive, seguido de una sola pulsación de 2 a 40 bytes (programa testigo versiones 1 a 16)
Un nodo receptor:
- si no ha recibido un
funding_signed
(si es un financiador) o unfunding_created
(si es un beneficiario):- DEBERÍA enviar un
error
y fallar el canal.
- DEBERÍA enviar un
- si
scriptpubkey
no está en una de las formas anteriores:- DEBERÍA enviar un
warning
.
- DEBERÍA enviar un
- si aún no ha enviado un
channel_ready
:- PUEDE responder a un mensaje de 'apagado' con un 'apagado'
- una vez que no haya actualizaciones pendientes en el par, A MENOS QUE ya haya enviado un
shutdown
:- DEBE responder a un mensaje
shutdown
conshutdown
- DEBE responder a un mensaje
- si ambos nodos anunciaron la característica
option_upfront_shutdown_script
, y el nodo receptor recibió unshutdown_scriptpubkey
de longitud distinta de cero enopen_channel
oaccept_channel
, yshutdown_scriptpubkey
no es igual ascriptpubkey
:- PUEDE enviar un
warning
. - DEBE fallar la conexión.
- PUEDE enviar un
Si el estado del canal es siempre "limpio" (sin cambios pendientes) cuando comienza el apagado, se evita la cuestión de cómo comportarse si no fuera así: el remitente siempre envía primero un commitment_signed
. Como el cierre implica un deseo de terminar, implica que no hay nuevosSe agregarán o aceptarán HTLC. Una vez que se liquidan los HTLC, no hay compromisos por los cuales se deba una revocación, y todas las actualizaciones se incluyen en ambas transacciones de compromiso, el par puede comenzar inmediatamente a cerrar la negociación, por lo que prohibimos más actualizaciones de la transacción de compromiso (en particular, update_fee
sería posible de otra manera). Sin embargo, mientras haya HTLC en la transacción de compromiso, el iniciador puede considerar deseable aumentar la tarifa ya que puede haber HTLCs pendientes en el compromiso que podrían expirar.
Los formularios scriptpubkey
incluyen solo formularios segwit estándar aceptados porla red Bitcoin, lo que garantiza que la transacción resultante se propagará a los mineros. Sin embargo, los nodos antiguos pueden enviar scripts no segwit, los cuales pueden ser aceptados para la compatibilidad con versiones anteriores (con una advertencia para forzar el cierre si esta salida no cumple con los requisitos de polvo del relay
).
La función option_upfront_shutdown_script
significa que el nodo quería comprometerse previamente con shutdown_scriptpubkey
en caso de que se viera comprometido de alguna manera. Este es un compromiso débil (¡un implementación malévola tiende a ignorar especificaciones como esta!), pero proporciona una mejora incremental en la seguridad al requerir la cooperación del nodo receptor para cambiar la scriptpubkey
.
El requisito de respuesta shutdown
implica que el nodo envía commitment_signed
para confirmar cualquier cambio pendiente antes de responder; sin embargo, teóricamente podría volver a conectarse, lo que simplemente borraría todos los cambios no confirmados pendientes.
Una vez que se completa el cierre, el canal está vacío de HTLC, no hay compromisos para los cuales se debe una revocación, y todas las actualizaciones están incluidas en ambos compromisos, las transacciones finales de compromiso actual no tendrán HTLC y comienza la negociación de la tarifa de cierre. El financiador elige una tarifa que cree que es justa, y firma la transacción de cierre con los campos scriptpubkey
de los mensajes de shutdown
(junto con la tarifa elegida) y envía la firma; el otro nodo luego responde de manera similar, utilizando una tarifa que considera justa. Este intercambio continúa hasta que ambos acuerdan la misma tarifa o cuando uno de los lados falla en el canal.
En el método moderno, el financiador envía su rango de tarifas permisible y el que no financia tiene que elegir una tarifa en este rango. Si el que no financia elige el mismo valor, la negociación se completa después de dos mensajes, de lo contrario, el financiado responderá con el mismo valor (completando después de tres mensajes).
-
type: 39 (
closing_signed
) -
data:
- [
channel_id
:channel_id
] - [
u64
:fee_satoshis
] - [
signature
:signature
] - [
closing_signed_tlvs
:tlvs
]
- [
-
tlv_stream
:closing_signed_tlvs
-
types:
- type: 1 (
fee_range
) - data:
- [
u64
:min_fee_satoshis
] - [
u64
:max_fee_satoshis
]
- [
- type: 1 (
El nodo financiador:
- después de que se haya recibido
shutdown
, Y no queden HTLCs en ninguna de las transacciones de compromiso:- DEBERÍA enviar un mensaje
closing_signed
.
- DEBERÍA enviar un mensaje
El nodo emisor:
- DEBERÍA establecer el
fee_satoshis
inicial de acuerdo a si estimacióm del coste de inclusión en un bloque - DEBERÍA establecer
fee_range
de acuerdo con las tarifas mínimas y máximas que está dispuesto a pagar por una transacción cerrada. - si no recibe una respuesta
closing_signed
después de un tiempo razonable:- DEBE fallar el canal
- si no es el financiador:
- DEBERÍA establecer
max_fee_satoshis
al menos almax_fee_satoshis
recibido - DEBERÍA establecer
min_fee_satoshis
a un valor bastante bajo
- DEBERÍA establecer
- DEBE establecer
signature
a la firma de Bitcoin de la transacción de cierre, como se especifica en BOLT #3.
El nodo receptor:
- si la
signature
no es válida para ninguna de las variantes de la transacción de cierre especificadas en BOLT #3 O no cumple con la regla LOW-S-standardLOWS:- DEBE enviar un
warning
y cerrar la conexión, o enviar unerror
y fallar el canal.
- DEBE enviar un
- si
fee_satoshis
es igual a sufee_satoshis
enviado previamente:- DEBERÍA firmar y difundir la transacción de cierre final.
- PUEDE cerrar la conexión.
- si
fee_satoshis
coincide con sufee_range
enviado previamente:- DEBERÍA usar
fee_satoshis
para firmar y difundir la transacción de cierre final - DEBERÍA responder con un
closing_signed
con el mismo valor defee_satoshis
si es diferente de sufee_satoshis
enviado previamente - PUEDE cerrar la conexión.
- DEBERÍA usar
- si el mensaje contiene un
fee_range
:- si no hay superposición entre eso y su propio
fee_range
:- DEBERÍA enviar una advertencia
- DEBE fallar el canal si no recibe un
fee_range
satisfactorio después de un tiempo razonable
- de lo contrario:
- si es el financiador:
- si
fee_satoshis
no está en la superposición entre el rango defee
enviado y recibido:- DEBE fallar el canal
- de lo contrario:
- DEBE responder con el mismo
fee_satoshis
.
- DEBE responder con el mismo
- si
- de lo contrario (no es el financiador):
- si ya ha enviado un
closing_signed
:- si
fee_satoshis
no es el mismo que el valor que envió:- DEBE fallar el canal
- de lo contrario:
- DEBE proponer un
fee_satoshis
en la superposición entre el rango defee
recibido y el rango defee
que está a punto de enviar.
- DEBE proponer un
- si
- si ya ha enviado un
- si es el financiador:
- si no hay superposición entre eso y su propio
- de lo contrario, si
fee_satoshis
no está estrictamente entre sufee_satoshis
enviado por última vez y sufee_satoshis
recibido previamente, A MENOS QUE se haya vuelto a conectar desde entonces:- DEBERÍA enviar un
warning
y cerrar la conexión, o enviar unerror
y fallar el canal.
- DEBERÍA enviar un
- de lo contrario, si el receptor está de acuerdo con la tarifa:
- DEBERÍA responder con un
closing_signed
con el mismo valor defee_satoshis
.
- DEBERÍA responder con un
- de lo contrario:
- DEBE proponer un valor "estrictamente entre" el
fee_satoshis
recibido y sufee_satoshis
enviado previamente.
- DEBE proponer un valor "estrictamente entre" el
El nodo receptor:
- si una de las salidas en la transacción de cierre está por debajo del límite de polvo para su
scriptpubkey
(ver BOLT 3):- DEBE fallar el canal
Cuando no se proporciona fee_range
, el requisito "estrictamente entre" garantiza ese progreso hacia adelante se hace, aunque solo sea por un solo satoshi a la vez. Para evitar mantener el estado y manejar el caso límite, donde las tarifas se han desplazado entre la desconexión y la reconexión, la negociación se reinicia en la reconexión.
Tenga en cuenta que existe un riesgo limitado si la transacción de cierre se retrasa, pero será emitida muy pronto; por lo que normalmente no hay razón para pagar una prima pora acelerar el procesado.
Tenga en cuenta que el no financiador no está pagando la tarifa, por lo que no hay razón para que tenga una tarifa máxima. Sin embargo, puede querer una tarifa mínima para garantizar que la transacción se propague. Siempre puede usar CPFP más tarde para acelerar la confirmación si es necesario, por lo que el mínimo debe ser bajo.
Puede suceder que la transacción de cierre no cumpla con las políticas de retransmisión predeterminadas de bitcoin (por ejemplo, cuando se usa un script de apagado que no es segwit para una salida por debajo de 546 satoshis, lo cual es posible si dust_limit_satoshis
está por debajo de 546 satoshis). No hay fondos en riesgo cuando eso sucede, pero el canal debe cerrarse a la fuerza, ya que probablemente la transacción de cierre nunca llegue a los mineros.
Una vez que ambos nodos hayan intercambiado channel_ready
(y opcionalmente announcement_signatures
), el canal se puede usar para realizar pagos a través de Hashed Time Locked Contracts
.
Los cambios se envían por lotes: uno o más mensajes update_
se envían antes de un mensaje commitment_signed
, como se puede ver en el siguiente diagrama:
+-------+ +-------+
| |--(1)---- update_add_htlc ---->| |
| |--(2)---- update_add_htlc ---->| |
| |<-(3)---- update_add_htlc -----| |
| | | |
| |--(4)--- commitment_signed --->| |
| A |<-(5)---- revoke_and_ack ------| B |
| | | |
| |<-(6)--- commitment_signed ----| |
| |--(7)---- revoke_and_ack ----->| |
| | | |
| |--(8)--- commitment_signed --->| |
| |<-(9)---- revoke_and_ack ------| |
+-------+ +-------+
Contrariamente a la intuición, estas actualizaciones se aplican a los otros nodos de la transacción de compromiso; el nodo solo agrega esas actualizaciones a su propia transacción de compromiso cuando el nodo remoto reconoce que los aplicó a través de revoke_and_ack
.
Por lo tanto, cada actualización atraviesa los siguientes estados:
- pendiente en el receptor
- en la última transacción de compromiso del receptor
- ... y la transacción de compromiso anterior del receptor ha sido revocada, y la actualización está pendiente en el remitente
- ... y en la última transacción de compromiso del remitente
- ... y se ha revocado la transacción de compromiso anterior del remitente
Como las actualizaciones de los dos nodos son independientes, las transacciones dos compromisos pueden estar desincronizadas indefinidamente. Esto no es preocupante: lo que importa es si ambas partes se han comprometido irrevocablemente a un actualización particular o no (el estado final, arriba).
En general, un nodo ofrece HTLC por dos razones: para iniciar un pago propio, o para reenviar el pago de otro nodo. En el caso de reenvío, se debe tener cuidado para garantizar que el HTLC saliente no se pueda redimir a menos que el entrante HTLC se puede redimir. Los siguientes requisitos aseguran que esto siempre sea cierto.
La respectiva adición/eliminación de un HTLC se considera irrevocablemente comprometida cuando:
- La transacción de compromiso con/sin está comprometida por ambos nodos, y cualquier transacción de compromiso anterior sin/con se ha revocado, O
- La transacción de compromiso con/sin se ha comprometido de forma irreversible la cadena de bloques
Un nodo:
- hasta que un HTLC entrante se haya persistido de forma irrevocable:
- NO DEBE ofrecer el HTLC saliente correspondiente (
update_add_htlc
) en respuesta a ese HTLC entrante.
- NO DEBE ofrecer el HTLC saliente correspondiente (
- hasta que la eliminación de un HTLC saliente se haya comprometido de forma irrevocable, O hasta que la salida saliente en cadena del HTLC se haya gastado mediante la transacción HTLC-timeout (con suficiente profundidad):
- NO DEBE fallar el HTLC entrante correspondiente (
update_fail_htlc
) a ese HTLC saliente.
- NO DEBE fallar el HTLC entrante correspondiente (
- una vez que se haya alcanzado el
cltv_expiry
de un HTLC entrante, O sicltv_expiry
menoscurrent_height
es menor quecltv_expiry_delta
para el HTLC saliente correspondiente:- DEBE fallar ese HTLC entrante (
update_fail_htlc
).
- DEBE fallar ese HTLC entrante (
- si el
cltv_expiry
de un HTLC entrante está irrazonablemente lejos en el futuro:- DEBERÍA fallar ese HTLC entrante (
update_fail_htlc
).
- DEBERÍA fallar ese HTLC entrante (
- al recibir un
update_fulfill_htlc
para un HTLC saliente, O al descubrir elpayment_preimage
de un gasto en cadena de HTLC:- DEBE cumplir con el HTLC entrante que corresponde a ese HTLC saliente.
En general, un lado del intercambio debe tratarse antes que el otro. Cumplir con un HTLC es diferente: el conocimiento de la preimagen es, por definición, irrevocable y el HTLC entrante debe cumplirse lo antes posible para reducir la latencia.
Un HTLC con un vencimiento injustificadamente largo es un vector de denegación de servicio y por lo tanto no está permitido. Tenga en cuenta que el valor exacto de "irrazonable" actualmente no está claro y puede depender de la topología de la red.
Una vez que se agota el tiempo de espera de un HTLC, puede cumplirse o agotarse; se debe tener cuidado con esta transición, tanto para los HTLC ofrecidos como para los recibidos.
Considere el siguiente escenario, donde A envía un HTLC a B, quien reenvía a C, quien entrega los bienes tan pronto como el pago es recibió.
-
C necesita asegurarse de que el HTLC de B no puede expirar, incluso si B se vuelve insensible; es decir, C puede cumplir con el HTLC entrante en la cadena antes de que B pueda tiempo de espera en la cadena.
-
B necesita estar seguro de que si C cumple con el HTLC de B, puede cumplir con el HTLC entrante de A; es decir, B puede obtener la preimagen de C y cumplir con la entrada HTLC en la cadena antes de que A pueda desconectarlo en la cadena.
La configuración crítica aquí es cltv_expiry_delta
en BOLT #7 y el min_final_cltv_expiry_delta
relacionado en BOLT #11.
cltv_expiry_delta
es la mínima diferencia en los tiempos de espera de HTLC CLTV, en la caja de reenvío (B). min_final_cltv_expiry_delta
es la mínima diferencia entre el tiempo de espera de HTLC CLTV y la altura de bloque actual, para el caja de terminales (C).
Tenga en cuenta que un nodo está en riesgo si acepta un HTLC en un canal y ofrece un HTLC en otro canal con una diferencia demasiado pequeña entre los tiempos de espera de CLTV. Por esta razón, el cltv_expiry_delta
para el canal saliente se usa como delta a través de un nodo.
El número de bloques en el peor de los casos entre la salida y la resolución HTLC entrante se puede derivar, dadas algunas suposiciones:
- bloques
R
de profundidad de reorganización en el peor de los casos - un período de gracia 'G' se bloquea después del tiempo de espera de HTLC antes de darse por vencido un compañero que no responde y cae a la cadena
- un número de bloques
S
entre la transmisión de la transacción y la transacción incluida en un bloque
El peor de los casos es para un nodo de reenvío (B) que tarda más tiempo posible para detectar el cumplimiento de HTLC saliente y también toma el mayor tiempo posible para canjearlo en la cadena:
- El B->C HTLC expira en el bloque
N
, y B espera los bloquesG
hasta que deja de esperar a que C. B o C se comprometa con la cadena de bloques,y B gasta HTLC, lo que requiere que se incluyan bloquesS
. - Mal caso: C gana la carrera (justo) y cumple el HTLC, B solo ve esa transacción cuando ve el bloque
N+G+S+1
. - En el peor de los casos: hay una reorganización
R
profunda en la que C gana y cumple B solo ve la transacción enN+G+S+R
. - B ahora necesita cumplir con el HTLC A->B entrante, pero A no responde: B espera 'G' más bloques antes de abandonar la espera de A. A o B se compromete con la cadena de bloques.
- Mal caso: B ve la transacción de compromiso de A en el bloque
N+G+S+R+G+1
y tiene para gastar la salida de HTLC, que requiere bloquesS
para ser extraídos. - En el peor de los casos: hay otra reorganización
R
profunda que A usa para gastar la transacción de compromiso, por lo que B ve el compromiso de A transacción en el bloqueN+G+S+R+G+R
y tiene que gastar la salida HTLC, que toma bloquesS
para ser extraídos. - El gasto de HTLC de B debe tener una profundidad de al menos "R" antes de que se agote el tiempo deespera, de lo contrario otra reorganización podría permitir que A agote el tiempo de espera de la transacción.
Por lo tanto, el peor de los casos es 3R+2G+2S
, asumiendo que R
es al menos 1. Tenga en cuenta que elposibilidades de tres reorganizaciones en las que el otro nodo las gana todas esbaja para R
de 2 o más. Dado que se usan tarifas altas (y los gastos de HTLC pueden usartarifas casi arbitrarias), S
debe ser pequeño durante el funcionamiento normal; a pesar de,dado que los tiempos de los bloques son irregulares, todavía hay bloques vacíos, las tarifas pueden variaren gran medida, y las tarifas no se pueden aumentar en las transacciones de HTLC, S = 12
debe serconsiderado un mínimo. S
es también el parámetro que puede variar más bajoataque, por lo que un valor más alto puede ser deseable cuando las cantidades no despreciables están enriesgo. El período de gracia G
puede ser bajo (1 o 2), ya que se requiere que los nodos superen el tiempo de esperao cumplir lo antes posible; pero si G
es demasiado bajo aumenta el riesgo decierre de canal innecesario debido a retrasos en la red.
Hay cuatro valores que deben derivarse:
-
el
cltv_expiry_delta
para canales,3R+2G+2S
: en caso de duda, uncltv_expiry_delta
de al menos 34 es razonable (R=2, G=2, S=12). -
la fecha límite para los HTLC ofrecidos: la fecha límite después de la cual el canal debe fallará y se agotará el tiempo de espera en la cadena. Estos son los bloques
G
después de los HTLCcltv_expiry
: 1 o 2 bloques es razonable. -
la fecha límite para los HTLC recibidos que este nodo ha cumplido: la fecha límite después de en el que el canal tiene que fallar y el HTLC se cumplió en la cadena antes es
cltv_expiry
. Consulte los pasos 4-7 anteriores, que implican una fecha límite de2R+G+S
bloques antes decltv_expiry
: 18 bloques es razonable. -
el
cltv_expiry
mínimo aceptado para pagos terminales: el El peor de los casos para el nodo terminal C son los bloques2R+G+S
(como, de nuevo, los pasos 1-3 anteriores no se aplican). El valor predeterminado en BOLT #11 es 18, que coincide con este cálculo.
Un nodo que ofrece:
- DEBE estimar una fecha límite de tiempo para cada HTLC que ofrece.
- NO DEBE ofrecer un HTLC con una fecha límite de tiempo anterior a su
cltv_expiry
. - si un HTLC que ofreció está en la transacción de compromiso actual de cualquiera de los nodos, Y ha pasado esta fecha límite de tiempo:
- DEBERÍA enviar un
error
al par receptor (si está conectado). - DEBE fallar el canal.
- DEBERÍA enviar un
Un nodo que cumple:
- para cada HTLC que intenta cumplir:
- DEBE estimar una fecha límite para el cumplimiento.
- DEBE fallar (y no reenviar) un HTLC cuya fecha límite de cumplimiento ya haya pasado.
- si un HTLC que ha cumplido está en la transacción de compromiso actual de cualquiera de los nodos, Y ha pasado esta fecha límite de cumplimiento:
- DEBERÍA enviar un
error
al par que ofrece (si está conectado). - DEBE fallar el canal.
- DEBERÍA enviar un
Cualquiera de los nodos puede enviar update_add_htlc
para ofrecer un HTLC al otro,que se puede canjear a cambio de una preimagen de pago. Las cantidades están enmillisatoshi, aunque la aplicación en cadena solo es posible para todocantidades de satoshi mayores que el límite de polvo (en transacciones de compromiso, estos se redondean hacia abajo comoespecificado en BOLT #3).
El formato de la porción onion_routing_packet
, que indica dónde se realiza el pago está destinado, se describe en BOLT #4.
-
type: 128 (
update_add_htlc
) -
data:
- [
channel_id
:channel_id
] - [
u64
:id
] - [
u64
:amount_msat
] - [
sha256
:payment_hash
] - [
u32
:cltv_expiry
] - [
1366*byte
:onion_routing_packet
]
- [
-
tlv_stream
:update_add_htlc_tlvs
-
types:
- type: 0 (
blinding_point
) - data:
- [
point
:blinding
]
- [
- type: 0 (
A sending node:
- if it is responsible for paying the Bitcoin fee:
- MUST NOT offer
amount_msat
if, after adding that HTLC to its commitment transaction, it cannot pay the fee for either the local or remote commitment transaction at the currentfeerate_per_kw
while maintaining its channel reserve (see Updating Fees). - if
option_anchors
applies to this commitment transaction and the sending node is the funder:- MUST be able to additionally pay for
to_local_anchor
andto_remote_anchor
above its reserve.
- MUST be able to additionally pay for
- SHOULD NOT offer
amount_msat
if, after adding that HTLC to its commitment transaction, its remaining balance doesn't allow it to pay the commitment transaction fee when receiving or sending a future additional non-dust HTLC while maintaining its channel reserve. It is recommended that this "fee spike buffer" can handle twice the currentfeerate_per_kw
to ensure predictability between implementations.
- MUST NOT offer
- if it is not responsible for paying the Bitcoin fee:
- SHOULD NOT offer
amount_msat
if, once the remote node adds that HTLC to its commitment transaction, it cannot pay the fee for the updated local or remote transaction at the currentfeerate_per_kw
while maintaining its channel reserve.
- SHOULD NOT offer
- MUST offer
amount_msat
greater than 0. - MUST NOT offer
amount_msat
below the receiving node'shtlc_minimum_msat
- DEBE establecer
cltv_expiry
less than 500000000. - if result would be offering more than the remote's
max_accepted_htlcs
HTLCs, in the remote commitment transaction:- MUST NOT add an HTLC.
- if the sum of total offered HTLCs would exceed the remote's
max_htlc_value_in_flight_msat
:- MUST NOT add an HTLC.
- for the first HTLC it offers:
- DEBE establecer
id
to 0.
- DEBE establecer
- MUST increase the value of
id
by 1 for each successive offer. - if it is relaying a payment inside a blinded route:
- DEBE establecer
blinding_point
(see Route Blinding)
- DEBE establecer
id
MUST NOT be reset to 0 after the update is complete (i.e. after revoke_and_ack
has
been received). It MUST continue incrementing instead.
Un nodo receptor:
- receiving an
amount_msat
equal to 0, OR less than its ownhtlc_minimum_msat
:- SHOULD send a
warning
and close the connection, or send anerror
and fail the channel.
- SHOULD send a
- receiving an
amount_msat
that the sending node cannot afford at the currentfeerate_per_kw
(while maintaining its channel reserve and anyto_local_anchor
andto_remote_anchor
costs):- SHOULD send a
warning
and close the connection, or send anerror
and fail the channel.
- SHOULD send a
- if a sending node adds more than receiver
max_accepted_htlcs
HTLCs to its local commitment transaction, OR adds more than receivermax_htlc_value_in_flight_msat
worth of offered HTLCs to its local commitment transaction:- SHOULD send a
warning
and close the connection, or send anerror
and fail the channel.
- SHOULD send a
- if sending node sets
cltv_expiry
to greater or equal to 500000000:- SHOULD send a
warning
and close the connection, or send anerror
and fail the channel.
- SHOULD send a
- MUST allow multiple HTLCs with the same
payment_hash
. - if the sender did not previously acknowledge the commitment of that HTLC:
- MUST ignore a repeated
id
value after a reconnection.
- MUST ignore a repeated
- if other
id
violations occur:- MAY send a
warning
and close the connection, or send anerror
and fail the channel.
- MAY send a
- if
blinding_point
is provided:- MUST use the corresponding blinded private key to decrypt the
onion_routing_packet
(see Route Blinding)
- MUST use the corresponding blinded private key to decrypt the
The onion_routing_packet
contains an obfuscated list of hops and instructions for each hop along the path.It commits to the HTLC by setting the payment_hash
as associated data, i.e. includes the payment_hash
in the computation of HMACs.This prevents replay attacks that would reuse a previous onion_routing_packet
with a different payment_hash
.
Las cantidades no válidas, son una clara violación del protocolo e indican un desglose.
Si un nodo no aceptaba múltiples HTLC con el mismo hash de pago, un atacante podría sondear para ver si un nodo tenía un HTLC existente. Este requisito, para hacer frente a los duplicados, conduce al uso de un identificador separado; se supone que un contador de 64 bits nunca se ajusta.
Las retransmisiones de actualizaciones no reconocidas están explícitamente permitidas para fines de reconexión; Permitirlos en otros momentos simplifica el código del destinatario (aunque una verificación estricta puede ayudar a la depuración).
max_accepted_htlcs
está limitado a 483 para garantizar que, incluso si ambas partes envían el número máximo de HTLC, el mensaje commitment_signed
todavía estar por debajo del tamaño máximo de mensaje. También asegura que una sola transacción de penalización puede gastar toda la transacción de compromiso,según lo calculado en BOLT #5.
Los valores de cltv_expiry
iguales o superiores a 500000000 indicarían un tiempo en segundos, y el protocolo solo admite una caducidad en bloques.
El nodo responsable de pagar la tarifa de Bitcoin debe mantener una fee spike buffer
en la parte superior de su reserva para acomodar un futuro aumento de tarifas. Sin este búfer, el nodo responsable de pagar la tarifa de Bitcoin puede llegar a un estado en el que no puede enviar ni recibir ningún HTLC que no sea polvo mientras manteniendo su reserva de canal (debido al aumento de peso de la transacción de compromiso), lo que resulta en un canal degradado. Ver #728 para más detalles.
Para simplificar, un nodo solo puede eliminar los HTLC agregados por el otro nodo. Hay cuatro razones para eliminar un HTLC: se proporciona la preimagen de pago, se agotó el tiempo de espera, no se pudo enrutar o tiene un formato incorrecto.
Para proporcionar la preimagen:
- type: 130 (
update_fulfill_htlc
) - data:
- [
channel_id
:channel_id
] - [
u64
:id
] - [
32*byte
:payment_preimage
]
- [
Para un HTLC con tiempo de espera agotado o ruta fallida:
- type: 131 (
update_fail_htlc
) - data:
- [
channel_id
:channel_id
] - [
u64
:id
] - [
u16
:len
] - [
len*byte
:reason
]
- [
El campo reason
es un blob cifrado opaco en beneficio del iniciador HTLC original, como se define en BOLT #4; sin embargo, hay una variante de fallo de malformación especial para el caso donde el par no pudo analizarlo: en este caso, el nodo actual toma medidas, encriptando en un update_fail_htlc
para la retransmisión.
Para un HTLC no analizable:
- type: 135 (
update_fail_malformed_htlc
) - data:
- [
channel_id
:channel_id
] - [
u64
:id
] - [
sha256
:sha256_of_onion
] - [
u16
:failure_code
]
- [
Un nodo:
- SHOULD remove an HTLC as soon as it can.
- SHOULD fail an HTLC which has timed out.
- until the corresponding HTLC is irrevocably committed in both sides'
commitment transactions:
- MUST NOT send an
update_fulfill_htlc
,update_fail_htlc
, orupdate_fail_malformed_htlc
.
- MUST NOT send an
- When failing an incoming HTLC:
- If
current_blinding_point
is set in the onion payload and it is not the final node:- MUST send an
update_fail_htlc
error using theinvalid_onion_blinding
failure code with thesha256_of_onion
of the onion it received, for any local or downstream errors. - SHOULD add a random delay before sending
update_fail_htlc
.
- MUST send an
- If
blinding_point
is set in the incomingupdate_add_htlc
:- MUST send an
update_fail_malformed_htlc
error using theinvalid_onion_blinding
failure code with thesha256_of_onion
of the onion it received, for any local or downstream errors.
- MUST send an
- If
Un nodo receptor:
- if the
id
does not correspond to an HTLC in its current commitment transaction:- MUST send a
warning
and close the connection, or send anerror
and fail the channel.
- MUST send a
- if the
payment_preimage
value inupdate_fulfill_htlc
doesn't SHA256 hash to the corresponding HTLCpayment_hash
:- MUST send a
warning
and close the connection, or send anerror
and fail the channel.
- MUST send a
- if the
BADONION
bit infailure_code
is not set forupdate_fail_malformed_htlc
:- MUST send a
warning
and close the connection, or send anerror
and fail the channel.
- MUST send a
- if the
sha256_of_onion
inupdate_fail_malformed_htlc
doesn't match the onion it sent:- MAY retry or choose an alternate error response.
- otherwise, a receiving node which has an outgoing HTLC canceled by
update_fail_malformed_htlc
:- MUST return an error in the
update_fail_htlc
sent to the link which originally sent the HTLC, using thefailure_code
given and setting the data tosha256_of_onion
.
- MUST return an error in the
Un nodo que no agota el tiempo de espera de los HTLC corre el riesgo de fallar en el canal (ver Selección cltv_expiry_delta
).
Un nodo que envía update_fulfill_htlc
, antes que el remitente, también es comprometido con el HTLC y corre el riesgo de perder fondos.
Si la cebolla tiene un formato incorrecto, el nodo ascendente no podrá extraer la clave compartida para generar una respuesta, de ahí el mensaje de error especial, que hace que este nodo lo haga.
El nodo puede verificar que el SHA256 del que se queja el flujo ascendente coincide con la cebolla que envió, lo que puede permitirle detectar bits aleatorios errores Sin embargo, sin volver a verificar el paquete cifrado real enviado, no sabrá si el error fue propio o del remoto; entonces tal detección se deja como una opción.
Los nodos dentro de una ruta ciega deben usar invalid_onion_blinding
para evitar filtrar información a los remitentes que intentan sondear la ruta ciega.
Cuando un nodo tiene cambios para el compromiso remoto, puede aplicarlos,
firma la transacción resultante (como se define en BOLT #3), y envía un mensaje commitment_signed
.
- type: 132 (
commitment_signed
) - data:
- [
channel_id
:channel_id
] - [
signature
:signature
] - [
u16
:num_htlcs
] - [
num_htlcs*signature
:htlc_signature
]
- [
A sending node:
- MUST NOT send a
commitment_signed
message that does not include any updates. - MAY send a
commitment_signed
message that only alters the fee. - MAY send a
commitment_signed
message that doesn't change the commitment transaction aside from the new revocation number (due to dust, identical HTLC replacement, or insignificant or multiple fee changes). - MUST include one
htlc_signature
for every HTLC transaction corresponding to the ordering of the commitment transaction (see BOLT #3). - if it has not recently received a message from the remote node:
- SHOULD use
ping
and await the replypong
before sendingcommitment_signed
.
- SHOULD use
Un nodo receptor:
- once all pending updates are applied:
- if
signature
is not valid for its local commitment transaction OR non-compliant with LOW-S-standard rule LOWS:- MUST send a
warning
and close the connection, or send anerror
and fail the channel.
- MUST send a
- if
num_htlcs
is not equal to the number of HTLC outputs in the local commitment transaction:- MUST send a
warning
and close the connection, or send anerror
and fail the channel.
- MUST send a
- if
- if any
htlc_signature
is not valid for the corresponding HTLC transaction OR non-compliant with LOW-S-standard rule LOWS:- MUST send a
warning
and close the connection, or send anerror
and fail the channel.
- MUST send a
- MUST respond with a
revoke_and_ack
message.
Tiene poco sentido ofrecer actualizaciones de spam: esto implica un bug.
El campo num_htlcs
es redundante, pero hace que la comprobación de la longitud del paquete sea totalmente autónoma.
La recomendación de requerir mensajes recientes reconoce la realidad de que las redes no son confiables: los nodos podrían no darse cuenta de que sus pares están fuera de línea hasta después de enviar commitment_signed
. Una vez que se envía commitment_signed
, el remitente se considera vinculado a esos HTLC y no puede fallar los HTLC entrantes relacionados hasta que los HTLC de salida se resuelvan por completo.
Tenga en cuenta que el htlc_signature
aplica implícitamente el mecanismo de bloqueo de tiempo en el caso de que los HTLC ofrecidos se agoten a tiempo de espera o se gasten los HTLC recibidos. Esto se hace para reducir las tarifas mediante la creación de scripts más pequeños en comparación con el establecimiento explícito de bloqueos de tiempo en las salidas HTLC.
El option_anchors
permite que las transacciones HTLC "traigan sus propias tarifas" adjuntando otras entradas y salidas, de ahí las banderas de firma modificadas.
Una vez que el destinatario de commitment_signed
verifica la firma y sabe que tiene una nueva transacción de compromiso válida, responde con la preimagen de compromiso para la transacción de compromiso anterior en un mensaje revoke_and_ack
.
Este mensaje también sirve implícitamente como un acuse de recibo del commitment_signed
, por lo que este es un momento lógico para que el remitente commitment_signed
aplique (a su propio compromiso) cualquier actualización pendiente que haya enviado antes de ese commitment_signed
.
La descripción de la derivación de claves se encuentra en BOLT #3.
- type: 133 (
revoke_and_ack
) - data:
- [
channel_id
:channel_id
] - [
32*byte
:per_commitment_secret
] - [
point
:next_per_commitment_point
]
- [
A sending node:
- DEBE establecer
per_commitment_secret
to the secret used to generate keys for the previous commitment transaction. - DEBE establecer
next_per_commitment_point
to the values for its next commitment transaction.
Un nodo receptor:
- if
per_commitment_secret
is not a valid secret key or does not generate the previousper_commitment_point
:- MUST send an
error
and fail the channel.
- MUST send an
- if the
per_commitment_secret
was not generated by the protocol in BOLT #3:- MAY send a
warning
and close the connection, or send anerror
and fail the channel.
- MAY send a
Un nodo:
- MUST NOT broadcast old (revoked) commitment transactions,
- Note: doing so will allow the other node to seize all channel funds.
- SHOULD NOT sign commitment transactions, unless it's about to broadcast
them (due to a failed connection),
- Note: this is to reduce the above risk.
El nodo que paga la tarifa de Bitcoin envía un mensaje update_fee
. Como cualquier actualización, primero se compromete con la transacción de compromiso del receptor y luego (una vez reconocida) se confirma con la del remitente. A diferencia de un HTLC, update_fee
nunca se cierra sino que simplemente se reemplaza.
Existe la posibilidad de una carrera, ya que el destinatario puede agregar nuevos HTLC antes de recibir el update_fee
. En esta circunstancia, es posible que el remitente no pueda pagar la tarifa en su propia transacción de compromiso, una vez que el destinatario finalmente reconozca la update_fee
. En este caso, la tarifa será inferior a la tasa de la tarifa, como se describe en BOLT #3.
The exact calculation used for deriving the fee from the fee rate is given in BOLT #3.
El cálculo exacto utilizado para derivar la tarifa a partir del fee rate
se proporciona en BOLT #3.
- type: 134 (
update_fee
) - data:
- [
channel_id
:channel_id
] - [
u32
:feerate_per_kw
]
- [
The node responsible for paying the Bitcoin fee:
- SHOULD send
update_fee
to ensure the current fee rate is sufficient (by a significant margin) for timely processing of the commitment transaction.
The node not responsible for paying the Bitcoin fee:
- MUST NOT send
update_fee
.
Un nodo receptor:
- if the
update_fee
is too low for timely processing, OR is unreasonably large:- MUST send a
warning
and close the connection, or send anerror
and fail the channel.
- MUST send a
- if the sender is not responsible for paying the Bitcoin fee:
- MUST send a
warning
and close the connection, or send anerror
and fail the channel.
- MUST send a
- if the sender cannot afford the new fee rate on the receiving node's
current commitment transaction:
- SHOULD send a
warning
and close the connection, or send anerror
and fail the channel.- but MAY delay this check until the
update_fee
is committed.
- but MAY delay this check until the
- SHOULD send a
Se requieren tarifas de Bitcoin para que los cierres unilaterales sean efectivos. Con option_anchors
, feerate_per_kw
ya no es tan crítico para garantizar la confirmación como lo era en el formato de compromiso heredado, pero aún debe ser suficiente para poder ingresar al mempool (satisfacer la tarifa mínima de retransmisión y la tarifa mínima de mempool).
Para el formato de compromiso heredado, no existe un método general para que el nodo de broadcasting use el elemento child-pays-for-parent
para aumentar su tarifa efectiva.
Dada la variación en las tarifas y el hecho de que la transacción puede gastarse en el futuro, es una buena idea que el pagador de la tarifa mantenga un buen margen (digamos 5 veces el requisito de la tarifa esperada) para txes de compromiso heredadas; pero, debido a los diferentes métodos de estimación de tarifas, no se especifica un valor exacto.
Dado que las tarifas actualmente son unilaterales (la parte que solicitó la creación del canal siempre paga las tarifas por la transacción de compromiso), lo más simple es permitirle solo establecer niveles de tarifas; sin embargo, dado que se aplica la misma tasa de tarifa a las transacciones de HTLC, el nodo receptor también debe preocuparse por que la tarifa sea razonable.
Debido a que los transportes de comunicación no son confiables y es posible que deban restablecerse de vez en cuando, el diseño del transporte se ha separado explícitamente del protocolo.
No obstante, se supone que nuestro transporte es ordenado y confiable. La reconexión introduce dudas sobre lo recibido, por lo que hay reconocimientos explícitos en ese punto.
Esto es bastante sencillo en el caso del establecimiento y cierre del canal, donde los mensajes tienen un orden explícito, pero durante el funcionamiento normal, los reconocimientos de actualizaciones se retrasan hasta el intercambio commitment_signed
/revoke_and_ack
; por lo que no se puede asumir que se han recibido las actualizaciones. Esto también significa que el nodo receptor solo necesita almacenar actualizaciones al recibir commitment_signed
.
Tenga en cuenta que los mensajes descritos en BOLT #7 son independientes de canales particulares; sus requisitos de transmisión están cubiertos allí, y además de ser transmitidos después de init
(como todos los mensajes), son independientes de los requisitos aquí.
- type: 136 (
channel_reestablish
) - data:
- [
channel_id
:channel_id
] - [
u64
:next_commitment_number
] - [
u64
:next_revocation_number
] - [
32*byte
:your_last_per_commitment_secret
] - [
point
:my_current_per_commitment_point
]
- [
next_commitment_number
: un número de compromiso es un contador incremental de 48 bits para cada transacción de compromiso; los contadores son independientes para cada par en el canal y comienzan en 0. Solo se transmiten explícitamente al otro nodo en caso de restablecimiento; de lo contrario, son implícitos.
Un nodo financiador:
- upon disconnection:
- if it has broadcast the funding transaction:
- MUST remember the channel for reconnection.
- otherwise:
- SHOULD NOT remember the channel for reconnection.
- if it has broadcast the funding transaction:
A non-funding node:
- upon disconnection:
- if it has sent the
funding_signed
message:- MUST remember the channel for reconnection.
- otherwise:
- SHOULD NOT remember the channel for reconnection.
- if it has sent the
Un nodo:
- MUST handle continuation of a previous channel on a new encrypted transport.
- upon disconnection:
- MUST reverse any uncommitted updates sent by the other side (i.e. all
messages beginning with
update_
for which nocommitment_signed
has been received).- Note: a node MAY have already used the
payment_preimage
value from theupdate_fulfill_htlc
, so the effects ofupdate_fulfill_htlc
are not completely reversed.
- Note: a node MAY have already used the
- MUST reverse any uncommitted updates sent by the other side (i.e. all
messages beginning with
- upon reconnection:
- if a channel is in an error state:
- SHOULD retransmit the error packet and ignore any other packets for that channel.
- otherwise:
- MUST transmit
channel_reestablish
for each channel. - MUST wait to receive the other node's
channel_reestablish
message before sending any other messages for that channel.
- MUST transmit
- if a channel is in an error state:
The sending node:
- DEBE establecer
next_commitment_number
to the commitment number of the nextcommitment_signed
it expects to receive. - DEBE establecer
next_revocation_number
to the commitment number of the nextrevoke_and_ack
message it expects to receive. - if
option_static_remotekey
applies to the commitment transaction:- DEBE establecer
my_current_per_commitment_point
to a valid point.
- DEBE establecer
- otherwise:
- DEBE establecer
my_current_per_commitment_point
to its commitment point for the last signed commitment it received from its channel peer (i.e. the commitment_point corresponding to the commitment transaction the sender would use to unilaterally close).
- DEBE establecer
- if
next_revocation_number
equals 0:- DEBE establecer
your_last_per_commitment_secret
to all zeroes
- DEBE establecer
- otherwise:
- DEBE establecer
your_last_per_commitment_secret
to the lastper_commitment_secret
it received
- DEBE establecer
Un nodo:
- if
next_commitment_number
is 1 in both thechannel_reestablish
it sent and received:- MUST retransmit
channel_ready
.
- MUST retransmit
- otherwise:
- MUST NOT retransmit
channel_ready
, but MAY sendchannel_ready
with a differentshort_channel_id
alias
field.
- MUST NOT retransmit
- upon reconnection:
- MUST ignore any redundant
channel_ready
it receives.
- MUST ignore any redundant
- if
next_commitment_number
is equal to the commitment number of the lastcommitment_signed
message the receiving node has sent:- MUST reuse the same commitment number for its next
commitment_signed
.
- MUST reuse the same commitment number for its next
- otherwise:
- if
next_commitment_number
is not 1 greater than the commitment number of the lastcommitment_signed
message the receiving node has sent:- SHOULD send an
error
and fail the channel.
- SHOULD send an
- if it has not sent
commitment_signed
, ANDnext_commitment_number
is not equal to 1:- SHOULD send an
error
and fail the channel.
- SHOULD send an
- if
- if
next_revocation_number
is equal to the commitment number of the lastrevoke_and_ack
the receiving node sent, AND the receiving node hasn't already received aclosing_signed
:- MUST re-send the
revoke_and_ack
. - if it has previously sent a
commitment_signed
that needs to be retransmitted:- MUST retransmit
revoke_and_ack
andcommitment_signed
in the same relative order as initially transmitted.
- MUST retransmit
- MUST re-send the
- otherwise:
- if
next_revocation_number
is not equal to 1 greater than the commitment number of the lastrevoke_and_ack
the receiving node has sent:- SHOULD send an
error
and fail the channel.
- SHOULD send an
- if it has not sent
revoke_and_ack
, ANDnext_revocation_number
is not equal to 0:- SHOULD send an
error
and fail the channel.
- SHOULD send an
- if
Un nodo receptor:
- if
option_static_remotekey
applies to the commitment transaction:- if
next_revocation_number
is greater than expected above, ANDyour_last_per_commitment_secret
is correct for thatnext_revocation_number
minus 1:- MUST NOT broadcast its commitment transaction.
- SHOULD send an
error
to request the peer to fail the channel.
- otherwise:
- if
your_last_per_commitment_secret
does not match the expected values:- SHOULD send an
error
and fail the channel.
- SHOULD send an
- if
- if
- otherwise, if it supports
option_data_loss_protect
:- if
next_revocation_number
is greater than expected above, ANDyour_last_per_commitment_secret
is correct for thatnext_revocation_number
minus 1:- MUST NOT broadcast its commitment transaction.
- SHOULD send an
error
to request the peer to fail the channel. - SHOULD store
my_current_per_commitment_point
to retrieve funds should the sending node broadcast its commitment transaction on-chain.
- otherwise (
your_last_per_commitment_secret
ormy_current_per_commitment_point
do not match the expected values):- SHOULD send an
error
and fail the channel.
- SHOULD send an
- if
Un nodo:
- MUST NOT assume that previously-transmitted messages were lost,
- if it has sent a previous
commitment_signed
message:- MUST handle the case where the corresponding commitment transaction is
broadcast at any time by the other side,
- Note: this is particularly important if the node does not simply
retransmit the exact
update_
messages as previously sent.
- Note: this is particularly important if the node does not simply
retransmit the exact
- MUST handle the case where the corresponding commitment transaction is
broadcast at any time by the other side,
- if it has sent a previous
- upon reconnection:
- if it has sent a previous
shutdown
:- MUST retransmit
shutdown
.
- MUST retransmit
- if it has sent a previous
Los requisitos anteriores aseguran que la fase de apertura sea casi atómica: si no se completa, comienza de nuevo. La única excepción es si el mensaje funding_signed
se envía pero no se recibe. En este caso, el financiador olvidará el canal y, presumiblemente, abrirá uno nuevo al volver a conectarse; mientras tanto, el otro nodo eventualmente olvidará el canal original, debido a que nunca recibió channel_ready
o vio la transacción de financiación en la cadena.
No hay confirmación de error
, por lo que si se produce una reconexión, es de buena educación retransmitir antes de desconectarse de nuevo; sin embargo, no es IMPRESCINDIBLE, porque también hay ocasiones en las que un nodo puede simplemente olvidar el canal por completo.
closing_signed
tampoco tiene acuse de recibo, por lo que debe retransmitirse en la reconexión (aunque la negociación se reinicia en la reconexión, por lo que no es necesario que sea una retransmisión exacta). El único acuse de recibo para shutdown
es closing_signed
, por lo que es necesario retransmitir uno u otro.
El manejo de las actualizaciones es igualmente atómico: si no se reconoce la confirmación (o no se envió), las actualizaciones se vuelven a enviar. Sin embargo, no se insiste en que sean idénticos: podrían estar en un orden diferente, implicar tarifas diferentes o incluso faltar HTLC que ahora son demasiado antiguos para agregarse. Requerir que sean idénticos significaría efectivamente una escritura en el disco por parte del remitente en cada transmisión, mientras que el esquema aquí fomenta una sola escritura persistente en el disco para cada "compromiso_firmado" enviado o recibido. Pero si necesita retransmitir tanto un commitment_signed
como un revoke_and_ack
, el orden relativo de estos dos debe conservarse, de lo contrario, se cerrará el canal.
Nunca se debe solicitar una retransmisión de revoke_and_ack
después de que se haya recibido un closing_signed
, ya que eso implicaría que se ha completado un apagado, lo que solo puede ocurrir después de que el nodo remoto haya recibido revoke_and_ack
.
Tenga en cuenta que next_commitment_number
comienza en 1, ya que el número de compromiso 0 se crea durante la apertura. next_revocation_number
será 0 hasta que se envíe commitment_signed
para el número de compromiso 1 y luego se reciba la revocación para el número de compromiso 0.
channel_ready
se reconoce implícitamente por el inicio de la operación normal, que se sabe que comenzó después de que se recibió un commitment_signed
; por lo tanto, la prueba para un next_commitment_number
mayor que 1.
Un borrador anterior insistía en que el financiador "DEBE recordar... si ha transmitido la transacción de financiación, de lo contrario NO DEBE": de hecho, este era un requisito imposible. Un nodo debe, en primer lugar, persistir en disco y, en segundo lugar, transmitir la transacción o viceversa. El nuevo lenguaje refleja esta realidad: ¡sin duda es mejor recordar un canal que no ha sido transmitido que olvidar uno que sí lo ha sido! deje que el financiador lo abra mientras el beneficiario lo ha olvidado.
option_data_loss_protect
se agregó para permitir que un nodo, que de alguna manera se haya quedado atrás (por ejemplo, se haya restaurado desde una copia de seguridad anterior), detecte que se ha quedado atrás. Un nodo retrasado debe saber que no puede transmitir su transacción de compromiso actual, lo que conduciría a la pérdida total de fondos, ya que el nodo remoto puede demostrar que conoce la preimagen de revocación. El error
devuelto por el nodo retrasado debería hacer que el otro nodo abandone su transacción de compromiso actual en la cadena. El otro nodo debe esperar ese error
para darle al nodo retrasado la oportunidad de corregir su estado primero (por ejemplo, reiniciando con una copia de seguridad diferente).
Si el nodo retrasado no tiene la última copia de seguridad, al menos le permitirá recuperar fondos que no sean HTLC, si my_current_per_commitment_point
es válido. Sin embargo, esto también significa que el nodo caído ha revelado este hecho (aunque no de forma demostrable: podría estar mintiendo), y el otro nodo podría usar esto para transmitir un estado anterior.
option_static_remotekey
elimina la clave cambiante to_remote
, por lo que my_current_per_commitment_point
es innecesario y, por lo tanto, se ignora (para simplificar el análisis, sigue siendo y debe ser un punto válido, sin embargo), pero la divulgación del secreto anterior aún permite la detección de retrasos. Sin embargo, una implementación puede ofrecer ambas cosas y recurrir al comportamiento option_data_loss_protect
si option_static_remotekey
no se negocia.
[ FIXME: Insert Author List ]
This work is licensed under a Creative Commons Attribution 4.0 International License.