Найти выход транзакции легко, так как мы используем хэш указатели.
Чтобы убедиться, что этот выход не был потрачен, нам нужно отсканировать цепочку блоков между указанной транзакцией и последним блоком.
Нам не нужно проходить весь путь назад к началу цепочки блоков, и это не требует хранения каких-либо дополнительных структур данных, хотя, как мы увидим, дополнительные структуры данных ускорят работу.
Так как транзакции могут иметь много входов и много выходов, разделять и объединять значения легко.
Например, Боб получил деньги в двух разных транзакциях – 17 биткойнов в одной и 2 биткойна в другой.
Боб может сказать, что хотел бы иметь одну транзакцию, которую он может потратить позже, где у него будут все 19 биткойнов.
Сделать это легко – он создает транзакцию с двумя входами и одним выходом, причем выходной адрес принадлежит ему.
Это позволяет ему консолидировать эти две транзакции.
Также, легко сделать и совместные платежи.
Предположим, Кэрол и Боб оба хотят заплатить Дэвиду.
Они могут создать транзакцию с двумя входами, которые принадлежат разным людям, и одним выходом.
И единственное отличие от предыдущего примера состоит в том, что, поскольку два выхода из предыдущих транзакций, которые здесь заявляются, относятся к разным адресам, для новой транзакции потребуется две отдельные подписи: одна – Кэрол, а другая – Боба.
Концептуально это все, что связано с транзакцией биткойнов.
Теперь посмотрим, как она представлена на низком уровне в биткойне.
В конечном счете, каждая структура данных, которая отправляется в сеть, представляет собой строку бит.
То, что здесь показано, является низкоуровневым форматом, но далее это дополнительно компилируется до компактного двоичного формата, который не читается человеком.
Как вы можете видеть в этом примере, транзакция делится на три части: некоторые метаданные, серия входов и серия выходов.
Что качается метаданных, здесь есть некоторая информация о самой транзакции – размер транзакции, количество входов и количества выходов.
Также здесь указан хэш всей транзакции, который служит уникальным идентификатором транзакции.
Это позволяет нам использовать хеш-указатели для ссылок на транзакции.
Наконец, есть поле «lock_time», к которому мы вернемся позже.
Теперь о входах.
Входы транзакций образуют массив, и каждый вход имеет один и тот же формат.