Транзакция Биткоина — это подписанный раздел данных, который транслируется в сеть и записываются в блоки. Она ссылается на предыдущие транзакции и переводит определённое количество BTC (биткоин-монет) на указанный открытый ключ (Bitcoin-адрес). Транзакции транслируются в сеть без шифрования. Существуют сайты на которых можно увидеть каждую транзакцию записанную в блок, такие сайты называют обозревателями блокчейна (например этот сайт). Они могут быть полезны для выяснения технических деталей сделки, или для подтверждения платежа.

Пример транзакции Bitcoin

Вход:
Previous tx: f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd04470b9a6
Index: 0
scriptSig: 304502206e21798a42fae0e854281abd38bacd1aeed3ee3738d9e1446618c4571d10
90db022100e2ac980643b0b82c0e88ffdfec6b64e3e6ba35e7ba5fdd7d5d6cc8d25c6b241501

Выход:
Value: 5000000000
scriptPubKey: OP_DUP OP_HASH160 404371705fa9bd789a2fcd52d2c580b65d35549d
OP_EQUALVERIFY OP_CHECKSIG

Разъяснения

Вход этой транзакции импортирует 50 BTC с выхода #0 транзакции f5d8... Затем выход данной транзакции отправляет 50 BTC на Bitcoin-адрес (выраженный в шестнадцатеричном формате: 404371...). Когда получатель захочет потратить эти деньги, он сформирует транзакцию, на входе которой будет ссылаться на выход #0 данной сделки.

Вход

Вход — это ссылка на выход другой транзакции. Часто в одной транзакции может быть записано несколько входов, в таком случае значения всех упомянутых выходов предыдущих сделок суммируются и общая сумма записывается на выход текущей транзакции. Previous tx — это хэш предыдущей транзакции. Index — конкретный выход транзакции на которую ссылаются. ScriptSig — это подпись - первая половина Скрипта.

Скрипт состоит из двух компонентов, подписи (ScriptSig) и открытого ключа (scriptPubKey). Открытый ключ принадлежит инициатору транзакции и подтверждает что он обладает суммой необходимой для выполнения транзакции (записанной на выходе транзакции). Второй компонент — это подпись (ScriptSig) полученная из хэша транзакции по алгоритму ECDSA (Elliptic Curve Digital Signature Algorithm — алгоритм с открытым ключом для создания цифровой подписи). Вместе они подтверждают что транзакция была создана реальным владельцем Bitcoin-адреса. Различные флаги определяют как упростить транзакцию, и могут быть использованы для создания различных типов оплаты.

Выход

Выход содержит инструкции на перевод BTC. Value – это количество Сатоши (1 BTC = 100 000 000 Сатоши) участвующих в данной транзакции (сумма которая будет списана с кошелька инициатора сделки). ScriptPubKey — это вторая половина Скрипта. Транзакция может содержать больше одного выхода, для того что бы обработать всю сумму BTC указанную на входе, к примеру: если вход ссылается на транзакцию в 50 BTC, а вы хотите отправить получателю только 25 BTC, то будет создано 2 выхода: первый к Bitcoin-адресу получателя, а второй обратно к вашему адресу. В тех случаях когда на выходах транзакции обрабатывается не вся сумма BTC указанная на входе, любой необработанный остаток BTC признаётся комиссией за транзакцию: майнер, сгенерировавший блок в который включена запись о данной транзакции — получит эти BTC.

Подтверждение

Для подтверждения того что выход транзакции имеет право использовать суммы BTC на её входах, в Bitcoin применяется Forth-подобная Скрипт-система. ScriptSig, на входе, и ссылающийся на него scriptPubKey, на выходе, оцениваются (именно в таком порядке), с использованием значения scriptPubKey из стека scriptSig. Вход признаётся действительным, если scriptPubKey возвращает значение true (истина). Через систему скриптов, отправитель может создавать более сложные условия, которым должен соответствовать получатель суммы указанной на выходе транзакции. Например, можно создать выход:

  • для получения суммы которого нужно будет ввести пароль (а не использовать ключ);
  • для получения суммы которого нужны будут подписи 10 различных ключей и т. д.

Типы транзакций

В настоящее время Bitcoin создаёт только три различные пары scriptSig/scriptPubKey. Они будут описаны ниже. Вполне возможно разработать и более сложные виды транзакций и собрать их вместе в криптографически-навязанном соглашении. Такие транзакции в Bitcoin называют Контракты.

Транзакция: перевод на IP-адрес

scriptPubKey: <pubKey> OP_CHECKSIG
scriptSig: <sig>

Отправитель получает открытый ключ получателя (pubKey) общаясь с ним. Когда сумма монет была отправлена на IP-адрес, получатель должен предоставить только подпись (sig). Подпись сверяется с открытым ключом в scriptPubKey.

Процесс проверки:

Stack (Стек) Script (Скрипт) Описание
Пусто <sig> <pubKey> OP_CHECKSIG scriptSig и scriptPubKey объединены.
<sig> <pubKey> OP_CHECKSIG Константы добавляются в стек
True (истина) Пусто Подпись проверяется на двух верхних элементах стека


Транзакция: перевод на адрес биткоина

scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
scriptSig: <sig> <pubKey>

Bitcoin-адрес представляет из себя хэш, по этому отправитель не может указать полный открытый ключ в scriptPubKey. При получении монет отправленных на Bitcoin-адрес, получатель должен предоставить и подпись (sig) и открытый ключ (pubKey). Скрипт проверяет возможно ли с помощью данного открытого ключа получить присланный хэш, затем проверяет подпись к предоставленному открытому ключу.

Stack (Стек) Script (Скрипт) Описание
Пусто <sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG scriptSig и scriptPubKey объединены.
<sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG Константы добавляются в стек.
<sig> <pubKey> <pubKey> OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG Верхний элемент стека дублируется.
<sig> <pubKey> <pubHashA> <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG Верхний элемент стека хэшируется.
<sig> <pubKey> <pubHashA> <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG Константы добавляются в стек.
<sig> <pubKey> OP_CHECKSIG Проверяется эквивалентность двух верхних элементов стека.
True (истина) Пусто. Подпись проверяется на двух верхних элементов стека.

Транзакция: Генерация монет

Транзакция генерации монет имеет один вход с параметром «coinbase», вместо параметра scriptSig. Данные в «coinbase» могут быть любыми, они не используются. Выход транзакции генерации монет может быть каким угодно, но Bitcoin создаёт один, идентичный выходу в транзакции перевода на IP-адрес.

Транзакции в сети Биткоина