Перейти к содержимому

Какая сеть у btc

  • автор:

Как устроен биткоин?

Сегодня о Bitcoin не слышал, наверное, только ленивый. Слышать-то слышал, но мало кто задавался вопросом, как он там «внутри» работает. Многие довольствуются теми знаниями, которых хватает, чтобы завести кошелек, получить, отправить криптовалюту на другой или продать ее. Работает – и ладно, а как именно – не важно. Тем не менее, знать это необходимо, так как эта информация может снять множество вопросов и избежать проблем с использованием.

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

Сеть

Как говорят нам многие источники, Bitcoin — это одноранговая платёжная система (сеть), расчетной единицей операций в которой является одноименная криптовалюта.

Одноранговая сеть — это компьютерная сеть, принципом которой является равноправие всех участников. Каждый узел (peer) или нода, как их еще называют, выполняет функции как клиента, так и сервера. Такая организация позволяет сохранять работоспособность сети при любом количестве и любом сочетании доступных нод (от перестановки мест слагаемых сумма не меняется). Участниками сети являются все пиры, поэтому главной особенностью системы является полная децентрализация: нет какого-либо центрального администратора или сервера. Вместо термина «одноранговая» можно использовать такие определения, как: децентрализованная, пиринговая или p2p (peer-to-peer) сеть.

Blockchain

Основой биткоина, а попутно и «книгой» учета транзакций является упорядоченная последовательность (цепочка) набора данных (блоков), или просто — блокчейн. Каждый блок сети биткоина вмещает до 1 Мб данных, формируется в среднем 10 минут, содержит информацию обо всех транзакциях, помещенных в него и информацию, которая связывает его с предыдущим блоком.

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

Принцип работы

Для более наглядного понимания основ работы сети биткоина представим гипотетического криптоэнтузиаста Тони, у которого установлен биткоин-кошелек с 2-мя BTC на балансе. Что такое биткоин-кошелек мы уже рассматривали в статьях ранее.

Наш Тони желает подарить 1 BTC своей подруге Синди, и для этого ему нужен ее уникальный биткоин-адрес кошелька (аналог номера счета в традиционном банке). Этот адрес Тони вносит в соответствующее поле ввода своего кошелька, а в другом указывает сумму перевода — 1 BTC. Затем Тони переходит к выставлению размера комиссии за транзакцию, тут остановимся чуть подробнее.

Транзакции и нагрузка сети

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

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

По сути, транзакция — это набор информации, которая указывает участникам сети на какое значение уменьшился баланс отправителя, и на какое значение увеличился баланс получателя.

Майнеры

Чтобы транзакция была успешно осуществлена, ее должны подтвердить (валидировать) майнеры. Сейчас, это специализированные организации, которые с помощью мощного вычислительного оборудования (ASIC-фермы) проверяют транзакции на «правильность», собирают эти транзакции в блоки, а блоки последовательно присоединяют друг к другу. На формирование 1 блока алгоритмом сети отводится в среднем 10 минут, в течение которых майнеры ежесекундно выполняют однотипную вычислительную работу в поисках одного единственно правильного решения. Это не сложно, это не математическая проблема, но это очень большой объём работы, который тяжело сделать маленькими вычислительными мощностями быстро и эффективно.

За выполненную работу майнеры получают вознаграждение в виде BTC. Это вознаграждение состоит из тех комиссий, которые заплатили пользователи за транзакции и абсолютно новых биткоинов, которые сгенерировала сама сеть в момент, когда из транзакций был собран и подтвержден новый блок. Новые биткоины являются наградой для майнеров за выполненную работу. Каждые 210 000 блоков происходит уполовинивание награды для майнеров за найденный блок, это называется «халвинг«.

Комиссии

Вернемся к нашему криптоэнтузиасту… Выставляя размер комиссии за транзакцию, Тони руководствуется тем, что за каждый байт информации он должен заплатить некоторое количество сатоши — дробной части биткоина. Поскольку Тони не знает, какой объем данных займет его транзакция, то решает сэкономить и поставить цену в 1 satoshi за байт.

Для вас, читатели, мы расскажем, как сформируется вес и стоимость транзакции Тони.
Те 2 BTC, который он имеет на балансе, появились в кошельке не просто так. Тони их заработал. 1 BTC в 2017 году, 1 BTC — в 2018. Теперь он хочет отправить половину подруге. В его транзакцию, помимо сведений о количестве монет, будет включена информация об адресах, с которых ему пришли монеты (их называют входы), информация об адресах получателей (их называют выходы) и информация о его собственном адресе.

— Каждый вход, с которого были получены монеты весит

— Каждый выход, на который уходят монеты —

— Сама транзакция весит

10 байтов, независимо от количества адресов или суммы перевода.

Считаем: 148*2+34*2+10=374 байта. Теперь мы знаем, что наш «жадный» Тони заплатит за транзакцию 374 satoshi.

Сдача

Вы спросите, а почему мы 34 (вес адреса получателя) умножаем на 2, когда получатель всего один? Дело в том, что когда вы отправляете часть своего баланса кому-либо, то с вашего баланса уходит не часть, а вся сумма, и после валидации, т.е. включения транзакции в блок, остаток (за вычетом комиссия сети) возвращается обратно на ваш кошелек. Поэтому, помимо информации об адресе получателя, в транзакцию включается и информация об адресе отправителя, то есть вашем адресе. Этот возврат называется сдачей. В обозревателях этот момент можно увидеть в следующем виде.

Mempool

Выставив мизерную комиссию в 374 сатоши, Тони подтверждает отправку 1 BTC и ждет, когда майнеры подтвердят эту транзакцию.

Вот только майнеры не спешат её подтверждать, транзакция попадает в мемпул — книгу очереди на подтверждение. Почему? Потому что майнеры хотят зарабатывать, а не просто эксплуатировать свое оборудование, ведь за подтверждение транзакции Тони они получат всего 374 satoshi. Специально для таких очень дешевых транзакций и существует мемпул с его системой сортировки.

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

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

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

Фактически, в такой ситуации балансы отправителя как бы «заморожены». Именно этот механизм защищает сеть от спам-транзакций — ситуаций, когда спамер создает множество дешевых отправок, тем самым перегружая сеть.

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

3 суткам, но в моменты высокой активности сети этот срок может растянуться на неделю и дольше.

Согласитесь, что скорость переводов в наше время — это одна из приоритетных характеристик в вопросе использования платежных систем, а такие вот очереди не очень приятны, мягко говоря.

Чтобы протолкнуть транзакцию в мемпуле существует много способов. Все они достаточно сложны понимании и осуществлении для рядового пользователя, а некоторые граничат с таким мошенническим способом как «double-spending» (повторная трата). Тем не менее, есть одна замечательная функция, которой может пользоваться любой, о ней и поговорим. Называется она «Замена комиссионных» (Replace-by-Fee или RBF).

Replace-by-fee (RBF)

В настоящий момент не каждый, а тем более мобильный биткоин-кошелек имеет подобный продвинутый функционал.

RBF — это редактирование существующей транзакции, которая находится в мемпуле.

Редактирование означает, что в новой транзакции будут использованы те же входы что и в старой, но при этом будет изменена комиссия. Такая редактированная транзакция не будет считаться «double-spending», так как использование опции Replace-by-Fee позволит этого избежать. Ноды сети bitcoin воспринимают отредактированную транзакцию как старую, и она переносится в очереди мемпула на более привлекательные для майнеров позиции.

Таким образом, если комиссия слишком мала, то увеличить ее — это нормальная практика в случае, если требуется ускорить операцию. Не пренебрегайте функцией RBF и включите ее перед совершением транзакций, это позволит подстраховаться на случай, если перевод задержится в очереди. О том, как ускорить транзакцию bitcoin в Trustee Wallet описано в этой короткой статье.

Подтверждение

Тони вовремя сообразил, что из-за его жадности Синди может не получить подарок вовсе, поэтому своевременно воспользовался функцией RBF и увеличил комиссию. Транзакция, как и ожидалось, стала более привлекательной для майнеров, и они включили ее в очередной блок — транзакция получила 1 подтверждение. С каждым последующим найденным блоком, эта транзакция будет получать по 1 дополнительному подтверждению. Когда таких подтверждений набирается 6 и более, транзакция считается подтвержденной.

Скорость транзакций

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

    размер одного блока

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

10 минут (600 секунд);

  • транзакция нашего Тони имеет вес 374 байта.
  • 1’048’576 байтов : 374 байта = 2803,6 транзакций в одном десятиминутном блоке.
  • 2803,6 транзакций : 600 секунд = 4,6 транзакций в секунду.

