Биткоин = блокчейн + транзакции.
Эта статья посвящена транзакциям. О том как работает блокчейн вы можете прочитать в этой статье.
Блок на блокчейн состоит из следующих частей:
- Порядковый номер (Index): #1
- Хэш предыдущего блока (Previous Hash): 000D1F890FE6A2195BF207F48BE035D621080BBD18776B42CA38C0852BE58AC5
- Отметка времени (Timestamp): MON, 21 MAY 2018 19:53:20 GMT
- Данные блока (Data): здесь содержатся транзакции
- Нонс (Nonce): 12543
- Хэш блока (Hash): 000F4ED432CB51138BCF09AA5E8A410DD4A1E204EF84BFED1BE16DFBA1B22060
В качестве данных блока (data) в Биткоин содержатся транзакции.
Что такое транзакция?
Транзакция, в нашем случае, это запись платежа между двумя сторонами. Когда происходит перемещение (перевод) ценности создается транзакция, фиксирующая этот перевод.
Например, у Пети есть 100 монет (он получил их в качестве награды (reward) за майнинг блока #1).
Он хочет перевести Васе 5 монет и готов заплатить за этот перевод 1 монету (mining fee). Петя использует имеющиеся у него 100 монет, чтобы осуществить данную транзакцию. Он ожидает получить 94 монеты в качестве сдачи.
Когда Дима осуществит майнинг блока, содержащего эту транзакцию, он получит 100 монет в качестве награды.
Для реализации данного перевода будут созданы следующие выходы (outputs) транзакции:
Так как полученные Петей 100 монет будут использованы в качестве входа (input) данной транзакции, то их статус изменится на потрачено (spent).
Теперь постараемся разобраться в этом примере.
Типы транзакций
Существует три типа транзакций:
- Награда (REWARD) — Петя и Дима получили награду за майнинг новых блоков
- Обычная (REGULAR) — Петя перевел Васе 5 монет и получил 94 монеты в качестве сдачи
- Плата (FEE) — плата за перевод, которую платит отправитель
Транзакция
Транзакция состоит из четырех частей:
- Входы (INPUTS) — откуда берется ценность
- Выходы (OUTPUTS) — куда перемещается ценность
- Хэш (HASH) — однозначно идентифицирует транзакцию используя входы и выходы
- Тип (TYPE) — награда, обычная или плата
Выходы
Выход состоит из двух частей:
- Адрес (ADDRESS) — публичный адрес кошелька куда перемещается ценность
- Количество (AMOUNT) — сколько монет перемещается
Входы
Вход должен иметь соответствующий ему предыдущий выход. Однако, выход может быть использован только один раз. Когда выход использован он потрачен (spent) и имеет соответствующий статус. Выходы, которые еще не использовались как вход, считаются доступными (unspent) и могут быть потрачены.
Вход состоит из 5 частей:
- Хэш транзакции (TRANSACTION HASH) — хэш доступного выхода
- Порядковый номер транзакции (OUTPUT INDEX) — номер доступного выхода
- Количество (AMOUNT) — количество монет на доступном выходе
- Адрес (ADDRESS) — адрес доступного выхода
- Подпись (SIGNATURE) — подписан соответствующим приватным ключом для данного публичного адреса
Транзакция награды (REWARD)
Транзакции награды создаются в результате нахождения валидного хэша блока, т.е в процессе майнинга. Так как при этом создаются новые монеты, то данные транзакции не имеют входа.
Например, Петя нашел новый блок с наградой за майнинг в размере 100 монет. Транзакция в блоке будет выглядеть следующим образом:
Тип (TYPE): Награда (REWARD)
Входы (INPUTS): нет
Выходы (OUTPUTS):
- Адрес (ADDRESS): публичный адрес Пети
- Количество (AMOUNT): 100
Хэш (HASH): 𝑓(inputs+outputs)
Транзакция обычная (REGULAR)
Обычные транзакции создаются когда одна сторона переводит монеты другой стороне.
Например, Петя использует доступный (unspent) выход транзакции награды в качестве входа транзакции перевода Васе 5 монет. Он определяет плату за майнинг в размере 1 монеты.
Тип (TYPE): Обычная (REGULAR)
Входы (INPUTS):
- Хэш транзакции (TRANSACTION HASH) — хэш транзакции награды Пети
- Порядковый номер транзакции (OUTPUT INDEX) — 0 (первый порядковый номер)
- Количество (AMOUNT) — 100 (количество монет на доступном выходе)
- Адрес (ADDRESS) — публичный адрес Пети (адрес доступного выхода)
- Подпись (SIGNATURE) — подписан соответствующим приватным ключом для данного публичного адреса Пети
Выходы (OUTPUTS):
Выход 1 (номер #0)
- Адрес (ADDRESS): публичный адрес Васи
- Количество (AMOUNT): 5
Выход 2 (номер #1)
- Адрес (ADDRESS): публичный адрес Пети
- Количество (AMOUNT): 94 (100 минус 5 (сумма перевода) и минус 1 (размер платы)
Первый выход — это платеж Васе. Второй выход — это сдача Пете.
Так как выход транзакции награды Пети был использован в качестве входа транзакции перевода Васе, он теперь считается потраченным (spent) и не может быть использован вновь.
Почему просто не просуммировать входы и выходы?
На входе мы имеем 100 монет. На выходе у нас 5+94=99 монет.
Разница между входами и выходами обычной транзакции является платой за майнинг.
На входе должно быть больше или столько же монет, как и на выходе. Если количество монет на входе и выходе одинаковое, то плата за майнинг отсутствует.
Транзакция платы (FEE)
Например, Дима осуществил процесс майнинга транзакции перевода монет от Пети к Васе.
Тип (TYPE): Плата (FEE)
Входы (INPUTS): нет
Выходы (OUTPUTS):
- Адрес (ADDRESS): публичный адрес Димы
- Количество (AMOUNT): 1 (разница между входами и выходами регулярной транзакции перевода)
Так как Дима осуществил майнинг данной транзакции в новый блок, то помимо платы (fee) он получает и награду (reward) в количество 100 монет.
В блокчейн это выглядит так:
Итоговый баланс
Петя: 94 = 100 (награда за майнинг блока #1) — 5 (платеж Васе) — 1 (плата)
Вася: 5 (платеж от Пети)
Дима: 101 = 100 (награда за майнинг блока #2) + 1 (плата)
Всего в обращении находятся 200 монет: 94 + 5 + 101 = 200
Два блока было добыто и каждый из блоков имел награду 100 монет за добычу (майнинг). Соответственно, должно быть в обращении 200 монет.