Что содержит выход транзакции в биткоин

Биткойн использует систему сценариев для транзакций. Далее, сценарий прост, основан на стеке и обрабатывается слева направо. Он намеренно не Тьюринг-полный, без петель. Сценарий-это, по сути, список инструкций, записанных с каждой транзакцией, которые описывают. Как следующий человек. Желающий потратить переводимые биткоины. Может получить к ним доступ. Сценарий типичного перевода биткоина на адрес назначения биткоина D просто обременяет будущие расходы биткоинов двумя вещами: транжира должна обеспечить

  1. открытый ключ, который при хэшировании дает адрес назначения D, встроенный в скрипт, и
  2. подпись, подтверждающая право собственности на закрытый ключ. Соответствующий только что предоставленному открытому ключу.

Скриптинг обеспечивает гибкость в изменении параметров того. Что необходимо для траты переведенных биткоинов. Например, система сценариев может быть использована для того. Чтобы требовать два закрытых ключа или комбинацию нескольких ключей. Или даже вообще никаких ключей.

Транзакция действительна, если ничто в объединенном скрипте не вызывает сбоя. А верхний элемент стека равен True (ненулевой) при выходе скрипта. Сторона, которая первоначально отправила потраченные биткоины, теперь диктует сценарий операций. Которые произойдут

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

Настоящий документ носит исключительно ИНФОРМАЦИОННЫЙ характер. Де — факто биткоин-скрипт определяется кодом, запускаемым сетью для проверки валидности блоков.

Стеки содержат байтовые векторы. При использовании в качестве чисел байтовые векторы интерпретируются как целые числа переменной длины с малым концом. Причем наиболее значимый бит определяет знак целого числа.

Таким образом, 0x81 представляет собой -1. 0x80 является еще одним представлением нуля (так называемый отрицательный 0). Положительный 0 представлен вектором нулевой длины. Байтовые векторы интерпретируются как булевы, где False представлен любым представлением нуля. А True-любым представлением ненулевого.

Ведущие нули в целочисленном и отрицательном нуле допускаются в блоках. Но отклоняются более строгими требованиями. Которые стандартные полные узлы ставят на транзакции перед их повторной передачей.

Байтовые векторы в стеке не должны иметь длину более 520 байт. Опкоды, которые берут целые числа и були из стека, требуют, чтобы они были длиной не более 4 байт. Но сложение и вычитание могут переполниться и привести к тому. Что 5-байтовое целое число будет помещено в стек.

Опкоды

Это список всех слов скрипта, также известных как коды операций, команды или функции.

Есть некоторые слова, которые существовали в очень ранних версиях биткойна. Но были удалены из-за опасений. Что клиент может иметь ошибку в их реализации. Этот страх был вызван ошибкой, найденной в OP_LSHIFT. Которая могла привести к краху любого Биткойн-узла. Если его использовать. И другими ошибками. Которые позволяли кому-либо тратить чьи-либо биткойны. Удаленные опкоды иногда говорят, что они абсолютно никакого способа для тех, кто использует Биткойн. Использовать эти опкоды (они просто больше не существуют в протоколе). А также нет твердых планов когда-либо повторно включить все эти опкоды. Они перечислены здесь исключительно для исторического интереса.

Новые опкоды могут быть добавлены с помощью тщательно разработанного и выполненного softfork с использованием OP_NOP1-OP_NOP10.

False-это ноль или отрицательный ноль (используя любое количество байтов) или пустой массив. А True-все остальное.

Константы

Когда речь идет о сценариях, эти слова, придающие ценность, обычно опускаются.

СловоКод операцииШестиугольныйВводВыходОписание
OP_0, OP_FALSE00x00Ничего.(пустое значение)Пустой массив байтов помещается в стек. (Это не отказ от операции: элемент добавляется в стек.)
N/A1-750x01-0x4b(специальный)данныеСледующие байты кода операции это данные которые должны быть помещены в стек
OP_PUSHDATA1760x4c(специальный)данныеСледующий байт содержит количество байтов. Которые должны быть помещены в стек.