Ответ: Каждую секунду майнеры подтверждают

5 транзакций, подобных транзакции Тони.

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

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

Да, но как же правило про 6 подтверждений? 6 блоков, по 10 минут на каждый, итого — 1 час…

Bitcoinклиенты

Все дело в программном обеспечении, которым пользуются держатели криптовалюты. Классические Bitcoin-кошельки будут отображать транзакцию как «неподтвержденную» до тех пор, пока она не получит 6 подтверждений (блоков).

Сервисы, которые принимают BTC в качестве оплаты, могут выставлять свои ограничения на количество блоков, нужных для подтверждения (7, 10, 45, 214 …).

BTC, которые генерируются сетью в качестве награды за нахождение блока, можно использовать только через 100 подтверждений, но классические биткоин-кошельки не будут отображать монеты, полученные за нахождение блока, пока не наберется 120 подтверждений.

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

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

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

Связка «SegWit + RBF + использование неподтвержденных транзакций» позволяет выжать максимум скорости из блокчейна BTC, что немаловажно для некастодиальных сервисов.

Предвидя ваш вопрос, что за биткоин-кошелек используют Тони и Синди, ответим сразу — Trustee Wallet.

Заключение

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

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

Если у вас остались вопросы или появились предложения — будем рады видеть их в нашем Telegram чате!

Принцип работы сети биткоин

Dzmitry Lahunouski

Биткоин-сеть — это полностью одноранговая система электронных денег, которая позволяет совершать транзакции между участниками сети напрямую, минуя любые финансовые институты. У участников сети нет необходимости доверять друг другу: данная проблема решается использованием цифровых подписей, а так же путем создания одноранговой (пиринговой) сети.

Кратко суть работы сети можно изложить следующим образом: сеть ставит метки времени на транзакции, предварительно шифруя данную метку, следующая метка шифруется на основе полученного шифра(хеша) предыдущей и новой метки времени. Таким образом формируется цепочка из меток. Цитата из свободного перевода белой книги Сатоси Накомото:

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

Транзакции. Цифровая монета в сети биткоин является ничем иным как последовательностью цифровых подписей. Для того чтобы понять, как работают подписи, представим следующую ситуацию. УАни есть 10 биткоинов, лежащих у нее в кошельке. Также у Ани есть 2 ключа — публичный, который доступен всем и так же является адресом ее кошелька, и приватный ключ — для создания подписи.

Теперь Аня создает транзакцию Бобу. Для этого она берет необходимые данные о транзакции (количество монет, хеш предыдущей транзакции, публичный ключ или адрес Боба и прочую информацию) — назовем это сообщением, и при помощи своего приватного ключа создает подпись. Подпись Ани является ничем иным как хешем.

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

Но есть две проблемы, которые остались не решенными. Первая — действительно ли Аня является владельцем того количества средств, которые она отправляла, и вторая — не отправила ли Аня эту же транзакцию например самой себе(двойная трата)?

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

Вторая проблема решается при помощи так называемой “вычислительной гонки”. О ней будет сказано ниже.

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

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

Не всякий сформированный блок будет принят остальными участни-ками. Требуется, чтобы числовое значение хеша блока не превышало установленного значения (параметр «сложность»).

Так же в служебной области блока выделено место для произвольных значений. Если хеш заголовка неверен, произвольные значения заменяются на новые и расчёт хеша повторяется. Результат хеширования непредсказуем, поэтому нет алгоритма целенаправленного изменения произвольной области для достижения желаемого результата. Обычно требуется большое количество пересчётов. Параметр «сложность» каждые 2016 блоков автоматически устанавливается так, примерно 1 блок мог быть найден(создан) за 10 минут.

Система. Работает по следующим правилам:

  1. Новые транзакции рассылаются всем узлам.
  2. Каждый узел объединяет пришедшие транзакции в блок.
  3. Каждый узел пытается подобрать хеш блока, удовлетворяющий текущей сложности.
  4. Как только такой хеш найден, этот блок отправляется в сеть.
  5. Узлы принимают блок, только если все транзакции в нем корректны и не используют уже потраченные средства.
  6. Свое согласие с новыми данными узлы выражают, начиная работу над следующим блоком и используя хеш предыдущего в качестве новых исходных данных.

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

Поэтому если Аня решит совершить двойную трату — ей придется создать собственный блок куда она включит свою “ложную” транзакцию, также ей потребуется создать за одно и то же время как минимум на 1 блок больше, чем создаст вся остальная сеть, что теоретически можно сделать только обладая 51% вычислительной мощности всей сети, совершив так называемую атаку 51.

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

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] ⁠ ⁠

Блокчейн был описан в статье Сатоши Накамото «Bitcoin: A Peer-to-Peer Electronic Cash System». Там всего на восьми страницах автор описал основы криптовалюты Биткоин, в основе которой лежал как раз алгоритм Блокчейна.

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

Список, который нельзя изменить

Блокчейн — цепочка блоков или другими словами связный список. В таком списке каждая следующая запись ссылается на одну предыдущую и так по цепочке до самой первой. Как вагоны поезда, каждый тащит за собой следующий. По поводу списков есть годная статья Никиты Лихачева на TJ, где то же самое объяснено для совсем новичков. Аналогии отчасти взяты оттуда.

Разберем на примере.

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

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

Теперь Олег всегда может подойти к доске и убедиться, что Макс всё вернул, а вот Ваня не отдает уже 700 рублей. Однажды Олег приглашает Ваню выпить к себе домой. Пока Олег отходит в туалет, Ваня стирает запись «Занял Ване 200 рублей» и вписывает вместо неё «Ваня отдал 500 рублей».

Доверявший своему списку Олег забывает про долг и теряет 700 рублей. Он решает как-то с этим бороться.

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

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

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

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

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

Но ЗЛОЙ РЮСЬКИЙ ИВАН тоже умеет в SHA-256 и легко может изменить запись вместе с её хешем. Особенно, если хеш написан прямо рядом на доске.

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

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

Так у Олега появляется личный связный список.

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

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

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

Зато проверить список всё так же просто: сначала нужно как раньше сравнить хеши, а потом проверить решения уравнений простой подстановкой. Если всё сходится — список не изменен.

В реальности же с уравнениями не всё так хорошо: компьютеры слишком хорошо их решают, да и где хранить столько уникальных уравнений. Потому авторы блокчейна придумали более красивую задачу: нужно найти такое число (nonce), чтобы итоговый хеш всей записи начинался на 10 нулей. Такой nonce сложно найти, зато результат всегда можно проверить просто глазами.

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

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

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

Централизация доверия

Идея вести неподделываемый список «кто кому занимал» понравилась нашим друзьям. Они тоже не хотят запоминать кто за кого заплатил в баре и сколько еще остался должен — всё записано на стене. Вы обсудили идею и решили, что теперь вам нужен единый список на всех.

Но кому доверить вести столь важную бухгалтерию? Ведь когда дело касается денег — доверие выходит на первый план. Мы не доверим хранить свои деньги неизвестному. Наши предки для этого придумали банки, которым со временем стали доверять, потому что они подкреплёны лицензией, законами и страховкой Центрального Банка.

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

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

Децентрализация: никто не доверяет никому

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

Минусом такого подхода является то, что для внесения новых записей придется обзванивать всех остальных участников и сообщать каждому из них свежие изменения. Но если эти участники — бездушные машины, это перестаёт быть хоть какой-то проблемой.

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

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

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

Наши записи типа «Занял Ване 500 рублей» — тоже транзакции. Но у нас нет банка, авторизующего автора транзакций. Как нам проверить, что Иван втихую не добавил запись «Макс должен Олегу 100500 рублей»?

В блокчейне для этого используется механизм публичных и приватных ключей, айтишники давно используют их для авторизации в том же SSH. Коротко о том, как работает эта сложная, но красивая математика: вы у себя на компьютере генерируете пару длинных простых чисел — публичный и приватный ключ. Приватный ключ считается супер-секретным, потому что может расшифровать то, что зашифровано публичным. Но наоборот тоже работает. Если вы расскажете публичный ключ всем друзьям, они смогут зашифровать им любое сообщение так, что прочитать его сможете только вы, так как владеете приватным. Но кроме этого у публичного ключа есть полезный эффект — с помощью него можно проверить, что данные были зашифрованы именно вашим приватным ключом, не расшифровывая при этом сами данные.

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

