Процесс проверки транзакций в полных узлах

У меня возникли проблемы с пониманием процесса проверки транзакций на полных узлах. Я понимаю, как транзакция проверяется с помощью общедоступной криптографии (хэши, подпись и т. д., как это объясняется в оригинальной статье Сатоши), но я не могу найти, как этот процесс выполняется в реальном программном обеспечении, включая базу данных UTXO и любые другие оптимизации, которые могут быть выполнены в реальных клиентах с полным узлом.

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

Ответы (1)

Немного поздно, но для аудитории, которая в конечном итоге ищет этот ответ:

указать на какой-нибудь технический ресурс, где я мог бы найти это описание?

https://en.bitcoin.it/wiki/Транзакция#Проверка

https://en.bitcoin.it/wiki/Protocol_rules#.22tx.22_messages

Сокращение и вставка (март 2018 г.):

These messages hold a single transaction.
Check syntactic correctness
Make sure neither in or out lists are empty
Size in bytes <= MAX_BLOCK_SIZE
Each output value, as well as the total, must be in legal money range
Make sure none of the inputs have hash=0, n=-1 (coinbase transactions)
Check that nLockTime <= INT_MAX[1], size in bytes >= 100[2], and sig opcount <= 2[3]
Reject "nonstandard" transactions: scriptSig doing anything other than pushing numbers on the stack, or scriptPubkey not matching the two usual forms[4]
Reject if we already have matching tx in the pool, or in a block in the main branch
For each input, if the referenced output exists in any other tx in the pool, reject this transaction.[5]
For each input, look in the main branch and the transaction pool to find the referenced output transaction. If the output transaction is missing for any input, this will be an orphan transaction. Add to the orphan transactions, if a matching transaction is not in there already.
For each input, if the referenced output transaction is coinbase (i.e. only 1 input, with hash=0, n=-1), it must have at least COINBASE_MATURITY (100) confirmations; else reject this transaction
For each input, if the referenced output does not exist (e.g. never existed or has already been spent), reject this transaction[6]
Using the referenced output transactions to get input values, check that each input value, as well as the sum, are in legal money range
Reject if the sum of input values < sum of output values
Reject if transaction fee (defined as sum of input values minus sum of output values) would be too low to get into an empty block
Verify the scriptPubKey accepts for each input; reject if any are bad
Add to transaction pool[7]
"Add to wallet if mine"
Relay transaction to peers
For each orphan transaction that uses this one as one of its inputs, run all these steps (including this one) recursively on that orphan