OP_PUSHDATA2770x4d(специальный)данныеСледующие два байта содержат количество байтов. Которые должны быть помещены в стек в порядке малого конца.
OP_PUSHDATA4780x4e(специальный)данныеСледующие четыре байта содержат количество байтов. Которые должны быть помещены в стек в порядке малого конца.
OP_1NEGATE790x4fНичего. -1Число -1 помещается в стек.
OP_1, OP_TRUE810x51Ничего.1Число 1 помещается в стопку.
OP_2-OP_1682-960x52-0x60Ничего.2-16Число в названии слова (2-16) помещается в стек.

Управление потоком

СловоКод операцииШестиугольныйВводВыходОписание
OP_NOP970x61НичегоНичегоНичего не делает.
OP_IF990x63Если значение верхнего стека не равно False, выполняются инструкции. Верхнее значение стека удаляется.
OP_NOTIF1000x64Если верхнее значение стека равно False, выполняются инструкции. Верхнее значение стека удаляется.
OP_ELSE1030x67Если предыдущий OP_IF или OP_NOTIF или OP_ELSE не был выполнен. То эти операторы выполняются. И если предыдущий OP_IF или OP_NOTIF или OP_ELSE был выполнен. То эти операторы не выполняются.

OP_ENDIF1040x68Завершает блок if/else. Все блоки должны заканчиваться, иначе транзакция недействительна. OP_ENDIF без OP_IF ранее также является недопустимым.
OP_VERIFY1050x69True / falseНичего / провал Помечает транзакцию как недопустимую, если значение верхнего стека не является истинным. Верхнее значение стека удаляется.
OP_RETURN1060x6aНичего потерпеть неудачу Помечает транзакцию как недействительную. Начиная с bitcoin 0.9, стандартным способом прикрепления дополнительных данных к транзакциям является добавление вывода нулевого значения с помощью scriptPubKey. Состоящего из OP_RETURN. За которым следуют данные.

Такие выходы доказуемо не расходуются и специально выбрасываются из хранилища в наборе UTXO. Снижая их стоимость для сети. Начиная с 0.12, стандартные правила ретрансляции допускают один выход с OP_RETURN. Который содержит любую последовательность push-операторов (или OP_RESERVED[1]) после OP_RETURN при условии. Что общая длина scriptPubKey составляет не более 83 байт.

Стек

СловоКод операцииШестиугольныйВводВыходОписание
OP_TOALTSTACK1070x6bx1(alt)x1Помещает входные данные в верхнюю часть стека alt.

Удаляет его из основного стека.

OP_FROMALTSTACK1080x6c(alt)x1x1Помещает входные данные в верхнюю часть основного стека. Удаляет его из стека alt.
OP_IFDUP1150x73иксx / x xЕсли верхнее значение стека не равно 0, продублируйте его.
OP_DEPTH1160x74НичегоПомещает количество элементов стека в стек.
OP_DROP1170x75иксНичегоУдаляет верхний элемент стека.
OP_DUP1180x76иксх хДублирует верхний элемент стека.
OP_NIP1190x77x1 x2x2Удаляет элемент стека от второго до верхнего.
OP_OVER1200x78x1 x2х1 х2 Х1Копирует элемент стека от второго к верхнему на самый верх.

OP_PICK1210x79xn…xn… x2 x1 x0 xnЭлемент n обратно в стек копируется наверх.
OP_ROLL1220x7axn…… x2 x1 x0 xnЭлемент n обратно в стопку перемещается наверх.
OP_ROT1230x7bх1 х2 х3х2 х3 Х1Три верхних элемента в стопке поворачиваются влево.
OP_SWAP1240х7сx1 x2x2 x1Два верхних элемента в стопке меняются местами.
OP_TUCK1250x7dx1 x2x2 x1 x2Элемент в верхней части стека копируется и вставляется перед вторым элементом.
OP_2DROP1090x6dx1 x2НичегоУдаляет два верхних элемента стека.