Простым пользователям, не желающим разбираться как выпускать и хранить приватные ключи, помогут сервисы онлайн-кошельков. Чтобы копировать длинные публичные ключи, там делают удобные QR-коды. Лично я пользуюсь Blockchain Wallet, потому что у него есть удобное мобильное приложение и он поддерживает две главные криптовалюты — BTC и ETH. Отсутствие понятия «баланса»

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

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

Отсутствие понятия «баланса»

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

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

Раз у нас нет баланса — это должны доказывать вы. Потому в транзакцию блокчейна входит не только ваша подпись и сколько вы хотите потратить, но и ссылки на предыдущие транзакции, в которых вы получили нужное количество денег. То есть если вы хотите потратить 400 рублей вы пробегаете по всей своей истории доходов и расходов, и прикрепляете к своей транзакции те доходы, где вам дали 100 + 250 + 50 рублей, тем самым доказывая, что у вас есть эти 400 рублей.

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

Каждый участник сети еще раз обязательно проверит, что вы не прикрепляли доходы дважды. Что те 300 рублей, что дал Макс на прошлой неделе, вы действительно еще не потратили.

Такие прикрепленные к транзакции доходы в блокчейне называются инпутами (input), а все получатели денег — аутпутами (output). Сумма всех инпутов редко бывает ровно такой, сколько вы хотите перевести за раз — потому один из аутпутов чаще всего будете вы сами. Другими словами транзакция в блокчейне выглядит как «мне дали 3 и 2 BTC, я хочу из них перевести 4 BTC и оставшийся 1 BTC вернуть себе обратно».

Забегая немного вперед: дополнительно из этой «сдачи» еще можно указать комиссию за транзакцию, чтобы майнеры активнее её добавляли в блоки. Тогда майнер получит копеечку, а вы немного меньше сдачи назад. О майнинге рассказано ниже.

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

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

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

Проблема двойной траты

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

Потому что сигналы из пункта А в пункт Б всегда идут с задержкой. Две транзакции могут пойти абсолютно разными путями. И транзакция, которая была инициирована первой, может дойти до получателя позже, потому что шла более длинным путём. Так получается двойное расходование, когда одни и те же деньги были отправлены сразу двум адресатам, о чем они даже не догадаются. Это вам не купюры из рук в руки передавать.

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

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

Как же убедиться, что одна транзакция была раньше другой?

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

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

Блоки — основа блокчейна

Каждый работающий компьютер в сети выбирает из общего пула любые транзакции, которые ему нравятся. Обычно просто по самой высокой комиссии, которую он может на ней заработать. Так он набирает себе транзакции, пока их суммарный размер не достигнет обговорённого лимита. В Биткоине этот лимит на размер блока равен 1 Мб (после SegWit2x будет 2 Мб), а в Биткоин Кеше — 8 Мб.

А вот в сетях типа Ethereum всё немного сложнее, там количество транзакций на блок зависит от вычислительной сложности включенных в них смарт-контрактов. Но суть не меняется — есть определенный лимит.

Весь блокчейн по сути и есть список таких блоков, где каждый ссылается на предыдущий. По нему можно отследить любую транзакцию за всю историю, разматывая блокчейн хоть до самой первой записи. Именно этот список и весит сейчас сотни гигабайт и должен быть полностью скачан на все компьютеры, которые хотят принимать участие в работе сети (но чтобы просто создавать транзакции и переводить деньги, это не обязательно). Скачивается он так же со всех ближайших компьютеров сети, как будто вы качаете сериал с торрентов, только новые новые серии в нём выходят каждые 10 минут.

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

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

Почему именно дерево. Потому что появляется возможность удалять ненужные (потраченные) транзакции из блока. Т.е. например есть две транзакции, объединённые хэшом, одна или обе уже не нужны т.к. это уже всё давно отдано другими транзакциями — так вот эти старые можно удалить, а хэш оставить, в итоге ничего не нарушается. См.пункт «7. Reclaiming Disk Space» в оригинальной статье Сатоши.

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

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

Остальные должны проверить, что блок построен по всем правилам и что мы не добавили туда лишних транзакций, а затем добавить к себе в цепочки. Теперь все транзакции в нём подтверждены, блокчейн увеличен на один блок и всё идет хорошо, не так ли?

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

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

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

Как в школе, когда все решали сложную контрольную, очень редко бывало так, что даже отличники сдавали ответы абсолютно одновременно.

Но если для человека сложная задача — это спланировать отпуск, чтобы и на майские праздники попал, и билеты на море недорого, то для компьютера — это добавить в конец блока такое число (nonce), чтобы в результате хеш SHA-256 для всего блока начинался, скажем, на 10 нулей. Это и есть та задача, которую надо решить, чтобы добавить блок в сеть Bitcoin. Для других сетей задачи могут отличаться.

Так мы приходим к понятию майнинга, на котором все так помешаны в последние годы.

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

Майнинг биткоина — не какое-то там священное таинство. Майнинг не связан с поиском новых биткоинов где-то в глубинах интернета. Майнинг — это когда тысячи компьютеров по всему миру гудят по подвалам, перебирая миллионы чисел в секунду, пытаясь подобрать хеш, начинающийся на 10 нулей. Им даже не обязательно для этого находиться в сети.

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

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

Почему именно на 10 нулей? А просто так, в этом нет никакого смысла. Так придумал Сатоши. Потому что это одна из тех задач, на которую точно всегда есть решение, но оно точно не может быть найдено быстрее, чем долгим монотонным перебором вариантов.

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

Чтобы найти начинающийся на 10 нулей хеш, у одного компьютера уйдет несколько десятков лет. Но если объединить тысячи компьютеров в единую сеть и искать параллельно, то по теории вероятностей эта задача решается в среднем за 10 минут. Это и есть время появления нового блока в блокчейне биткоина. Каждые 8-12 минут кто-то на земле находит такой хеш и получает привилегию анонсировать свою находку на всех, избежав тем самым проблемы кто был первым.

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

За нахождение ответа компьютер (по данным на 2017 год) получает 12.5 BTC — это сумма вознаграждения, которая генерируется системой биткоин «из воздуха» и уменьшается каждые четыре года. Технически это означает, что каждый майнер всегда добавляет в свой блок еще одну транзакцию — «создать 12.5 BTC и отправить их на мой кошелек». Когда вы слышите «количество биткоинов в мире ограничено 21 млн, сейчас наймайнили уже 16 млн» — это и есть такие генерируемые сетью вознаграждения.

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

Любой блокчейн существует только пока существуют его майнеры.

Именно майнеры добавляют появляющиеся транзакции в блокчейн. Так что если кто-то рассказывает вам, что он «сделает блокчейн для ***», первый вопрос, на который он должен ответить — кто и зачем будет майнить на нём. Чаще всего правильный ответ — «будут все, потому что за майнинг мы даём наши коины, которые будут расти и майнерам это выгодно». Но это применимо не для всех проектов. Например какой-нибудь Минздрав завтра создает свой закрытый блокчейн для докторов (а они хотят), кто его будет майнить? Терапевты по выходным?

Но какая выгода майнерам будет потом, когда вознаграждения исчезнут или станут мизерными?

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

То есть суть майнинга в решешии бессмысленных задачек. Разве нельзя пустить все эти мощности на что-то более полезное — поиск лекарства от рака, например?

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

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

Для биткоина именно так. Но так было не всегда. Раньше сеть была меньше, сложность ниже, а значит и выше вероятность единолично найти хеш для нового блока. Но и биткоин тогда стоил не так дорого.

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

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

Значит мы так и будем сжигать тысячи видеокарт впустую и никакого выхода нет?

Если награда в 12.5 BTC вручается лишь раз в 10 минут и только одному нашедшему блок, получается мне надо впустую жечь видеокарты несколько лет в надежде, что однажды мне упадет $40000 (по текущему курсу)?

Для биткоина именно так. Но так было не всегда. Раньше сеть была меньше, сложность ниже, а значит и выше вероятность единолично найти хеш для нового блока. Но и биткоин тогда стоил не так дорого.

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

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

Значит мы так и будем сжигать тысячи видеокарт впустую и никакого выхода нет?

Да, но есть идеи. Тот майнинг, что я описал, является классическим и называется Proof-of-Work (доказательство работы). То есть каждая машина доказывает, что она работала на благо сети тем, что решает бессмысленные задачки с заданной вероятностью.

Но некоторые ребята начинают делать блокчейны с другими видами майнинга. Сейчас вторая по популярности концепция — это Proof-of-Stake (доказательство доли владения). В таком виде майнинга, чем больше «коинов» на счету у участника сети, тем больше его вероятность вставить в блокчейн свой блок. Как самый громкий парень на деревне.

