pr-35501
wallet: store all witness variants of a transaction
- Introducción
- Pregunta 1¿Qué significa que dos transacciones compartan el mismo txid pero tengan diferentes wtxids? ¿Cómo es esto posible y qué implica sobre los inputs de la transacción?
- Pregunta 2¿Por qué el wallet necesita almacenar todas las variantes de witness de una transacción? ¿Qué escenario práctico lo motiva?
- Pregunta 3El PR introduce el concepto de una variante de witness “canónica”. ¿Qué hace que una variante sea canónica y por qué cambia la regla según el estado de confirmación? ¿Cuáles son las ventajas y desventajas de cada regla?
- Pregunta 4La regla de selección canónica para transacciones no confirmadas tiene en cuenta el menor peso. “Peso” incluye los datos de witness. ¿Porque no usamos el mayor feerate en lugar del peso? ¿Podría la variante de mayor peso tener un feerate mayor que una variante menos pesada?
- Pregunta 5Cuando el wallet retransmite transacciones usa
GetTx()lo cual devuelve la variante canónica. Si la tx es taproot y la variante canónica es un gasto key-path no confirmado pero en la mempool ya tiene el gasto script-path (mismo txid), ¿qué pasa? ¿Podría la retransmisión ser rechazada? - Pregunta 6Imagina un escenario donde una transacción tiene tres variantes de witness: A (key-path, la más ligera), B (script-path 1, mediana) y C (script-path 2, la más pesada). La variante B se confirma en un bloque. Luego el bloque es reorganizado. ¿Cuál es la variante canónica antes del reorg? ¿Y después del reorg? ¿El wallet retiene las tres variantes?
- Pregunta 7El PR refactoriza
CWalletTxpara ser RAII. ¿Qué principio de diseño sigue esto y qué clase de bugs previene? - Pregunta 8El esquema de la DB almacena la variante canónica en el registro principal
txy todas las variantes (incluyendo la canónica) en registroswtxvariant. ¿Por qué no almacenar solo las variantes no canónicas en registroswtxvariant, evitando la redundancia? - Pregunta 9En
CWalletTx::RecomputeCanonical, el lambdais_bettercompara dos variantes. El código itera constd::next(it)comenzando desdem_txs.begin(). Sim_txstiene solo una entrada, el bucle nunca se ejecuta ybest_wtxidpermanece como la primera entrada. ¿Está garantizado que esto sea correcto? ¿Qué pasaría sim_txsestá vacío, puedeRecomputeCanonicalcrashear? - Pregunta 10En
CWalletTx::Update, ¿por quéRecomputeCanonical()solo se llama cuando!isConfirmed()? ¿Qué saldría mal si se llamara incondicionalmente?