Как узнать, действительна ли сделка?

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

Например, должна ли транзакция иметь определенную структуру, чтобы ее можно было потратить, например, сценарий из TxIn должен скомпилироваться в закодированное сообщение, а сценарий TxOut должен правильно запустить OP_Checksig для этого конкретного сообщения? Если нет, можно просто удалить сообщение из TxIn, отправить собственное вредоносное сообщение и запустить для него OP_Checksig.

Какие шаги протокол требует от клиента, чтобы проверить, действительна ли транзакция?

Не понятно, о чем вы спрашиваете. Под «действительным» вы просто подразумеваете, что клиент не будет считать блок недействительным, если он содержит эту транзакцию? Или под «действительным» вы подразумеваете, что клиент по умолчанию будет включать эту транзакцию в блоки, которые он генерирует? Или под «действительным» вы подразумеваете, что клиент по умолчанию будет передавать его другим узлам? Или что-то другое? Существуют различные проверки транзакций, чтобы решить, являются ли они «действительными» для ряда различных целей. Например, рассмотрим транзакцию, которая тратит монеты, которые еще не доступны, но могут стать доступными. В некотором смысле это справедливо. В некоторых еще нет.
@DavidSchwartz Я полагаю, что все вышеперечисленное было бы полезно, но в основном я думал о включении транзакций в блок.

Ответы (3)

В биткойн-вики есть довольно полный список проверок, которые делает клиент Satoshi: Protocol_rules .

Также есть раздел , посвященный проверке транзакций.

Я рекомендую использовать библиотеку биткора, созданную BitPay, которая имеет хорошо работающую функцию transaction.verify() .

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

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

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

Какие шаги протокол требует от клиента, чтобы проверить, действительна ли транзакция?

https://github.com/bitcoin/bitcoin/tree/master/src

Что ж, гораздо больше, чем «[однократное] подтверждение», чтобы «утвердить [это] в камне».
Хотя вы технически правы, говоря, что вам нужно проверить цепочку на всем пути до генерации, это бесполезно. Клиенты сохраняют только ту часть цепочки, валидность которой они подтвердили, и единственное, что им нужно проверить, — правильно ли она подключается к транзакциям в ней. Кроме того, транзакции никогда не фиксируются полностью, но каждое подтверждение значительно снижает вероятность дальнейшего возврата.
Не было и, скорее всего, не будет ни одной атаки Chain Fork. Не стоит, вряд ли, такого еще не было. fЕдинственной атакой на биткойн-клиент или цепочку было целочисленное переполнение в начале времен.