Можно придумать и другие виды майнинга. Как уже предлагали, все компьютеры в сети могут искать лекарство от рака, только нужно придумать как в таком случае зафиксировать их вклад в систему. Ведь я могу заявить, что я тоже участвую, но отключить свою видеокарту и ничего не считать. Как выразить количественный вклад каждого участника в поиск лекарства от рака? Придумаете — дерзайте пилить свой CancerCoin, хайп в СМИ вам обеспечен.

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

Теперь у нас есть два валидных блока и снова возникает проблема кого считать первым. Как поведет себя сеть в таком случае?

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

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

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

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

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

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

Из-за этого были придуманы три правила безопасности хвоста блокчейна (end of chain insecurity):

1. Вознаграждениями за майнинг, можно пользоваться только спустя еще 20 подтвержденных блоков после получения. Для биткоина это около трёх часов.

2. Если вам переслали биткоины, использовать их в качестве инпутов в новых транзакциях можно только спустя 1-5 блоков.

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

Пытаемся обмануть блокчейн

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

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

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

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

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

Но в реальности ни один датацентр не сравнится по мощности со всеми компьютерами в мире. Полтора миллиарда китайцев с айсиками, еще полтора миллиарда голодных индусов с фермами для майнинга и дешевым электричеством — это огромная вычислительная мощность. Никто в мире пока не может составить им конкуренцию в одиночку, даже Google.

Это примерно как выйти на улицу и пытаться убедить каждого человека в мире, что доллар теперь стоит 1 рубль и успеть до того, как в СМИ вас разоблачат. И вот если вы умудритесь убедить всех, то сможете обвалить мировую экономику. В теории ведь это возможно? Но на практике почему-то ни у кого не получалось.

На этой вероятности держится и блокчейн. Чем больше участников-майнеров — тем больше безопасность и доверие сети. Потому когда в Китае накрывают очередную крупную майнинг-ферму, курс и обваливается. Все боятся, что где-то в мире сидел злой гений, который уже собрал пул майнеров на

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

Блокчейн изнутри: как устроен биткоин. Разбираемся раз и навсегда человеческим языком. [ДЛИННОПОСТ] Программирование, IT, Криптовалюта, Биткоины, Блокчейн, Ethereum, Шифрование, Длиннопост

Блокчейн не только для криптовалют

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

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

«Эфиры» — второе по популярности слово, которое вы слышите в новостях о криптохайпе, после биткоина. Для обывателей это еще одна криптовалюта и способ делать моднейшую штуку под названием ICO. Разработчики на сайте описывают Ethereum как «конструктор блокчейнов для ваших нужд». Так тоже можно, да.

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

Как на самом деле работает протокол Биткоин

Много тысяч статей было написано для того, чтобы объяснить Биткоин — онлайн, одноранговую (p2p) валюту. Большинство из этих статей поверхностно рассказывают суть криптографического протокола, опуская многие детали. Даже те статьи, которые «копают» глубже, часто замалчивают важные моменты. Моя цель в этой публикации — объяснить основные идеи, лежащие в протоколе Биткоин в ясной, легкодоступной форме. Мы начнем с простых принципов, далее пойдем к широкому теоретическому пониманию, как работает протокол, а затем копнем глубже, рассматривая сырые (raw) данные в транзакции Биткоин.

Достаточно сложно понять работу протокола в деталях. Намного проще вместо этого принять Биткоин как данность и участвовать в спекуляциях о том, как разбогатеть с помощью Биткоин, является ли Биткоин пузырем, может ли Биткоин в один прекрасный день уничтожить обязательное налогообложение, и так далее. Это все весело, но существенно ограничивает ваше понимание. Понимание деталей протокола Биткоин открывает недоступные перспективы. В частности, это основа для понимания встроенного языка сценариев (скриптовый язык программирования) Биткоин, который делает возможным использование Биткоин для создания новых видов финансовых инструментов, таких как умные контракты (1 2). Новые финансовые инструменты могут, в свою очередь, быть использованы для создания новых рынков и получения новых форм коллективного поведения человека.

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

Это может показаться удивительным, что основой Биткоин является криптография. Разве Биткоин не валюта, не способ отправки секретных сообщений? На самом деле, проблемы, которые должен решать Биткоин, касаются в основном обеспечения безопасности сделок – быть уверенным, что люди не могут красть друг у друга, или выдавать себя за друг друга, и так далее. В мире атомов мы достигаем такой безопасности с помощью таких устройств, как замки, сейфы, подписи и банковские хранилища. В мире битов мы достигаем такого рода безопасности с помощью криптографии. И вот почему Биткоин в душе — криптографический протокол.

Стратегия, которую я буду использовать в моей публикации, предполагает создание Биткоин поэтапно. Я начну с объяснения очень простой цифровой валюты, основанной на идеях, которые практически очевидны. Мы назовем эту валюту Инфокоин, чтобы отличить ее от Биткоин. Конечно, наша первая версия Инфокоин будет иметь много недостатков, и поэтому мы будем проходить через несколько итераций Инфокоин, с каждой новой итерацией будем вводить только одну или две простые новые идеи. После нескольких таких итераций мы придём к полному протоколу Биткоин. Мы заново откроем Биткоин!

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

Наконец, я должен упомянуть, что я новичок в Биткоин. Я наблюдаю за ним с 2011 года (и за криптовалютами с конца 1990-х годов), но серьёзно вник в детали протокола Биткоин только в начале этого года. Так что буду благодарен за исправления любых заблуждений с моей стороны. Кроме того, я в своем материале включил ряд «проблем для автора», — заметки для себя о вопросах, которые возникли у меня во время написания. Вы можете найти их интересными, но вы также можете пропустить их полностью, не теряя основного текста.

Первые шаги: подписан протокол о намерениях

Так как мы можем спроектировать цифровую валюту?

На первый взгляд, цифровая валюта кажется чем-то невозможным. Представим себе человека — назовем ее Алиса – она имеет некоторые цифровые деньги, которые она хочет потратить. Если Алиса может использовать строку битов в качестве денег, как мы можем помешать ей использовать одну и ту же строку битов снова и снова, таким образом, создав неограниченное количество денег? Или, если мы можем как-то решить эту проблему, как мы можем предотвратить подделывания такой строки битов и использование ее для кражи у Алисы?

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

В первой версии Инфокоин давайте найдем способ, чтобы Алиса могла использовать строку битов в (очень примитивной и неполной) форме денег, но таким образом, чтоб у нее была хоть какая-то защита от подделки. Предположим, Алиса хочет дать другому человеку, назовем его Боб, один инфокоин. Чтобы сделать это, Алиса записывает сообщение «Я, Алиса, даю Бобу один инфокоин». Затем она подписывает в цифровом формате сообщение с использованием закрытого ключа шифрования (криптоключ), и заявляет о подписанной строке битов всему миру.

(Кстати, я использую «Инфокоин» с большой буквы для обозначения протокола и общей концепции, и «инфокоин» с маленькой буквы для обозначения конкретного денежного знака. Подобная практика является обычным явлением, хотя и не всеобщей, в мире Биткоин.)

Такой прототип цифровой валюты вас не очень впечатлит! Но у него есть некоторые достоинства. Любой человек в мире (в том числе и Боб) может использовать открытый ключ Алисы для проверки, что Алиса на самом деле была человеком, который подписал сообщение «Я, Алиса, даю Бобу один инфокоин». Никто другой не смог бы создать эту строку битов, а значит Алиса не может повернуться и сказать: «Нет, я вовсе не имела в виду, что хочу отдать Бобу один инфокоин». Таким образом, протокол устанавливает, что Алиса действительно намерена дать Бобу один инфокоин. Такой же факт — никто не смог бы составить такое подписанное сообщение — дает Алисе некоторую ограниченную защиту от подделки. Конечно, после того, как Алиса опубликовала свое сообщение, существует возможность дублировать ее сообщение другими людьми, так что в некотором смысле подделка возможна. Но это не возможно с нуля. Эти два свойства — установление намерения со стороны Алисы и ограниченная защита от подделки – действительно примечательные особенности этого протокола.

Я (совсем) не сказал о том, что, собственно, есть цифровые деньги. Объясняю: это просто само сообщение, т. е. последовательность битов, а точней, подписанное цифровой подписью сообщение: «Я, Алиса, даю Бобу один инфокоин». В будущем протоколы будут похожи в том, что все наши формы цифровых денег будут просто более содержательными сообщениями.

Использование серийных номеров с целью обозначить монеты

