Отправил необработанный tx, который уже был в блокчейне, чтобы протестировать его. Я получил «отсутствующие входные данные» вместо «уже существует». Почему?

В попытке более полно понять необработанные транзакции и т. д. я посмотрел на tx 518c41d5e59114f6a23383afbe95f02cdd09cb50cabd8390bdd9162a890435b3 в необработанном виде :

01000000017871f56f7be2743293abb1adccf21526265e4ad793fddbc08508417293fd6b4e000000006a47304402201f3b98d55c16a1ff9e66cbdd5533fd74d18362477f50dbce357d66e1233ba469022066fd837cf7e1e030f5aab0f22fec06c7d98ee948fd8b9aba185512426079e0a201210284ca3e364bebb4cafb9fa76624927078e16a4244314f824ea8acff0ef1ba4627ffffffff0220a10700000000001976a91488d924f51033b74a895863a5fb57fd545529df7d88ac81f1d909000000001976a914db4c1f7949870fae5cdc366a45e2ea39c084547c88ac00000000

Затем я попытался отправить эту необработанную форму, просто скопировал и вставил в свою программу биткойн-кошелька «senddrawtransaction» и получил ошибку missing inputs (code -25). Это кажется странным само по себе, потому что, поскольку это точная копия и вставка необработанной транзакции, которая находится в блокчейне, не должна ли она вообще ничего пропускать? Кроме того, разве я не должен вместо этого получать ошибку «транзакция уже существует»? Или я что-то не понимаю в том, как подаются необработанные транзакции?

Ответы (1)

Bitcoin Core не знает, какие транзакции уже существуют в цепочке. Он не поддерживает полный индекс, потому что... в этом нет необходимости. На самом деле, при работе в режиме обрезки у него даже нет ни цепочки, ни ее транзакций.

Единственное, что у него есть, это набор неизрасходованных выходов транзакций. Поскольку вы пытаетесь воспроизвести существующую транзакцию, все входные данные уже потрачены ее предыдущим экземпляром. В результате ожидаемый и правильный ответ состоит в том, что входные данные отсутствуют, т. е. ваша транзакция представляет собой двойную трату и, следовательно, недействительна.

Я бы сказал, что это одно из преимуществ модели UTXO: реплей и двойная трата — это одно и то же, и их не нужно различать.

В таком случае, в чем смысл fHaveChain на github.com/bitcoin/bitcoin/blob/master/src/rpc/… , который выдает RPC_TRANSACTION_ALREADY_IN_CHAIN?
@MeshCollider Если я правильно понимаю, если некоторые выходные данные транзакции существуют в блокчейне и не израсходованы, то sendrawtransaction завершается с ошибкой с этой ошибкой, а не с ошибкой отсутствия входных данных.