OP_2DUP1100x6ex1 x2x1 x2 x1 x2Дублирует два верхних элемента стека.
OP_3DUP1110x6fx1 x2 x3x1 x2 x3 x1 x2 x3Дублирует три верхних элемента стека.
OP_2OVER1120x70x1 x2 x3 x4x1 x2 x3 x4 x1 x2Копирует пару элементов на два пробела назад в стопку вперед.
OP_2ROT1130x71x1 x2 x3 x4 x5 x6x3 x4 x5 x6 x1 x2Пятый и шестой элементы обратно перемещаются в верхнюю часть стопки.
OP_2SWAP1140x72x1 x2 x3 x4x3 x4 x1 x2Меняет местами две верхние пары предметов.

Сращивание

Если какой-либо код операции, помеченный как отключенный. Присутствует в скрипте. Он должен прерваться и потерпеть неудачу.

СловоКод операцииШестиугольныйВводВыходОписание
OP_CAT1260x7ex1 x2изОбъединяет две строки. инвалид.
OP_SUBSTR1270x7fв начальном размереизВозвращает раздел строки. инвалид.
OP_LEFT1280x80в размереизСохраняет в строке только символы. Оставшиеся от указанной точки. инвалид.
OP_RIGHT1290x81в размереизСохраняет только символы справа от указанной точки в строке. инвалид.
OP_SIZE1300x82вв размереВыталкивает длину строки верхнего элемента стека (не выталкивая его).

Побитовая логика

Если какой-либо код операции, помеченный как отключенный. Присутствует в скрипте. Он должен прерваться и потерпеть неудачу.

СловоКод операцииШестиугольныйВводВыходОписание
OP_INVERT1310x83визПереворачивает все биты на входе. инвалид.
OP_AND1320x84x1 x2изЛогическое значение и между каждым битом во входных данных. инвалид.
OP_OR1330x85x1 x2изЛогическое или между каждым битом во входных данных. инвалид.
OP_XOR1340x86x1 x2изЛогическое исключение или между каждым битом во входных данных.

инвалид.

OP_EQUAL1350x87x1 x2True / falseВозвращает 1, если входные данные точно равны, 0 в противном случае.
OP_EQUALVERIFY1360x88x1 x2Ничего / провалТо же самое, что и OP_EQUAL. Но после этого запускает OP_VERIFY.

Арифметика

Примечание: арифметические входные данные ограничены 32-битными целыми числами со знаком. Но могут переполнять их выходные данные.

Если какое-либо входное значение для любой из этих команд превышает 4 байта. Сценарий должен прерваться и завершиться ошибкой. Если какой — либо код операции, помеченный как отключенный, присутствует в скрипте-он также должен прерваться и потерпеть неудачу.

СловоКод операцииШестиугольныйВводВыходОписание
OP_1ADD1390x8bвиз1 добавляется к входным данным.
OP_1SUB1400x8cвиз1 вычитается из входных данных.
OP_2MUL1410x8dвизВход умножается на 2. отключено.
OP_2DIV1420x8eвизВход делится на 2. отключено.
OP_NEGATE1430x8fвизЗнак входа переворачивается.
OP_ABS1440x90визВход делается положительным.
OP_NOT1450x91визЕсли вход равен 0 или 1, он переворачивается. В противном случае выход будет равен 0.

OP_0NOTEQUAL1460x92визВозвращает 0, если входные данные равны 0. в противном случае-1.
OP_ADD1470x93а бизa добавляется к b.
OP_SUB1480x94а бизb вычитается из a.
OP_MUL1490x95а бизa умножается на b. отключено.
OP_DIV1500x96а бизa делится на b. отключено.
OP_MOD1510x97а бизВозвращает остаток после деления a на b. отключено.
OP_LSHIFT1520x98а бизСдвигает биты a влево, сохраняя знак. инвалид.
OP_RSHIFT1530x99а бизСдвигает вправо биты b, сохраняя знак. инвалид.
OP_BOOLAND1540x9aа бизЕсли и a, и b не равны 0, выход равен 1. в противном случае 0.
OP_BOOLOR1550x9bа бизЕсли a или b не 0, то вывод 1. в противном случае 0.
OP_NUMEQUAL1560x9cа бизВозвращает 1, Если числа равны, 0 в противном случае.
OP_NUMEQUALVERIFY1570x9dа бНичего / неудачаТо же самое, что и OP_NUMEQUAL. Но запускает OP_VERIFY позже.
OP_NUMNOTEQUAL1580x9eа бизВозвращает 1, Если числа не равны, и 0 в противном случае.
OP_LESSTHAN1590x9fа бизВозвращает 1, Если a меньше b, в противном случае 0.
OP_GREATERTHAN1600xa0а бизВозвращает 1, Если a больше b, в противном случае 0.
OP_LESSTHANOREQUAL1610xa1а бизВозвращает 1, Если a меньше или равно b, в противном случае 0.
OP_GREATERTHANOREQUAL1620xa2а бизВозвращает 1, Если a больше или равно b, в противном случае 0.
OP_MIN1630xa3а бизВозвращает меньшее из a и b.
OP_MAX1640xa4а бизВозвращает большее из a и b.
OP_WITHIN1650xa5x мин максизВозвращает 1, Если x находится в пределах указанного диапазона (включительно слева), 0 в противном случае.