Проблема с первой версией Инфокоин в том, что Алиса может продолжать посылать Бобу то же подписанное сообщение снова и снова. Предположим, Боб получает десять копий подписанного сообщения «Я, Алиса, даю Бобу один инфокоин». Означает ли это, что Алиса послала Бобу десять различных инфокоинов? Было ли ее послание случайно дублированным? Возможно, она пыталась обмануть Боба, притворяясь, что она дала ему десять различных ифнокоинов, в то время как сообщение лишь доказывает всему миру, что она намерена передать один инфокоин.

Чего бы нам хотелось, так это найти способ сделать инфокоины уникальными. Они нуждаются в лейбле или серийном номере. Алиса подпишет сообщение «Я, Алиса, даю Бобу один инфокоин, с серийным номером 8740348». Потом, позже, Алиса может подписать сообщение «Я, Алиса, даю Бобу один инфокоин, с серийным номером 8770431», и Боб (и все остальные) будет знать, что другой инфокоин был передан.

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

Более конкретно, давайте предположим, что Алиса приходит в банк и говорит: «Я хочу снять (withdraw) один инфокоин с моего счета». Банк уменьшает ее баланс счета на один инфокоин, и присваивает ему новый, никогда ранее не используемый серийный номер, скажем 1234567. Затем, когда Алиса хочет передать ее инфокоин Бобу, она подписывает сообщение «Я, Алиса, даю Бобу один инфокоин с порядковым номером 1234567». Но Боб не просто принимает инфокоин. Вместо этого, он вступает в контакт с банком, и проверяет, что: (а) инфокоин с этим серийным номером принадлежит Алисе; и (б) Алиса еще не потратила этот инфокоин. Если условия верны, то Боб информирует банк о том, что он хочет принять этот инфокоин, и банк обновляет свои записи, чтобы отображать, что инфокоин с этим серийным номером в настоящее время в распоряжении Боба и больше не принадлежит Алисе.

Создавать банк совместными усилиями

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

Идея состоит в том, чтобы каждый (в совокупности) был банком. В частности, мы допустим, что все пользователи Инфокоин хранят полную запись о том, кому инфокоины принадлежат. Вы можете представить это как открытую общую книгу учета с указанием всех операций Инфокоин. Мы назовём эту книгу «цепочка блоков» (blockchain), именно так в Биткоин и называется публичная запись всех транзакций.

Теперь предположим, что Алиса хочет передать инфокоин Бобу. Она подписывает сообщение «Я, Алиса, даю Бобу один инфокоин с порядковым номером 1234567», и отправляет подписанное сообщение Бобу. Боб может использовать свою копию цепочки блоков, чтобы проверить, действительно ли инфокоин принадлежит Алисе. Если это проверяется, то потом он посылает одновременно сообщение Алисы и свок сообщение о принятии сделки по всей сети и все обновляют свои копии цепочки блоков.

У нас еще есть проблема «откуда берется серийный номер», но это, оказывается, довольно легко решить, и поэтому я отложу ее на потом, когда будем обсуждать Биткоин. Более сложной проблемой является то, что этот протокол позволяет Алисе обманывать через повторное расходование (double spending) ее инфокоинов. Она отправляет подписанное сообщение «Я, Алиса, даю Бобу один инфокоин с порядковым номером 1234567» Бобу, и сообщение «Я, Алиса, даю Чарли один инфокоин, с [тем же] серийный номером 1234567» Чарли. Оба, Боб и Чарли, используют свою копию цепочки блоков для проверки того, что инфокоин принадлежит Алисе. При условии, что они делают эту проверку в то-же самое время (до того, как они имели возможность услышать друг от друга), оба увидят, что да, цепочка блоков показывает принадлежность монеты Алисе. Итак, они оба принимают перевод и также вместе транслируют информацию о принятие сделки. Вот теперь мы имеем проблему. Как другие люди должны обновлять свои цепочки блоков? Может быть не так уж просто найти способ получения согласующей общей книги транзакций. И даже если все могут согласиться на постоянной основе обновлять свои цепочки блоков, есть еще одна проблема, что Боб или Чарли могут быть обманутыми.

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

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

Более подробно, давайте предположим, что Алиса хочет дать Бобу один инфокоин. Как и прежде, она подписывает сообщение «Я, Алиса, даю Бобу один инфокоин с порядковым номером 1234567», и дает подписанное сообщение Бобу. Так же, как и прежде, Боб делает проверку работоспособности, используя его копию цепочки блоков, чтобы проверить действительно ли монета в настоящее время принадлежит Алисе. Но в этот момент протокол изменен. Боб не просто идет вперед и принимает сделку. Вместо этого, он передает сообщение Алисы всей сети. Другие члены сети проверяют, имеет ли Алиса этот инфокоин. Если это так, они передают сообщение «Да, Алиса владеет инфокоином 1234567, теперь он может быть передан Бобу». Как только достаточное количество людей распространят этот послание в сети, все обновят свои цепочки блоков, которые будут показывать, что инфокоин 1234567 теперь принадлежит Бобу, и сделка завершена.

Этот протокол имеет много неточных элементов в настоящее время. Например, что значит сказать «достаточное количество людей должны транслировать это сообщение»? Что значит «достаточно»? Это не может означать всех в сети, так как мы априори не знаем, кто находится в сети Инфокоин. По той же причине, это не может означать некоторую фиксированную долю пользователей в сети. Мы не будем пытаться разобраться в этом прямо сейчас. Вместо этого, в следующем разделе я буду указывать серьезные проблемы в подходе, который мы описали. Обращая внимание на эту проблему, мы будем иметь приятный побочный эффект от создания идей выше более понятными.

Доказательство работы

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

Существует способ избежать этой проблемы, используя идею, известную как доказательство правильности работы (proof-of-work). Идея парадоксальна и включает в себя сочетание двух других идей: (1) (искусственно) сделать подтверждение транзакций затратными для пользователей сети в виде компьютерных вычислений; и (2), вознаградить их за помощь проверки транзакций. Награда используется для того, чтобы люди в сети пробовали помочь проверить сделки, несмотря на необходимость тратить вычислительную мощность на этот процесс. Польза от того, что проверка транзакций требует затрат, помогает избежать зависимости от количества идентичностей (пользователей сети), подконтрольных кому-либо. Таким образом, только общая вычислительная мощность может оказывать давление на проверку. Как мы увидим, используя некоторый умный дизайн, мы можем сделать так, чтобы мошеннику потребовались огромные вычислительные ресурсы для обмана, что делает это практически нецелесообразным.

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

Предположим, Алиса транслирует в сеть новость «Я, Алиса, даю Бобу один инфокоин с порядковым номером 1234567».

Услышав это сообщение, каждый добавляет его в очередь ожидающих подтверждения (pending) сделок: услышаны, но еще не были утверждены сетью. Например, другой пользователь сети по имени Дэвид может иметь следующую очередь незавершенных сделок:

Я, Том, даю Сью один инфокоин, с серийным номером 1201174.

Я, Сидней, даю Синтии один инфокоин, с серийным номером 1295618.

Я, Алиса, даю Бобу один инфокоин с порядковым номером 1234567.

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

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

Что за задачу Давиду нужно решить? Чтобы объяснить это, давайте h будет фиксированной хэш-функцией известной всем в сети — она встроена в протокол. Биткоин использует известную хеш-функцию SHA-256, но любая криптографически безопасная хэш-функция подойдет. Давайте дадим очереди незавершенных сделок Дэвида лейбл L, чтоб нам удобней было ссылаться. Предположим, Дэвид добавляет число х (так называемый одноразовый номер) и вычисляет хэш-суму из комбинации. Например, если мы используем L = «Hello, world!» (Очевидно, что это не список операций, просто строка используется для иллюстрации) и одноразовый х = 0, то (выход получаем в шестнадцатеричном формате)

h(«Hello, world!0») = 1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64

Задача, которую Дэвид должен решить — доказательство правильности работы — это найти простое число х так, что когда мы добавляем х к L и результат хеширования комбинации начинается с ряда нулей. Задачу можно сделать более или менее трудной, изменяя число нулей, необходимых для решения этой задачи. Относительно простым доказательством правильности работы задачи может потребовать только три или четыре нуля в начале хэша, в то время как более трудным доказательством правильности работы задача может потребовать гораздо большее количество нулей, скажем 15 последовательных нулей. В любом случае, выше попытка найти подходящий одноразовый номер с х = 0 не удалась, так как результат не начинается с нуля. Попробуем х = 1,. Тоже не сработает:

h(«Hello, world!1») = e9afc424b79e4f6ab42d99c81156d3a17228d6e1eef4139be78e948a9332a7d8

