pr-34872
wallet: fix mixed-input transaction accounting in history RPCs
- Introducción
- Pregunta 1¿Qué problemas tiene la manera actual en que las wallets contabilizan transacciones cuyos inputs no son todos de la wallet? ¿Qué puede saber la wallet con certeza y qué problemas puede tener al calcular la fee?
- Pregunta 2En el primer commit se introduce el enum
WalletTxInputOwnership(NONE,PARTIAL,ALL) junto con el cachém_cached_input_ownershipenCWalletTx. ¿Por qué el enum necesita tres estados en lugar de reutilizar elboolexistenteAllInputsMine()? ¿Por qué la clasificación se guarda en caché y se invalida conMarkDirty()? - Pregunta 3En el segundo commit se crea el struct
WalletTxHistoryAccountingy la funciónCachedTxGetHistoryAccounting(). ¿Qué información agrupa esta función y por qué, de momento, la fee solo tiene valor cuandoinput_ownership == ALL? ¿Por qué la fee pasa a serstd::optional? - Pregunta 4En el tercer commit se añade
CWallet::MarkOutputsDirty()y se invoca al insertar una transacción nueva enAddToWallet()yLoadToWallet(). ¿Qué ayuda a solucionar esta función? (Piensa en qué pasaría si el padre de una transacción que ya está en la wallet se importa después). - Pregunta 5En el quinto commit, en
CachedTxGetAmounts(), la condiciónnDebit > 0para reportar salidas como “sent” se sustituye porall_inputs_mine, y la fee solo se rellena siaccounting.feetiene valor. ¿Qué cambio de comportamiento introduce esto para una transacción con inputs mixtos? - Pregunta 6En el septimo commit se añade
AllForeignInputsKnownZeroValue()con su cachém_cached_foreign_inputs_zero_value. ¿Qué condición exacta debe cumplir cada input que no es de la wallet para considerarse de valor cero conocido? ¿Por qué se devuelvefalsesi el prevout apunta a una transacción que la wallet no conoce? - Pregunta 7En el octavo commit, la condición para atribuir salidas enviadas pasa de
all_inputs_mineacan_attribute_sent_outputs. ¿Qué nuevo comportamiento habilita esto para transacciones con inputs extranjeros de valor cero? ¿Por qué, cuando tenemos un input extranjero de valor distinto de cero, aunque sea conocido porque su transacción padre está en la wallet, no calculamos la fee? - Pregunta 8En el decimo segundo commit, el test
test_zero_value_wallet_inputde Alice construye una transacción mixta en la que el input propiedad de la wallet gasta un output de valor cero, mientras que el input que no es suyo (de la wallet de Bob) tiene un valor superior a cero y es desconocido por Alice. El test verifica que la transacción sigue reportándose con la vista de transacción mixta:involves_mixed_inputs: true, una entradasendagregada conwallet_debit = 0y la fee ausente. ¿Por qué la wallet trata esta transacción como mixta en lugar de tratarla como una recepción pura, dado que Alice no aporta ningún valor?