Протокол Биткоин: как работают транзакции
Протокол Биткойн был впервые анонсирован 31 октября 2008 года, когда Сатоши Накамото, анонимный основатель(и) Биткойна, отправил технический документ Биткойна в список рассылки Cypherpunk. Чуть более двух месяцев спустя, примерно 3 января 2009 года, был добыт первый блок в цепочке блоков Биткойн, и протокол Биткойн ожил.
В этой статье рассматриваются фундаментальные концепции работы протокола Биткойн. Мы рассмотрим основы исходного кода Биткойна, процессы транзакций, механизмы безопасности и типы платежей.
Исходный код Bitcoin
Доступность — это один из атрибутов, который привел к массовому внедрению протокола Биткоин. Сатоши Накамото запустил Bitcoin Core как программное обеспечение с открытым исходным кодом, которое позволяет разработчикам блокчейнов постоянно выпускать новые обновления, улучшающие функциональность протокола.
Оригинальный исходный код Bitcoin Core написан на C ++, а последнюю версию можно найти на GitHub.
По мере того, как Биткоин стал более популярным, были выпущены новые клиенты, написанные на других языках программирования. Сегодня разработчики блокчейнов также имеют возможность создавать приложения Биткойн с использованием Python, Golang, Java или Rust.
Вывод неизрасходованной транзакции (UTXO)
BTC — это собственная монета протокола Биткойн, которая используется во всех сетевых транзакциях. Для организации транзакций BTC протокол Биткоин представил первый в мире блокчейн (один из разновидностей технологии распределенного реестра). В частности, Биткоин использует модель неизрасходованного вывода транзакций (UTXO) как способ отслеживать движение средств и предотвращать проблему двойных расходов. Важно понимать, что каждый UTXO можно потратить только один раз. Когда один пользователь проводит UTXO, создается один или несколько новых UTXO.
Допустим, у Боба в биткоин-кошельке 1,2 BTC. Он хочет отправить Алисе 1 BTC. Перед обработкой транзакции сети необходимо распознать, что в кошельке Боба содержится не менее 1 BTC. Если в кошельке Боба нет хотя бы 1 BTC, то он не сможет отправить 1 BTC Алисе.
В модели UTXO один или несколько неизрасходованных выходов могут быть добавлены вместе, чтобы отразить общую сумму средств, принадлежащих одному пользователю. В нашем примере у Боба может быть один UTXO стоимостью 0,5 BTC, а другой — 0,7 BTC, что соответствует общей сумме средств в его биткойн-кошельке. При отправке 1 BTC Алисе Боб фактически должен отправить всю сумму обоих UTXO (1,2 BTC). Затем Боб получает один новый UTXO, содержащий 0,2 BTC. Тем временем Алиса получает один новый UTXO, содержащий 1,0 BTC.
Биткоин-скрипт и коды операций
Как обсуждалось выше, программное обеспечение с открытым исходным кодом Биткоин (известное как Bitcoin Core) написано на C ++. Однако протокол Биткоин на самом деле использует другой язык программирования, называемый Биткойн-скрипт, чтобы давать инструкции Bitcoin Core о том, как можно потратить каждый UTXO. Большинству пользователей на самом деле не нужно изучать биткоин-скрипт. Это связано с тем, что и биткоин-кошельки, и другие приложения автоматически выполняют обработку биткоин-скриптов за кулисами. Тем не менее, хорошо понимать, что такое биткоин-скрипт и почему он так важен.
Биткоин-скрипт использует систему кодов операций. По сути, коды операций — это команды, которые сообщают узлам в сети Биткоин, как обрабатывать любой запрос транзакции. Каждый код операции начинается с префикса «OP_», за которым следует конкретная команда. Например, OP_CHECKSIG используется как механизм для проверки того, что отправитель транзакции применяет правильную цифровую подпись. Независимо от того, хочет ли пользователь отправить стандартную транзакцию или создать собственный сценарий транзакции, биткойн-сценарий и коды операций являются обязательными компонентами этого процесса.
Приватные ключи Биткоин
Для обеспечения безопасности средств пользователей в протоколе Биткоин используется асимметричное шифрование. В этой системе пользователи могут генерировать приватные ключи (также известные как секретные ключи) как часть пары приватных и открытых ключей. Приватные ключи должны храниться в секрете, а открытые ключи могут быть общедоступными для получения транзакций BTC. Только пользователь, имеющий доступ к соответствующему приватному ключу Биткоин, может тратить средства (разблокировать UTXO), которые отправляются на соответствующий открытый ключ. Таким образом, открытый ключ можно сравнить с номером банковского счета. Приватный ключ можно сравнить с кодом доступа к банковскому счету. Основное отличие состоит в том, что количество приватных ключей невероятно велико — настолько велико, что шансы угадать правильную комбинацию пары приватных и открытых ключей практически равны нулю.
Безопасность приватных ключей Биткоин поддерживается криптографией на основе эллиптических кривых (ECC) и криптографическими хеш-функциями. Эти математические концепции применяются для предоставления пользователям двух основных преимуществ. Во-первых, пользователи могут делиться своим открытым ключом с кем угодно в сети для получения платежей. Учитывая открытый ключ, перепроектировать приватный ключ практически невозможно. Во-вторых, пользователи, которые хотят отправлять транзакции BTC по сети, могут использовать свой приватный ключ для создания цифровых подписей. Цифровая подпись работает аналогично одноразовому паролю для аутентификации личности. Это позволяет получателю транзакции или кому-либо еще в сети математически доказать со 100-процентной уверенностью, что конкретный приватный ключ Биткоин предоставил подпись. Более того, приватный ключ никогда не раскрывается в сети в процессе.
Биткоин-кошельки и адреса
Как и другие криптосистемы, использующие криптографию с открытым ключом, мы знаем, что Биткоин поддерживает генерацию пар приватного и открытого ключей. Однако на самом деле этот процесс идет еще дальше. Хотя пользователи могут получать средства с помощью открытого ключа, они могут использовать адрес биткоин-кошелька (также известный как публичный адрес) для получения транзакций BTC. Публичный адрес создается из соответствующего открытого ключа с использованием двух алгоритмов хеширования: алгоритм 256 безопасного хеширования (SHA-256) и дайджест сообщения оценки примитивов целостности RACE 160 (RIPEMD-160). Публичные адреса более широко используются благодаря безопасности, обеспечиваемой этим дополнительным уровнем шифрования, и более дружелюбному пользовательскому интерфейсу, обеспечиваемому более короткой буквенно-цифровой строкой.
Каждый биткоин-кошелек по умолчанию имеет приватный ключ и соответствующий публичный адрес (а также открытый ключ). Часто используемая аналогия — рассматривать биткоин-кошельки как связку ключей. Вообще говоря, каждый биткоин-кошелек предназначен для хранения нескольких пар ключей. Пользователи должны иметь возможность создавать новые пары ключей в любое время.
Биткоин-транзакции
Протокол Биткоин позволяет пользователям отправлять различные типы платежей. Три популярных примера включают Pay To Pubkey (P2PK), Pay To Pubkey Hash (P2PKH) и Pay To Script Hash (P2SH). Обратите внимание, что BTC отправляется с каждым типом платежа, но необходимые шаги немного различаются.
Оплата в Pubkey (P2PK)
Когда в 2009 году был запущен протокол Биткоин, важным типом оплаты была Pay To Pubkey (P2PK). На тот момент это был единственный вид оплаты, кроме P2PKH. В 2009 и 2010 годах сеть требовала, чтобы пользователи, запускающие узлы (известные как майнеры криптовалюты), принимали вознаграждения за блоки через транзакции P2PK. Кроме того, программное обеспечение для майнинга BTC для процессоров поддерживает P2PK. Хотя этот тип оплаты получил некоторую раннюю поддержку, его использование прекратилось из-за дополнительных преимуществ, предоставляемых использованием общедоступных адресов вместо открытых ключей.
Когда P2PK-транзакция создается и отправляется в одноранговую сеть Биткоина, отправитель отправляет средства из своего собственного Биткоин-кошелька на открытый ключ (также известный как pubkey для краткости) другого пользователя. Если получатель захочет потратить эти средства (потратить соответствующий UTXO) в любой момент в будущем, ему нужно только доказать, что он владеет открытым ключом, на который были отправлены средства.
Оплата в хэш Pubkey (P2PKH)
Наряду с P2PK, Pay To Pubkey Hash (P2PKH) изначально поддерживался в качестве типа платежа, когда протокол Биткоин был запущен в 2009 году. P2PKH остается самым популярным способом отправки и получения BTC. На момент написания этой статьи более 54% существующего предложения BTC хранится на выходах P2PKH.
Транзакции P2PKH очень похожи на транзакции P2PK. Наиболее важное отличие состоит в том, что транзакции P2PKH отправляются в хэш открытого ключа получателя. P2PKH в конечном итоге получил более широкое распространение по двум основным причинам. Во-первых, по сравнению с открытым ключом хэш открытого ключа представляет собой более короткую и более управляемую буквенно-цифровую строку. Во-вторых, P2PKH позволяет обнаруживать ошибки с помощью функции контрольной суммы, помогая пользователям значительно снизить вероятность отправки BTC на недопустимый адрес.
Плата за скрипт хэш (P2SH)
Pay To Script Hash (P2SH) был представлен как тип оплаты в 2012 году. Он быстро получил поддержку со стороны пользователей, которым требовались дополнительные функции, не предоставляемые через типы оплаты P2PK или P2PKH. На момент написания этой статьи почти 31% существующего запаса BTC хранится на выходах P2SH.
Транзакции P2SH обычно добавляют ограничения в дополнение к требованию обычной цифровой подписи или проверки открытого ключа. Например, транзакция P2SH может потребовать от получателя или группы получателей предоставить цифровые подписи из нескольких приватных ключей. Эти ограничения создаются с помощью нескольких строк Биткойн-скрипта. Затем создается хэш этого сценария как способ заблокировать платеж в транзакции P2SH.
P2SH предоставляет два преимущества по сравнению с ранее разработанными способами оплаты. Во-первых, отправители могут отправлять BTC, не беспокоясь о том, как получатели разблокируют соответствующий UTXO (например, с помощью кода доступа или с учетом требований множественной подписи). Во-вторых, P2SH позволяет отправителям требовать от получателей оплаты дополнительных сетевых комиссий за транзакции. Прежде чем P2SH стал стандартизированным типом оплаты, отправителям приходилось проходить утомительный процесс написания настраиваемых строк кода (известных как сценарии) с использованием сценария Биткоин для достижения того же результата.
Дополнительные протоколы цепочки блоков
Сегодня Биткоин можно считать семейством протоколов. Это потому, что ряд протоколов цепочки блоков был создан как ответвления протокола Биткоин. Во многих случаях протоколы цепочки блоков, которые происходят из протокола Биткоин, функционируют совершенно по-разному и служат совершенно разным целям.
Например, Zcash — это хорошо известный проект криптовалюты, который был создан с использованием кода, изначально написанного для клиента Bitcoin Core. Хотя некоторые характеристики этих двух протоколов одинаковы (например, оба используют модель UTXO), разработчики Zcash представили несколько отличных функций. Например, доказательства с нулевым разглашением позволяют сохранять конфиденциальность транзакций в сети Zcash. Litecoin, Bitcoin Cash и Dash — другие популярные примеры проектов криптовалюты, которые были созданы с использованием исходного клиента Bitcoin Core.
Кроме того, существует множество проектов криптовалюты, которые были созданы на основе автономных протоколов цепочки блоков, что означает, что они не происходят из протокола Биткоин или какого-либо другого существующего протокола. Несколько ярких примеров включают Ethereum, EOS, Stellar, Tezos, Cardano, Cosmos и Monero.
Кроме того, в некоторых криптовалютных проектах используются другие типы технологий распределенного реестра. Например, IOTA использует направленный ациклический граф (DAG) для организации транзакций, а не блокчейн. По большей части большинство протоколов блокчейнов изначально проектировались как разрозненные экосистемы. Другими словами, протокол Биткоин не может легко подключаться или взаимодействовать с протоколом Ethereum. Однако технические решения, такие как атомарные свопы, теперь обеспечивают некоторую совместимость блокчейнов между различными протоколами.
Узнать больше о Bitcoin протоколе
Если вы нашли этот обзор протокола Биткоин полезным, ознакомьтесь с серией материалов Komodo’s Blockchain Fundamentals. Есть десятки информативных статей, которые помогут вам узнать все о том, как работает технология блокчейн. Подробные руководства доступны для UTXO, биткоин-скрипта, биткоин-секретных ключей и многих других концепций, представленных в этой статье.
Чтобы идти в ногу с прогрессом Komodo, вы можете присоединиться к Komodo Discord и подписаться на ежемесячную рассылку новостей.
Начните свое путешествие по блокчейну с Komodo сегодня.
Присоединяйтесь к нашему сообществу в Твиттер и вступайте в наш Телеграм канал, чтобы узнать последние новости Komodo и пообщаться с другими членами сообщества.
#ОсновыБлокчейн
Кто контролирует Bitcoin Core?. Перевод, оригинал см. здесь: Who… | by Rain Dog Dance
Перевод, оригинал см. здесь: Who Controls Bitcoin Core?
Вопрос о том, кто контролирует код в репозитории Bitcoin Core на гитхабе, продолжает возникать снова и снова. Этот довод часто преподносится как свидетельство наличия центральной точки контроля протокола биткоина. Я убеждён, что сам вопрос обманчив, поскольку подразумевает неминуемое существование авторитарной власти — а эта модель неприменима к биткоину. Обывателю, конечно, может быть неочевидно, почему это так, поэтому цель этой статьи — объяснить, как работает Bitcoin Core и, на более высоком уровне, как развивается сам протокол биткоина.
Bitcoin Core — это, скорее, главное место разработки протокола биткоина, а не орган управления и контроля. Если оно по какой-либо причине прекратит своё существование, возникнет новое. Выбор конкретной платформы (в настоящее время — репозиторий на гитхабе) — это скорее вопрос удобства, а не определения или же аутентичности проекта. На самом деле, мы уже не раз наблюдали, как разработка биткоина переезжала на другие платформы и даже меняла имена.
Хотя в репозитории на гитхабе некоторые разработчики имеют статус «дежурных» (maintainer — статус с определёнными административными правами в данном репозитории — прим. перев.), имеющих полномочия добавление кода в основную ветвь — они скорее занимаются техническим обслуживанием репозитория, а не контролируют его. Если бы любой человек мог добавлять код в основную ветку, это очень быстро превратилось бы в хаос. Bitcoin Core следует принципам наименьших привилегий: любые полномочия, предоставляемые отдельным лицам, легко отзываются, если ими злоупотребляют.
С точки зрения безопасности, гитхабу доверять нельзя. Любой сотрудник гитхаба может воспользоваться своим служебным положением и вставить код в репозиторий без ведома дежурных. Но маловероятно, что такой злоумышленник также сможет завладеть PGP-ключом дежурного разработчика Bitcoin Core.
Bitcoin Core не сводит вопрос надёжности кода к безопасности аккаунтов на гитхабе, поэтому он имеет систему непрерывной интеграции, проверяющей PGP-ключи доверенных лиц, которые должны подписывать каждое слияние кода (merge commit — слияние нового кода с уже находящимся в репозитории — прим. перев.). Хотя все знают, кто владеет этими ключами, всё-таки небезопасно предполагать, что так будет всегда — ключ могут украсть, и мы не сможем об этом узнать до тех пор, пока его владелец не уведомит об этом других дежурных. Таким образом, ключи для слияния кода также не гарантируют идеальную защиту; они просто усложняют задачу добавления произвольного кода злоумышленником.
На момент написания статьи доверенными отпечатками PGP являются:
71A3B16735405025D447E8F274810B012346C9A6
133EAC179436F14A5CF1B794860FEB804E669320
32EE5C4C3FA15CCADB46ABE529D4BCB6416F53EC
B8B3F1C0E58C15DB6A81D30C3648A882F4316B9B
CA03882CB1FC067B5D3ACFE4D300116E1C875A3D
Эти ключи принадлежат следующим людям:
Владимир ван дер Лаан <[email protected]>
Питер Вулле <[email protected]>
Ионас Шнелли <[email protected]>
Марко Фальке <[email protected]>
Сэмюэль Добсон <[email protected]>
Значит ли это, что мы доверяем этим пяти людям? Не совсем. Ключи не являются доказательством личности — теоретически, они могут попасть в руки других людей. В чём вы действительно можете убедиться, запустив скрипт verify-commits в питоне?
python3 contrib/verify-commits/verify-commits.py
Using verify-commits data from bitcoin/contrib/verify-commits
All Tree-SHA512s matched up to 309bf16257b2395ce502017be627186b749ee749
There is a valid path from “HEAD” to 82bcf405f6db1d55b684a1f63a4aabad376cdad7 where all commits are signed!
Скрипт verify-commits — это проверка аутентичности кода, которую любой разработчик может запустить на своем компьютере. При выполнении скрипт проверяет PGP-подпись, стояющую на каждом слиянии кода, начиная с номера 82bcf405… в декабре 2015 года — в сумме более 3400 слияний на момент написания этой статьи. Если скрипт завершается успешно, то это значит, что каждая строка кода, которая была добавлена или изменена с того момента, прошла через процесс разработки Bitcoin Core и была подписана кем-то с ключом дежурного. Хоть это и не даёт железную гарантию того, что никто не мог ввести вредоносный код (дежурный может захотеть навредить проекту или у него могут украсть ключи), это значительно снижает вероятность атаки. А кто вообще такие дежурные и как они получили свои роли? Об этом мы поговорим чуть позже.
Целостность кода Bitcoin Core не должна зависеть только от нескольких криптографических ключей, поэтому есть и множество других проверок. Для обеспечения серьёзной защиты создано множество уровней безопасности:
Безопасность пул-реквестов
(Pull request — запрос на объединение нового кода с уже находящимся в репозитории — прим. перев.)
- Совершенно любой человек может свободно предложить изменения, улучшающие код проекта, открыв свой пул-реквест в репозитории bitcoin/bitcoin.
- Разработчики проверяют пул-реквесты, чтобы убедиться, что они не являются вредоносными. Любой желающий может свободно просматривать пул-реквесты и высказывать своё мнение о них — для участия в Bitcoin Core не нужно проходить проверки или сдавать экзамены. Если пул-реквест доживает до момента, когда разумных оснований не добавить его в основную ветку больше нет, дежурный выполняет слияние.
- Дежурные разработчики Bitcoin Core установили скрипт, предотвращающий случайное выполнение слияний кода в репозитории, если их ещё не подписали.
- Иногда такие слияния датируются с помощью OpenTimestamps.
- Travis Continuous Integration system (система непрерывной интеграции Travis — прим. перев.) регулярно запускает скрипт для проверки аутентичности истории разработки и для проверки подписей всех слияний основной ветвки разработки: они должны соотноситься с одним из доверенных PGP-ключей.
- Любой желающий может запустить скрипт для проверки PGP-подписей всех слияний после декабря 2015 года. Я сам запустил его во время написания этой статьи, и на моем ноутбуке он всё проверил за 25 минут.
Безопасность релизов
- Время от времени несколько разработчиков независимо друг от друга запускают системы воспроизводимой сборки Gitian, чтобы убедиться в том, что на выходе получаются идентичные исполняемые файлы. Если кому-то удаётся создать сборку, не совпадающую со сборками других разработчиков, это признак того, что в ней замечен невоспроизводимый компонент — тогда релиз откладывается.
В таком случае разработчики отслеживают причину расхождений, исправляют её и затем собирают другого кандидата на релиз. Как только детерминированная сборка успешно завершается, разработчики подписывают результат, тем самым гарантируя, что получившиеся исполняемые файлы и использованные для их сборки инструменты чисты, и что они собраны из одного и того же источника. Этот метод позволяет обезопасить процесс сборки и распространения исполняемых файлов. Любой пользователь, имеющий соответствующие навыки, может запустить свою собственную систему сборки; инструкции здесь.
- Как только сборки Gitian успешно завершаются и подписываются сборщиками, один из дежурных Bitcoin Core подписывает своим PGP-ключом сообщение, содержащее sha256-хэш каждой сборки. Если вы хотите запустить предварительно собранные исполняемые файлы, после загрузки вы можете посмотреть их хэш, а затем проверить, находится ли этот хэш в подписанном дежурными сообщении. Инструкции для этого можно найти здесь.
- Код всех вышеперечисленных действий открыт и доступен каждому — любой, владеющий достаточными навыками и желанием, может его проверить лично.
- После прохождения всех вышеперечисленных проверок качества и аутентичности код попадает в Bitcoin Core и в конечном итоге уходит в релиз, но никто не насаждает его нодам биткоина в принудительном порядке. Каждый оператор ноды биткоина сам принимает осознанное решение обновить установленный у себя код. Bitcoin Core не случайно не имеет функции автообновления, так как она потенциально может быть использована для навязывания пользователям кода, на который они не соглашались.
Несмотря на все технические меры безопасности, используемые в Bitcoin Core, ни одна из них не совершенна, и любая из них теоретически может быть взломана. Последний рубеж защиты кода Bitcoin Core такой же, как и в любом другом проекте с открытым исходным кодом — это постоянная бдительность. Чем больше глаз присматривает за кодом Bitcoin Core, тем меньше вероятность того, что вредоносный или уязвимый код попадёт в релиз.
В Bitcoin Core содержится и немало тестового кода. Существует набор интеграционных тестов, который проверяет каждый пул-реквест, и расширенный набор тестов, который каждую ночь проверяет основную ветку.
Проверить объём кода покрываемого тестами можно самостоятельно. Для этого нужно:
- Склонировать репозиторий Bitcoin Core на гитхабе
- Установить необходимые зависимости для сборки из исходного кода
- Запустить эти команды
- Просмотреть отчет здесь: ./total_coverage/index.html
Также, вы можете просмотреть отчёты о тестировании кода, которые регулярно публикует Марко Фальке.
Отчёт о тестировании кодаТакое широкое покрытие кода тестами даёт нам уверенность в том, что код работает так, как задумано.
Тестирование имеет большое значение, когда речь идет о программном обеспечении, в котором достижение консенсуса является критически важной задачей. Для особо сложных изменений разработчики иногда проводят кропотливое мутационное тестирование: то есть, они проверяют сами тесты, намеренно ломая код и убеждаясь, что они провалились именно так, как от них и ожидали. Грег Максвелл пролил свет на некоторые детали этого процесса в своём рассказе о релизе 0.15:
«Тест — это проверка программного обеспечения, но чем проверить сам тест? Программным обеспечением. Чтобы проверить тест, вы должны сломать программное обеспечение» — Грег Максвелл
В BitMEX написали отличную статью об экосистеме программных реализаций биткоина. Существует более десятка различных реализаций, совместимых с сетью биткоина, и еще больше реализаций «конкурирующих» сетей. Это и есть свобода, даруемая программным обеспечением с открытым исходным кодом: любой, кто недоволен проектом Bitcoin Core, может начать свой собственный. Сделать это можно либо начав с чистого листа, либо форкнув (т.е. создав полную копию репозитория — прим. перев.) программное обеспечение Core.
На момент написания этой статьи на 96% доступных нод биткоина запущен Bitcoin Core той или иной версии. Но почему? Как может Bitcoin Core доминировать в сети, где каждый волен использовать любое другое программное обеспечение? В конце концов, RPC API-интерфейсы других программных реализаций совместимы с Bitcoin Core, или, по крайней мере, очень похожи на него.
Я считаю, что причина заключается в том, что вся разработка сконцентрирована вокруг Bitcoin Core. В него вложено несоизмеримо больше времени и таланта, чем в какой-либо другой проект — а это значит, что код Bitcoin Core получается наиболее эффективным, надёжным и безопасным. Операторам нод хочется запускать самое лучшее программное обеспечение, особенно когда речь идёт о работе с деньгами. Есть и ещё одно объяснение: достижение консенсуса с другими нодами является критически важной задачей для такого программного обеспечения, но в то же время у протокола биткоина нет формальной спецификации (потому что никто не вправе её составлять), поэтому безопаснее всего использовать код самой популярной программной реализации, так как шансов на совместимость с остальной сетью больше всего именно у неё. В этом смысле код, которому уделяют больше всего внимания, получается наиболее близким к тому, что могло бы быть спецификацией.
Людям, незнакомым с участием в разработке Bitcoin Core, со стороны может показаться, что Core — это некая однородная организация. Это совсем не так! Основные участники часто спорят друг с другом, и даже самые усердные из них написали немало кода, который так и не дошёл до релиза. Если вы прочитаете рекомендации и правила для участников, то заметите, что они довольно расплывчаты — процесс лучше всего охарактеризовать как «приблизительный консенсус».
Дежурные оценивают, соответствует ли патч общим принципам проекта; отвечает ли минимальным стандартам качества; и принимают во внимание общее мнение других участников.
Кто такие дежурные Bitcoin Core? Это участники, накопившие достаточный социальный капитал благодаря своему вкладу в проект на протяжении длительного времени. Когда дежурные замечают компетентного участника, продемонстрировавшего свою надежность и мотивацию в определенной области, они могут принять решение дать его аккаунту расширенные права на гитхабе. В свою очередь, главный дежурный наблюдает за всеми аспектами проекта и отвечает за координацию релизов. Эта роль добровольно передавалась друг другу следующими людьми:
Работа дежурного разработчика больше напоминает техобслуживание репозитория, а не власть над ним, потому что дежурные фактически не имеют права принимать решения, противоречащие общему мнению участников или пользователей. Тем не менее, это довольно сложная и утомительная роль; во многом из-за дополнительного внимания со стороны экосистемы в целом. Например, Грегори Максвелл оставил свою должность дежурного в 2017 году по личным причинам; скорее всего, под давлением общественности, обрушившемся на него во время споров о масштабировании биткоина. Владимир ван дер Лаан написал вдумчивый пост о трудностях, связанных с работой дежурным Core, и о том, почему огорчившее многих решение лишить аккаунт Гэвина Андресена (предыдущий главный дежурный — прим. перев.) административных привилегий было правильным.
Так же поступили и с Джеффом Гарзиком, исключив его из репозитория на гитхабе — что расстроило его и многих других — но к тому моменту он не принимал участия в проекте на протяжении уже двух лет. Оставить его аккаунту административные привилегии значило создать потенциальную угрозу безопасности проекта и нарушить принцип наименьших привилегий, на который ссылается Владимир в своем посте.
При взгляде на Core со стороны может показаться, что это закрытый мирок, созданный технократами, в который крайне сложно попасть новичку. Но если вы поговорите с участниками, то поймёте, что это не так. Хотя за все эти годы всего лишь дюжина людей имела доступ к изменению кода, сотни разработчиков внесли свою лепту в проект — и я в их числе. Хоть я и не считаю себя разработчиком Bitcoin Core — технически я им являюсь. Никто не может помешать вам внести свой вклад!