Мы можем продолжать искать разные значения для х =2,3,4….наконец, при значении x=4250 мы получаем:

h(«Hello, world!4250») = 0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9

Это число дает нам строку из четырех нулей в начале выхода хэш. Этого будет достаточно, чтобы решить простую задачу «доказательство работы», но не достаточно, чтобы решить более трудную задачу «доказательство работы».

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

Существует возможность сделать эту задачу более или менее трудно решаемой через большее или меньшее количество нулей на выходе из хэш-функции. На самом деле, протокол Биткоин получает довольно хороший уровень контроля над трудностью задачи, используя незначительную вариацию головоломки на доказательство правильности работы (proof-of-work), описанной выше. Вместо того, чтобы требовать нули, Биткойн в качестве доказательства правильности работы требует, чтобы хэш заголовка блока транзакций быть меньше или равным числу, известному как цель. Эта цель автоматически регулируется для того, чтобы блок Биткойн занимал, в среднем, около десяти минут для авторизации.

(На практике есть значительная случайность в том, как много времени потребуется для утверждения блока — иногда новый блок утвержден всего за минуту или две, а в других случаях это может занять 20 минут или даже больше. Это напрямую меняется в протоколе Биткойн, так что время для проверки обычно достигает максимум около десяти минут. Вместо того, чтобы решать одну задачу, мы можем потребовать решения нескольких задач; используя тщательно разработанный программный дизайн, можно значительно уменьшить дисперсию во времени для проверки блока сделок.)

Хорошо, давайте предположим, что Дэвиду повезло и он нашел подходящее число х. Ура! (Он получит вознаграждение за нахождение числа, как будет описано ниже). Он транслирует блок операций, который он утверждает, в сеть вместе со значением х. Другие участники сети Инфокоин могут проверить, что х является решением доказательства правильности работы задачи. И они затем должны обновить свои цепочки блока, чтобы включить новый блок операций в цепочку.

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

В протоколе Биткоин, этот процесс подтверждения называется майнинг (mining). За каждый проверенный блок сделок, успешный майнер получает вознаграждение в биткоинах. Вначале эта награда была установлена на уровне 50 биткоинов. Но на каждые 210 тысяч проверенных блоков (примерно, раз в четыре года) награда уменьшается вдвое. Это произошло только один раз. На сегодняшний день вознаграждение за добычу блока составляет 25 биткоинов. Это снижение ставки в два раза будет продолжаться каждые четыре года до года 2140. В тот момент, награда за майнинг упадет ниже 10^-8 биткоинов за блок.10^-8 биткоинов, на самом деле, минимальная единица Биткоин, и известна как Сатоши. Таким образом, в 2140 году общее предложение биткоинов перестанет увеличиваться. Однако это не устранит стимул, чтобы продолжать проверки транзакций. Биткоин также дает возможность выделить некоторую сумму в сделке в качестве платы за транзакцию, что попадет к майнеру, который помогает акцептовать сделки. В первые дни Биткоин плата за транзакцию составляла ноль, но с ростом популярности Биткоин платы за транзакцию постепенно возросли, и в настоящее время являются дополнительной прибавкой к награде в 25 биткоинов за майнинг блока.

Вы можете думать о доказательстве правильности работы (proof-of-work) как о соревновании кто быстрей акцептует сделки. Каждый вход в соревнование стоит немного вычислительной мощности. Шанс победы майнера в соревновании является (грубо говоря, и с некоторыми оговорками) равным отношению к общей вычислительной мощности, что они контролируют. Так, например, если майнер контролирует один процент всей вычислительной мощности используемого для проверки транзакций в Биткоин, то он имеет примерно один процент шансов на победу. То есть при условии, что в соревновании задействовано много вычислительной мощности, нечестный майнер скорее всего будет иметь относительно небольшой шанс исказить процесс проверки, если только он не потратит огромное количество вычислительных ресурсов.

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

Я проанализирую двойные расходы уже скоро. Прежде чем сделать это, я хочу заполнить важную деталь в описании Инфокоин. Идеально было бы согласовать порядок в сети Инфокоин, в котором имели место транзакции. Если у нас нет такого порядка, то в любой момент может стать непонятно, кто владеет какими инфокоинами. Чтобы решить это, мы будет требовать, чтобы новые блоки всегда включали указатель на предыдущий блок, утвержденный в цепочке, в дополнение к списку транзакций в блоке. (Указатель на самом деле просто хэш предыдущего блока). Итак, у нас есть цепочка блоков (block chain) – это просто прямая цепочка блоков транзакций, один за другим, где каждый блок содержит указатель на непосредственно предыдущий блок:

image

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

image

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

Предположим мы имеем вилку, в которой некоторые майнеры получают сначала блок А и некоторые майнеры получают блок В. Те майнеры, которые получают блок А сначала, будут продолжать работать вдоль этого разветвления, в то время как другие майнеры будут идти вместе с разветвлением B. Предположим, что майнеры, работающие на разветвлении B успешно добыли блок:

image

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

Независимо от результата, этот процесс гарантирует, что цепочка блоков имеет согласованное во времени упорядочение блоков транзакций. В Биткоин принято, что сделка не считается подтвержденной до того как: (1) она является частью блока в длинном разветвлении, и (2), по меньшей мере, 5 блоков последовали за ним в самом длинном разветвлении. В этом случае мы говорим, что сделка имеет «6 подтверждений ». Это дает время сети прийти к согласованной упорядоченности блоков. Мы будем также использовать эту стратегию для Инфокоин.

С упорядочением мы разобрались, давайте вернемся к размышлению о том, что происходит, если нечестный пользователь пытается дважды потратить. Предположим, Алиса пытается дважды потратить инфокойн с Бобом и Чарли. Один из возможных подходов для нее, попытаться самостоятельно проверить блок, который включает в себя обе транзакции. Предполагая, что у нее есть один процент общей вычислительной мощности, ей может повезти, и она подтверждает блок, решая математическую задачу правильности работы (proof-of-work). К сожалению, для Алисы, повторный платеж будет сразу замечен другими людьми в сети Ифнокоин и отклонен, несмотря на решение задачи с доказательством правильности работы. Так что нам не нужно беспокоиться.

Более серьезная проблема возникает, если она транслирует отдельно две сделки, в которых она проводит тот же инфокоин с Бобом и Чарли, соответственно. Она может, например, транслировать одну транзакцию одной группе майнеров, а другую транзакцию — другой, надеясь получить одобрение сделок таким образом. К счастью, в этом случае, как мы видели, сеть будет окончательно подтверждать только одну из этих сделок, но не обе. Так, например, сделка Боба в конечном счете может быть подтверждена, и в этом случае Боб может быть спокоен. Между тем, Чарли увидит, что его сделка не была подтверждена, и он откажется от предложения Алисы. Так что в этом нет проблемы. На самом деле, зная, что это будет происходить, нет особых причин для Алисы пробовать это.

Существует другой важный вариант двойных расходов, если Алиса = Боб, т.е. Алиса старается оплатить монету Чарли, которую она также «расходует» сама себе (то есть, отдавая себе). Выглядит это так, что легко заметить и справиться с этим, но в то же время, конечно, легко в сети настроить несколько пользователей, связанных с тем же лицом или организацией, так что такую возможность необходимо учитывать. В таком случае, стратегия Алисы ждать, пока Чарли не примет инфокоин, что произойдет после того, как сделка была подтверждена 6 раз в самой длинной цепи. Она будет пытаться разветвить цепочку до сделки с Чарли, добавляя блок, в который включена транзакция оплаты самой себе:

image

К сожалению, для Алисы сейчас очень трудно догнать более длинное разветвление. Другие майнеры не хотят помочь ей, так как они будут работать на более длинном разветвлении. И до тех пор, пока Алиса не сможет решить доказательство правильности работы, по крайней мере так быстро, как и все остальные в сети вместе — грубо говоря, это означает, что контролируя более пятидесяти процентов вычислительной мощности — то она будет просто отставать дальше и дальше позади. Конечно, ей может повезти. Мы можем, например, представить себе сценарий, в котором Алиса управляет одним процентом вычислительной мощности, но случится удача и она найдет шесть дополнительных блоков в ряд, прежде чем остальная часть сети нашла какой-либо новый блок. В этом случае она могла бы опередить, и получить контроль над цепочкой блоков. Но это в частности событие произойдет с вероятностью 1/(100^6) = 10^-12. Более общий анализ в этом направлении показывает, что вероятность Алисы догнать более длинное разветвление блоков бесконечно мала, если она не в состоянии решить доказательство правильности работы со скоростью, близкой ко всем другим майнерам вместе взятым.