Крипто

СловоКод операцииШестиугольныйВводВыходОписание
OP_RIPEMD1601660xa6вгашишВходные данные хэшируются с помощью RIPEMD-160.
OP_SHA11670xa7вгашишВходные данные хэшируются с помощью SHA-1.
OP_SHA2561680xa8вгашишВходные данные хэшируются с помощью SHA-256.
OP_HASH1601690xa9вгашишВходные данные хэшируются дважды: сначала с помощью SHA-256, а затем с помощью RIPEMD-160.
OP_HASH2561700xaaвгашишВходные данные хэшируются два раза с помощью SHA-256.
OP_CODESEPARATOR1710xabНичегоНичегоВсе слова проверки сигнатур будут совпадать только с сигнатурами данных после самого последнего выполненного OP_CODESEPARATOR.
OP_CHECKSIG1720xacsig pubkeyTrue / falseВсе выходы. Входы и сценарий транзакции (от последнего выполненного OP_CODESEPARATOR до конца) хэшируются. Подпись, используемая OP_CHECKSIG. Должна быть действительной подписью для этого хэша и открытого ключа. Если это так, то возвращается 1, в противном случае-0.
OP_CHECKSIGVERIFY1730xadsig pubkeyНичего / провалТо же самое, что и OP_CHECKSIG. Но OP_VERIFY выполняется позже.
OP_CHECKMULTISIG1740xaex sig1 sig2 …Истина / ЛожьСравнивает первую подпись с каждым открытым ключом. Пока не найдет соответствие ECDSA. Начиная с последующего открытого ключа, он сравнивает вторую подпись с каждым оставшимся открытым ключом. Пока не найдет соответствие ECDSA. Процесс повторяется до тех пор. Пока не будут проверены все подписи или не останется достаточного количества открытых ключей для получения успешного результата. Все подписи должны соответствовать открытому ключу. Поскольку открытые ключи не проверяются повторно, если они не проходят какое-либо сравнение подписей. Подписи должны быть помещены в scriptSig в том же порядке. В каком их соответствующие открытые ключи были помещены в scriptPubKey или redeemScript. Если все подписи действительны, то возвращается 1, в противном случае-0. Из-за ошибки из стека удаляется одно дополнительное неиспользуемое значение.
OP_CHECKMULTISIGVERIFY1750xafx sig1 sig2 …Ничего / провалТо же самое, что и OP_CHECKMULTISIG, но OP_VERIFY выполняется позже.

Время блокировки

СловоКод операцииШестиугольныйВводВыходОписание
OP_CHECKLOCKTIMEVERIFY (ранее OP_NOP2)1770xb1иксx / fail Помечает транзакцию как недопустимую, если элемент верхнего стека больше поля nLockTime транзакции. В противном случае оценка скрипта продолжается так. Как если бы был выполнен OP_NOP. Транзакция также недействительна, если 1. стек пуст; или 2. Элемент верхнего стека отрицателен; или 3. элемент верхнего стека больше или равен 500000000, а поле nLockTime транзакции меньше 500000000, или наоборот; или 4. поле nSequence входных данных равно 0xffffffff. Точная семантика описана в BIP 0065.
OP_CHECKSEQUENCEVERIFY (ранее OP_NOP3)1780xb2иксx / fail Помечает транзакцию как недействительную, если относительное время блокировки ввода (принудительное BIP 0068 с nSequence) не равно или больше значения элемента верхнего стека. Точная семантика описана в BIP 0112.