Похоже, людям крайне сложно понять, что разработка биткоина не зависит от структуры репозитория Bitcoin Core на гитхабе. Хотя Bitcoin Core и имеет некоторую структуру (для координации используются централизованные каналы связи), сам проект не контролируется кем-либо из участников — даже теми, кто имеет особые привилегии в репозитории гитхаба. Хотя технически дежурные могут захватить репозиторий, подвергнуть цензуре несогласных разработчиков и, возможно, даже сохранить за собой название «Bitcoin Core» — это будет лишь означать, что разработка проекта переедет из Bitcoin Core в другое место. Если разработчики перестанут соглашаться с действиями дежурных, то они просто скопируют код и перенесут свою работу в другой репозиторий, в котором предыдущие дежурные Bitcoin Core не будут иметь административных привилегий.
Даже если без захвата власти какие-нибудь сомнительные изменения попали бы в код Bitcoin Core, нашлись бы разработчики, которые создали клон репозитория, удалили спорный момент из кода и сделали бы эту версию доступной для всех желающих. По сути, именно это и сделал Амори Сашэ, когда форкнул Bitcoin Core и удалил Segregated Witness из кода, чтобы создать Bitcoin ABC. Также бывают и случаи, когда Core отклоняет изменения, нужные некоторым людям: в таком случае разработчики могут форкнуть репозиторий и добавить эти изменения. Это случалось много раз, например:
Форкнуть код — очень просто. Сместить центр фокуса разработки биткоина — сложно: вы должны убедить участников, что им будет лучше участвовать в другом проекте.
Я не присягаю на верность никому, ни одной команде разработчиков. Моя цель — запускать тот код, что, как я считаю, наилучшим образом защитит мой финансовый суверенитет.У некоторых людей есть мнение — и их трудно в нём переубедить — что пользователи Bitcoin Core не глядя следуют любым изменениям кода. Это может стать самоподкрепляющимся убеждением: раз уж пользователи не участвуют в процессе разработки, то они и не осознают своих возможностей, тем самым отдавая часть своей власти разработчикам. Однако, пользователи показали свою реальную власть во время движения UASF (User Activated Soft Fork — активируемый пользователями форк — прим. перев.) в 2017 году. Неизвестный разработчик под псевдонимом shaolinfry опубликовал BIP148 (Bitcoin Improvement Proposal — предложение по улучшению биткоина — прим. перев.), который заставил бы майнеров активировать функцию Segregated Witness примерно 1 августа. Однако, BIP148 оказался слишком спорным и не был принят в Bitcoin Core, поэтому shaolinfry форкнул Core и опубликовал свою версию под названием Bitcoin UASF. Эта программная реализация приобрела неожиданную популярность и, вероятно, создала достаточное давление, чтобы убедить майнеров принять BIP91 и тем самым активировать форк до истечения срока BIP148.
Лучшие участники Bitcoin Core на мой взгляд — это те, кто придерживаются принципа «экстремальной ответственности» (extreme ownership). Показательный пример: хотя Джон Ньюбери и не был автором кода, содержавшего в себе баг консенсуса, он тем не менее взял на себя ответственность за его попадание в релиз — так как не смог обнаружить его при проверке — и за то, что не смог найти этот баг позже, когда прописывал различные варианты тестирования:
Я несу ответственность за баг CVE-2018–17144.
Мы все — Сатоши.
Визуализация разработки Bitcoin CoreМожет показаться, что начать свой путь в Core — это что-то пугающе сложное, но в сети есть немало ресурсов, призванных помочь разработчикам-новичкам. Рекомендации и правила для участников можно найти здесь, хотя, возможно, лучше даже начать с ненавязчивого вступления за авторством Джимми Сонга:
Core разработчик Эрик Ломброзо также написал статью о том, как происходят изменения в репозитории Core:
Алекс Б. написал отличную статью о философии разработки биткоина — советую прочитать это любому намеренному участвовать в проекте всерьёз:
Думаю, будет полезным привести конкретный пример: при написании этой статьи я столкнулся с трудностями при попытке запустить на моем компьютере скрипт verify-commits. py для проверки целостности истории слияний на гитхабе. Чтобы избавить будущих разработчиков от похожих проблем, я открыл пул-реквест, в котором предложил некоторые улучшения документации. Как можно увидеть из истории пул-реквеста, четыре разных разработчика высказали свои идеи о том, как можно улучшить мой запрос. Предложения были разными: от изменения вики-разметки до введения нового параметра, который бы можно было использовать в скрипте verify-commits.py. Я согласился со всеми предложениями, поэтому включил их в свой код и обновил пул-реквест. После этого разработчики, которые просматривали код, решили, что пул-реквест отвечает всем требованиям, и дежурный Марко Фальке поставил на нём тег, обозначающий что код будет включён в релиз 0.18. Через несколько дней, не встретив каких-либо возражений со стороны других разработчиков, дежурный Сэмюэль Добсон добавил код в Core.
Как я неоднократно повторял на протяжении многих лет, полностью понять биткоин как систему практически невозможно. Определение протокола биткоина подобно определению языка. Языки развиваются органически: слова со временем сами обретают своё значение, а не берут его из словарей. Так же как словари описывают язык, а не определяют его, так и программные реализации биткоина описывают язык биткоина с помощью кода. Никто не обязан соглашаться с определением данного слова в словаре, равно как и не обязан соглашаться с кодом в данной программной реализации биткоина, запуская его.
Языками не управляет демократия, и точно так же она не управляет биткоином. Несмотря на это, постоянно можно слышать, как люди ссылаются на майнеров, нод, разработчиков или пользователей, которые могут «голосовать» за что-то — но на самом деле механизма, который бы заставил меньшинство принять изменения, за которые проголосовало большинство, не существует. Биткоин — это анархия: без правителей, но не без правил. Правила определяются и применяются отдельными участниками сети.
Хотя изменения в сам протокол биткоина обычно вносятся через так называемые Bitcoin Improvement Proposal, даже это всего лишь рекомендуемая и самая распространённая практика, и никто не обязан ей следовать. Это просто более формализованный способ рассмотрения предложенных участниками изменений: сначала они подвергаются экспертной оценке, а затем должны получить всеобщее одобрение.
Как бы трудно ни было это объяснить или понять, здесь и заключается важный аспект «антихрупкости» биткоина: если бы существовала единственная точка контроля — она же бы и была главным уязвимым местом, на которое могли бы надавить структуры, которым биткоин угрожает. В конечном счете, каждый оператор ноды сам себе начальник в том смысле, что он лично следит за тем, чтобы никто в сети не нарушал правил, которые он считает верными. Эта модель безопасности — основа управления биткоином, которая строится по принципу «снизу — вверх».
Никто не контролирует биткоин.
Никто не контролирует разработку биткоина.
Авторы перевода: Nikita Kolodin и RainDogDance
Парсер Блокчейна в 300 строчек на Питоне / Хабр
В далёком 2015 году, когда криптовалютам ещё не уделялось такое внимание широкой общественности как сейчас, мне пришла в голову мысль узнать в подробностях — что такое блокчейн, криптовалюты и Биткоин, в частности.
Попытки провести детальный анализ исходного кода проекта Bitcoin Core не увенчались особым успехом, ввиду достаточно строгих начальных условий, которые были мною поставлены перед собой, для того, чтобы сказать «да, теперь я знаю что это и как оно работает» и огромного количества строк исходного кода, которые необходимо было осмыслить, чтобы считать результат достигнутым.
Пришлось искать другие пути. Тем более, к моменту принятия данного решения блокчейн уже полностью загрузился на мой локальный компьютер. А сегодня это уже не так быстро как было тогда.
И так. Официальный клиент Bitcoin Core загрузил весь блокчейн в папку на локальной машине, это были какие-то файлы, которые, как говорилось в официальных документах, содержали всё то, что называется Bitcoin. Самым интересным для меня являлись файлы так называемой RAW Blockchain Data (blk00000.dat… blk01234.dat и т.д. из папки Bitcoin/blocks), а именно файлы базы данных блокчейн как они есть, в исходном виде.
Остальное содержимое каталога — это индекс «сырой» базы данных, данные для корректного учёта непотраченных выходов, настройки и персональный кошелёк.
Дабы проникнуть в суть, очевидным показалось разобраться в том, что в себе хранит исходная база данных, на основании которой локальная система производит всё дальнейшее необходимое действо для обеспечения функционирования блокчейна данной криптовалюты. Часть технологии, касающаяся сетевых взаимодействий не рассматривалась в данной статье. Намеренно я ограничился именно локальной частью, и именно файлами хранящими блоки.
Спецификация формата блоков и транзакций доступна в открытых источниках, в виде разрозненных описаний данных структур. Но ничего не удалось найти того, что в полной мере могло бы дать представление о том, как интерпретировать данные, хранящиеся в файлах этой самой «сырой» базы данных блокчейн (RAW Blockchain Database).
Единственным, на мой взгляд, вариантом было разобрать линейную структуру файлов и представить её в виде некой читаемой структуры, которая и должна дать полное понимание что это за фрукт такой Биткоин.
Результатом является написанный на Python скрипт в ~300 строк, который преобразует локально хранящиеся «сырые» файлы данных blkXXXXX. dat в обычный текстовый формат с указанием того, что там содержится, и какой смысл имеет каждое поле данных. Полученные текстовые файлы подходят для дальнейшей их обработки и извлечения из них, к примеру, всех хэшей блоков, хэшей транзакций, адресов, сумм транзакций и т.п. с целью анализа, да и много ещё для каких целей…
Удобство и прозрачность использования парсера обеспечено, на мой взгляд, с максимальной наглядностью, за счёт реализации через последовательное побайтное чтение-преобразование данных.
Существующие в природе парсеры блокчейна, имеют множество фич, но ни один не работает напрямую с файлами самой базы данных непосредственно. Именно поэтому я не стал заострять внимание на реализации каких-либо интересностей, таких как получение списка адресов с баллансами или тому подобном, а ограничился максимально наглядной и простой реализацией непосредственного преобразования файлов из внутреннего формата в универсальный текстовый вид. Тем более, множество плюшек, таких как формирование UTXO Set (набор непотраченных выходов) или формирование списка адресов с баллансами уже мною реализованы для ряда проектов.
Неотъемлемой частью данной работы является помощь заинтересованным лицам в изучении технологии блокчейн.
Да, как оказалось, скрипт подходит также и для большинства других криптовалют, таких как Dash, Dogecoin, Bitcoin Cash, Litecoin и прочих альткоинов, правда для этого необходимо сделать пару хитростей. В рамках данной статьи не планировалось раскрывать эти трюки.
Сам парсер блокчейна (blockchain parser) вы можете загрузить по ссылке с Гитхаба.
как его получить и что с ним можно сделать
Биткоин — первая и самая известная криптовалюта в мире. Многих пользователей интересует вопрос, кто владеет и управляет Биткоином, а также – кто может вносить изменения в исходный код Биткоина. На самом деле, Биткоин не просто так называют децентрализованным. Он принадлежит одновременно всем и никому. Подробности рассказывает ProstoCoin.
Как выглядит код биткоина
По сути, Биткоин — протокол. То есть, язык, который используют компьютеры для совместной работы. Ключевой особенностью биткоина является полная децентрализация. За управлением монетой не стоит центральный администратор или его аналог. Монета полностью открыта. Те, кто хочет стать частью сети, просто должны установить программу-клиент. Все запущенные по всему миру программы соединяются между собой в одноранговую сеть, где каждый узел самодостаточный и равен остальным.
Важно, что биткоин имеет открытый исходный код. Программы с открытым исходным кодом доступны к изучению и изменению. Это позволяет не только убедиться в отсутствии уязвимостей, но открывает перспективы для использования программного кода в своих интересах.
Любой пользователь может просмотреть программный код биткоина, проверить наличие недокументированных возможностей или выявить недочеты в системе, предложить свой метод исправления или создать на основе кода биткоина собственный новый продукт, улучшенную или измененную версию.
Возможности биткоина
В биткоине доверие к эмитенту или любому другому управляющему органу заменено криптографией, математикой и алгоритмами. Децентрализация, отсутствие контроля разработчиков и влияния человеческого фактора гарантируют, что в один прекрасный момент система не закроется или не изменит кардинально правила.
Несмотря на отсутствие контроля, система полностью безопасна, поскольку работает по определенному алгоритму. Как децентрализованной платежной системе Биткоину свойственны следующие возможности и особенности:
- легкие и быстрые платежи с минимальными комиссиями;
- анонимность и защита персональных данных при транзакциях;
- равенство и независимость участников;
- глобальность;
- безопасность, надежность и защищенность, достигаемая при помощи криптографии;
- честный рыночный курс биткоина зависимый от соотношения спроса и предложения, а не установленный властями или создателем;
- отсутствие посредников при совершении транзакции;
- полный контроль над личными монетами и отсутствие финансовой цензуры, счет участника не может быть заморожен, а платеж не может быть запрещен.
Почему цифровой код биткоина не принадлежит разработчикам
Впервые о Биткоин заговорили в 2008 году, когда вся информация о принципах его функционирования и цифровой код появились в свободном доступе. Статья, подробно описывающая первую криптовалюту, была размещена на одном из форумов, где с ней мог бы ознакомиться любой желающий.
Главным преимуществом Биткоина является то, что он полностью децентрализован, то есть – не контролируется и не принадлежит правительству, банкам и даже разработчикам. Биткоин имеет открытый код, но, в отличие от большинства других открытых систем, в нем нет даже отдельного избирателя, который бы контролировал работу системы. Формально, сеть управляется только пользователями и майнерами. Хотя разработчики биткоина и имеют на него влияние, но работать с исходным кодом может любой желающий.
Цифровой код биткоина размещен на множестве информационных ресурсов для разработчиков. Обсуждение изменений ведется в нескольких чатах и на вебсайтах, а технология не принадлежит никому.
Создатель Биткоина – или группа лиц, скрывающихся за псевдонимом Сатоши Накамото и разместивших впервые статью о принципах работы криптовалюты – пожелал остаться анонимным и просто представил свое творение людям. Криптовалюты — наднациональная технология, сравнимая с Интернетом.
Где можно получить исходный код биткоина
Как упоминалось ранее, исходный код Биткоина размещен в открытом доступе. Любой желающий может его изучить или изменить на свое усмотрение. Найти официальную версию кода биткоина можно на страницах сервиса GitHub по этой ссылке.
GitHub — портал для разработчиков и программистов, куда выкладывается множество открытых кодов проектов для совместного изучения, работы, комментирования, а также для подтверждения надежности и открытости систем. На сервисе можно найти даже исходные коды таких гигантов, как Google или Microsoft.
С помощью данного сервиса любой желающий может получить код Биткоина для изучения или изменения.
Управление и изменение кода
В конечном счете, управление Биткоином ложится на обычных, равных между собой, участников сети, установивших на свой ПК соответствующее программное обеспечение. Данный тип управления можно сравнить с использованием английского языка в качестве международного. Нет управляющего органа, который бы закрепил статус английского языка как международного, но в нем есть единые грамматические правила, которых придерживаются все люди, использующие его. Точно так же и с Биткоином. В нем нет управления, но все участники сети придерживаются общего консенсуса. Основной тон дают пользователи, выполняющие большие транзакции по сети или владеющие большими подключенными мощностями.
Получить и изменить код Биткоина под силу любому программисту. Некоторые изменения протокола могут быть поддержаны множеством участников сети, другие — требует согласования со всей сетью для достижения общего консенсуса. При этом даже незначительное изменение программного кода может создать две абсолютно несовместимые между собой сети, создав новую криптовалюту.
Изменения, которые вносятся в код Биткоина, должны быть приняты и согласованы с пользователями, поскольку именно они должны будут обновить программное обеспечение и перейти на новую версию, оставив прошлую. Другими словами, пользователи должны начать использовать новую монету и принимать ее за Биткоин.
Разработчики Биткоина не имеют полномочий запретить использовать старую сеть или принудить использовать измененную. Это добровольный выбор каждого участника сети, установившего себе полную ноду. Максимум, что могут сделать разработчики, это дать совет и аргументировать необходимость принятия изменений.
Разработчики могут выпускать множество различных версий с измененным кодом, а участники могут просто игнорировать изменения и продолжать использовать прежнюю версию. Поэтому реальная проблема не в том, чтобы внести изменения в код, а в том, чтобы убедить участников, что эти изменения оправданы и можно перейти на новую сеть, приняв ее за единственно верный Биткоин.
Поэтому, чтобы избежать раскола сети, разработчики ядра Биткоина вносят изменения в софт форками, при которых на новую сеть должны переключиться все или никто. За принятие изменений участники голосуют хешированной мощностью. Если решение принимается, то пользователи, которые не желают переходить на новую сеть, должны быть готовы к тому, что, несмотря на совместимость с измененной сетью, их операции перестанут признаваться валидными, поскольку не будут соответствовать новым правилам сети.
Стоит отметить, что аналогичным образом большинство пользователей могут внести изменения в код Биткоина и без участия разработчиков, но если группа майнеров будет вносить изменения, противоречащие пользовательским интересам, то протокол Биткоина может быть изменен вместе с алгоритмом майнинга другими пользователями.
Популярные форки биткоина
Путем изменения исходного кода Биткоина может быть создана новая, похожая на Биткоин, но совершенно иная монета — форк, несовместимая с основной сетью. С момента появления Биткоина его код изменяли более 70 раз.
Некоторые форки Биткоина «помнит» только Интернет: они так и не смогли набрать достаточной популярности и привлечь внимание пользователей. К числу таких монет можно отнести Bitcoin Star, Bitcoin Coral, Bitcoin Hush и многие другие, чьи названия мало кто слышал и встречал. Список всех форков Биткоина можно найти на информационном сайте forkdrop.io.
По статистике, из 70 форков Биткоина в листинг на биржи попали только 10 монет, при этом их совокупная стоимость составляет всего 0,12 ВТС. Исключением из этого правила является Bitcoin Cash и Bitcoin Gold. Данные форки Биткоина обрели наибольшую популярность.
Bitcoin Cash был создан в результате раскола сети, когда некоторые пользователи всерьез озадачились проблемой масштабируемости блока Биткоина. Монета полностью повторяет оригинальный блокчейн, но имеет размер блока в 8 Мб, против 1 Мб в Биткоине. Благодаря чему ее транзакции более быстрые. В Bitcoin Gold был изменен алгоритм хеширования с SHA-256 на Equihash, что сделало более продуктивным майнинг на видеокартах.
Так что, несмотря на заявления разработчиков, предлагающих новые улучшенные варианты Биткоина с измененным кодом, мало какую монету имеют желание поддерживать участники сети и тем более единогласно принять ее за новый Биткоин, поэтому результатом внесения изменений является совершенно другая криптовалюта.
Выводы
Внести изменения в исходный код Биткоина может любой желающий, поскольку он полностью открытый и представлен в свободном доступе. Для того, чтобы эти изменения относились именно к основной сети Биткоина, они должны быть поддержаны большинством узлов связи, а для этого должны быть оправданы и полезны. Даже разработчики ядра Биткоина не могут вносить изменения без поддержки обычных пользователей.
Исходный протокол биткоина: что это такое и почему он так важен?
КАЛГАРИ, 30 августа 2021 г. — За последние 10 лет такие концепции, как «блокчейн» и «цифровые валюты», вышли за рамки небольших онлайн-сообществ, и теперь их поддерживают и используют крупнейшие организации по всему миру. С ростом популярности этих технологий и появлением множества различных цифровых предложений компания MNP (ведущая национальная бухгалтерская, налоговая и консалтинговая фирма в Канаде) подготовила подробный отчет с целью определить, какая версия биткоина наиболее точно соответствует первоначальному видению из «белой книги» Сатоши Накамото (в которой была изложена сама концепция биткоина).
«Белая книга» Накамото, озаглавленная «Биткоин: одноранговая электронная денежная система», стала основой для анализа MNP. Этот технический документ, а также электронные письма, публикации на форумах и исходный код Сатоши определяют протокол (набор правил для биткоина как сети передачи данных) и ключевые элементы, которые делают биткоин функциональной технологией. Наряду с «белой книгой» специалисты MNP изучили общедоступные электронные письма, публикации на форумах и исходный код, оставленный Сатоши. Сотрудники MNP использовали доступные первичные материалы, чтобы рассмотреть первоначальную цель биткоина в понимании Сатоши — стать глобальной системой электронных платежей (которая работает путем взаимодействия равноправных узлов), а также заложить основу для сети, способной поддерживать более сложные приложения для обработки данных.
Используя упомянутые выше источники, эксперты MNP разработали модель и соответствующие критерии для оценки актуальности языка сценариев биткоина (в том числе интегрированных в него операционных кодов), элементов протокола и возможностей текущих версий Bitcoin SV (BSV) и Bitcoin Core (BTC) в сравнении с первоначальным видением Сатоши.
BSV — это открытый блокчейн, который является крупнейшим в мире по таким показателям, как: функционал, важный для практического применения, возможности для хранения данных, ежедневный объем транзакций, масштабируемость и средний размер блока.
Выводы MNP показывают, что Bitcoin SV наиболее полно отражает первоначальный замысел Сатоши Накамото и его дизайн биткоина. Один из ключевых факторов заключается в том, что блокчейн BSV демонстрирует возможности масштабирования для оперативной поддержки значительных объемов транзакций для макроплатежей и даже микроплатежей. Такие возможности стали доступны в результате хардфорка BSV «Генезис» (Genesis) в феврале 2020 года, который также снял произвольное ограничение на размер блока и позволил блокчейну BSV и его пропускной способности транзакций расти без каких-либо преград. При этом также были сняты ограничения по состояниям и улучшен базовый код, что сделало возможным неограниченное масштабирование. Кроме того, хардфорк «Генезис» восстановил ключевые аспекты исходной функциональности Bitcoin script — языка программирования, используемого в протоколе биткоина.
В подготовленном MNP отчете также указывается, какие технологические возможности могут быть задействованы, когда видение биткоина Сатоши будет полностью реализовано. «MNP гордится тем, что участвует в независимом анализе Bitcoin SV. Мы надеемся, что наш отчет поможет сделать ситуацию с блокчейнами более ясной и понятной для заинтересованных канадцев», — сказал Хеш Куреши, партнер отдела по управлению рисками компании MNP.
Джимми Нгуен, президент-основатель Bitcoin Association, добавил: «Биткоин-протокол может изменить подход к использованию данных по всему миру, как в свое время это сделал интернет-протокол. Однако его истинная сила недооценивалась и неправильно понималась на протяжении слишком долгого времени. Исходный дизайн биткоина, созданный Сатоши Накамото, был искажен разработчиками протокола Bitcoin Core, превратившими BTC в сильно ограниченную и малопригодную для использования версию массовой одноранговой сети, задуманной создателем этой технологии. На самом деле система биткоина обладает техническими возможностями и способностью к масштабированию, позволяющими поддерживать самые эффективные в мире цифровые платежи и распределенные сети передачи данных. Сегодняшний отчет MNP ясно и объективно иллюстрирует это. В нем показано, что возможности протокола биткоина были ограничены из-за узости мышления разработчиков BTC. Как показано в отчете, сеть Bitcoin SV — наиболее полная реализация исходного протокола биткоина, предоставленного Сатоши Накамото, которая предлагает блокчейн с неограниченным масштабированием в ответ на запрос рыночных сил. Этот блокчейн поддерживает высокую пропускную способность, сверхнизкие комиссии за транзакции и уникальные функции обработки данных для удовлетворения потребностей крупных предприятий, правительственных органов и, что наиболее важно, рядовых пользователей. BSV — это не просто цифровой инвестиционный актив для состоятельных людей и институциональных инвесторов; это глобальный биткоин для всех и для всего».
Общая структура отчета выглядит следующим образом:
- «белая книга биткоина» — техническая документация по биткоину;
- известные публикации Сатоши на форумах и его электронные письма;
- исходный протокол биткоина:
- возможности;
- критические компоненты;
- нефункциональные требования;
- атрибуты реализации;
- сравнение текущих реализаций биткоина с первоначальным видением Сатоши;
- перспективы полной реализации видения Сатоши.
Чтобы узнать больше о блокчейне BSV и множестве предприятий, использующих его сеть, посетите сайт bsvblockchain.org.
Вы также можете посмотреть прошедшие и будущие конференции CoinGeek — крупнейшие международные мероприятия, посвященные технологии блокчейн BSV. Последнее мероприятие прошло в Цюрихе, центре европейского банковского мира. Мероприятие доступно в записи. Ближайшее мероприятие — конференция CoinGeek New York, которая пройдет в отеле Sheraton New York Times Square, 5–7 октября 2021 года. Присоединяйтесь к нам очно или виртуально, чтобы узнать, как предприятия, потребители и государственные органы могут использовать неограниченное масштабирование блокчейна BSV в приложениях по обработке данных с низкими комиссиями и микроплатежами.
Контактное лицо для получения более подробной информации:
Николас де Рой, старший менеджер по маркетингу, эксперт и консультант, [email protected]
Об MNP
MNP — одна из крупнейших национальных бухгалтерских и консалтинговых фирм в Канаде, предоставляющая своим клиентам персональные консультации и рекомендации по бухгалтерскому учету и налогообложению. Общенациональная по охвату, но обладающая прекрасным знанием особенностей местного рынка, компания MNP гордится тем, что обслуживает частных лиц, государственные и частные компании на протяжении более 60 лет. Благодаря развитию прочных отношений MNP предлагает клиентам индивидуальные стратегии с учетом местного рынка, помогая им добиться успеха. Для получения дополнительной информации посетите сайт www.mnp.ca.
Кратко о биткоине | КИТ Групп Блог
Биткоин. Простые ответы на сложные вопросы
Сначала общая информация. Биткоин — платежная система, основанная на равноправии участников, использует одноимённую единицу расчета и одноимённый протокол передачи данных. Эта цифровая валюта создана и работает только в сети интернет. Если человек не связан с Bitcoin напрямую, то у него обычно возникнет целый ряд вопросов насчет принципов работы криптовалюты.
За биткоины можно покупать все что угодно в интернете, он так же торгуется на биржах. С другой стороны ни одно учреждение в мире не контролирует биткоин. Данная валюта не печатается никаким банком и не работает по его правилам.
Биткоин не обеспечен золотом или серебром, это чистая математика.
В Bitcoin процесс добычи монеток требует ресурсов и времени. Можно сказать, что Bitcoin — это набор чисел, который может передаваться от одного компьютера к другому, информация о транзакциях хранится в зашифрованном виде у всех участников системы, тем самым биткоин превращается в самостоятельную цифровую платежную систему.
Любой человек во всем мире может запустить скрипт по добыче биткоинов у себя на компьютере и почувствовать себя мини-Центробанком. Исходных код скрипта опубликован в открытом виде, каждый может посмотреть, как он работает.
Для начала попробуйте скачать программу или завести онлайн-кошелёк. Вы можете создавать бесконечное количество биткоин адресов без привязки к имени, адресу или любой другой информации.
Правовой статус биткоинов везде трактуют по-разному, и это делает систему крайне уязвимой. До сих пор биткоины никак не регулируются на правительственном уровне. В Германии считают, что Bitcoin попадает под определение частных денег, а в Сингапуре — под цифровые товары. С другой стороны, анонимность платежей делает систему привлекательной в преступной среде.
Конечно. Среди альтернатив — Litecoin, Peercoin, Namecoin и десятки других.
При помощи биткоинов можно совершать покупки, делать денежные переводы, конвертировать валюту в обычные деньги. Некоторые предпочитают хранить сбережения в криптовалюте.
Инструменты JavaScript разработчика
Artiom Matusenco
JS Software Developer / Team Lead
Основные инструменты, без которых сложно представить будни JavaScript-разработчика: от IDE до браузера.
VS Code
VS Code — это универсальная IDE (Integrated Development Environment), которая уже стала стандартом для многих разработчиков. Основной задачей инструмента является предоставление удобной и эффективной среды для работы с программным кодом. VS Code позиционируется как легковесный редактор кода, позволяющий расширить функционал при помощи плагинов, что делает его максимально конфигурируемым под задачи и предпочтения каждого разработчика индивидуально.
Ключевые «фишки» редактора:
- Возможность расширения и конфигурации редактора при помощи огромного количества плагинов, позволяющих добавить практически любой необходимый для разработки функционал.
- IntelliSense — умная подсветка и автодополнение кода, основывающиеся на типах переменных, описании функций и методов, импортируемых модулях.
- Встроенный отладчик, позволяющий анализировать выполнение кода непосредственно в редакторе, не прибегая к выводу состояния переменных и среды исполнения.
- Удобная интеграция с командами Git и другими системами контроля версий делает рутинную работу легче и эффективнее.
Для разработки на JavaScript в VS Code я использую следующий набор плагинов:
- One Dark Pro — известная One Dark тема, одна из наиболее популярных среди пользователей VS Code.
- Prettier — инструмент, позволяющий автоматически форматировать код JavaScript в соответствии с общепринятыми стандартами.
- ESLint — статический анализатор JavaScript кода, задачей которого является выявление нарушений правил и соглашений по написанию и оформлению кода.
- JavaScript Snippets — плагин, расширяющий функционал автодополнения, предоставляющий возможность удобно вставлять готовые стандартные JavaScript выражения и конструкции.
- VSCodeVim — плагин, позволяющий переключиться в режим модального редактора Vim.
- JestRunner — предоставляет возможность запускать и отлаживать Jest тесты прямо из редактора путем нажатия на всплывающие кнопки.
- Git File History — визуализация истории изменений файла, основанная на системе управления версиями Git.
Node.js
Node.js или как ее еще называют «нода» — это среда исполнения JavaScript, основанная на движке V8. В отличие от браузера, Node.js предоставляет возможность исполнять код на стороне сервера, позволяя подключаться к базам данных, «слушать» сетевые подключения, используя разного рода протоколы, или работать в режиме командной строки. При построении бэкенд-сервисов Node.js — неотъемлемый инструмент повседневной работы.
npm
Менеджер пакетов Node.js — это инструмент, который предоставляет набор команд для установки, удаления, версионирования, запуска и многих других операций над JavaScript пакетами как для серверных приложений на Node.js, так и для клиентских, предназначенных для браузера.
Пакет — это полноценная программа или набор функций, которые могут быть переиспользованы при разработке другой программы. Ярким примером может быть React или Lodash. Потенциально программа, написанная на JavaScript под Node.js, может не использовать сторонних зависимостей. Но на большинстве проектов для ускорения разработки и переиспользования логики и функционала npm используется как один из основных инструментов.
Набор npm пакетов варьируется от проекта к проекту и разделяется на пакеты, входящие в конечную программу, и на пакеты, необходимые для процесса разработки, сборки, отладки, размещения и других операций над конечной программой.
nvm
Менеджер версий Node.js — используется для быстрого переключения между версиями «ноды» на одной машине. Чаще всего необходим в одновременной работе над разными проектами, когда каждый из них зависит от конкретной версии.
Prettier
Инструмент, позволяющий автоматически форматировать JavaScript код в соответствии с общепринятыми стандартами. Форматирование кода в соответствии с набором правил необходимо для поддержания чистоты и строго детерминированной структуры. Код читается и воспринимается гораздо легче, когда его оформление стандартизировано.
В некоторых языках есть встроенные инструменты для форматирования кода, например, в Go это fmt, без соблюдения правил которого код не скомпилируется. Для JavaScript долгое время не было инструмента, строго описывающего и исполняющего правила форматирования. Prettier занял свою нишу достаточно скоро после выхода и сейчас уже является обязательным npm-пакетом практически на каждом проекте.
ESLint
Статический анализатор JavaScript кода, задачей которого является выявление нарушений правил и соглашений по написанию и оформлению кода. В отличие от правил форматирования, ESLint применяет правила написания выражений, конструкций и операторов. В результате ESLint «следит» за качеством кода, выявляя потенциальные проблемы и ошибки в синтаксисе. Так же, как и Prettier, этот инструмент считается практически обязательным для каждого проекта.
Google Chrome
Работа в браузере занимает чуть ли не большую часть рабочего дня. Но самое главное, что браузер предоставляет не только возможность работать с ресурсами интернета, но и достаточно широкий набор инструментов разработчика. В основном они необходимы для отладки, анализа, оптимизации фронтенд приложений.
Основные инструменты разработчика в Google Chrome:
- Elements — просмотр HTML-элементов, их свойств, параметров и CSS-стилей. Кроме этого в Elements можно редактировать HTML и CSS прямо на лету, что дает удобную возможность экспериментировать с версткой прямо в браузере.
- Network — таблица HTTP-запросов и ответов, предоставляющая о них полную информацию.
- Console — среда исполнения JavaScript в контексте скрипта страницы. Позволяет не только выполнять код построчно, но и выводит логи JavaScript-приложения.
- Sources — открывает исходный код JavaScript-приложения, является полноценным отладчиком кода, где можно установить точки останова и просмотреть состояние приложения и среды исполнения в необходимый момент.
- Performance — анализ производительности приложения, включающий не только данные об исполнении JavaScript-кода, но и ресурсы, затраченные на отрисовку HTML, анимацию CSS и другие составляющие в разрезе промежутка времени, записанного во время анализа.
- Application — доступ к разным типам хранилища браузера, а также к сервисам, исполняемым в фоновом режиме.
- Sensors — инструмент, позволяющий подменить данные сенсоров, такие как геолокация, положение в пространстве и другие.
Естественно, это лишь основные или базовые инструменты, без которых сложно представить будни JavaScript-разработчика. Существует масса других, не менее важных и популярных инструментов и приложений, которыми в принципе пользуется каждый разработчик программного обеспечения вне зависимости от языка программирования или стека.
А какой ваш набор любимых инструментов для работы с JavaScript?
Хинт для программистов: если зарегистрируетесь на соревнования Huawei Cup, то бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании.
Перейти к регистрации
GitHub — openblockchains / программирование-биткойн-скрипт: Программирование транзакций биткойн-скрипта (крипто), шаг за шагом
Дополнительные книги о блокчейнах см. На странице Лучшее из криптографических книг »
Давайте начнем с создания вашей собственной биткойн-стековой машины с нуля / с нуля и давайте запустим ваши собственные биткойн-операции (операции) …
ОСТОРОЖНО: Биткойн — это гигантская схема Понци¹. На Луну!? Новый золотой стандарт !? НЕ «инвестируйте», пытаясь быстро разбогатеть HODLING.Почему нет? Код биткойна архаичен и устарел. Гори детка Гори! Proof-of-Work / Waste — это глобальная энергетическая экологическая катастрофа используя 300 кВтч на транзакцию биткойнов (!), это около 179 килограммов выбросов CO₂². Программируемые деньги (или Интернет ценности) для всех будущих поколений со скриптом (биткойн) без петель и скачков (gotos) и всего «без сохранения состояния» !? РЖУ НЕ МОГУ.
¹:
(Источник: Best of Bitcoin Maximalist — Мошенники, дебилы, клоуны, шиллы и багходлеры — Inside The New New Crypto Ponzi Economics)
²: Допустим, 0.596 кг CO₂ на кВтч (это энергоэффективность в Германии) это около 179 кг CO₂ на транзакцию с биткойнами (300 кВт · ч × 0,596 кг). Для получения дополнительной информации см. Индекс потребления энергии биткойнами.
Внутри Биткойн-скрипта
Знаете ли вы? Каждая (да, каждая) биткойн-транзакция (платеж) выполняется сценарий контракта (одна половина поступает из транзакции «вывода» или «блокировки», а другая половина поступает из транзакции «ввод» или «разблокировка»). Язык программирования называется просто (биткойн) скриптом.
Биткойн использует систему сценариев для транзакций. Подобно четвертому, скрипт прост, основан на стеке и обрабатывается слева направо. Он намеренно не является полным по Тьюрингу, без циклов.
(Источник: Script @ Bitcoin Wiki)
Первое впечатление. Добавление 2 + 2 в биткойн-скрипт, начиная с нуля / с нуля:
## Простой штабелеукладчик def op_add (стек) left = stack.pop right = stack.pop stack.push (влево + вправо) конец def op_2 (стек) куча.толкать (2) конец ## Давайте работать! стек = [] op_2 (стек) # => стек = [2] op_2 (стек) # => стек = [2,2] op_add (стек) # => stack = [4]
(Источник: stackmachine_add.rb
)
Да вот и все волшебство! Вы создали свою собственную стековую машину с
две операции / операции, то есть op_add
и op_2
.
Операция op_2
помещает в стек число 2
.
Операция op_add
выталкивает два верхних числа из стека.
и помещает результат в стек.
В сторону — Что такое стек? Push ‘n’ Pop
Стек — это структура данных типа «последний пришел — первый ушел» (LIFO). Используйте push
чтобы добавить элемент в верхнюю часть стека и использовать pop
чтобы удалить верхний элемент из стека.
Пример:
стек = [] # => [] stack.empty? # => верно stack.push (1) # => [1] stack.empty? # => ложь stack.push (2) # => [1, 2] stack.push (3) # => [1, 2, 3] куча.push ("<подпись>") # => [1, 2, 3, "<подпись>"] stack.push ("") # => [1, 2, 3, " ", " "] stack.pop # => " " стек # => [1, 2, 3, "<подпись>"] stack.pop # => "<подпись>" стек # => [1, 2, 3] stack.push (4) # => [1, 2, 3, 4] stack.push (5) # => [1, 2, 3, 4, 5] stack.pop # => 5 стек # => [1, 2, 3, 4] куча.поп # => 4 стек # => [1, 2, 3] stack.pop # => 3 стек # => [1, 2] stack.pop # => 2 стек # => [1] stack.empty? # => ложь stack.pop # => 1 стек # => [] stack.empty? # => верно stack.pop # => ноль
(Источник: stack.rb
)
Разблокировка + Блокировка / Ввод + Вывод / ScriptSig + ScriptPubKey
В «реальном мире» биткойн скрипт состоит из двух частей / половин в двух транзакциях. которые объединяются.Сценарий «блокировка», «вывод» или «ScriptPubKey» который блокирует «неизрасходованный вывод транзакции (UTXO)», и сценарий «разблокировать», «ввод» или «ScriptSig», который разблокирует биткойны.
Кто угодно может потратить (разблокировать) выходы (биткойны)
Биткойны ваши, если биткойны еще не потрачены —
увидеть блокчейн и то, как он решает проблему двойных расходов 🙂 —
И если сценарий возвращается с истиной, то есть 1
находится на вершине стека.
## Простой штабелеукладчик def op_true (стек) куча.толкать (1) конец ## Давайте работать! стек = [] ## I) Часть ScriptSig (ввод / разблокировка) op_true (стек) # => стек = [1] ## II) Часть ScriptPubKey (вывод / блокировка) ## <Пусто>
(Источник: stackmachine_anyone.rb
)
Бинго! Да вот и все волшебство!
Операция op_true
помещает в стек число 1
, то есть true
.
«Официальная» нотация сценария биткойнов:
ScriptSig (ввод): OP_TRUE
ScriptPubKey: (пусто)
Теперь давайте разделим сценарий сложения 2 + 2
на головоломку из двух частей.
то есть ? + 2 = 4
или в ScriptSig
и ScriptPubKey
.Если вы знаете ответ, вы можете «разблокировать» награду,
то есть биткойны ваши!
Вот вызов:
## Простой штабелеукладчик def op_add (стек) left = stack.pop right = stack.pop stack.push (влево + вправо) конец def op_2 (стек) stack.push (2) конец def op_4 (стек) stack.push (4) конец def op_equal (стек) left = stack.pop right = stack.pop stack.push (слева == справа? 1: 0) конец ## Давайте работать! стек = [] ## I) Часть ScriptSig (ввод / разблокировка) ## ИСПРАВИТЬ!!! - добавьте сюда свою операцию / операции "разблокировки" стека ## II) Часть ScriptPubKey (вывод / блокировка) op_2 (стек) # => стек = [?, 2] op_add (стек) # => стек = [4] op_4 (стек) # => стек = [4,4] op_equal (стек) # => стек = [1]
(Источник: stackmachine_puzzle.руб
)
«Официальная» нотация сценария биткойнов:
ScriptSig (ввод):?
ScriptPubKey: OP_2 OP_ADD OP_4 OP_EQUAL
Если вы проверите все операции сценария Биткойн — следующие операции больше не должны быть загадкой:
Константы
Word | Код операции | шестигранник | Вход | Выход | Описание |
---|---|---|---|---|---|
OP_0, OP_FALSE | 0 | 0x00 | Ничего. | (пустое значение) | В стек помещается пустой массив байтов. (Это не бездействие: элемент добавляется в стек.) |
OP_1, OP_TRUE | 81 | 0x51 | Ничего. | 1 | Число 1 помещается в стек. |
OP_2-OP_16 | 82-96 | 0x52-0x60 | Ничего. | 2-16 | Число в слове name (2-16) помещается в стек. |
Побитовая логика
Word | Код операции | шестигранник | Вход | Выход | Описание |
---|---|---|---|---|---|
OP_EQUAL | 135 | 0x87 | х1 х2 | Верно / неверно | Возвращает 1, если входы в точности равны, в противном случае — 0. |
Арифметические
Word | Код операции | шестигранник | Вход | Выход | Описание |
---|---|---|---|---|---|
OP_ADD | 147 | 0x93 | а б | из | a добавлен к b. |
OP_MUL | 149 | 0x95 | а б | из | а умножается на b. отключен. |
OP_DIV | 150 | 0x96 | а б | из | a делится на b. отключен. |
Trivia Corner: Знаете ли вы? OP_MUL
для умножения (например, 2 * 2
)
был забанен, то есть отключен! Почему?
Из-за соображений безопасности, то есть боязни переполнения стека.А как насчет OP_DIV
для подразделений (например, 4/2
)? Не спрашивайте!
Спросите, кто защищает вас от переполнения стека?
Итак, что осталось для программирования — не более того, кроме проверки
подписи и таймлоки :-).
Стандартные сценарии
Необязательно начинать с нуля / с нуля. Биткойн имеет множество стандартных шаблонов сценариев. К наиболее важным относятся:
Краткое имя | Длинное имя |
---|---|
п2пк | Pay-to-pubkey |
п2пх | Pay-to-pubkey-hash |
п2ш | Хеш Pay-to-script |
Стандартные сценарии с SegWit (Segregated Witness)
Краткое имя | Длинное имя |
---|---|
p2wpkh | Pay-to-witness-pubkey-hash |
p2wsh | Хеш-код сценария оплаты свидетелю |
p2pk — Pay-to-pubkey
Pay-to-pubkey (p2pk) — простейший стандартный скрипт и использовался в первые дни в том числе Сатоши Накамото (псевдоним основателя Биткойна).
Биткойн Общая информация:
Первоначально единственный, а затем и доминирующий горнодобывающий сектор, Накамото был награжден биткойнами при создании и на 10 дней после этого. За исключением тестовых транзакций, они остаются неизрасходованными с середины января 2009 года. Общедоступный журнал транзакций биткойнов показывает, что известные адреса Накамото содержат примерно один миллион биткойнов. На пике биткойнов в декабре 2017 года это стоило более 19 миллиардов долларов США, что сделало Накамото, возможно, 44-м самым богатым человеком в мире в то время.
(Источник: Сатоши Накамото @ Wikipedia)
Один миллион биткойнов ваш, если скрипт pay-to-pubkey (p2pk)
возвращается с истиной, то есть 1
находится на вершине стека.
Единственный вход, который вам нужен, чтобы разблокировать удачу, — это подпись. Вы Сатоши?
Попробуем:
## Биткойн-крипто-помощник класс Биткойн def self.checksig (sig, pubkey) ## "крипто" магия здесь ## для тестирования пока всегда возвращать false; извиняюсь ложный конец конец ## Простая стековая машина def op_checksig (стек) pubkey = стек.поп sig = stack.pop если Bitcoin.checksig (sig, pubkey) stack.push (1) еще stack.push (0) конец конец ## Давайте работать! стек = [] ## I) Часть ScriptSig (ввод / разблокировка) stack.push ("") # => stack = [" "] ## II) Часть ScriptPubKey (вывод / блокировка) stack.push (" stack = [" ", " "] op_checksig (стек) # => stack = [0]
(Источник: pay-to-pubkey.rb
)
Бинго! Да вот и все волшебство!
Операция op_checksig
извлекает два элемента из
стек, то есть открытый ключ (pubkey)
и подпись (подпись) и
если криптографическая эллиптическая кривая проверяет подпись (из транзакции ввода / разблокировки)
с использованием открытого ключа (из транзакции вывода / блокировки)
тогда удача твоя! Если не
число 0
, то есть false
помещается в стек
и тебе не повезло.Извините.
«Официальная» нотация сценария биткойнов:
ScriptSig (ввод):
ScriptPubKey: OP_CHECKSIG
Примечание: Можете ли вы угадать, где часть ввода / разблокировки получила свое имя ScriptSig и где часть вывода / блокировки получила свое имя ScriptPubKey? Да, из скрипта pay-to-pubkey.
В сторону — Айви — язык сценариев биткойнов более высокого уровня
Что такое Айви?
Из ридми проекта:
Ivy — это язык более высокого уровня, позволяющий писать (крипто) контракты. для протокола Биткойн.Ivy может компилировать коды операций для стековой машины Биткойн, Биткойн-скрипт и может использоваться для создания биткойн-адресов, совместимых с SegWit …
Вы можете попробовать Ivy, используя Ivy Playground для биткойнов, который позволяет вам создавать тестовые контракты и пытаться их потратить, все в изолированной среде.
(Источник: документация по языку Ivy)
Давайте посмотрим на скрипт pay-to-pubkey в Ivy:
контракт LockWithPublicKey (publicKey: PublicKey, val: Value) {
статья о расходах (sig: Signature) {
проверить checkSig (publicKey, sig)
разблокировать вал
}
}
И — сюрприз, сюрприз — скрипт более высокого уровня компилируется в
Криптография с эллиптическими кривыми
Так как же выглядит открытый ключ «реального мира» (pubkey)? В первые дни Сатоши Накамото использовался несжатый формат SEC (Standards for Efficient Cryptography) для открытого ключа, который приводит в 65 необработанных байтах.Биткойн использует эллиптическую кривую криптография и открытый ключ — точка (x, y) на кривая, где координаты x и y являются 256-битными (32 байтовыми) числами.
В несжатом формате разместите координаты x и y рядом друг с другом,
затем префикс 04
, чтобы указать, что это несжатый открытый ключ:
префикс (1 байт): 04
Координата x (32 байта): fe53c78e36b86aae8082484a4007b706d5678cabb92d178fcd4d8dc41ef
Координата Y (32 байта): 44cfbb8dfa7a593c7910a5b6f94d079061a7766cbeed73e24ee4f654f1e51904
=>
04fe53c78e36b86aae8082484a4007b706d5678cabb92d178fcd4d8dc41ef44cfbb8dfa7a593c7910a5b6f94d079061a7766cbeed73e24ee4f654f1e51904
А в сжатом виде, потому что эллиптическая кривая симметрична вдоль оси x, фокус в том, что каждая координата x будет только когда-либо иметь одну из двух возможных координат y:
- Если y четно, он соответствует одной из точек.
- Если y нечетное, оно соответствует другому.
Таким образом, в формате сжатого открытого ключа поместите координату x
вместе с префиксом ( 02
или 03
)
который сообщает, является ли y четным ( 02
) или нечетным ( 03
).
префикс (1 байт): 03
Координата x (32 байта): df51984d6b8b8b1cc693e239491f77a36c9e9dfe4a486e9972a18e03610a0d22
=>
03df51984d6b8b8b1cc693e239491f77a36c9e9dfe4a486e9972a18e03610a0d22
Создадим публичный ключ из приватного
Примечание. Давайте воспользуемся сторонним алгоритмом цифровой подписи с эллиптической кривой (ECDSA). библиотека / драгоценный камень Дэвида Грейсона.
требуется 'pp' require 'ecdsa' # Использовать библиотеку эллиптических кривых # Этот закрытый ключ - всего лишь пример. Это должно быть намного безопаснее! privatekey = 1234 # Умножение эллиптических кривых group = ECDSA :: Group :: Secp256k1 # Выберите кривую, используемую в биткойнах point = group.generator.multiply_by_scalar (privatekey) # Умножить на целое (не шестнадцатеричное) # =>fc05c2d068ff1d38b304c> # Несжатый формат (с префиксом 04) # Преобразовать в 64 символа шестнадцатеричной строки (32 байта) в длину префикс = '04' pubkey = prefix + "% 064x"% балл.x + "% 064x"% point.y # => "04e37648435c60dcd181b3d41d50857ba5b5abebe279429aa76558f6653f1658f26d2ee9a82d4158f164ae653e9c6fa7f982ed8c fc05c2d0684ff1d38b # Сжатый формат (с префиксом - 02 = чет / 03 = нечет) # Вместо использования координат x и y, # просто используйте координату x и укажите, является ли y четным / нечетным префикс = point.y% 2 == 0? '02': '03' pubkey = prefix + "% 064x"% point.x # => "02e37648435c60dcd181b3d41d50857ba5b5abebe279429aa76558f6653f1658f2" (Источник:
pubkey.руб
)п2пх — Pay-to-pubkey-hash
…
В сторону — что такое Hash260?
Это хеш-функция для хеширования и сокращения открытых ключей. Открытые ключи если без сжатия сократите с 65 до 20 байтов (или если сжат из 33 байтов). Пример:
pubkey = 02b4632d08485ff1df2db55b9dafd23347d1c47a457072a1e87be268a8737 hash260 (pubkey) = 93ce48570b55c42c2af816aeaba06cfee1224fae
Для вычисления Hash260 запустите открытый ключ с помощью хэш-функций SHA256 и RIPEMD160.Пример:
require 'digest' # Функции хеширования (дайджеста) def hash260 (pubkey) binary = [pubkey] .pack ("H *") # Преобразовать в двоичный код перед хешированием sha256 = Дайджест :: SHA256.digest (двоичный) ripemd160 = Дайджест :: RMD160.digest (sha256) ripemd160.unpack ("H *") [0] # Преобразовать обратно в шестнадцатеричный формат конец pubkey = "02b4632d08485ff1df2db55b9dafd23347d1c47a457072a1e87be268a8737" hash260 (pubkey) # => "93ce48570b55c42c2af816aeaba06cfee1224fae"(Источник:
hash260.руб
)Вопросы безопасности I. Зачем использовать SHA256 и RIPEMD160?
RIPEMD160 используется, потому что приводит к короткий 160-битный (20-байтовый) дайджест, НО сам по себе не самая сильная хэш-функция, таким образом, SHA256 используется для большей силы. Лучшее из обоих миров.
Security Trivia II: Что такое RIPEMD160?
Дайджест сообщения оценки примитивов целостности RACE¹ 160 бит
¹: Исследования и разработки в области передовых коммуникационных технологий в Европе
def ripemd160 (сообщение) Дайджест :: RMD160.hexdigest (сообщение) конец ripemd160 («Быстрая коричневая лисица перепрыгивает через ленивого пса») # => "37f332f68db77bd9d7edd4969571ad671cf9dd3b" ripemd160 («Быстрая коричневая лисица перепрыгивает через ленивую шестеренку») # => "132072df6835eb8b6ad0b77e7b6f14acad7" # Хеш строки нулевой длины: ripemd160 ("") # => "9c1185a5c5e9fc54612808977ee8f548b2258d31" (Источник: RIPEMD @ Wikipedia)
…
«Официальная» нотация сценария биткойнов:
ScriptSig (вход):
ScriptPubKey: OP_DUP OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG И версия более высокого уровня Ivy читает:
контракт LockWithPublicKeyHash (pubKeyHash: Hash260 (PublicKey), val: Value) { статья о расходах (pubKey: PublicKey, sig: Signature) { проверить hash260 (pubKey) == pubKeyHash проверить checkSig (pubKey, sig) разблокировать вал } }
, который компилируется в
OP_DUP OP_HASh260
OP_EQUALVERIFY OP_CHECKSIG Продолжение следует…
Приложение
В сторону — Простота — новый контрактный язык биткойнов?
Simplicity — язык программирования блокчейн. разработан как альтернатива биткойн-скрипту.
(Источник: Simplicity README)
Почему простота?
Язык сценариев Биткойн обычно ограничен комбинациями проверок цифровой подписи, временных и хэш-блокировок. Хотя впечатляющие протоколы (например, Lightning Network) были построены на этих примитивах, Скриптовому языку Биткойн не хватает необходимой выразительности для более сложных сценариев контрактов.
(Источник: Simplicity: High-Assurance Bitcoin Contract Scripting, Рассел О’Коннор, Эндрю Поэлстра, Blockstream Research, ноябрь 2018 г.)
Простота: новый язык для блокчейнов (Аннотация в техническом документе)
Simplicity — это типизированный, основанный на комбинаторах функциональный язык без циклы и рекурсия, предназначенные для использования в криптовалютах и блокчейн-приложения. Он направлен на улучшение существующих языков криптовалюты, такие как скрипт Биткойна, твердость Эфириума или ликвидность Майкельсона, избегая при этом некоторых проблем, с которыми они сталкиваются.Простота приходит с формальным обозначением семантика, определенная в Coq, популярном помощнике по проверке программного обеспечения общего назначения. Простота также включает операционную семантику, которая определяется с абстрактной машиной, которую мы называем Битовой машиной. Битовая машина используется как инструмент для измерения вычислительного пространства и времени. ресурсы, необходимые для оценки программ Simplicity. Благодаря его Тьюрингу неполнота, простота поддается статическому анализу, который можно использовать для получения верхних границ требуемых вычислительных ресурсов до исполнение.В то время как Тьюринг неполный, простота может выразить любое конечное функции, которой, по нашему мнению, достаточно для создания полезных контрактов для блокчейн-приложения.
(Источник: Технический документ по простоте (PDF) Рассела О’Коннора, Blockstream, декабрь 2017 г.)
Ресурсы
Статьи
Книги / Серия
- Программирование Биткойн с нуля Джимми Сонг
- Глава 6 — Скрипт — Как работает скрипт • Примеры операций • Анализ полей скрипта • Объединение полей скрипта • Стандартные скрипты • p2pk • Проблемы с p2pk • Решение проблем с p2pkh • Скрипты могут быть созданы произвольно • Заключение
- Глава 8 — Хеширование Pay-to-Script — Голая мульти-подпись • Кодирование OP_CHECKMULTISIG • Проблемы с Голой Мультиподписной • Pay-to-Script-Hash (p2sh) • Кодирование p2sh • Заключение
- Глава 13 — Изолированный свидетель — Pay-to-Witness-Pubkey-Hash (p2wpkh) • Транзакции p2wpkh • p2sh-p2wpkh • Кодирование p2wpkh и p2sh-p2wpkh • Pay-to-Witness-Script-Hash (p2wsh) • p2sh-p2wsh • Кодирование p2wsh и p2sh-p2wsh • Другие улучшения • Заключение
Обсуждение
Код
Лицензия
Пошаговая книга / руководство по программированию биткойн-скрипта посвящен общественному достоянию.Используйте его как хотите, без каких-либо ограничений.
kristapsk / bitcoin-scripts: различные сценарии оболочки, в основном для использования вместе с кошельком Bitcoin Core (bitcoind или bitcoin-qt). Поддельный коинджойн, рикошет, проводник блоков клиник для бедняков.
Различные сценарии оболочки, в основном для использования вместе с кошельком Bitcoin Core (bitcoind или bitcoin-qt).
Зависимости:
Скриптыbash
,bitcoin-cli
(v0.15 или новее),awk
,bc
,jq
,sed
.используют биткойн JSON-RPC API, поэтому он должен быть включен в
bitcoin.conf
(server = 1
,rpcuser =
иrpcpassword =
settings).Выполнение каждого сценария без аргументов покажет использование. Большинство скриптов передают любые параметры, начинающиеся с тире в начале списка аргументов, непосредственно на
bitcoin-cli
(например,-testnet
или-rpcuser
).Ни один из скриптов не выполняет разблокировку кошелька самостоятельно, поэтому при использовании скриптов, отправляющих транзакции (
fake-coinjoin.sh
,ricochet-send.sh
), если ваш кошелек заблокирован (он должен быть в основной сети).
Скрипт Описание blockheightat.sh
Возвращает высоту последнего блока перед указанной датой / временем. checktransaction.sh
Отображает основную информацию о транзакциях Биткойн в удобочитаемой форме. сметаш
Звонки bitcoin-cli Estimatesmartfee
.fake-coinjoin.sh
Создает транзакцию, которая выглядит как транзакция CoinJoin, но все входные данные поступают, а выходы изменений фактически поступают в ваш собственный кошелек. Может быть полезно, если вы хотите отправить одинаковую сумму средств более чем одному получателю. listpossiblecjtxids.sh
Перечисляет txid транзакций в данном блоке, которые потенциально могут быть транзакциями CoinJoin.Обратите внимание, что он не анализирует вводимые суммы (так как без -txindex это сложно обойтись), поэтому, вероятно, будет выдано много ложных срабатываний. randbtc.sh
Выводит случайное количество BTC между двумя суммами, указанными в качестве аргументов. Круглые числа могут снизить вашу конфиденциальность. ricochet-send.sh
Реализует Ricochet Send, который добавляет дополнительные переходы между входом (ами) из вашего кошелька и местом назначения. рикошет-отправка.ш
Альтернативная реализация Ricochet Send, где вместо указания суммы для отправки вы указываете адрес источника, и все монеты с этого адреса отправляются. timetoblocks.sh
Преобразует удобочитаемую строку интервала времени в ожидаемое количество блоков биткойнов. whitepaper.sh
Извлекает PDF-файл оригинального документа Биткойн Сатоши Накамото из блокчейна Биткойн. Примеры
Отправить случайную сумму от 0.001 и 0,002 BTC с использованием поддельного коинджоина. Потребуется достаточно входов P2PKH с 5 или более подтверждениями в кошельке. Транзакция будет иметь два или более входа из вашего кошелька и два дополнительных выхода изменений, возвращающихся в ваш кошелек (в дополнение к получателям).
$ ./fake-coinjoin.sh $ (./ randbtc.sh 0,001 0,002) 1andreas3batLhQa2FawWjeyjCqyBzypd 3N6qaU3bnF43u4YTFKQf8usd3UqvyShovS
Отправить пожертвование 0,001 BTC с использованием рикошетной отправки с 5 переходами и 24-часовым подтверждением.
$ ./ricochet-send.sh 0,001 1andreas3batLhQa2FawWjeyjCqyBzypd 5 $ (./ sizesmartfee.sh $ (./ timetoblocks.sh "24 часа"))
Поддержка
Если вы найдете эти сценарии полезными, вы можете поддержать разработку, отправив немного биткойнов на адрес 3BGEw1eLeu1xrcRVogvHbqNqWWLtmB2BTM. Или воспользуйтесь ссылкой на tippin.me выше, чтобы получить подсказки через Lightning Network.
Script — Bitcoin Wiki
Биткойн использует систему сценариев для транзакций. Подобно четвертому, Скрипт прост, основан на стеке и обрабатывается слева направо.Он намеренно не является полным по Тьюрингу, без циклов.
Сценарий — это, по сути, список инструкций, записанных с каждой транзакцией, которые описывают, как следующий человек, желающий потратить передаваемые биткойны, может получить к ним доступ. Сценарий для типичного перевода биткойнов на биткойн-адрес назначения D просто обременяет будущие расходы биткойнов двумя вещами: спонсор должен предоставить
- открытый ключ, который при хешировании дает адрес назначения D, встроенный в сценарий, и
- подпись, подтверждающая право собственности на закрытый ключ, соответствующий только что предоставленному открытому ключу.
Сценарии обеспечивают гибкость для изменения параметров того, что необходимо для траты переданных биткойнов. Например, система сценариев может использоваться для запроса двух закрытых ключей или комбинации нескольких ключей, или даже без ключей.
Транзакция действительна, если ничто в объединенном сценарии не вызывает сбой и верхний элемент стека имеет значение Истина (ненулевое значение) при выходе из сценария. Сторона, которая первоначально отправила биткойнов, которые сейчас тратятся, диктует операции сценария, которые будут выполняться за последние , чтобы освободить их для использования в другой транзакции.Сторона, желающая потратить их, должна предоставить входные данные для ранее записанного сценария, в результате чего комбинированный сценарий завершает выполнение с истинным значением на вершине стека.
Этот документ предназначен только для информационных целей. Де-факто биткойн-скрипт определяется кодом, запускаемым сетью для проверки действительности блоков.
Стеки содержат байтовые векторы. При использовании в качестве чисел байтовые векторы интерпретируются как целые числа переменной длины с прямым порядком байтов, где старший бит определяет знак целого числа.Таким образом, 0x81 представляет -1. 0x80 — это еще одно представление нуля (так называемый отрицательный 0). Положительный 0 представлен вектором нулевой длины. Байтовые векторы интерпретируются как логические, где False представлено любым представлением нуля, а True представлено любым представлением ненулевого значения.
Начальные нули в целых числах и отрицательные нули разрешены в блоках, но отклоняются более строгими требованиями, которые стандартные полные узлы предъявляют к транзакциям перед их повторной передачей. Длина байтовых векторов в стеке не должна превышать 520 байтов.Коды операций, которые берут целые числа и логические значения из стека, требуют, чтобы они были не более 4 байтов в длину, но сложение и вычитание могут переполниться и привести к помещению в стек 5-байтового целого числа.
Коды операций
Это список всех слов сценария, также известных как коды операций, команды или функции.
Есть некоторые слова, которые существовали в очень ранних версиях Биткойна, но были удалены из опасения, что у клиента может быть ошибка в их реализации. Этот страх был вызван ошибкой, обнаруженной в OP_LSHIFT, которая могла привести к сбою любого узла Биткойн в случае эксплуатации, и другими ошибками, которые позволяли любому потратить чьи-либо биткойны.Удаленные коды операций иногда называют «отключенными», но это неправильное название, потому что абсолютно не может использовать для любого, кто использует Биткойн, чтобы использовать эти коды операций (их просто больше не существует, в протоколе), и также нет серьезных планов когда-либо снова включить все эти коды операций. Они перечислены здесь только для исторического интереса.
Новые коды операций могут быть добавлены с помощью тщательно разработанной и выполненной softfork с использованием OP_NOP1-OP_NOP10.
Ноль, отрицательный ноль (с использованием любого количества байтов) и пустой массив обрабатываются как ложные.Все остальное считается истиной.
Обозначение на этой странице
В таблицах ниже входы и выходы описаны элементами, как если бы они были помещены в стек в указанном порядке. Так, например, «x1 x2» указывает, что значение x1 помещается в стек, затем x2, так что x1 находится внизу стека, а x2 — вверху.
Константы
Говоря о скриптах, эти слова, определяющие значение, обычно опускаются.
Слово Код операциишестигранник Ввод Выход Описание OP_0, OP_FALSE 0 0x00 Ничего. (пустое значение) В стек помещается пустой массив байтов. (Это не бездействие: элемент добавляется в стек.) НЕТ 1-75 0x01-0x4b (специальный) данных Следующий код операции байт — это данные, которые нужно поместить в стек. OP_PUSHDATA1 76 0x4c (специальный) данных Следующий байт содержит количество байтов, помещаемых в стек. OP_PUSHDATA2 77 0x4d (специальный) данных Следующие два байта содержат количество байтов, которые должны быть помещены в стек в обратном порядке. OP_PUSHDATA4 78 0x4e (специальный) данных Следующие четыре байта содержат количество байтов, которые должны быть помещены в стек в обратном порядке. OP_1NEGATE 79 0x4f Ничего. -1 Число -1 помещается в стек. OP_1, OP_TRUE 81 0x51 Ничего. 1 Число 1 помещается в стек. OP_2-OP_16 82-96 0x52-0x60 Ничего. 2-16 Число в слове name (2-16) помещается в стек. Регулятор потока
Слово Код операциишестигранник Ввод Выход Описание OP_NOP 97 0x61 Ничего Ничего Ничего не делает. OP_IF 99 0x63 <выражение> if [операторы] [else [операторы]] * endif Если значение верхнего стека не равно False, инструкции выполняются. Значение верхнего стека удаляется. OP_NOTIF 100 0x64 <выражение> notif [операторы] [еще [операторы]] * endif Если значение верхнего стека равно False, операторы выполняются. Значение верхнего стека удаляется. OP_ELSE 103 0x67 <выражение> if [операторы] [else [операторы]] * endif Если предыдущие OP_IF, OP_NOTIF или OP_ELSE не были выполнены, то выполняются эти операторы, а если предыдущие OP_IF, OP_NOTIF или OP_ELSE были выполнены, то эти операторы не выполняются. OP_ENDIF 104 0x68 <выражение> if [операторы] [else [операторы]] * endif Завершает блок if / else.Все блоки должны завершиться, иначе транзакция недействительна . OP_ENDIF без OP_IF ранее также является недопустимым . OP_VERIFY 105 0x69 Верно / неверно ничего / сбой Помечает транзакцию как недопустимую. , если значение верхнего стека неверно. Значение верхнего стека удаляется. OP_RETURN 106 0x6a Ничего сбой Помечает транзакцию как недействительную .Начиная с биткойна 0.9, стандартный способ присоединения дополнительных данных к транзакциям — это добавление вывода с нулевым значением с помощью scriptPubKey, состоящего из OP_RETURN, за которым следуют данные. Доказуемо, что такие выходы нельзя расходовать, и они специально выбрасываются из хранилища в наборе UTXO, что снижает их стоимость для сети. Начиная с версии 0.12, стандартные правила ретрансляции допускают единственный выход с OP_RETURN, который содержит любую последовательность операторов push (или OP_RESERVED [1] ) после OP_RETURN при условии, что общая длина scriptPubKey составляет не более 83 байтов. Стек
Слово Код операциишестигранник Ввод Выход Описание OP_TOALTSTACK 107 0x6b x1 (альтернативный) x1 Помещает ввод в верхнюю часть стека alt. Удаляет его из основного стека. OP_FROMALTSTACK 108 0x6c (альтернативный) x1 x1 Помещает ввод в верхнюю часть основного стека.Удаляет его из стека альтернатив. OP_IFDUP 115 0x73 х х / х х Если значение верхнего стека не равно 0, продублируйте его. OP_DEPTH 116 0x74 Ничего <Размер стопки> Помещает количество элементов стека в стопку. OP_DROP 117 0x75 х Ничего Удаляет верхний элемент стопки. OP_DUP 118 0x76 х х х Дублирует верхний элемент стопки. OP_NIP 119 0x77 х1 х2 x2 Удаляет второй сверху элемент стека. OP_OVER 120 0x78 х1 х2 х1 х2 х1 Копирует элемент стека вторым наверху. OP_PICK 121 0x79 xn … x2 x1 x0 хн … х2 х1 х0 хн Элемент n обратно в стопку копируется наверх. OP_ROLL 122 0x7a xn … x2 x1 x0 … х2 х1 х0 хн Элемент n снова в стопке перемещается наверх. OP_ROT 123 0x7b х1 х2 х3 х2 х3 х1 Третий элемент в стопке перемещается наверх. OP_SWAP 124 0x7c х1 х2 х2 х1 Два верхних элемента в стопке меняются местами. OP_TUCK 125 0x7d х1 х2 х2 х1 х2 Элемент наверху стопки копируется и вставляется перед элементом, занимающим второе место сверху. OP_2DROP 109 0x6d х1 х2 Ничего Удаляет два верхних элемента стека. OP_2DUP 110 0x6e х1 х2 х1 х2 х1 х2 Дублирует два верхних элемента стека. OP_3DUP 111 0x6f х1 х2 х3 х1 х2 х3 х1 х2 х3 Дублирует три верхних элемента стека. OP_2OVER 112 0x70 х1 х2 х3 х4 х1 х2 х3 х4 х1 х2 Копирует пару элементов на два деления назад в стопке вперед. OP_2ROT 113 0x71 х1 х2 х3 х4 х5 х6 х3 х4 х5 х6 х1 х2 Пятый и шестой элементы назад перемещаются в верхнюю часть стопки. OP_2SWAP 114 0x72 х1 х2 х3 х4 х3 х4 х1 х2 Меняет местами две верхние пары элементов. Соединение
Если в сценарии присутствует какой-либо код операции, помеченный как отключенный, он должен прерваться и завершиться ошибкой.
Слово Код операциишестигранник Ввод Выход Описание OP_CAT 126 0x7e х1 х2 из Объединяет две строки. отключен. OP_SUBSTR 127 0x7f в начальном размере из Возвращает часть строки. отключен. OP_LEFT 128 0x80 по размеру из Сохраняет только символы слева от указанной точки в строке. отключен. OP_RIGHT 129 0x81 по размеру из Сохраняет только символы справа от указанной точки в строке. отключен. OP_SIZE 130 0x82 дюйм по размеру Выдвигает длину строки верхнего элемента стека (не выталкивая его). Побитовая логика
Если в сценарии присутствует какой-либо код операции, помеченный как отключенный, он должен прерваться и завершиться ошибкой.
Слово Код операциишестигранник Ввод Выход Описание OP_INVERT 131 0x83 дюйм из Инвертирует все биты на входе. отключен. OP_AND 132 0x84 х1 х2 из Boolean и между каждым битом на входах. отключен. OP_OR 133 0x85 х1 х2 из Boolean или между каждым битом на входах. отключен. OP_XOR 134 0x86 х1 х2 из Boolean исключающее или между каждым битом на входах. отключен. OP_EQUAL 135 0x87 х1 х2 Верно / неверно Возвращает 1, если входы в точности равны, в противном случае — 0. OP_EQUALVERIFY 136 0x88 х1 х2 ничего / сбой То же, что OP_EQUAL, но потом запускает OP_VERIFY. Арифметика
Примечание. Арифметические вводы ограничены 32-разрядными целыми числами со знаком, но могут выходить за пределы их вывода.
Если любое входное значение для любой из этих команд превышает 4 байта, сценарий должен прерваться и завершиться ошибкой. Если какой-либо код операции, помеченный как отключен , присутствует в сценарии, он также должен прерваться и завершиться ошибкой.
Слово Код операциишестигранник Ввод Выход Описание OP_1ADD 139 0x8b дюйм из На вход добавляется1. OP_1SUB 140 0x8c дюйм из 1 вычитается из ввода. ОП_2МУЛ 141 0x8d дюйм из Ввод умножается на 2. отключен. OP_2DIV 142 0x8e дюйм из Вход делится на 2. отключено. OP_NEGATE 143 0x8f дюйм из Знак ввода перевернут. OP_ABS 144 0x90 дюйм из Вход сделан положительным. OP_NOT 145 0x91 дюйм из Если на входе 0 или 1, он переворачивается. В противном случае на выходе будет 0. OP_0NOTEQUAL 146 0x92 дюйм из Возвращает 0, если на входе 0. 1 в противном случае. OP_ADD 147 0x93 а б из a добавлен к b. OP_SUB 148 0x94 а б из b вычитается из a. OP_MUL 149 0x95 а б из а умножается на b. отключен. OP_DIV 150 0x96 а б из a делится на b. отключен. OP_MOD 151 0x97 а б из Возвращает остаток от деления a на b. отключен. OP_LSHIFT 152 0x98 а б из Сдвигает a влево на b бит, сохраняя знак. отключен. OP_RSHIFT 153 0x99 а б из Сдвигает a вправо на b бит, сохраняя знак. отключен. OP_BOOLAND 154 0x9a а б из Если и a, и b не равны 0, на выходе будет 1.В противном случае 0. OP_BOOLOR 155 0x9b а б из Если a или b не равны 0, на выходе будет 1. В противном случае — 0. OP_NUMEQUAL 156 0x9c а б из Возвращает 1, если числа равны, 0 в противном случае. OP_NUMEQUALVERIFY 157 0x9d а б ничего / сбой То же, что OP_NUMEQUAL, но потом запускает OP_VERIFY. OP_NUMNOTEQUAL 158 0x9e а б из Возвращает 1, если числа не равны, в противном случае — 0. OP_LESSTHAN 159 0x9f а б из Возвращает 1, если a меньше b, в противном случае — 0. OP_GREATERTHAN 160 0xa0 а б из Возвращает 1, если a больше, чем b, в противном случае — 0. OP_LESSTHANOREQUAL 161 0xa1 а б из Возвращает 1, если a меньше или равно b, в противном случае — 0. OP_GREATERTHANOREQUAL 162 0xa2 а б из Возвращает 1, если a больше или равно b, в противном случае — 0. OP_MIN 163 0xa3 а б из Возвращает меньшее из значений a и b. OP_MAX 164 0xa4 а б из Возвращает большее из значений a и b. OP_WITHIN 165 0xa5 x мин. Макс. из Возвращает 1, если x находится в пределах указанного диапазона (включительно слева), в противном случае — 0. Крипто
Слово Код операциишестигранник Ввод Выход Описание OP_RIPEMD160 166 0xa6 дюйм хеш Входные данные хешируются с помощью RIPEMD-160. OP_SHA1 167 0xa7 дюйм хеш Входные данные хешируются с использованием SHA-1. OP_SHA256 168 0xa8 дюйм хеш Входные данные хешируются с использованием SHA-256. ОП_ХАШ260 169 0xa9 дюйм хеш Входные данные хешируются дважды: сначала с помощью SHA-256, а затем с помощью RIPEMD-160. ОП_ХАШ356 170 0xaa дюйм хеш Вход дважды хешируется с помощью SHA-256. OP_CODESEPARATOR 171 0xab Ничего Ничего Все слова проверки подписи будут сопоставлять подписи с данными только после последнего выполненного OP_CODESEPARATOR. OP_CHECKSIG 172 0xac sig pubkey Верно / неверно Хешируются все выходы, входы и сценарий транзакции (от последнего выполненного OP_CODESEPARATOR до конца).Подпись, используемая OP_CHECKSIG, должна быть действительной подписью для этого хэша и открытого ключа. Если это так, возвращается 1, в противном случае — 0. OP_CHECKSIGVERIFY 173 0xad sig pubkey ничего / сбой То же, что OP_CHECKSIG, но OP_VERIFY выполняется позже. OP_CHECKMULTISIG 174 0xae x sig1 sig2 … <количество подписей> pub1 pub2 <количество открытых ключей> Верно / Неверно Сравнивает первую подпись с каждым открытым ключом, пока не найдет совпадение ECDSA.Начиная с последующего открытого ключа, он сравнивает вторую подпись с каждым оставшимся открытым ключом, пока не найдет совпадение ECDSA. Процесс повторяется до тех пор, пока все подписи не будут проверены или пока не останется достаточно открытых ключей для получения успешного результата. Все подписи должны соответствовать публичному ключу. Поскольку открытые ключи не проверяются снова, если они не проходят какое-либо сравнение подписей, подписи должны быть помещены в scriptSig в том же порядке, в котором их соответствующие открытые ключи были помещены в scriptPubKey или redeemScript.Если все подписи действительны, возвращается 1, в противном случае — 0. Из-за ошибки из стека удаляется одно лишнее неиспользованное значение. OP_CHECKMULTISIGVERIFY 175 0xaf x sig1 sig2 … <количество подписей> pub1 pub2 … <количество открытых ключей> ничего / сбой То же, что OP_CHECKMULTISIG, но OP_VERIFY выполняется позже. Locktime
Слово Код операциишестигранник Ввод Выход Описание OP_CHECKLOCKTIMEVERIFY (ранее OP_NOP2) 177 0xb1 х x / сбой Помечает транзакцию как недопустимую. , если верхний элемент стека больше, чем поле nLockTime транзакции, в противном случае оценка сценария продолжается, как если бы был выполнен OP_NOP.Транзакция также недействительна, если 1. стек пуст; или 2. верхний элемент стека отрицательный; или 3. элемент верхнего стека больше или равен 500000000, в то время как поле транзакции nLockTime меньше 500000000, или наоборот; или 4. входное поле nSequence равно 0xffffffff. Точная семантика описана в BIP 0065. OP_CHECKSEQUENCEVERIFY (ранее OP_NOP3) 178 0xb2 х x / сбой Помечает транзакцию как недопустимую. , если относительное время блокировки ввода (принудительно выполняемое BIP 0068 с nSequence) не равно или больше, чем значение верхнего элемента стека.Точная семантика описана в BIP 0112. Псевдослова
Эти слова используются внутри компании для помощи в сопоставлении транзакций. Они недействительны, если используются в реальных сценариях.
Слово Код операциишестигранник Описание OP_PUBKEYHASH 253 0xfd Представляет открытый ключ, хешированный с OP_HASh260. OP_PUBKEY 254 0xfe Представляет открытый ключ, совместимый с OP_CHECKSIG. OP_INVALIDOPCODE 255 0xff Соответствует любому еще не назначенному коду операции. Зарезервированные слова
Любой не назначенный код операции также зарезервирован. Использование неназначенного кода операции делает транзакцию недействительной .
Слово Код операциишестигранник При использовании … OP_RESERVED 80 0x50 Транзакция недействительна , если не происходит в невыполненной ветви OP_IF OP_VER 98 0x62 Транзакция недействительна , если не происходит в невыполненной ветви OP_IF OP_VERIF 101 0x65 Транзакция недействительна даже в невыполненной ветви OP_IF OP_VERNOTIF 102 0x66 Транзакция недействительна даже в невыполненной ветви OP_IF OP_RESERVED1 137 0x89 Транзакция недействительна , если не происходит в невыполненной ветви OP_IF OP_RESERVED2 138 0x8a Транзакция недействительна , если не происходит в невыполненной ветви OP_IF OP_NOP1, OP_NOP4-OP_NOP10 176, 179–185 0xb0, 0xb3-0xb9 Слово игнорируется.Не отмечает транзакцию как недействительную. Примеры скриптов
Ниже приводится список интересных скриптов. При записи скриптов данные, которые должны быть помещены в стек, обычно заключаются в угловые скобки. и команды передачи данных опущены. Слова без квадратных скобок — это коды операций. Эти примеры включают префикс «OP_», но его можно опустить. Таким образом «
OP_2 OP_CHECKMULTISIG» может быть сокращено до « 2 CHECKMULTISIG».Обратите внимание, что существует небольшое количество стандартных форм сценария, которые ретранслируются от узла к узлу; нестандартные скрипты принимаются, если они находятся в блоке, но узлы не будут их ретранслировать. Стандартная транзакция на биткойн-адрес (pay-to-pubkey-hash)
scriptPubKey: OP_DUP OP_HASh260OP_EQUALVERIFY OP_CHECKSIG scriptSig: Чтобы продемонстрировать, как скрипты выглядят в сети, вот необработанный scriptPubKey:
76 A9 14 OP_DUP OP_HASh260 Байт для отправки 89 AB CD EF AB BA AB BA AB BA AB BA AB BA AB BA AB BA AB BA 88 AC Данные для отправки OP_EQUALVERIFY OP_CHECKSIGПримечание: scriptSig находится на входе транзакции расходования, а scriptPubKey находится на выходе ранее неизрасходованного i.е. «доступная» транзакция.
Вот как обрабатывается каждое слово:
Стек Скрипт Описание Пусто. OP_DUP OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG scriptSig и scriptPubKey объединены. OP_DUP OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG Константы добавлены в стек. OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG Дублирован элемент верхнего стека. OP_EQUALVERIFY OP_CHECKSIG Элемент верхнего стека хешируется. OP_EQUALVERIFY OP_CHECKSIG Константа добавлена. OP_CHECKSIG Проверяется равенство между двумя верхними элементами стека. правда Пусто. Подпись проверяется для двух верхних элементов стека. Устаревшая транзакция pay-to-pubkey
OP_CHECKSIG используется напрямую, без предварительного хеширования открытого ключа. Это использовалось в ранних версиях Биткойна, где люди платили напрямую на IP-адреса, до того, как были введены адреса Биткойн.scriptPubKeys этой формы транзакции по-прежнему распознаются Bitcoin Core как платежи пользователю. Недостатком этой формы транзакции является то, что весь открытый ключ должен быть известен заранее, что подразумевает более длинные платежные адреса, и что он обеспечивает меньшую защиту в случае сбоя в алгоритме подписи ECDSA.
scriptPubKey:OP_CHECKSIG scriptSig: Процесс проверки:
Стек Скрипт Описание Пусто. OP_CHECKSIG scriptSig и scriptPubKey объединены. OP_CHECKSIG Константы добавлены в стек. правда Пусто. Подпись проверяется для двух верхних элементов стека. Выводы, которые можно не расходовать / сократить
Стандартный способ пометить транзакцию как доказуемо невозможную — использовать scriptPubKey следующей формы:
scriptPubKey: OP_RETURN {ноль или более операций}OP_RETURN немедленно помечает сценарий как недопустимый, гарантируя, что не существует scriptSig, который мог бы использовать этот вывод.Таким образом, вывод может быть немедленно удален из набора UTXO, даже если он не был потрачен. eb31ca1a4cbd97c2770983164d7560d2d03276ae1aee26f12d7c2c6424252f29 является примером: он имеет единственный выход с нулевым значением, что дает полную комиссию 0,125 BTC майнеру, который майнил транзакцию, без добавления записи в набор UTXO. Вы также можете использовать OP_RETURN для добавления данных в транзакцию без того, чтобы данные когда-либо появлялись в наборе UTXO, как показано в 1a2e22a717d626fc5db363582007c46924ae6b28319f07cb1b
6bd8293fc; P2Pool делает это с помощью хэша txout цепочки общих ресурсов в базе блоков, которые он создает.
Замораживание средств на будущее
Используя OP_CHECKLOCKTIMEVERIFY, можно сделать средства доказуемо неизрасходованными до определенного момента в будущем.
scriptPubKey: <время истечения срока действия> OP_CHECKLOCKTIMEVERIFY OP_DROP OP_DUP OP_HASh260OP_EQUALVERIFY OP_CHECKSIG scriptSig:
Стек Скрипт Описание Пусто. <время истечения срока действия> OP_CHECKLOCKTIMEVERIFY OP_DROP OP_DUP OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG scriptSig и scriptPubKey объединены. <срок действия> OP_CHECKLOCKTIMEVERIFY OP_DROP OP_DUP OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG Константы добавлены в стек. <срок действия> OP_DROP OP_DUP OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG Элемент верхнего стека проверяется на текущее время или высоту блока. OP_DUP OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG Элемент верхнего стека удален. OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG Дублирован элемент верхнего стека. OP_EQUALVERIFY OP_CHECKSIG Элемент верхнего стека хешируется. OP_EQUALVERIFY OP_CHECKSIG Константа добавлена. OP_CHECKSIG Проверяется равенство между двумя верхними элементами стека. правда Пусто. Подпись проверяется для двух верхних элементов стека. Загадка транзакции
Транзакция a4bfa8ab6435ae5f25dae9d89e4eb67dfaca751f393c1ddc5a837bbc31b — интересная головоломка.
scriptPubKey: OP_HASh356 6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d61000000 OP_EQUAL scriptSig:
Чтобы провести транзакцию, вам нужно придумать некоторые данные, такие, что двойное хеширование данных приводит к получению данного хеша.
Стек Скрипт Описание Пусто. <данные> OP_HASh356 OP_EQUAL <данные> OP_HASh356 OP_EQUAL scriptSig добавлен в стек. OP_EQUAL Данные хешируются. OP_EQUAL Данный хэш помещается в стек. правда Пусто. Хеши сравниваются, в стеке остается истина. Эту транзакцию успешно провел 09f691b2263260e71f363d1db51ff3100d285956a40cc0e4f8c8c2c4a80559b1. Необходимые данные оказались блоком Genesis, а данный хэш в скрипте был заголовком блока Genesis, дважды хешированным с помощью SHA-256. Обратите внимание, что, хотя такие транзакции забавны, они небезопасны, потому что они не содержат никаких подписей, и поэтому любая транзакция, пытающаяся их потратить, может быть заменена другой транзакцией, отправляющей средства в другое место.
Стимулируемое обнаружение хэш-коллизий
В 2013 году Питер Тодд создал скрипты, которые возвращают истину при обнаружении хеш-коллизии. На биткойн-адреса, полученные из этих скриптов, могут быть отправлены деньги. Если кто-то обнаруживает хэш-коллизию, он может потратить биткойны на этот адрес, поэтому такая настройка действует как стимул для кого-то сделать это.
Например, сценарий SHA1:
scriptPubKey: OP_2DUP OP_EQUAL OP_NOT OP_VERIFY OP_SHA1 OP_SWAP OP_SHA1 OP_EQUAL scriptSig:Подробнее см. Ветку bitcointalk [2] и ветку reddit [3] .
В феврале 2017 года было заявлено вознаграждение SHA1 в размере 2,48 биткойнов.
См. Также
Внешние ссылки
- [2] — Минискрипт: язык для написания (подмножества) скриптов Биткойн структурированным способом, обеспечивающий анализ, составление, общее подписывание и многое другое.
- Bitcoin IDE — Биткойн-скрипт для чайников
- Выполнение сценария отладки биткойнов — веб-инструмент, который выполняет код операции сценария по коду операции
- Площадка для скриптов — преобразование скриптов в JavaScript
- BitAuth IDE — интегрированная среда разработки для аутентификации биткойнов
(см.«Онлайн-симулятор биткойн-скрипта или отладчик?»)
Список литературы
Script — Bitcoin Wiki
Биткойн использует систему сценариев для транзакций. Подобно четвертому, Скрипт прост, основан на стеке и обрабатывается слева направо. Он намеренно не является полным по Тьюрингу, без циклов.
Сценарий — это, по сути, список инструкций, записанных с каждой транзакцией, которые описывают, как следующий человек, желающий потратить передаваемые биткойны, может получить к ним доступ.Сценарий для типичного перевода биткойнов на биткойн-адрес назначения D просто обременяет будущие расходы биткойнов двумя вещами: спонсор должен предоставить
- открытый ключ, который при хешировании дает адрес назначения D, встроенный в сценарий, и
- подпись, подтверждающая право собственности на закрытый ключ, соответствующий только что предоставленному открытому ключу.
Сценарии обеспечивают гибкость для изменения параметров того, что необходимо для траты переданных биткойнов.Например, система сценариев может использоваться для запроса двух закрытых ключей или комбинации нескольких ключей, или даже без ключей.
Транзакция действительна, если ничто в объединенном сценарии не вызывает сбой и верхний элемент стека имеет значение Истина (ненулевое значение) при выходе из сценария. Сторона, которая первоначально отправила биткойнов, которые сейчас тратятся, диктует операции сценария, которые будут выполняться за последние , чтобы освободить их для использования в другой транзакции. Сторона, желающая потратить их, должна предоставить входные данные для ранее записанного сценария, в результате чего комбинированный сценарий завершает выполнение с истинным значением на вершине стека.
Этот документ предназначен только для информационных целей. Де-факто биткойн-скрипт определяется кодом, запускаемым сетью для проверки действительности блоков.
Стеки содержат байтовые векторы. При использовании в качестве чисел байтовые векторы интерпретируются как целые числа переменной длины с прямым порядком байтов, где старший бит определяет знак целого числа. Таким образом, 0x81 представляет -1. 0x80 — это еще одно представление нуля (так называемый отрицательный 0). Положительный 0 представлен вектором нулевой длины.Байтовые векторы интерпретируются как логические, где False представлено любым представлением нуля, а True представлено любым представлением ненулевого значения.
Начальные нули в целых числах и отрицательные нули разрешены в блоках, но отклоняются более строгими требованиями, которые стандартные полные узлы предъявляют к транзакциям перед их повторной передачей. Длина байтовых векторов в стеке не должна превышать 520 байтов. Коды операций, которые берут целые числа и логические значения из стека, требуют, чтобы они были не более 4 байтов в длину, но сложение и вычитание могут переполниться и привести к помещению в стек 5-байтового целого числа.
Коды операций
Это список всех слов сценария, также известных как коды операций, команды или функции.
Есть некоторые слова, которые существовали в очень ранних версиях Биткойна, но были удалены из опасения, что у клиента может быть ошибка в их реализации. Этот страх был вызван ошибкой, обнаруженной в OP_LSHIFT, которая могла привести к сбою любого узла Биткойн в случае эксплуатации, и другими ошибками, которые позволяли любому потратить чьи-либо биткойны. Удаленные коды операций иногда называют «отключенными», но это неправильное название, потому что абсолютно не может использовать для любого, кто использует Биткойн, чтобы использовать эти коды операций (их просто больше не существует, в протоколе), и также нет серьезных планов когда-либо снова включить все эти коды операций.Они перечислены здесь только для исторического интереса.
Новые коды операций могут быть добавлены с помощью тщательно разработанной и выполненной softfork с использованием OP_NOP1-OP_NOP10.
Ноль, отрицательный ноль (с использованием любого количества байтов) и пустой массив обрабатываются как ложные. Все остальное считается истиной.
Обозначение на этой странице
В таблицах ниже входы и выходы описаны элементами, как если бы они были помещены в стек в указанном порядке. Так, например, «x1 x2» указывает, что значение x1 помещается в стек, затем x2, так что x1 находится внизу стека, а x2 — вверху.
Константы
Говоря о скриптах, эти слова, определяющие значение, обычно опускаются.
Слово Код операциишестигранник Ввод Выход Описание OP_0, OP_FALSE 0 0x00 Ничего. (пустое значение) В стек помещается пустой массив байтов. (Это не бездействие: элемент добавляется в стек.) НЕТ 1-75 0x01-0x4b (специальный) данных Следующий код операции байт — это данные, которые нужно поместить в стек. OP_PUSHDATA1 76 0x4c (специальный) данных Следующий байт содержит количество байтов, помещаемых в стек. OP_PUSHDATA2 77 0x4d (специальный) данных Следующие два байта содержат количество байтов, которые должны быть помещены в стек в обратном порядке. OP_PUSHDATA4 78 0x4e (специальный) данных Следующие четыре байта содержат количество байтов, которые должны быть помещены в стек в обратном порядке. OP_1NEGATE 79 0x4f Ничего. -1 Число -1 помещается в стек. OP_1, OP_TRUE 81 0x51 Ничего. 1 Число 1 помещается в стек. OP_2-OP_16 82-96 0x52-0x60 Ничего. 2-16 Число в слове name (2-16) помещается в стек. Регулятор потока
Слово Код операциишестигранник Ввод Выход Описание OP_NOP 97 0x61 Ничего Ничего Ничего не делает. OP_IF 99 0x63 <выражение> if [операторы] [else [операторы]] * endif Если значение верхнего стека не равно False, инструкции выполняются. Значение верхнего стека удаляется. OP_NOTIF 100 0x64 <выражение> notif [операторы] [еще [операторы]] * endif Если значение верхнего стека равно False, операторы выполняются. Значение верхнего стека удаляется. OP_ELSE 103 0x67 <выражение> if [операторы] [else [операторы]] * endif Если предыдущие OP_IF, OP_NOTIF или OP_ELSE не были выполнены, то выполняются эти операторы, а если предыдущие OP_IF, OP_NOTIF или OP_ELSE были выполнены, то эти операторы не выполняются. OP_ENDIF 104 0x68 <выражение> if [операторы] [else [операторы]] * endif Завершает блок if / else.Все блоки должны завершиться, иначе транзакция недействительна . OP_ENDIF без OP_IF ранее также является недопустимым . OP_VERIFY 105 0x69 Верно / неверно ничего / сбой Помечает транзакцию как недопустимую. , если значение верхнего стека неверно. Значение верхнего стека удаляется. OP_RETURN 106 0x6a Ничего сбой Помечает транзакцию как недействительную .Начиная с биткойна 0.9, стандартный способ присоединения дополнительных данных к транзакциям — это добавление вывода с нулевым значением с помощью scriptPubKey, состоящего из OP_RETURN, за которым следуют данные. Доказуемо, что такие выходы нельзя расходовать, и они специально выбрасываются из хранилища в наборе UTXO, что снижает их стоимость для сети. Начиная с версии 0.12, стандартные правила ретрансляции допускают единственный выход с OP_RETURN, который содержит любую последовательность операторов push (или OP_RESERVED [1] ) после OP_RETURN при условии, что общая длина scriptPubKey составляет не более 83 байтов. Стек
Слово Код операциишестигранник Ввод Выход Описание OP_TOALTSTACK 107 0x6b x1 (альтернативный) x1 Помещает ввод в верхнюю часть стека alt. Удаляет его из основного стека. OP_FROMALTSTACK 108 0x6c (альтернативный) x1 x1 Помещает ввод в верхнюю часть основного стека.Удаляет его из стека альтернатив. OP_IFDUP 115 0x73 х х / х х Если значение верхнего стека не равно 0, продублируйте его. OP_DEPTH 116 0x74 Ничего <Размер стопки> Помещает количество элементов стека в стопку. OP_DROP 117 0x75 х Ничего Удаляет верхний элемент стопки. OP_DUP 118 0x76 х х х Дублирует верхний элемент стопки. OP_NIP 119 0x77 х1 х2 x2 Удаляет второй сверху элемент стека. OP_OVER 120 0x78 х1 х2 х1 х2 х1 Копирует элемент стека вторым наверху. OP_PICK 121 0x79 xn … x2 x1 x0 хн … х2 х1 х0 хн Элемент n обратно в стопку копируется наверх. OP_ROLL 122 0x7a xn … x2 x1 x0 … х2 х1 х0 хн Элемент n снова в стопке перемещается наверх. OP_ROT 123 0x7b х1 х2 х3 х2 х3 х1 Третий элемент в стопке перемещается наверх. OP_SWAP 124 0x7c х1 х2 х2 х1 Два верхних элемента в стопке меняются местами. OP_TUCK 125 0x7d х1 х2 х2 х1 х2 Элемент наверху стопки копируется и вставляется перед элементом, занимающим второе место сверху. OP_2DROP 109 0x6d х1 х2 Ничего Удаляет два верхних элемента стека. OP_2DUP 110 0x6e х1 х2 х1 х2 х1 х2 Дублирует два верхних элемента стека. OP_3DUP 111 0x6f х1 х2 х3 х1 х2 х3 х1 х2 х3 Дублирует три верхних элемента стека. OP_2OVER 112 0x70 х1 х2 х3 х4 х1 х2 х3 х4 х1 х2 Копирует пару элементов на два деления назад в стопке вперед. OP_2ROT 113 0x71 х1 х2 х3 х4 х5 х6 х3 х4 х5 х6 х1 х2 Пятый и шестой элементы назад перемещаются в верхнюю часть стопки. OP_2SWAP 114 0x72 х1 х2 х3 х4 х3 х4 х1 х2 Меняет местами две верхние пары элементов. Соединение
Если в сценарии присутствует какой-либо код операции, помеченный как отключенный, он должен прерваться и завершиться ошибкой.
Слово Код операциишестигранник Ввод Выход Описание OP_CAT 126 0x7e х1 х2 из Объединяет две строки. отключен. OP_SUBSTR 127 0x7f в начальном размере из Возвращает часть строки. отключен. OP_LEFT 128 0x80 по размеру из Сохраняет только символы слева от указанной точки в строке. отключен. OP_RIGHT 129 0x81 по размеру из Сохраняет только символы справа от указанной точки в строке. отключен. OP_SIZE 130 0x82 дюйм по размеру Выдвигает длину строки верхнего элемента стека (не выталкивая его). Побитовая логика
Если в сценарии присутствует какой-либо код операции, помеченный как отключенный, он должен прерваться и завершиться ошибкой.
Слово Код операциишестигранник Ввод Выход Описание OP_INVERT 131 0x83 дюйм из Инвертирует все биты на входе. отключен. OP_AND 132 0x84 х1 х2 из Boolean и между каждым битом на входах. отключен. OP_OR 133 0x85 х1 х2 из Boolean или между каждым битом на входах. отключен. OP_XOR 134 0x86 х1 х2 из Boolean исключающее или между каждым битом на входах. отключен. OP_EQUAL 135 0x87 х1 х2 Верно / неверно Возвращает 1, если входы в точности равны, в противном случае — 0. OP_EQUALVERIFY 136 0x88 х1 х2 ничего / сбой То же, что OP_EQUAL, но потом запускает OP_VERIFY. Арифметика
Примечание. Арифметические вводы ограничены 32-разрядными целыми числами со знаком, но могут выходить за пределы их вывода.
Если любое входное значение для любой из этих команд превышает 4 байта, сценарий должен прерваться и завершиться ошибкой. Если какой-либо код операции, помеченный как отключен , присутствует в сценарии, он также должен прерваться и завершиться ошибкой.
Слово Код операциишестигранник Ввод Выход Описание OP_1ADD 139 0x8b дюйм из На вход добавляется1. OP_1SUB 140 0x8c дюйм из 1 вычитается из ввода. ОП_2МУЛ 141 0x8d дюйм из Ввод умножается на 2. отключен. OP_2DIV 142 0x8e дюйм из Вход делится на 2. отключено. OP_NEGATE 143 0x8f дюйм из Знак ввода перевернут. OP_ABS 144 0x90 дюйм из Вход сделан положительным. OP_NOT 145 0x91 дюйм из Если на входе 0 или 1, он переворачивается. В противном случае на выходе будет 0. OP_0NOTEQUAL 146 0x92 дюйм из Возвращает 0, если на входе 0. 1 в противном случае. OP_ADD 147 0x93 а б из a добавлен к b. OP_SUB 148 0x94 а б из b вычитается из a. OP_MUL 149 0x95 а б из а умножается на b. отключен. OP_DIV 150 0x96 а б из a делится на b. отключен. OP_MOD 151 0x97 а б из Возвращает остаток от деления a на b. отключен. OP_LSHIFT 152 0x98 а б из Сдвигает a влево на b бит, сохраняя знак. отключен. OP_RSHIFT 153 0x99 а б из Сдвигает a вправо на b бит, сохраняя знак. отключен. OP_BOOLAND 154 0x9a а б из Если и a, и b не равны 0, на выходе будет 1.В противном случае 0. OP_BOOLOR 155 0x9b а б из Если a или b не равны 0, на выходе будет 1. В противном случае — 0. OP_NUMEQUAL 156 0x9c а б из Возвращает 1, если числа равны, 0 в противном случае. OP_NUMEQUALVERIFY 157 0x9d а б ничего / сбой То же, что OP_NUMEQUAL, но потом запускает OP_VERIFY. OP_NUMNOTEQUAL 158 0x9e а б из Возвращает 1, если числа не равны, в противном случае — 0. OP_LESSTHAN 159 0x9f а б из Возвращает 1, если a меньше b, в противном случае — 0. OP_GREATERTHAN 160 0xa0 а б из Возвращает 1, если a больше, чем b, в противном случае — 0. OP_LESSTHANOREQUAL 161 0xa1 а б из Возвращает 1, если a меньше или равно b, в противном случае — 0. OP_GREATERTHANOREQUAL 162 0xa2 а б из Возвращает 1, если a больше или равно b, в противном случае — 0. OP_MIN 163 0xa3 а б из Возвращает меньшее из значений a и b. OP_MAX 164 0xa4 а б из Возвращает большее из значений a и b. OP_WITHIN 165 0xa5 x мин. Макс. из Возвращает 1, если x находится в пределах указанного диапазона (включительно слева), в противном случае — 0. Крипто
Слово Код операциишестигранник Ввод Выход Описание OP_RIPEMD160 166 0xa6 дюйм хеш Входные данные хешируются с помощью RIPEMD-160. OP_SHA1 167 0xa7 дюйм хеш Входные данные хешируются с использованием SHA-1. OP_SHA256 168 0xa8 дюйм хеш Входные данные хешируются с использованием SHA-256. ОП_ХАШ260 169 0xa9 дюйм хеш Входные данные хешируются дважды: сначала с помощью SHA-256, а затем с помощью RIPEMD-160. ОП_ХАШ356 170 0xaa дюйм хеш Вход дважды хешируется с помощью SHA-256. OP_CODESEPARATOR 171 0xab Ничего Ничего Все слова проверки подписи будут сопоставлять подписи с данными только после последнего выполненного OP_CODESEPARATOR. OP_CHECKSIG 172 0xac sig pubkey Верно / неверно Хешируются все выходы, входы и сценарий транзакции (от последнего выполненного OP_CODESEPARATOR до конца).Подпись, используемая OP_CHECKSIG, должна быть действительной подписью для этого хэша и открытого ключа. Если это так, возвращается 1, в противном случае — 0. OP_CHECKSIGVERIFY 173 0xad sig pubkey ничего / сбой То же, что OP_CHECKSIG, но OP_VERIFY выполняется позже. OP_CHECKMULTISIG 174 0xae x sig1 sig2 … <количество подписей> pub1 pub2 <количество открытых ключей> Верно / Неверно Сравнивает первую подпись с каждым открытым ключом, пока не найдет совпадение ECDSA.Начиная с последующего открытого ключа, он сравнивает вторую подпись с каждым оставшимся открытым ключом, пока не найдет совпадение ECDSA. Процесс повторяется до тех пор, пока все подписи не будут проверены или пока не останется достаточно открытых ключей для получения успешного результата. Все подписи должны соответствовать публичному ключу. Поскольку открытые ключи не проверяются снова, если они не проходят какое-либо сравнение подписей, подписи должны быть помещены в scriptSig в том же порядке, в котором их соответствующие открытые ключи были помещены в scriptPubKey или redeemScript.Если все подписи действительны, возвращается 1, в противном случае — 0. Из-за ошибки из стека удаляется одно лишнее неиспользованное значение. OP_CHECKMULTISIGVERIFY 175 0xaf x sig1 sig2 … <количество подписей> pub1 pub2 … <количество открытых ключей> ничего / сбой То же, что OP_CHECKMULTISIG, но OP_VERIFY выполняется позже. Locktime
Слово Код операциишестигранник Ввод Выход Описание OP_CHECKLOCKTIMEVERIFY (ранее OP_NOP2) 177 0xb1 х x / сбой Помечает транзакцию как недопустимую. , если верхний элемент стека больше, чем поле nLockTime транзакции, в противном случае оценка сценария продолжается, как если бы был выполнен OP_NOP.Транзакция также недействительна, если 1. стек пуст; или 2. верхний элемент стека отрицательный; или 3. элемент верхнего стека больше или равен 500000000, в то время как поле транзакции nLockTime меньше 500000000, или наоборот; или 4. входное поле nSequence равно 0xffffffff. Точная семантика описана в BIP 0065. OP_CHECKSEQUENCEVERIFY (ранее OP_NOP3) 178 0xb2 х x / сбой Помечает транзакцию как недопустимую. , если относительное время блокировки ввода (принудительно выполняемое BIP 0068 с nSequence) не равно или больше, чем значение верхнего элемента стека.Точная семантика описана в BIP 0112. Псевдослова
Эти слова используются внутри компании для помощи в сопоставлении транзакций. Они недействительны, если используются в реальных сценариях.
Слово Код операциишестигранник Описание OP_PUBKEYHASH 253 0xfd Представляет открытый ключ, хешированный с OP_HASh260. OP_PUBKEY 254 0xfe Представляет открытый ключ, совместимый с OP_CHECKSIG. OP_INVALIDOPCODE 255 0xff Соответствует любому еще не назначенному коду операции. Зарезервированные слова
Любой не назначенный код операции также зарезервирован. Использование неназначенного кода операции делает транзакцию недействительной .
Слово Код операциишестигранник При использовании … OP_RESERVED 80 0x50 Транзакция недействительна , если не происходит в невыполненной ветви OP_IF OP_VER 98 0x62 Транзакция недействительна , если не происходит в невыполненной ветви OP_IF OP_VERIF 101 0x65 Транзакция недействительна даже в невыполненной ветви OP_IF OP_VERNOTIF 102 0x66 Транзакция недействительна даже в невыполненной ветви OP_IF OP_RESERVED1 137 0x89 Транзакция недействительна , если не происходит в невыполненной ветви OP_IF OP_RESERVED2 138 0x8a Транзакция недействительна , если не происходит в невыполненной ветви OP_IF OP_NOP1, OP_NOP4-OP_NOP10 176, 179–185 0xb0, 0xb3-0xb9 Слово игнорируется.Не отмечает транзакцию как недействительную. Примеры скриптов
Ниже приводится список интересных скриптов. При записи скриптов данные, которые должны быть помещены в стек, обычно заключаются в угловые скобки. и команды передачи данных опущены. Слова без квадратных скобок — это коды операций. Эти примеры включают префикс «OP_», но его можно опустить. Таким образом «
OP_2 OP_CHECKMULTISIG» может быть сокращено до « 2 CHECKMULTISIG».Обратите внимание, что существует небольшое количество стандартных форм сценария, которые ретранслируются от узла к узлу; нестандартные скрипты принимаются, если они находятся в блоке, но узлы не будут их ретранслировать. Стандартная транзакция на биткойн-адрес (pay-to-pubkey-hash)
scriptPubKey: OP_DUP OP_HASh260OP_EQUALVERIFY OP_CHECKSIG scriptSig: Чтобы продемонстрировать, как скрипты выглядят в сети, вот необработанный scriptPubKey:
76 A9 14 OP_DUP OP_HASh260 Байт для отправки 89 AB CD EF AB BA AB BA AB BA AB BA AB BA AB BA AB BA AB BA 88 AC Данные для отправки OP_EQUALVERIFY OP_CHECKSIGПримечание: scriptSig находится на входе транзакции расходования, а scriptPubKey находится на выходе ранее неизрасходованного i.е. «доступная» транзакция.
Вот как обрабатывается каждое слово:
Стек Скрипт Описание Пусто. OP_DUP OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG scriptSig и scriptPubKey объединены. OP_DUP OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG Константы добавлены в стек. OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG Дублирован элемент верхнего стека. OP_EQUALVERIFY OP_CHECKSIG Элемент верхнего стека хешируется. OP_EQUALVERIFY OP_CHECKSIG Константа добавлена. OP_CHECKSIG Проверяется равенство между двумя верхними элементами стека. правда Пусто. Подпись проверяется для двух верхних элементов стека. Устаревшая транзакция pay-to-pubkey
OP_CHECKSIG используется напрямую, без предварительного хеширования открытого ключа. Это использовалось в ранних версиях Биткойна, где люди платили напрямую на IP-адреса, до того, как были введены адреса Биткойн.scriptPubKeys этой формы транзакции по-прежнему распознаются Bitcoin Core как платежи пользователю. Недостатком этой формы транзакции является то, что весь открытый ключ должен быть известен заранее, что подразумевает более длинные платежные адреса, и что он обеспечивает меньшую защиту в случае сбоя в алгоритме подписи ECDSA.
scriptPubKey:OP_CHECKSIG scriptSig: Процесс проверки:
Стек Скрипт Описание Пусто. OP_CHECKSIG scriptSig и scriptPubKey объединены. OP_CHECKSIG Константы добавлены в стек. правда Пусто. Подпись проверяется для двух верхних элементов стека. Выводы, которые можно не расходовать / сократить
Стандартный способ пометить транзакцию как доказуемо невозможную — использовать scriptPubKey следующей формы:
scriptPubKey: OP_RETURN {ноль или более операций}OP_RETURN немедленно помечает сценарий как недопустимый, гарантируя, что не существует scriptSig, который мог бы использовать этот вывод.Таким образом, вывод может быть немедленно удален из набора UTXO, даже если он не был потрачен. eb31ca1a4cbd97c2770983164d7560d2d03276ae1aee26f12d7c2c6424252f29 является примером: он имеет единственный выход с нулевым значением, что дает полную комиссию 0,125 BTC майнеру, который майнил транзакцию, без добавления записи в набор UTXO. Вы также можете использовать OP_RETURN для добавления данных в транзакцию без того, чтобы данные когда-либо появлялись в наборе UTXO, как показано в 1a2e22a717d626fc5db363582007c46924ae6b28319f07cb1b
6bd8293fc; P2Pool делает это с помощью хэша txout цепочки общих ресурсов в базе блоков, которые он создает.
Замораживание средств на будущее
Используя OP_CHECKLOCKTIMEVERIFY, можно сделать средства доказуемо неизрасходованными до определенного момента в будущем.
scriptPubKey: <время истечения срока действия> OP_CHECKLOCKTIMEVERIFY OP_DROP OP_DUP OP_HASh260OP_EQUALVERIFY OP_CHECKSIG scriptSig:
Стек Скрипт Описание Пусто. <время истечения срока действия> OP_CHECKLOCKTIMEVERIFY OP_DROP OP_DUP OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG scriptSig и scriptPubKey объединены. <срок действия> OP_CHECKLOCKTIMEVERIFY OP_DROP OP_DUP OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG Константы добавлены в стек. <срок действия> OP_DROP OP_DUP OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG Элемент верхнего стека проверяется на текущее время или высоту блока. OP_DUP OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG Элемент верхнего стека удален. OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG Дублирован элемент верхнего стека. OP_EQUALVERIFY OP_CHECKSIG Элемент верхнего стека хешируется. OP_EQUALVERIFY OP_CHECKSIG Константа добавлена. OP_CHECKSIG Проверяется равенство между двумя верхними элементами стека. правда Пусто. Подпись проверяется для двух верхних элементов стека. Загадка транзакции
Транзакция a4bfa8ab6435ae5f25dae9d89e4eb67dfaca751f393c1ddc5a837bbc31b — интересная головоломка.
scriptPubKey: OP_HASh356 6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d61000000 OP_EQUAL scriptSig:
Чтобы провести транзакцию, вам нужно придумать некоторые данные, такие, что двойное хеширование данных приводит к получению данного хеша.
Стек Скрипт Описание Пусто. <данные> OP_HASh356 OP_EQUAL <данные> OP_HASh356 OP_EQUAL scriptSig добавлен в стек. OP_EQUAL Данные хешируются. OP_EQUAL Данный хэш помещается в стек. правда Пусто. Хеши сравниваются, в стеке остается истина. Эту транзакцию успешно провел 09f691b2263260e71f363d1db51ff3100d285956a40cc0e4f8c8c2c4a80559b1. Необходимые данные оказались блоком Genesis, а данный хэш в скрипте был заголовком блока Genesis, дважды хешированным с помощью SHA-256. Обратите внимание, что, хотя такие транзакции забавны, они небезопасны, потому что они не содержат никаких подписей, и поэтому любая транзакция, пытающаяся их потратить, может быть заменена другой транзакцией, отправляющей средства в другое место.
Стимулируемое обнаружение хэш-коллизий
В 2013 году Питер Тодд создал скрипты, которые возвращают истину при обнаружении хеш-коллизии. На биткойн-адреса, полученные из этих скриптов, могут быть отправлены деньги. Если кто-то обнаруживает хэш-коллизию, он может потратить биткойны на этот адрес, поэтому такая настройка действует как стимул для кого-то сделать это.
Например, сценарий SHA1:
scriptPubKey: OP_2DUP OP_EQUAL OP_NOT OP_VERIFY OP_SHA1 OP_SWAP OP_SHA1 OP_EQUAL scriptSig:Подробнее см. Ветку bitcointalk [2] и ветку reddit [3] .
В феврале 2017 года было заявлено вознаграждение SHA1 в размере 2,48 биткойнов.
См. Также
Внешние ссылки
- [2] — Минискрипт: язык для написания (подмножества) скриптов Биткойн структурированным способом, обеспечивающий анализ, составление, общее подписывание и многое другое.
- Bitcoin IDE — Биткойн-скрипт для чайников
- Выполнение сценария отладки биткойнов — веб-инструмент, который выполняет код операции сценария по коду операции
- Площадка для скриптов — преобразование скриптов в JavaScript
- BitAuth IDE — интегрированная среда разработки для аутентификации биткойнов
(см.«Онлайн-симулятор биткойн-скрипта или отладчик?»)
Список литературы
Script — Bitcoin Wiki
Биткойн использует систему сценариев для транзакций. Подобно четвертому, Скрипт прост, основан на стеке и обрабатывается слева направо. Он намеренно не является полным по Тьюрингу, без циклов.
Сценарий — это, по сути, список инструкций, записанных с каждой транзакцией, которые описывают, как следующий человек, желающий потратить передаваемые биткойны, может получить к ним доступ.Сценарий для типичного перевода биткойнов на биткойн-адрес назначения D просто обременяет будущие расходы биткойнов двумя вещами: спонсор должен предоставить
- открытый ключ, который при хешировании дает адрес назначения D, встроенный в сценарий, и
- подпись, подтверждающая право собственности на закрытый ключ, соответствующий только что предоставленному открытому ключу.
Сценарии обеспечивают гибкость для изменения параметров того, что необходимо для траты переданных биткойнов.Например, система сценариев может использоваться для запроса двух закрытых ключей или комбинации нескольких ключей, или даже без ключей.
Транзакция действительна, если ничто в объединенном сценарии не вызывает сбой и верхний элемент стека имеет значение Истина (ненулевое значение) при выходе из сценария. Сторона, которая первоначально отправила биткойнов, которые сейчас тратятся, диктует операции сценария, которые будут выполняться за последние , чтобы освободить их для использования в другой транзакции. Сторона, желающая потратить их, должна предоставить входные данные для ранее записанного сценария, в результате чего комбинированный сценарий завершает выполнение с истинным значением на вершине стека.
Этот документ предназначен только для информационных целей. Де-факто биткойн-скрипт определяется кодом, запускаемым сетью для проверки действительности блоков.
Стеки содержат байтовые векторы. При использовании в качестве чисел байтовые векторы интерпретируются как целые числа переменной длины с прямым порядком байтов, где старший бит определяет знак целого числа. Таким образом, 0x81 представляет -1. 0x80 — это еще одно представление нуля (так называемый отрицательный 0). Положительный 0 представлен вектором нулевой длины.Байтовые векторы интерпретируются как логические, где False представлено любым представлением нуля, а True представлено любым представлением ненулевого значения.
Начальные нули в целых числах и отрицательные нули разрешены в блоках, но отклоняются более строгими требованиями, которые стандартные полные узлы предъявляют к транзакциям перед их повторной передачей. Длина байтовых векторов в стеке не должна превышать 520 байтов. Коды операций, которые берут целые числа и логические значения из стека, требуют, чтобы они были не более 4 байтов в длину, но сложение и вычитание могут переполниться и привести к помещению в стек 5-байтового целого числа.
Коды операций
Это список всех слов сценария, также известных как коды операций, команды или функции.
Есть некоторые слова, которые существовали в очень ранних версиях Биткойна, но были удалены из опасения, что у клиента может быть ошибка в их реализации. Этот страх был вызван ошибкой, обнаруженной в OP_LSHIFT, которая могла привести к сбою любого узла Биткойн в случае эксплуатации, и другими ошибками, которые позволяли любому потратить чьи-либо биткойны. Удаленные коды операций иногда называют «отключенными», но это неправильное название, потому что абсолютно не может использовать для любого, кто использует Биткойн, чтобы использовать эти коды операций (их просто больше не существует, в протоколе), и также нет серьезных планов когда-либо снова включить все эти коды операций.Они перечислены здесь только для исторического интереса.
Новые коды операций могут быть добавлены с помощью тщательно разработанной и выполненной softfork с использованием OP_NOP1-OP_NOP10.
Ноль, отрицательный ноль (с использованием любого количества байтов) и пустой массив обрабатываются как ложные. Все остальное считается истиной.
Обозначение на этой странице
В таблицах ниже входы и выходы описаны элементами, как если бы они были помещены в стек в указанном порядке. Так, например, «x1 x2» указывает, что значение x1 помещается в стек, затем x2, так что x1 находится внизу стека, а x2 — вверху.
Константы
Говоря о скриптах, эти слова, определяющие значение, обычно опускаются.
Слово Код операциишестигранник Ввод Выход Описание OP_0, OP_FALSE 0 0x00 Ничего. (пустое значение) В стек помещается пустой массив байтов. (Это не бездействие: элемент добавляется в стек.) НЕТ 1-75 0x01-0x4b (специальный) данных Следующий код операции байт — это данные, которые нужно поместить в стек. OP_PUSHDATA1 76 0x4c (специальный) данных Следующий байт содержит количество байтов, помещаемых в стек. OP_PUSHDATA2 77 0x4d (специальный) данных Следующие два байта содержат количество байтов, которые должны быть помещены в стек в обратном порядке. OP_PUSHDATA4 78 0x4e (специальный) данных Следующие четыре байта содержат количество байтов, которые должны быть помещены в стек в обратном порядке. OP_1NEGATE 79 0x4f Ничего. -1 Число -1 помещается в стек. OP_1, OP_TRUE 81 0x51 Ничего. 1 Число 1 помещается в стек. OP_2-OP_16 82-96 0x52-0x60 Ничего. 2-16 Число в слове name (2-16) помещается в стек. Регулятор потока
Слово Код операциишестигранник Ввод Выход Описание OP_NOP 97 0x61 Ничего Ничего Ничего не делает. OP_IF 99 0x63 <выражение> if [операторы] [else [операторы]] * endif Если значение верхнего стека не равно False, инструкции выполняются. Значение верхнего стека удаляется. OP_NOTIF 100 0x64 <выражение> notif [операторы] [еще [операторы]] * endif Если значение верхнего стека равно False, операторы выполняются. Значение верхнего стека удаляется. OP_ELSE 103 0x67 <выражение> if [операторы] [else [операторы]] * endif Если предыдущие OP_IF, OP_NOTIF или OP_ELSE не были выполнены, то выполняются эти операторы, а если предыдущие OP_IF, OP_NOTIF или OP_ELSE были выполнены, то эти операторы не выполняются. OP_ENDIF 104 0x68 <выражение> if [операторы] [else [операторы]] * endif Завершает блок if / else.Все блоки должны завершиться, иначе транзакция недействительна . OP_ENDIF без OP_IF ранее также является недопустимым . OP_VERIFY 105 0x69 Верно / неверно ничего / сбой Помечает транзакцию как недопустимую. , если значение верхнего стека неверно. Значение верхнего стека удаляется. OP_RETURN 106 0x6a Ничего сбой Помечает транзакцию как недействительную .Начиная с биткойна 0.9, стандартный способ присоединения дополнительных данных к транзакциям — это добавление вывода с нулевым значением с помощью scriptPubKey, состоящего из OP_RETURN, за которым следуют данные. Доказуемо, что такие выходы нельзя расходовать, и они специально выбрасываются из хранилища в наборе UTXO, что снижает их стоимость для сети. Начиная с версии 0.12, стандартные правила ретрансляции допускают единственный выход с OP_RETURN, который содержит любую последовательность операторов push (или OP_RESERVED [1] ) после OP_RETURN при условии, что общая длина scriptPubKey составляет не более 83 байтов. Стек
Слово Код операциишестигранник Ввод Выход Описание OP_TOALTSTACK 107 0x6b x1 (альтернативный) x1 Помещает ввод в верхнюю часть стека alt. Удаляет его из основного стека. OP_FROMALTSTACK 108 0x6c (альтернативный) x1 x1 Помещает ввод в верхнюю часть основного стека.Удаляет его из стека альтернатив. OP_IFDUP 115 0x73 х х / х х Если значение верхнего стека не равно 0, продублируйте его. OP_DEPTH 116 0x74 Ничего <Размер стопки> Помещает количество элементов стека в стопку. OP_DROP 117 0x75 х Ничего Удаляет верхний элемент стопки. OP_DUP 118 0x76 х х х Дублирует верхний элемент стопки. OP_NIP 119 0x77 х1 х2 x2 Удаляет второй сверху элемент стека. OP_OVER 120 0x78 х1 х2 х1 х2 х1 Копирует элемент стека вторым наверху. OP_PICK 121 0x79 xn … x2 x1 x0 хн … х2 х1 х0 хн Элемент n обратно в стопку копируется наверх. OP_ROLL 122 0x7a xn … x2 x1 x0 … х2 х1 х0 хн Элемент n снова в стопке перемещается наверх. OP_ROT 123 0x7b х1 х2 х3 х2 х3 х1 Третий элемент в стопке перемещается наверх. OP_SWAP 124 0x7c х1 х2 х2 х1 Два верхних элемента в стопке меняются местами. OP_TUCK 125 0x7d х1 х2 х2 х1 х2 Элемент наверху стопки копируется и вставляется перед элементом, занимающим второе место сверху. OP_2DROP 109 0x6d х1 х2 Ничего Удаляет два верхних элемента стека. OP_2DUP 110 0x6e х1 х2 х1 х2 х1 х2 Дублирует два верхних элемента стека. OP_3DUP 111 0x6f х1 х2 х3 х1 х2 х3 х1 х2 х3 Дублирует три верхних элемента стека. OP_2OVER 112 0x70 х1 х2 х3 х4 х1 х2 х3 х4 х1 х2 Копирует пару элементов на два деления назад в стопке вперед. OP_2ROT 113 0x71 х1 х2 х3 х4 х5 х6 х3 х4 х5 х6 х1 х2 Пятый и шестой элементы назад перемещаются в верхнюю часть стопки. OP_2SWAP 114 0x72 х1 х2 х3 х4 х3 х4 х1 х2 Меняет местами две верхние пары элементов. Соединение
Если в сценарии присутствует какой-либо код операции, помеченный как отключенный, он должен прерваться и завершиться ошибкой.
Слово Код операциишестигранник Ввод Выход Описание OP_CAT 126 0x7e х1 х2 из Объединяет две строки. отключен. OP_SUBSTR 127 0x7f в начальном размере из Возвращает часть строки. отключен. OP_LEFT 128 0x80 по размеру из Сохраняет только символы слева от указанной точки в строке. отключен. OP_RIGHT 129 0x81 по размеру из Сохраняет только символы справа от указанной точки в строке. отключен. OP_SIZE 130 0x82 дюйм по размеру Выдвигает длину строки верхнего элемента стека (не выталкивая его). Побитовая логика
Если в сценарии присутствует какой-либо код операции, помеченный как отключенный, он должен прерваться и завершиться ошибкой.
Слово Код операциишестигранник Ввод Выход Описание OP_INVERT 131 0x83 дюйм из Инвертирует все биты на входе. отключен. OP_AND 132 0x84 х1 х2 из Boolean и между каждым битом на входах. отключен. OP_OR 133 0x85 х1 х2 из Boolean или между каждым битом на входах. отключен. OP_XOR 134 0x86 х1 х2 из Boolean исключающее или между каждым битом на входах. отключен. OP_EQUAL 135 0x87 х1 х2 Верно / неверно Возвращает 1, если входы в точности равны, в противном случае — 0. OP_EQUALVERIFY 136 0x88 х1 х2 ничего / сбой То же, что OP_EQUAL, но потом запускает OP_VERIFY. Арифметика
Примечание. Арифметические вводы ограничены 32-разрядными целыми числами со знаком, но могут выходить за пределы их вывода.
Если любое входное значение для любой из этих команд превышает 4 байта, сценарий должен прерваться и завершиться ошибкой. Если какой-либо код операции, помеченный как отключен , присутствует в сценарии, он также должен прерваться и завершиться ошибкой.
Слово Код операциишестигранник Ввод Выход Описание OP_1ADD 139 0x8b дюйм из На вход добавляется1. OP_1SUB 140 0x8c дюйм из 1 вычитается из ввода. ОП_2МУЛ 141 0x8d дюйм из Ввод умножается на 2. отключен. OP_2DIV 142 0x8e дюйм из Вход делится на 2. отключено. OP_NEGATE 143 0x8f дюйм из Знак ввода перевернут. OP_ABS 144 0x90 дюйм из Вход сделан положительным. OP_NOT 145 0x91 дюйм из Если на входе 0 или 1, он переворачивается. В противном случае на выходе будет 0. OP_0NOTEQUAL 146 0x92 дюйм из Возвращает 0, если на входе 0. 1 в противном случае. OP_ADD 147 0x93 а б из a добавлен к b. OP_SUB 148 0x94 а б из b вычитается из a. OP_MUL 149 0x95 а б из а умножается на b. отключен. OP_DIV 150 0x96 а б из a делится на b. отключен. OP_MOD 151 0x97 а б из Возвращает остаток от деления a на b. отключен. OP_LSHIFT 152 0x98 а б из Сдвигает a влево на b бит, сохраняя знак. отключен. OP_RSHIFT 153 0x99 а б из Сдвигает a вправо на b бит, сохраняя знак. отключен. OP_BOOLAND 154 0x9a а б из Если и a, и b не равны 0, на выходе будет 1.В противном случае 0. OP_BOOLOR 155 0x9b а б из Если a или b не равны 0, на выходе будет 1. В противном случае — 0. OP_NUMEQUAL 156 0x9c а б из Возвращает 1, если числа равны, 0 в противном случае. OP_NUMEQUALVERIFY 157 0x9d а б ничего / сбой То же, что OP_NUMEQUAL, но потом запускает OP_VERIFY. OP_NUMNOTEQUAL 158 0x9e а б из Возвращает 1, если числа не равны, в противном случае — 0. OP_LESSTHAN 159 0x9f а б из Возвращает 1, если a меньше b, в противном случае — 0. OP_GREATERTHAN 160 0xa0 а б из Возвращает 1, если a больше, чем b, в противном случае — 0. OP_LESSTHANOREQUAL 161 0xa1 а б из Возвращает 1, если a меньше или равно b, в противном случае — 0. OP_GREATERTHANOREQUAL 162 0xa2 а б из Возвращает 1, если a больше или равно b, в противном случае — 0. OP_MIN 163 0xa3 а б из Возвращает меньшее из значений a и b. OP_MAX 164 0xa4 а б из Возвращает большее из значений a и b. OP_WITHIN 165 0xa5 x мин. Макс. из Возвращает 1, если x находится в пределах указанного диапазона (включительно слева), в противном случае — 0. Крипто
Слово Код операциишестигранник Ввод Выход Описание OP_RIPEMD160 166 0xa6 дюйм хеш Входные данные хешируются с помощью RIPEMD-160. OP_SHA1 167 0xa7 дюйм хеш Входные данные хешируются с использованием SHA-1. OP_SHA256 168 0xa8 дюйм хеш Входные данные хешируются с использованием SHA-256. ОП_ХАШ260 169 0xa9 дюйм хеш Входные данные хешируются дважды: сначала с помощью SHA-256, а затем с помощью RIPEMD-160. ОП_ХАШ356 170 0xaa дюйм хеш Вход дважды хешируется с помощью SHA-256. OP_CODESEPARATOR 171 0xab Ничего Ничего Все слова проверки подписи будут сопоставлять подписи с данными только после последнего выполненного OP_CODESEPARATOR. OP_CHECKSIG 172 0xac sig pubkey Верно / неверно Хешируются все выходы, входы и сценарий транзакции (от последнего выполненного OP_CODESEPARATOR до конца).Подпись, используемая OP_CHECKSIG, должна быть действительной подписью для этого хэша и открытого ключа. Если это так, возвращается 1, в противном случае — 0. OP_CHECKSIGVERIFY 173 0xad sig pubkey ничего / сбой То же, что OP_CHECKSIG, но OP_VERIFY выполняется позже. OP_CHECKMULTISIG 174 0xae x sig1 sig2 … <количество подписей> pub1 pub2 <количество открытых ключей> Верно / Неверно Сравнивает первую подпись с каждым открытым ключом, пока не найдет совпадение ECDSA.Начиная с последующего открытого ключа, он сравнивает вторую подпись с каждым оставшимся открытым ключом, пока не найдет совпадение ECDSA. Процесс повторяется до тех пор, пока все подписи не будут проверены или пока не останется достаточно открытых ключей для получения успешного результата. Все подписи должны соответствовать публичному ключу. Поскольку открытые ключи не проверяются снова, если они не проходят какое-либо сравнение подписей, подписи должны быть помещены в scriptSig в том же порядке, в котором их соответствующие открытые ключи были помещены в scriptPubKey или redeemScript.Если все подписи действительны, возвращается 1, в противном случае — 0. Из-за ошибки из стека удаляется одно лишнее неиспользованное значение. OP_CHECKMULTISIGVERIFY 175 0xaf x sig1 sig2 … <количество подписей> pub1 pub2 … <количество открытых ключей> ничего / сбой То же, что OP_CHECKMULTISIG, но OP_VERIFY выполняется позже. Locktime
Слово Код операциишестигранник Ввод Выход Описание OP_CHECKLOCKTIMEVERIFY (ранее OP_NOP2) 177 0xb1 х x / сбой Помечает транзакцию как недопустимую. , если верхний элемент стека больше, чем поле nLockTime транзакции, в противном случае оценка сценария продолжается, как если бы был выполнен OP_NOP.Транзакция также недействительна, если 1. стек пуст; или 2. верхний элемент стека отрицательный; или 3. элемент верхнего стека больше или равен 500000000, в то время как поле транзакции nLockTime меньше 500000000, или наоборот; или 4. входное поле nSequence равно 0xffffffff. Точная семантика описана в BIP 0065. OP_CHECKSEQUENCEVERIFY (ранее OP_NOP3) 178 0xb2 х x / сбой Помечает транзакцию как недопустимую. , если относительное время блокировки ввода (принудительно выполняемое BIP 0068 с nSequence) не равно или больше, чем значение верхнего элемента стека.Точная семантика описана в BIP 0112. Псевдослова
Эти слова используются внутри компании для помощи в сопоставлении транзакций. Они недействительны, если используются в реальных сценариях.
Слово Код операциишестигранник Описание OP_PUBKEYHASH 253 0xfd Представляет открытый ключ, хешированный с OP_HASh260. OP_PUBKEY 254 0xfe Представляет открытый ключ, совместимый с OP_CHECKSIG. OP_INVALIDOPCODE 255 0xff Соответствует любому еще не назначенному коду операции. Зарезервированные слова
Любой не назначенный код операции также зарезервирован. Использование неназначенного кода операции делает транзакцию недействительной .
Слово Код операциишестигранник При использовании … OP_RESERVED 80 0x50 Транзакция недействительна , если не происходит в невыполненной ветви OP_IF OP_VER 98 0x62 Транзакция недействительна , если не происходит в невыполненной ветви OP_IF OP_VERIF 101 0x65 Транзакция недействительна даже в невыполненной ветви OP_IF OP_VERNOTIF 102 0x66 Транзакция недействительна даже в невыполненной ветви OP_IF OP_RESERVED1 137 0x89 Транзакция недействительна , если не происходит в невыполненной ветви OP_IF OP_RESERVED2 138 0x8a Транзакция недействительна , если не происходит в невыполненной ветви OP_IF OP_NOP1, OP_NOP4-OP_NOP10 176, 179–185 0xb0, 0xb3-0xb9 Слово игнорируется.Не отмечает транзакцию как недействительную. Примеры скриптов
Ниже приводится список интересных скриптов. При записи скриптов данные, которые должны быть помещены в стек, обычно заключаются в угловые скобки. и команды передачи данных опущены. Слова без квадратных скобок — это коды операций. Эти примеры включают префикс «OP_», но его можно опустить. Таким образом «
OP_2 OP_CHECKMULTISIG» может быть сокращено до « 2 CHECKMULTISIG».Обратите внимание, что существует небольшое количество стандартных форм сценария, которые ретранслируются от узла к узлу; нестандартные скрипты принимаются, если они находятся в блоке, но узлы не будут их ретранслировать. Стандартная транзакция на биткойн-адрес (pay-to-pubkey-hash)
scriptPubKey: OP_DUP OP_HASh260OP_EQUALVERIFY OP_CHECKSIG scriptSig: Чтобы продемонстрировать, как скрипты выглядят в сети, вот необработанный scriptPubKey:
76 A9 14 OP_DUP OP_HASh260 Байт для отправки 89 AB CD EF AB BA AB BA AB BA AB BA AB BA AB BA AB BA AB BA 88 AC Данные для отправки OP_EQUALVERIFY OP_CHECKSIGПримечание: scriptSig находится на входе транзакции расходования, а scriptPubKey находится на выходе ранее неизрасходованного i.е. «доступная» транзакция.
Вот как обрабатывается каждое слово:
Стек Скрипт Описание Пусто. OP_DUP OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG scriptSig и scriptPubKey объединены. OP_DUP OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG Константы добавлены в стек. OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG Дублирован элемент верхнего стека. OP_EQUALVERIFY OP_CHECKSIG Элемент верхнего стека хешируется. OP_EQUALVERIFY OP_CHECKSIG Константа добавлена. OP_CHECKSIG Проверяется равенство между двумя верхними элементами стека. правда Пусто. Подпись проверяется для двух верхних элементов стека. Устаревшая транзакция pay-to-pubkey
OP_CHECKSIG используется напрямую, без предварительного хеширования открытого ключа. Это использовалось в ранних версиях Биткойна, где люди платили напрямую на IP-адреса, до того, как были введены адреса Биткойн.scriptPubKeys этой формы транзакции по-прежнему распознаются Bitcoin Core как платежи пользователю. Недостатком этой формы транзакции является то, что весь открытый ключ должен быть известен заранее, что подразумевает более длинные платежные адреса, и что он обеспечивает меньшую защиту в случае сбоя в алгоритме подписи ECDSA.
scriptPubKey:OP_CHECKSIG scriptSig: Процесс проверки:
Стек Скрипт Описание Пусто. OP_CHECKSIG scriptSig и scriptPubKey объединены. OP_CHECKSIG Константы добавлены в стек. правда Пусто. Подпись проверяется для двух верхних элементов стека. Выводы, которые можно не расходовать / сократить
Стандартный способ пометить транзакцию как доказуемо невозможную — использовать scriptPubKey следующей формы:
scriptPubKey: OP_RETURN {ноль или более операций}OP_RETURN немедленно помечает сценарий как недопустимый, гарантируя, что не существует scriptSig, который мог бы использовать этот вывод.Таким образом, вывод может быть немедленно удален из набора UTXO, даже если он не был потрачен. eb31ca1a4cbd97c2770983164d7560d2d03276ae1aee26f12d7c2c6424252f29 является примером: он имеет единственный выход с нулевым значением, что дает полную комиссию 0,125 BTC майнеру, который майнил транзакцию, без добавления записи в набор UTXO. Вы также можете использовать OP_RETURN для добавления данных в транзакцию без того, чтобы данные когда-либо появлялись в наборе UTXO, как показано в 1a2e22a717d626fc5db363582007c46924ae6b28319f07cb1b
6bd8293fc; P2Pool делает это с помощью хэша txout цепочки общих ресурсов в базе блоков, которые он создает.
Замораживание средств на будущее
Используя OP_CHECKLOCKTIMEVERIFY, можно сделать средства доказуемо неизрасходованными до определенного момента в будущем.
scriptPubKey: <время истечения срока действия> OP_CHECKLOCKTIMEVERIFY OP_DROP OP_DUP OP_HASh260OP_EQUALVERIFY OP_CHECKSIG scriptSig:
Стек Скрипт Описание Пусто. <время истечения срока действия> OP_CHECKLOCKTIMEVERIFY OP_DROP OP_DUP OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG scriptSig и scriptPubKey объединены. <срок действия> OP_CHECKLOCKTIMEVERIFY OP_DROP OP_DUP OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG Константы добавлены в стек. <срок действия> OP_DROP OP_DUP OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG Элемент верхнего стека проверяется на текущее время или высоту блока. OP_DUP OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG Элемент верхнего стека удален. OP_HASh260 OP_EQUALVERIFY OP_CHECKSIG Дублирован элемент верхнего стека. OP_EQUALVERIFY OP_CHECKSIG Элемент верхнего стека хешируется. OP_EQUALVERIFY OP_CHECKSIG Константа добавлена. OP_CHECKSIG Проверяется равенство между двумя верхними элементами стека. правда Пусто. Подпись проверяется для двух верхних элементов стека. Загадка транзакции
Транзакция a4bfa8ab6435ae5f25dae9d89e4eb67dfaca751f393c1ddc5a837bbc31b — интересная головоломка.
scriptPubKey: OP_HASh356 6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d61000000 OP_EQUAL scriptSig:
Чтобы провести транзакцию, вам нужно придумать некоторые данные, такие, что двойное хеширование данных приводит к получению данного хеша.
Стек Скрипт Описание Пусто. <данные> OP_HASh356 OP_EQUAL <данные> OP_HASh356 OP_EQUAL scriptSig добавлен в стек. OP_EQUAL Данные хешируются. OP_EQUAL Данный хэш помещается в стек. правда Пусто. Хеши сравниваются, в стеке остается истина. Эту транзакцию успешно провел 09f691b2263260e71f363d1db51ff3100d285956a40cc0e4f8c8c2c4a80559b1. Необходимые данные оказались блоком Genesis, а данный хэш в скрипте был заголовком блока Genesis, дважды хешированным с помощью SHA-256. Обратите внимание, что, хотя такие транзакции забавны, они небезопасны, потому что они не содержат никаких подписей, и поэтому любая транзакция, пытающаяся их потратить, может быть заменена другой транзакцией, отправляющей средства в другое место.
Стимулируемое обнаружение хэш-коллизий
В 2013 году Питер Тодд создал скрипты, которые возвращают истину при обнаружении хеш-коллизии. На биткойн-адреса, полученные из этих скриптов, могут быть отправлены деньги. Если кто-то обнаруживает хэш-коллизию, он может потратить биткойны на этот адрес, поэтому такая настройка действует как стимул для кого-то сделать это.
Например, сценарий SHA1:
scriptPubKey: OP_2DUP OP_EQUAL OP_NOT OP_VERIFY OP_SHA1 OP_SWAP OP_SHA1 OP_EQUAL scriptSig:Подробнее см. Ветку bitcointalk [2] и ветку reddit [3] .
В феврале 2017 года было заявлено вознаграждение SHA1 в размере 2,48 биткойнов.
См. Также
Внешние ссылки
- [2] — Минискрипт: язык для написания (подмножества) скриптов Биткойн структурированным способом, обеспечивающий анализ, составление, общее подписывание и многое другое.
- Bitcoin IDE — Биткойн-скрипт для чайников
- Выполнение сценария отладки биткойнов — веб-инструмент, который выполняет код операции сценария по коду операции
- Площадка для скриптов — преобразование скриптов в JavaScript
- BitAuth IDE — интегрированная среда разработки для аутентификации биткойнов
(см.«Онлайн-симулятор биткойн-скрипта или отладчик?»)
Список литературы
Bitcoin Exchange Исходный код, скрипт, шаблон и плагины
Исходный код биткойн-обмена — это полный набор программного кода или сценария, написанный с использованием любого понятного человеку языка программирования, в основном с использованием PHP, который может быть реализован для создания веб-сайта обмена биткойнами. Это не просто исходный код других веб-сайтов, он совершенно другой, потому что он состоит из всех функций и возможностей торговли биткойнами.Многие считают, что сценарий обмена биткойнами с открытым исходным кодом — лучший выбор для начала обмена биткойнами, но это неправда, потому что в скрипте / программном обеспечении обмена биткойнами с открытым исходным кодом вы не можете получить некоторые функции безопасности и, очевидно, веб-сайт, состоящий из он не будет защищен для обработки децентрализованных транзакций.
Хорошо, надеюсь, вы получили общее представление об исходном коде обмена биткойнами, поэтому давайте подробно обсудим, где получить исходный код обмена биткойнами и какие плагины используются для запуска веб-сайта обмена биткойнами.
Готовый сценарий обмена биткойнами Исходный код и шаблон веб-сайта обмена биткойнами
— Где взять вышеперечисленное?Как мы уже говорили в начале, скрипт обмена биткойнами премиум-класса сам по себе имеет полный потенциал для разработки защищенного веб-сайта обмена биткойнами. Только признанная, известная и известная компания по разработке обмена биткойнами может в одиночку предоставить полностью защищенный исходный код обмена биткойнами с белой этикеткой для создания ориентированного на пользователя защищенного веб-сайта обмена биткойнами.
Bitdeal — мы являемся монополистом и самостоятельным игроком в индустрии криптовалют в течение последних 4 лет (включены в 2015 году), чтобы предоставить скрипт обмена биткойнами без ошибок (также известный как исходный код), интегрированный с функцией торговли биткойнами до минуты.Таким образом, с каждым годом у нас растет клиентская база, и мы сохраняем идентичность бренда без каких-либо проблем на рынке криптовалют.
Получить исходный код обмена биткойнов
Плагины обмена биткойнами, API и другие решения, которые могут быть интегрированы со скриптом обмена биткойнами.
Ниже приведены специальные надстройки, которые можно интегрировать со сценарием во время или после развертывания веб-сайта обмена биткойнами.1. Интеграция маржинальной торговли и кредитования
2.AML — Плагин
3. KYC — Плагин
4. Полное программное обеспечение MEAN Stack
5. Структурированный код и меры безопасности
6. Интегрированный API биткойн-кошелька
7. Маркетинговый API
8. API ликвидности
9. Остальное API
10. Ценник API
11. CoinMarketCap API (для размещения на coinmarketcap.com)
12. Биткойн-трейдинг BOT API
13. Холодный кошелек API
Получить API и плагины для обмена биткойнами
Вышеупомянутые основные API-интерфейсы, которые могут дать жизнь веб-сайту обмена биткойнами, Bitdeal выполняет все вышеперечисленное и может интегрировать специальный API-интерфейс в зависимости от ваших требований и потребностей.
Почему Bitdeal?
Мы — известная компания по развитию обмена биткойнами, охватывающая все бизнес-решения, связанные с биткойнами и криптовалютами. Мы воплощаем в жизнь ваши бизнес-планы и идеи в отношении биткойнов и криптовалют с помощью соответствующих сценариев и программных услуг. Помимо разработки биржи биткойнов, мы специализируемся и обладаем опытом в разработке ICO и блокчейн. Так что не стесняйтесь начать обмен биткойнов или любой другой сайт криптовалютного бизнеса! Мы готовы вас поднять !!
Проконсультируйтесь с bitdeal через WhatsApp
Получите мгновенную демонстрацию готового скрипта обмена биткойнами
Исходный код инвестиционного скриптана PHP — скачать бесплатно
Наш инвестиционный скрипт биткойнов был создан, чтобы заполнить пробел между биткойн-трейдерами и инвесторами.Этот скрипт можно использовать как высокодоходную инвестиционную программу (HYIP) или иначе.
Если вы занимаетесь торговлей форекс или криптовалютой и хотите, чтобы люди инвестировали вместе с вами по фиксированной ежедневной процентной ставке, то наш сценарий инвестирования в биткойны будет идеальной идеей.
В этом программном обеспечении ваши инвесторы будут вносить средства прямо на ваш кошелек в биткойнах, Ethereum или Perfect Money. Все внесенные депозиты будут храниться в долларах США.
Исходный код сценария инвестирования в биткойны не только поддерживает биткойн, но также есть варианты Etherium и Perfect Money, а в обновление мы включили Mobile Money.Все вместе в одном зонтике, чтобы не ограничивать ваших инвесторов.
Это платформа, на которой люди могут прийти и инвестировать свои BTC, ETH, Perfect Money или Mobile Money и получать ежедневную прибыль. В конце периода инвестирования инвестор может вывести свой фонд или реинвестировать.
Скрипт сам по себе является кошельком, это означает, что инвесторы могут хранить криптовалюту по текущему обменному курсу. Все деньги, хранящиеся в скрипте, не будут подвержены колебаниям биткойнов, поскольку они хранятся в долларах США.
Скрипт состоит из трех уникальных пакетов, из которых инвесторы могут выбирать. Пакеты настраиваются администратором.
Особенности инвестиционного скрипта Биткойн
- Скрипт поддерживает депозиты через Bitcoin, Ethereum, Perfect Money и Mobile Money.
- Полностью адаптивная мобильная версия с потрясающим интерфейсом на панели управления пользователя и администратора.
- Бесплатный привлекательный интерфейс с готовыми страницами.
- Простая регистрация пользователя, скрипт поставляется с очень простой регистрационной формой, которая не будет утомлять пользователей. Электронное письмо инвестор получает автоматически после регистрации.
- Каждая регистрация должна ждать подтверждения администратора. Это дает администратору право вручную проверять каждого пользователя, чтобы избежать рассылки спама.
- Уникальный URL-адрес для входа администратора. Это поможет помешать хакерам узнать фактическую ссылку для запуска их грубой силы.
- Три различных инвестиционных плана, которые могут быть полностью настроены администратором на основе ежедневной процентной доходности и общего периода инвестирования.
- Администратор может отменить вложение любого инвестора, если он того пожелает.
- Администратор может вручную кредитовать или дебетовать баланс кошелька инвесторов.
- Инвесторы обновляют свой адрес кошелька Биткойн, адрес кошелька Ethereum и адрес Perfect Money в любое время, когда захотят.
- Инвесторы могут хранить свои деньги на платформе в долларах США, чтобы не зависеть от колебаний в мире криптовалют.
- Инвесторы могут без промедления вывести свои деньги прямо на свои кошельки BTC, ETH или PM.Это может одобрить только администратор.
- Перед выводом средств инвесторы должны быть проверены администратором для вывода средств. По умолчанию Инвестору необходимо загрузить средство идентификации.
- Каждый инвестор имеет уникальную реферальную ссылку, по которой, если новые пользователи зарегистрируются, реферал получит комиссию, которая потребует подтверждения администратора.
- Каждый инвестор может видеть список людей, которых он направил, и тех, кто зарегистрировался по их ссылке.
- Улучшенная дополнительная безопасность с 2fa, интегрированная с Google Authenticator.
- Биткойн QR-код для легкого пополнения счета со сканера BTC-кода мобильного телефона.
- Неограниченное количество пользователей, нет ограничений на количество пользователей, которых может разместить этот скрипт.
- Пользователь в окно обмена сообщениями администратора и наоборот.
- Полный почтовик, мы интегрировали полный почтовик в этот скрипт. Который администратор может использовать для отправки электронной почты пользователям и не пользователям. Фактически, его можно использовать для цифрового маркетинга.
- Live Chat, который необходим для этого скрипта, чтобы инвесторы могли сразу же поговорить с администратором один на один.
- (Обновление) Администратор может дебетовать и кредитовать счета инвесторов без необходимости дебетования или кредитования.
- (Обновление) Интеграция с мобильными деньгами.
Этот сценарий все еще открыт для дальнейшей настройки, если вам понадобятся некоторые специальные функции, добавленные в вашу копию сценария, которые не будут проблемой, если вы можете соответствовать требованиям.
Посмотрите демонстрационное видео инвестиционного скрипта.
(Перечисленные обновления могут не быть частью видео)
Кому нужно инвестиционное программное обеспечение
Детали инвестиционного скрипта Биткойн
- Инвестиционные агентства
- Веб-разработчики
- Студенты по смежному проекту
- Криптотрейдеры
- Агентства по вкладу
Имя скрипта Investment Pro (имя будет необходимо, если вы хотите приобрести этот скрипт) Имя пользователя администратора
админ @ digitalwebplus.com Пароль администратора admin123 (можно поменять) URL для входа администратора /admin/c2wadmin/signin.php URL для входа клиентов /users/form/signin.php Языки HTML, PHP, MySQL, JavaScript и Bootstrap Папка расположения базы данных / config / db Содержит 2779 папок / подпапок Тип загрузки Zip-файл Версия PHP 7 Размер загрузки ZIP-файл 94 МБ Статус Протестировано и отлично работает онлайн и офлайн Стоимость скрипта 70 тыс. ₦ или 150 долларов
Чтобы получить пароль, просто свяжитесь с нами по телефону WhatsApp или позвоните нам по телефону +2348035606050 .
Мы также принимаем оплату в биткойнах и PayPal
Позвоните нам, чтобы запросить адрес нашего биткойн-кошелька или PayPal.
Мы также можем помочь в установке и дальнейшей настройке.
НУЖЕН ВЕБ-РАЗРАБОТЧИК? ЗВОНИТЕ: +2348035606050
WHATSAPP: +2348035606050Требования к серверу
- Общий хостинг или Виртуальный частный сервер (VPS)
- PHP 7 и выше
- Сервер должен поддерживать MySQL
- Скрипт отлично работает на домене и поддомене
Хотя мы провели тщательное сканирование всех файлов на нашем веб-сайте, мы по-прежнему настаиваем на том, чтобы вы сканировали каждый файл, загруженный из Интернета, с помощью надежного антивирусного программного обеспечения.
2019. Все права защищены. Карта сайта