Конечно, это не тщательный анализ безопасности, показывающий невозможность Алисы осуществить повторные расходы. Это всего лишь неофициальный аргумент достоверности. Оригинальный текст, представляющий Биткоин, по сути, не содержит тщательного анализа безопасности, только неформальные аргументы по моментам, что я представил. Сообщество, которые интересуются безопасностью, по-прежнему анализирует Биткоин, и пытается понять возможные уязвимости. Вы можете увидеть некоторые из этих исследований здесь, и я упомяну несколько проблем в «Проблемы для автора » ниже (см. в оригинальном тесте). На данный момент, я думаю, что справедливо сказать, что жюри все еще не знают, насколько безопасным Биткоин является.

Идеи доказательства правильности работы и майнинга порождают много вопросов. Какова награда нужна, чтобы убедить людей добывать? Как изменения в эмиссии инфокоин повлияет на экономику Ифнокоин? Будет майнинг Инфокоин в конечном итоге сконцентрирован в руках немногих, или многих? Если майнеров всего лишь несколько, поставит ли это под угрозу безопасность системы? Предположительно стоимость транзакций со временем сбалансируется — не приведет ли это к нежелательному источнику трения, и не сделает ли маленькие транзакции менее желательными? Это все большие вопросы, которые выходят за рамки этой статьи. Я могу возвратиться к этим вопросам (в контексте Биткоин) в будущих публикациях. В настоящее время, мы сфокусируемся на понимании того, как работает протокол Биткоин.

Биткоин

Давайте отойдем от Инфокоин, и опишем фактический протокол Биткоин. Есть несколько новых идей здесь, но с одним исключением (см. ниже), что они в основном очевидные модификации Инфокоин.

Для того, чтобы использовать Биткоин на практике, сначала устанавливаем программу- бумажник на вашем компьютере. Чтобы дать вам понимание, что это значит, вот скриншот из программы-бумажника с названием Multbit. Вы можете видеть баланс биткоинов слева — 0.06555555 биткоин, или около 70 долларов по курсу на день, когда я сделал этот скриншот — и справа две недавние сделки, которые формируют 0,06555555 биткоинов:

image

Предположим, что вы торговец, который создал интернет-магазин, и решил позволить людям оплачивать ваши товары с помощью Биткоин. Первое что вы делаете – генерируете в программе Биткоин адрес. В ответ, он сгенерирует открытую / закрытую пару ключей, а затем хэш открытого ключа, чтобы сформировать свой Bitcoin адрес:

image

Затем вы отправьте Биткоин-адрес человеку, который хочет покупать у вас. Вы можете сделать это по электронной почте, или даже поместить адрес публично на веб-странице. Это безопасно, поскольку адрес является лишь значением результата хэширования вашего открытого ключа, который может безопасно быть известен в мире так или иначе. (Я вернусь позже к вопросу о том, почему адрес Биткоин — это хэш, а не только открытый ключ.)

Человек, который будет платить вам генерирует транзакцию. Давайте взглянем на данные из реальной сделки передающей 0.31900000 биткоинов. Ниже показаны почти необработанные данные. Они изменены в трех моментах: (1) данные были преобразованы из последовательной формы в параллельную (deserialized); (2) номера строк, которые были добавлены, для удобства пользования; и (3) я сократил различные хэши и открытые ключи, просто отображая первые шесть шестнадцатеричных цифр каждого, когда на самом деле они гораздо длиннее. Вот данные:

  1. <«hash»:«7c4025…»,
  2. «ver»:1,
  3. «vin_sz»:1,
  4. «vout_sz»:1,
  5. «lock_time»:0,
  6. «size»:224,
  7. «in»:[
  8. <«prev_out»:
  9. <«hash»:«2007ae…»,
  10. «n»:0>,
  11. «scriptSig»:«304502… 042b2d…»>],
  12. «out»:[
  13. <«value»:«0.31900000»,
  14. «scriptPubKey»:«OP_DUP OP_HASH160 a7db6f OP_EQUALVERIFY OP_CHECKSIG»>]>

Давайте пройдемся строка за строкой.

Строка 1 содержит хэш оставшейся части сделки, 7c4025 …, выраженное в шестнадцатеричном виде. Это используется в качестве идентификатора транзакции.

Строка 2 говорит нам, что это сделка в версии 1 протокола Биткоин.

Строки 3 и 4 говорят нам, что сделка имеет один ввод и один вывод, соответственно. Я поговорю ниже о сделках с большим количеством вводов и выводов, и почему это полезно.

Строка 5 содержит значение lock_time, которое может быть использовано для контроля, когда транзакция будет завершена. Для большинства транзакций Биткоин сегодня lock_time установлен в 0, это означает, что транзакция немедленно завершена.

Строка 6 говорит нам размер (в байтах) сделки. Обратите внимание, что это не денежная сумма передается! Об этом далее.

Строки с 7 по 11 определяют вводные биткоины к операции. В частности, строки с 8 по 10 говорят нам, что ввод должен быть взят с вывода из предыдущей сделки с соответственной хэш-суммой, которая выражается в шестнадцатеричном формате как 2007ae ….n = 0 говорит нам о том, что это будет первый вывод из той транзакции; мы увидим в ближайшее время, как работают несколько выводов (и вводов) в транзакции, так что не волнуйтесь слишком много об этом сейчас. Строка 11 содержит подпись лица, передающего деньги — 304502 …, затем пробел, а затем соответствующий открытый ключ -04b2d …. Опять же в шестнадцатеричном формате.

Единственное, что следует отметить о вводе, так это отсутствие точного указания сколько биткоинов от предыдущей транзакции должны быть потрачены в этой транзакции. На самом деле, все биткоины от n = 0-го вывода предыдущей транзакции потрачены. Так, например, если n = 0-й вывод из предыдущей сделки составил 2 биткоина, то 2 биткоина будут потрачены в этой транзакции. Это кажется неудобным ограничением – все равно, что пытаться купить хлеб с купюрой в 20 долларов, и не в состоянии разбить на мелкие банкноты. Решение, конечно, должно иметь механизм для получения сдачи. Это можно сделать с помощью транзакций с несколькими вводами и выводами, которые мы обсудим в следующем разделе.

Строки с 12 по 14 определяют вывод биткоинов из сделки. В частности, строка 13 говорит нам значение вывода: 0,319 биткоинов. Строка 14 является достаточно сложным процессом. Важно отметить, что значение a7db6f … является Биткоин-адресом предполагаемого получателя средств (написанный в шестнадцатеричном формате). На самом деле, строка14 ни что иное как отображение языка сценариев Биткоин. Я не собираюсь описывать этот язык программирования в деталях в этой заметке, главное для нас понять, что a7db6f … является лишь Биткоин-адресом.

Между прочим, теперь видно, как биткоин взывает к проблеме, что я «припрятал в рукаве» в прошлой главе: откуда берутся серийные номера Биткоин? На самом деле, роль серийного номера играет хеш-сумма транзакций. В приведенной выше транзакции, например, получатель получает 0,319 биткоинов, которые приходят из первого вывода предшествующей операции с хэш-суммой 2007ae … (строка 9). Если вы идете и смотрите в цепочку блока для этой транзакции, вы увидите, что его вывод поступает из еще более ранней сделки. И так далее.

Есть две умные вещи в том, чтобы использовать хэш-суммы транзакций вместо серийных номеров. Во-первых, в Биткоин совсем нет действительно никаких отдельных, постоянных (виртуальных) «монет». Имеет место просто длинная серия сделок в цепочке блоков. Это умная идея, чтобы понять, что вам не нужны монеты, и можно просто обойтись книгой сделок. Во-вторых, при работе таким образом мы убираем необходимость любого центрального органа, который выдает серийные номера. Вместо этого, серийные номера могут быть генерированы автоматически, лишь путем хеширования сделки.

На самом деле, можно продолжать следовать по цепочке сделок дальше в прошлое. В конечном счете, этот процесс должен завершиться. Это может произойти двумя способами. Первая возможность возникнет, когда вы придёте к самой первой транзакции Биткоин, содержащейся в так называемом Начальном блоке (Genesis block). Это особая транзакция, не имеющая вводов, а только вывод в 50 биткоинов. Другими словами, эта сделка устанавливает первоначальную денежную массу. Начальный блок обращается отдельно клиентами (программами) сети Биткоин. И я не буду вдаваться в подробности сейчас, хотя это очень похоже на сделку, описанную выше. Вы можете увидеть преобразованные из последовательной формы в параллельную исходные данные здесь.

