El número de compromiso oscurecido para cada transacción de compromiso son los 48 bits inferiores de:
SHA256(payment_basepoint from open_channel || payment_basepoint from accept_channel)
Está codificado en los campos de secuencia y tiempo de bloqueo (24 bits cada uno) de la transacción de compromiso. No entiendo por qué es necesario, el BOLT rfc dice:
Esto oscurece la cantidad de compromisos realizados en el canal en el caso de un cierre unilateral, pero aún proporciona un índice útil para ambos nodos (que conocen los puntos base de pago) para encontrar rápidamente una transacción de compromiso revocado.
¿Por qué el TXID del compromiso TX no es suficiente como clave de índice de búsqueda?
Mirando el código c-lightning encuentro esta llamada :
txs[0] = commit_tx(ctx, &channel->funding_txid,
channel->funding_txout,
channel->funding_msat / 1000,
channel->funder,
channel->config[!side].to_self_delay,
&keyset,
channel->view[side].feerate_per_kw,
channel->config[side].dust_limit_satoshis,
channel->view[side].owed_msat[side],
channel->view[side].owed_msat[!side],
committed,
htlcmap,
commitment_number ^ channel->commitment_number_obscurer,
side);
en particular la siguiente línea:
commitment_number ^ channel->commitment_number_obscurer
Al rastrear la commitment_number
variable, esto me sugiere que en realidad es un número entero. Si ve con qué frecuencia en el código tiene que validarse que dos transacciones de compromiso se sucedan directamente, tiene sentido tener un número entero no oscurecido en lugar de un txid. Considere, por ejemplo, este bloque de código :
/* FIXME: Document this requirement in BOLT 2! */
/* We can't send two commits in a row. */
if (peer->revocations_received != peer->next_index[REMOTE] - 1) {
assert(peer->revocations_received
== peer->next_index[REMOTE] - 2);
peer->commit_timer_attempts++;
Se oscurece más adelante ya que la información de cuántos compromisos tx existían no debería ser pública. Según tengo entendido, está oscurecido con una OTP a través de XOR. La OTP es la que mencionaste anteriormente. La idea es tener un número entero que se pueda usar pero que se oculte cuando se envía a la cadena de bloques. Sin embargo, no encontré una posición en el código donde el valor oscurecido se tome y se procese a un valor limpio.
Espero que eso ayude (:
james c
René Pickhardt
james c
james c