Coinbase-транзакция определяет получателей награды за блок: разрешённых новых биткоинов и комиссий остальных транзакций. В отличие от обычного платежа, она не тратит ранее полученные средства. Она действительна только в корректном блоке, а награду нельзя потратить сразу. Название обозначает тип транзакции, а не биржу Coinbase.
Представим, что Анна готовит блок-кандидат для майнинга. Она собирает платежи пользователей и перед ними ставит особую транзакцию, определяющую получателей награды. В нашем примере правила разрешают создать 3,125 BTC, а выбранные платежи дают 0,075 BTC комиссий. Значит, Анна может назначить себе не более 3,2 BTC. Эта первая транзакция — coinbase. Самой записи недостаточно: блок должен выполнить требование майнинга и все остальные условия, которые получающие его узлы проверяют самостоятельно. Если Анна запросит слишком много, они отвергнут весь блок, сколько бы энергии ни ушло на его поиск. Центрального счёта, который перечисляет ей выплату, нет. Новые монеты возникают по общим правилам внутри принятого блока. Из 3,2 BTC в примере новыми являются лишь 3,125 BTC; остальное заплатили пользователи. Это награда, не прибыль: расходы на майнинг ещё не вычтены. [6] [4]
Разрешённая новая эмиссия называется Block Subsidy и периодически сокращается вдвое при Halving. Сатоши — наименьшая единица биткоина. Комиссии зависят от конкретных платежей, поэтому два блока могут давать разные награды. Предел награды складывается из разрешённой эмиссии для данной высоты, вычисляемой GetBlockSubsidy в Bitcoin Core, и комиссий остальных действительных транзакций блока. Только эмиссия увеличивает количество монет; комиссии — существующие сатоши. Майнер может получить меньше, но не забрать разницу позже: невостребованная эмиссия не возникнет, а неполученные комиссии навсегда станут недоступными для расходования. Даже один лишний сатоши делает весь блок недействительным. [4] [6]
Награда часто поступает пулу, координирующему работу нескольких майнеров. Блокирующий скрипт — короткая программа, которая задаёт условия дальнейшего расходования выхода. PPS, FPPS и PPLNS — разные способы распределения дохода пула между участниками. Выходы используют обычные блокирующие скрипты. Награда может поступить на общий адрес, распределиться между получателями или включать долю оператора пула. Узлы проверяют суммы и условия расходования, а не договоры и фактических владельцев. PPS, FPPS, PPLNS, пороги выплат и дальнейшие переводы участникам — правила пула, а не консенсуса Bitcoin. [6] [7]
Анна видит награду в блоке, но ещё не может оплатить ею электричество. Её удерживает не биржа: ждать заставляют правила Bitcoin. Высота — порядковый номер блока; H здесь обозначает высоту блока, в котором возникла награда. COINBASE_MATURITY требует разницы не менее 100 между высотой блока расходования и высотой создания выхода. Выход с высоты H впервые можно потратить в действительном блоке H+100. Счётчик подтверждений может выглядеть иначе, ведь создающий блок уже считается первым. Важна разница высот, а не оценка в часах. Её соблюдение не гарантирует, что блок никогда не покинет цепочку. [5]
Реорганизация означает переход узла на другую корректную ветвь с большей накопленной работой майнинга. UTXO — неизрасходованные выходы, отдельные доступные суммы. Награда может исчезнуть из этого набора вместе со своим блоком. Реорганизация может удалить исходный блок из активной действительной цепочки с наибольшей накопленной работой. Его выходы coinbase исчезнут из активного набора UTXO. Пострадать могут и транзакции, расходующие награду. Ожидание 100 блоков ограничивает последствия коротких реорганизаций, но не даёт абсолютной гарантии. Пул должен различать награду в активной цепочке, возможность её расходования и обязательства перед майнерами. [4] [5]
Для точного формата нужны названия: вход обычно указывает на расходуемые средства, а выход задаёт сумму и условия расходования. Txid идентифицирует транзакцию, версия определяет формат, а locktime может ограничивать момент включения. Блок должен содержать хотя бы одну транзакцию; только первая может быть coinbase. У неё один вход с нулевой ссылкой на предыдущий выход: хеш из 32 нулевых байтов и индекс 0xffffffff. Эта ссылка, outpoint, ничего прежнего не тратит, поэтому обычная подпись на расходование выхода здесь не проверяется. При этом у транзакции есть txid, версия, locktime и один или несколько выходов. [1] [2] [3]
Высота — порядковый номер блока. BIP34 обозначает предложение, правило которого принято в Bitcoin; scriptSig — поле данных входа, а CScript — способ записи скриптовых инструкций и чисел. BIP34 требует начинать scriptSig с высоты блока в виде минимально закодированного числа CScript. Всё поле занимает 2–100 байтов. Далее могут идти extra nonce, обозначение пула или данные объединённого майнинга. Неверная высота или длина вызывает отклонение. Хотя вход не исполняется как обычный разблокирующий скрипт, его коды операций подписи могут учитываться в лимите sigops, то есть ограничении числа операций подписи. [1] [9]
Майнинг многократно вычисляет хеш, цифровой отпечаток краткого описания блока — заголовка. Nonce — изменяемое число, а корень Меркла — общий отпечаток транзакций. Изменение транзакции открывает новые попытки. Поле nonce заголовка имеет 32 бита, и оборудование быстро перебирает его варианты. Поэтому программа меняет и extra nonce в coinbase. Меняются txid, корень дерева Меркла и заголовок, открывая новое пространство поиска хешей. Пул распределяет работу между устройствами, чтобы они без нужды не проверяли одинаковые варианты. Extra nonce не создаёт дополнительных монет. [6] [7] [12]
SegWit отделяет часть проверочных данных, например подписи, в часть witness. Commitment — проверяемая привязка к данным, а не ещё одна выплата. Далее приведён её технический формат. Если блок содержит данные witness, BIP141 требует выход coinbase с witness commitment — криптографической привязкой к этим данным. Скрипт начинается с 6a24aa21a9ed: OP_RETURN, помещение 36 байтов и метка aa21a9ed. Затем идёт 32-байтовый двойной хеш SHA-256 от корня дерева Меркла witness, соединённого с зарезервированным значением. Witness входа coinbase должен содержать только это одно 32-байтовое значение. Если подходят несколько выходов, действует наибольший индекс. Это не расходуемая выплата; без данных witness в блоке привязка необязательна. [10]
Full Node — компьютер, самостоятельно проверяющий правила Bitcoin. Вес блока измеряет использование разрешённой ёмкости данных; Mempool хранит обычные неподтверждённые транзакции локально. Проверка награды — часть проверки всего блока. Full Node требует coinbase первой и отклоняет дополнительные coinbase в том же блоке. Он проверяет scriptSig, высоту BIP34, диапазоны сумм, вес блока, комиссии и необходимый witness commitment. Сумма выходов не может превышать эмиссию плюс комиссии; при последующем расходовании должно выполняться условие зрелости. Майнер не может по правилам протокола назначить себе произвольную сумму. Без своего блока coinbase не попадает в mempool. [3] [4] [10]
Genesis Block — начальный блок Bitcoin. Его особое положение и старые повторяющиеся идентификаторы объясняют, почему обычные современные правила нельзя без разбора применять ко всем историческим случаям. До обязательного указания высоты разные coinbase могли иметь одинаковые txid. BIP30 не позволяет перезаписывать старые неизрасходованные выходы; BIP34 добавляет различающую высоту в обычных современных блоках. Genesis Block — особый случай: его coinbase записана в блоке, но инициализация не сделала её выход расходуемым. Поэтому первоначальные 50 BTC потратить нельзя; это не обычное ожидание 100 блоков. [8] [9] [11]
Для полной картины прочитайте эту статью вместе с Block, Block Subsidy, Transaction Fees, Майнинг, Block Template, Bitcoin. На эту статью также ссылаются Block Subsidy, Подтверждение, Reorg, Stale Block.