Вторая возможность будет, когда вы последуете по цепочке сделок назад во времени, то в конечном итоге вы прибудете к так называемой базовой транзакции (coinbase transaction). За исключением Начального блока, каждый блок операций в цепочке блоков начинается со специальной базовой транзакции. Это сделка — награждение майнера, который проверит этот блок операций. Он использует аналогичный, но не идентичный формат транзакции, представленной выше. Я не буду вдаваться в детали по формату, и если вы хотите увидеть пример, см. здесь. Вы можете прочитать немного больше о базовых сделках здесь. Кое в чем я не был точным из представленного выше, а именно в том, что конкретно подписывается цифровой подписью в строке 11. Очевидно, что плательщик должен подписать всю транзакцию (кроме хэш транзакции, которая генерируется позже). В настоящее время, это не так — некоторые части транзакции опущены. Это делает некоторые части сделки изменяемыми, т. е. они могут быть изменены позже. Однако, эта пластичность не включаются в сумму к выплате, отправителей и получателей, которые не могут быть изменены позже. Я должен признать, я не влезал в детали. Как я понимаю, эта пластичность находится в стадии обсуждения в сообществе разработчиков Биткоин, и предпринимаются усилия в направлении сокращения или ликвидации этой пластичности.

Операции с несколькими входами и выходами

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

  1. . <«hash»:«993830…»,
  2. «ver»:1,
  3. «vin_sz»:3,
  4. «vout_sz»:2,
  5. «lock_time»:0,
  6. «size»:552,
  7. «in»:[
  8. <«prev_out»:<
  9. «hash»:«3beabc…»,
  10. «n»:0>,
  11. «scriptSig»:«304402… 04c7d2…»>,
  12. <«prev_out»:<
  13. «hash»:«fdae9b…»,
  14. «n»:0>,
  15. «scriptSig»:«304502… 026e15…»>,
  16. <«prev_out»:<
  17. «hash»:«20c86b…»,
  18. «n»:1>,
  19. «scriptSig»:«304402… 038a52…»>],
  20. «out»:[
  21. <«value»:«0.01068000»,
  22. «scriptPubKey»:«OP_DUP OP_HASH160 e8c306… OP_EQUALVERIFY OP_CHECKSIG»>,
  23. <«value»:«4.00000000»,
  24. «scriptPubKey»:«OP_DUP OP_HASH160 d644e3… OP_EQUALVERIFY OP_CHECKSIG»>]>

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

Строка 1 содержит хэш остальной части транзакции. Это используется в качестве идентификатора транзакции.

Строка 2 говорит нам, что это сделка версии 1 протокола Биткоин.

Строки 3 и 4 говорят нам, что сделка имеет три ввода и два вывода, соответственно.

Строка 5 содержит lock_time. Как и в случае с одним вводом и одним выводом значение равно 0, что означает, что транзакция немедленно завершена.

Строка 6 говорит нам размер сделки в байтах.

Строки с 7 по 19 определяют список вводов к сделке. Каждый соответствует выводу из предыдущей сделки Биткоин.

Первый ввод определяется в строках с 8 до 11.

В частности, строки с 8 по 10 говорят нам, что ввод должен быть взят от n = 0-го вывода из сделки с значением хэша 3beabc …. Строка 11 содержит подпись, затем пробел, а затем открытый ключ отправителя биткоин.

Строки 12 по 15 определяют второй ввод в формате подобно строкам с 8 по 11. И строки с 16 по 19 определяют третий ввод.

Строки с 20 по 24 определяют список, содержащий два вывода из сделки.
Первый вывод определяется в строках 21 и 22. Строка 21 говорит нам значение вывода в 0,01068000 биткоинов. Как и прежде, строка 22 является выражением скриптового языка Биткоин. Главное, на что стоит тут обратить внимание, строка e8c30622 … является Биткоин адресом предполагаемого получателя средств.

Второй вывод определяется в строках 23 и 24 в форме подобно первому выводу.

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

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

Одно хорошее применение таких транзакций является идея сдачи. Предположим, например, что я хочу послать вам 0,15 биткоинов. Я могу сделать это, отправив вам деньги из предыдущей сделки, в которой я получил 0,2 биткоинов. Конечно, я не хочу отправить вам все 0,2 биткоинов. Решение будет отправить вам 0,15 биткоинов, и направить 0,05 биткоинов на свой Биткоин-адрес, который принадлежит мне. Эти 0,05 биткоинов являются сдачей. Это несколько отличается от процесса получения сдачи в магазине, так как сдача в данном случае есть плата самому себе. Но общая идея схожа.

Вывод

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

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

Я завершу свой пост обращением к нескольким спорным моментам.

Насколько анонимен Биткоин? Многие люди утверждают, что Биткоин можно использовать анонимно. Это утверждение привело к образованию рынков, таких как Шелковый путь (Silk Road) и различных преемников, которые специализируются на нелегальных товарах. Между тем, утверждение что Биткоин анонимен является мифом. Цепочка блоков публична и открыта, что означает возможность для каждого увидеть любую транзакцию Биткоин когда-либо. Хотя Биткоин-адреса не сразу ассоциируется с реальных людьми, ученые-компьютерщики сделали большую работу, выясняя, как осуществлять де-анонимизацию «анонимных» социальных сетей. Цепочка блоков является идеальной целью для этих методов. Я буду очень удивлен, если подавляющее большинство пользователей Биткоин не будут опознаны с относительно высокой степенью уверенности и легкости в ближайшем будущем. Эта уверенность не будет достаточно высокой для достижения признания виновности, но будет достаточно высокой, чтобы определить вероятные цели. Кроме того, идентификация будет ретроспективной, это означает, что тот, кто купил наркотики на рынке Шелковый путь в 2011 году по-прежнему будет возможен для идентификации на основе цепочки блока, скажем, в 2020 году. Эти методы де-анонимизации хорошо известны ученым, и, предположительно, Агентству Национальной Безопасности (США). Я бы не удивился, если АНБ и другие учреждения уже распознали многих пользователей. Парадоксально, что Биткоин часто преподносится как анонимный. Это не так. Наоборот, Биткоин, возможно, наиболее открытый и прозрачный финансовый инструмент, какого мир еще не видел.

Можете ли вы разбогатеть с Биткоин? Ну, может быть. Тим О’Рейли однажды сказал: «Деньги, как бензин в машине — нужно обращать внимание или вы, в конечном итоге, окажитесь на обочине дороги; но хорошо прожитая жизнь не экскурсия по АЗС! » Много интереса к Биткоин исходит от людей, чья жизненная позиция направлена на то чтобы найти действительно большую бензоколонку. Я должен признать, я нахожу это озадачивающим. На мой взгляд, гораздо более интересно и приятно думать о Биткоин и других криптовалютах, как о пути новых форм коллективного поведения. Это интеллектуально увлекательно, предлагает чудесные возможности для творчества, является социально ценным, и можно также положить деньги в банк. Но если деньги в банке является вашей главной задачей, то я считаю, что другие стратегии имеют гораздо больше шансов на успех.

Детали я опустил: хотя этот пост описал основные идеи, лежащие в Биткоин, есть много деталей, которые я не упомянул. Вот, например, особенность по сохранению размера, что используется протоколом, основанная на модели структурирования данных, известной как дерево Меркле (Merkle Tree). Это деталь, но великолепная деталь, и стоит узнать больше, если структуры данных — ваша фишка. Вы можете загрузить и изучить оригинальные страницы Биткоин. Во-вторых, я уже говорил немного о сети Биткоин — вопросы типа как сеть имеет дело с атаками в отказе обслуживания (denial of service attack), как узлы присоединяются и покидают сеть, и так далее. Это увлекательная тема, но это также требует много деталей, так что я опустил это. Вы можете узнать больше об этом на некоторых из приведенных выше ссылках.

Скриптовый язык Биткоин: В этой статье я объяснил Биткоин как форму цифровых онлайн денег. Но это только малая часть гораздо большей и более интересной истории. Как мы уже видели, каждая Биткоин транзакция связана со сценарием (script) на языке программирования Биткоин. Сценарии, которые мы видели в этом материале описывают простые операции, как «Алиса дала Бобу 10 биткойнов». Но язык сценариев также можно использовать, чтобы выразить гораздо более сложные транзакции. Иными словами, Биткоин – это программируемые деньги. В более поздних публикациях я поясню систему сценариев, и как можно использовать Биткоин сценарии в качестве платформы для экспериментов со всеми видами удивительных финансовых инструментов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

https://alkogolizm.vyvod-iz-zapoya-na-domu-voronezh.ru/