Bitcoin Script: основы для начинающих

Bitcoin Script: основы для начинающих

Bitcoin Script написан на языке программирования Bitcoin Scripting. Это довольно простой язык, который не является полным по Тьюрингу, что означает, что в нем отсутствуют некоторые логические функции, включая циклы.

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

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

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

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

Биткойн имеет различные типы криптовалют, хотя Pay to Public Key Hash (P2PKH) является самой популярной из них. Это простой скрипт, который выплачивает ВТС на адрес, хеш открытого ключа.

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

Хотя криптовалюты SegWit, P2WPKH и P2WSH, предлагают экономию на комиссиях за транзакции, их внедрение пока не очень велико. Спустя более 4 лет после запуска этого усовершенствования, P2PKH по-прежнему используется подавляющим большинством UTXO.

Важные концепции Bitcoin

Скрипт похож на язык программирования Forth, основан на стеке и имеет обратную нотацию. Это язык программирования, который является неполным по Тьюрингу.

Конечно, все это звучит по-китайски, если вы никогда не программировали, но по сути это очень простые концепции. Позже мы объясним подробно, чтобы вы поняли, как это работает и в чем их важность.

Но перед этим важно сказать, что официальное программное обеспечение Биткойна (также известное как Bitcoin Core) не написано на Bitcoin Script.

Однако то, что делает возможным работу Bitcoin Script — это программная реализация Bitcoin. Тот, который написан на C++, или, по крайней мере, на оригинальной реализации. С момента запуска первой версии этой программы были созданы различные версии на языках Python, Java и Go.

В случае реализации Python, Bitcoin Script возможен благодаря этому языку. Это также справедливо для каждой из различных реализаций Bitcoin, используемых другими.

Bitcoin Script — это язык программирования, используемый для взаимодействия с программным обеспечением Bitcoin. В частности, Script сообщает программному обеспечению Биткойна, как должны быть потрачены монеты в UTXO (выход неизрасходованной транзакции).

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

Скрипт был реализован Сатоши Накамото в Биткойне версии 0.1. Однако в тот раз его выпуск сопровождался несколькими ошибками.

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

  1. В основе стек

Bitcoin Script использует структуру данных, которую лучше всего понять, физически представив ее в виде стека. Когда новые элементы добавляются (pushed) или удаляются (popped), это делается на последнем элементе в стеке.

Предположим, у нас есть 3 книги, одна на другой:

  • Книга (A): верхняя часть
  • Книга (B): средняя
  • Книга (C): дно

При использовании Bitcoin Script первой из стопки вынимается книга A, затем книга B и, наконец, книга C.

В случае, если мы хотим добавить новую книгу, мы делаем это на последней книге, в нашем случае на книге А.

Bitcoin Script работает таким образом, что операции складываются последовательно и удаляются в обратном порядке.

  1. Похожий на Forth

Script очень похож на язык программирования Forth. Впервые он появился в 1970 году и довольно хорошо известен, или, по крайней мере, был известен.

Forth используется в Open Firmware Boot Loader, в аэрокосмических приложениях и в различных встраиваемых системах, которым необходимо взаимодействовать с аппаратным обеспечением.

  1. Обратная нотация

Также известная как постфиксная нотация, RPN (обратная польская нотация) — это метод размещения операций над функциями в конце оператора.

Например, если мы хотим сложить 1 + 2, это будет записано как «1 2 +» вместо обычного «1 + 2».

  1. Неполный тьюринг

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

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

В более технических терминах, Script позволяет избежать того, что известно, как проблема остановки.

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

Недостаток отсутствия полного языка Тьюринга связан с невозможностью разработки более сложных алгоритмов, которые могут породить, например, смарт-контракты.

Как выглядит транзакция ВТС

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

Для большинства Биткойн-транзакций требуется только простой скрипт, но можно реализовать и более сложные скрипты.

Чтобы понять, как все это работает, давайте рассмотрим, как работает транзакция Pay To Public Key Hash (P2PKH).

Чистый Биткойн-скрипт

На самом деле, если вы посмотрите, как выглядит скрипт Pay To Publish Key Hash (P2PKH) скрипт PubKey в транзакции, вы увидите что-то вроде этого:

Для чего может быть использована криптовалюта BTC

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

  • Операция условного депонирования

Первое из этих применений связано с операциями условного депонирования, что очень полезно в определенных ситуациях.

Предположим, мы хотим купить что-то у нового продавца. Мы будем платить BTC, а продавец отправит нам физический товар на дом. Возможно, мы не доверяем им настолько, чтобы платить до получения товара, но продавец не хочет отправлять его, если сначала не получил оплату.

Решение заключается в создании транзакции с несколькими подписями, которая требует подписи 2 или 3 человек, чтобы иметь возможность потратить криптовалюты. В этом случае теми же людьми будем мы, продавец и еще один человек, который будет выступать в качестве судьи в случае возникновения спора.

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

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

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

  • Эффективные микроплатежи

Предположим, вы являетесь потребителем услуги, которая предоставляется за очень небольшую сумму денег. Например, вы платите за каждую минуту пользования Интернетом в аэропорту.

Было бы очень неэффективно создавать транзакцию на каждую использованную минуту, было бы слишком много транзакций с малой ценностью, и комиссии быстро бы накапливались.

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

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

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

На данный момент поставщик ничего не подписал, поэтому эти последние транзакции не опубликованы в сети Bitcoin.

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

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

Однако довольно похожая система используется компанией Lightning Network с определенными требованиями, которые не позволяют этому произойти. Например, установить временной лимит, по достижении которого средства высвобождаются. Тем временем провайдер может отправлять другие транзакции, которые ему платят.

  • Блокировка по времени

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

Это достигается с помощью параметра транзакции под названием LOCK_TIME, который имеет множество применений, например, для создания контрактов HTLC, используемого для функционирования Lightning Network.

Помимо более общих примеров, которые мы рассмотрели выше, есть и другие конкретные применения, которые можно дать Bitcoin Script. Вот некоторые примеры:

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

Заключение

Биткойн основан на языке Bitcoin Scripting. Это язык программирования, который не является полным по Тьюрингу и очень прост в использовании для обеспечения большей безопасности.

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

Вот, пожалуй, и все, что нужно знать новичку, что бы иметь общее представление об Bitcoin Script.