Глоссарий / Транзакции и комиссии
Аутпоинт
- Что такое аутпоинт?
- Аутпоинт представляет собой указатель размером 36 байт, который идентифицирует ровно один выход транзакции, сочетая 32-байтовый идентификатор создавшей его транзакции с 4-байтовым индексом его позиции.
В биткоине нет номеров счетов, поэтому каждое расходование должно точно указывать, какая именно монета расходуется. В записи для человека указатель выглядит как идентификатор транзакции, двоеточие и число, и он служит первичным ключом всей базы неизрасходованных выходов, которую поддерживает каждый полный узел. Если две транзакции когда-либо назовут один и тот же аутпоинт, действительной может быть только одна из них, и именно это единственное правило не позволяет потратить монету дважды.
Как это работает
Аутпоинт стоит в начале каждого входа транзакции, и это первое, что узел проверяет, когда выясняет, допустимо ли расходование.
В передаваемых данных это два поля без разделителя: 32 байта хеша транзакции, затем 4-байтовый индекс, записанный в порядке little-endian. Хеш записан во внутреннем порядке байтов, обратном тому порядку, который виден в обозревателе блоков, поэтому необработанная транзакция в шестнадцатеричном виде выглядит так, будто ссылается на идентификатор транзакции, записанный в обратном порядке. Это сбивает с толку всякого, кто впервые читает необработанный hex, и представляет собой исключительно соглашение об отображении, а не различие в данных.
Индексы считаются с нуля. Первый выход транзакции имеет индекс 0, второй имеет индекс 1, а монета, описанная как заканчивающаяся на :2, является третьим выходом. Поле занимает 4 байта, поэтому теоретический предел составляет 4 294 967 295, к которому не приближается ни одна реальная транзакция.
Одно значение зарезервировано. Транзакция coinbase, та, что платит майнеру, имеет единственный вход, аутпоинт которого состоит из 32 нулевых байтов с индексом, установленным во все единицы, 0xffffffff. Такое сочетание ни на что не указывает и сигнализирует, что этот вход создает стоимость, а не перемещает ее.
Уникальность пришлось обеспечить правилом, а не предполагать. Две транзакции coinbase с идентичным содержимым дали бы одинаковые идентификаторы и, следовательно, дублирующиеся аутпоинты, что дважды случалось в ранней истории биткоина. BIP30 прямо запретил такую схему, а затем BIP34 потребовал, чтобы каждая транзакция coinbase включала высоту блока в свой скрипт входа, что гарантировало разное содержимое. BIP34 стал обязательным на блоке 227 931 в марте 2013 года.
Где это встречается
Аутпоинт является идентификатором, с которым работают всякий раз, когда говорят точно о конкретной монете, а не о балансе.
Экраны управления монетами в кошельках показывают запасы как идентификатор транзакции и индекс. Интерфейс RPC в Bitcoin Core принимает эти два поля как пару: listunspent возвращает их, gettxout ищет один из них, а createrawtransaction ожидает их. Lightning использует аутпоинт финансирующей транзакции как постоянное имя канала, поэтому идентификаторы каналов в программном обеспечении узла выглядят как хеш, за которым следует небольшое число.
Это также то, что уместно приводить в споре. На адрес могли совершить десятки платежей, а транзакция может иметь десятки выходов, но аутпоинт называет один платеж одной суммы в один момент, без какой-либо неоднозначности для обсуждения. Если биржа просит вас подтвердить конкретное пополнение, именно такой уровень точности закрывает вопрос.
Аутпоинт vs индекс выхода
Индекс выхода является одним полем внутри аутпоинта, а не его сокращенным названием. Сам по себе индекс не несет никакой информации, потому что десятки миллионов транзакций имеют выход с индексом 0, и это число ничего не говорит о том, какой именно имеется в виду. Путаница возникает из интерфейсов обозревателей блоков, которые обозначают индекс как "vout" и показывают его на видном месте, поэтому люди начинают называть весь указатель vout. Держите их раздельно, когда что-то записываете: идентификатор транзакции говорит, какая транзакция, а индекс говорит, какой выход в ней, и только оба вместе идентифицируют монету.