Псевдо-слова

Эти слова используются внутренне для помощи в сопоставлении транзакций. Они недействительны, если используются в реальных сценариях.

СловоКод операцииШестиугольныйОписание
OP_PUBKEYHASH2530xfdПредставляет собой открытый ключ, хэшированный с помощью OP_HASH160.
OP_PUBKEY2540xfeПредставляет собой открытый ключ, совместимый с OP_CHECKSIG.
OP_INVALIDOPCODE2550xffСоответствует любому коду операции, который еще не назначен.

Зарезервированные слова

Любой не назначенный опкод также зарезервирован. Использование неназначенного опкода делает транзакцию недействительной.

СловоКод операцииШестиугольныйПри использовании…
OP_RESERVED800x50 Транзакция недействительна, если только она не происходит в ветви OP_IF без выполнения
OP_VER980x62 Транзакция недействительна, если только она не происходит в ветви OP_IF без выполнения
OP_VERIF1010x65 Транзакция недопустима, даже если она происходит в неисполненной ветви OP_IF
OP_VERNOTIF1020x66 Транзакция недопустима, даже если она происходит в неисполненной ветви OP_IF
OP_RESERVED11370x89 Транзакция недействительна, если только она не происходит в ветви OP_IF без выполнения
OP_RESERVED21380x8a Транзакция недействительна, если только она не происходит в ветви OP_IF без выполнения
OP_NOP1, OP_NOP4-OP_NOP10176, 179-1850xb0, 0xb3-0xb9Это слово игнорируется. Не помечает транзакцию как недействительную.

Примеры сценариев

Ниже приведен список интересных сценариев. При записи скриптов данные, подлежащие перемещению в стек, обычно заключаются в угловые скобки. А команды перемещения данных опущены. Слова, не заключенные в скобки, являются кодами операций. Эти примеры включают префикс “OP_”, но его можно опустить. Обратите внимание, что существует небольшое количество стандартных форм сценариев. Которые ретранслируются от узла к узлу; нестандартные сценарии принимаются. Если они находятся в блоке. Но узлы не будут ретранслировать их.

Стандартная транзакция на биткоин-адрес (pay-to-pubkey-hash)

Чтобы продемонстрировать, как скрипты выглядят на проводе, вот сырой scriptPubKey:

 76 A9 14 OP_DUP OP_HASH160 байт для push 89 AB CD EF AB BA AB BA AB BA AB BA AB BA AB BA AB BA AB BA 88 AC Данные для push OP_EQUALVERIFY OP_CHECKSIG

Примечание: scriptSig находится на входе расходной транзакции. А scriptPubKey-на выходе ранее неизрасходованной, то есть

Вот как обрабатывается каждое слово:

Стек Скрипт Описание
Пустой. scriptSig и scriptPubKey объединены.
Константы добавляются в стек.
Верхний элемент стека дублируется.
Верхний элемент стека хэшируется.
OP_EQUALVERIFY OP_CHECKSIG — Добавил констант.
OP_CHECKSIG Равенство проверяется между двумя верхними элементами стека.
истинныйПустой.Подпись проверяется для двух верхних элементов стека.

Устаревшая транзакция pay-to-pubkey

OP_CHECKSIG используется непосредственно без предварительного хеширования открытого ключа. Это было использовано ранними версиями биткойна, где люди платили непосредственно на IP-адреса. Еще до того. Как были введены биткойн-адреса. scriptPubKeys этой формы транзакции по-прежнему распознаются Bitcoin Core как платежи пользователю. Недостатком этой формы транзакции является то, что весь открытый ключ должен быть известен заранее. Что подразумевает более длинные платежные адреса. И что он обеспечивает меньшую защиту в случае сбоя в алгоритме подписи ECDSA.

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

Стек Скрипт Описание
Пустой.scriptSig и scriptPubKey объединены.
OP_CHECKSIGКонстанты добавляются в стек.
истинныйПустой.Подпись проверяется для двух верхних элементов стека.

Доказуемо Нерасходуемые/Обрезаемые Выходы

Стандартный способ пометить транзакцию как доказуемо нерасходуемую-это scriptPubKey следующего вида:

OP_RETURN немедленно помечает скрипт как недопустимый, гарантируя, что не существует никакого скрипта. Который мог бы потратить этот вывод. Таким образом. Выход может быть немедленно вырезан из набора UTXO, даже если он не был израсходован. eb31ca1a4cbd97c2770983164d7560d2d03276ae1aee26f12d7c2c6424252f29 вот пример: он имеет один выход нулевого значения. Таким образом давая полную комиссию в размере 0,125 BTC майнеру. Который добыл транзакцию. Не добавляя запись в набор UTXO. Вы также можете использовать OP_RETURN для добавления данных в транзакцию без того. Чтобы данные когда-либо появлялись в наборе UTXO. Как показано в 1a2e22a717d626fc5db363582007c46924ae6b28319f07cb1b907776bd8293fc; P2Pool делает это с помощью хэша share chain txout в coinbase создаваемых им блоков.

Замораживание средств до определенного времени в будущем

Используя OP_CHECKLOCKTIMEVERIFY. Можно сделать средства доказуемо нерастраченными до определенного момента в будущем.

Стек Скрипт Описание
Пустой. scriptSig и scriptPubKey объединены.
Константы добавляются в стек.
Верхний элемент стека сверяется с текущим временем или высотой блока.
Верхний элемент стека удаляется.
Верхний элемент стека дублируется.
Верхний элемент стека хэшируется.
OP_EQUALVERIFY OP_CHECKSIG — Добавил констант.
OP_CHECKSIG Проверяется равенство между двумя верхними элементами стека.
истинныйПустой.Подпись проверяется для двух верхних элементов стека.

Транзакционная головоломка

Транзакция a4bfa8ab6435ae5f25dae9d89e4eb67dfa94283ca751f393c1ddc5a837bbc31b-интересная головоломка.

scriptPubKey: OP_HASH256 6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000 OP_EQUAL scriptSig: 

Чтобы провести транзакцию. Вам нужно придумать некоторые данные таким образом. Чтобы хеширование данных дважды приводило к заданному хэшу.

Стек Скрипт Описание
Пустой.
скрипциг добавил в стопку.
Данные хэшируются.
OP_EQUALДанный хэш будет помещен в стек.
истинныйПустой.Хэши сравниваются. Оставляя true в стеке.

Эта транзакция была успешно проведена 09f691b2263260e71f363d1db51ff3100d285956a40cc0e4f8c8c2c4a80559b1. Требуемыми данными оказался блок генезиса, а заданным хэшем в скрипте был заголовок блока генезиса. Дважды хэшированный с помощью SHA-256. Обратите внимание, что в то время как подобные транзакции являются забавными. Они не являются безопасными. Потому что они не содержат никаких подписей. И поэтому любая транзакция. Пытающаяся потратить их. Может быть заменена другой транзакцией. Отправляющей средства куда-то еще.

Стимулированное нахождение хэш-коллизий

В 2013 году Питер Тодд создал сценарии, которые приводят к true, если обнаруживается коллизия хэшей. Биткойн-адреса. Полученные в результате этих скриптов. Могут иметь деньги. Отправленные на них. Если кто-то находит хэш-коллизию. Он может потратить биткоины на этот адрес. Поэтому эта установка действует как стимул для кого-то сделать это.

Например сценарий SHA1:

Более подробную информацию смотрите в потоке bitcointalk [2] и reddit[3].

В феврале 2017 года был заявлен баунти SHA1 стоимостью 2,48 биткоина.

См. Также

Внешние Ссылки

  • [2] — Miniscript: язык для написания (подмножество) Биткойн-скриптов структурированным способом, обеспечивающим анализ, композицию. Общую подпись и многое другое.
  • Bitcoin IDE – биткоин скрипт для чайников
  • Bitcoin Debug Script Execution – веб-инструмент. Который выполняет скрипт opcode-by-opcode
  • Script Playground — преобразование скрипта в JavaScript
  • BitAuth IDE — интегрированная среда разработки для аутентификации биткоинов

(СР. онлайн-симулятор Биткойн-скрипта или отладчик?

Рекомендации