Биткойн изнутри для непонимающих
Множество неоднозначных статей написаных про биткойн побудили написать меня статью о внутреннем устройстве этой системы. Меня удивило, что некоторые авторы писали о цифровых монетах без понимания внутреннего устройства, и смысл длительных рассуждений был безуспешной попыткой узнать лохотрон ли это. Надеюсь после данной статьи вера или доверие bitcoin перейдет в уверенность и осознанность. Я не буду раскрывать в этой статье общественно-экономического влияния цифровых монет, а сосредоточусь исключительно на внутренних алгоритмах.
Электронная цифровая подпись (ЭЦП)
К сожалению, я не нашел подходящих простых образов, чтобы показать как изнутри работает криптография на эллиптических кривых. Возьмем этот инструмент «на веру». Те же алгоритмы используются в банковском секторе (и не только), поэтому крах ЭЦП приведет к кризису многих отраслей. Итак, закрытым ключом мы подписываем «письма передачи прав собственности» (транзакции), и тем самым отдаем свои монеты кому-то другому. Открытым ключом мы проверяем подлинность чужих транзакций.
Хеширование
Если Вам понятен процесс хеширования, пропустите этот раздел. Показать хеширование довольно просто. Возьмем некоторое число… например номер телефона +7 (495) 606-36-02. Сложим все цифры вместе, несколько раз:
7+4+9+5+6+0+6+3+6+0+2=48 => 4+8=12 => 1+2=3
Так можно однозначно сопоставить любому номеру телефона некоторое число. Процесс суммирования называется хешированием, сам способ — хеш функцией, полученное число — хеш-суммой или просто хешем.
Обычно добиваются следующий свойств от хеширования:
— Зная хеш-сумму (в нашем случае 3) нельзя определить исходный номер телефона.
— Нельзя подогнать номер телефона под заранее известную сумму (в нашем примере неприменимо, обязательно для bitcoin).
— Малое изменение номера телефона приведет к кардинальному изменению хеша (в нашем примере неприменимо, но обязательно для bitcoin).
Также много других понятных бытовых примеров хеширования в wiki статье.
Передача прав собственности. Хеш-сумма публичного ключа
Bitcoin оперирует хеш-суммой публичного ключа, как адрес для передачи монет. Объявить чей-либо bitcoin адрес во всеуслышание — ничего не стоит. Узнать исходный ключ по его хешу не предоставится возможным даже участникам «битвы экстрасенсов». А сама пара ключей будет использована лишь однажды — при передаче прав собственности. На этом жизнь пары ключей заканчивается.
PUB1 — публичный ключ
PRIV1 — секретный ключ
HASH1 или HASH(PUB1) — хеш-сумма публичного ключа (биткойн-адрес).
HASH2 или HASH(PUB2) — хеш публичного ключа следующего владельца.
Отвлечемся на некоторое время от монет. Возьмем, к примеру, владельца автомобиля, собственность которого не вызывает сомнений.
— Собственник на публичном собрании (ярмарке, телевизионном шоу) показывает всем хеш своего публичного ключа HASH(PUB1), заводской номер автомобиля, и все соглашаются с этим — никто не предъявляет претензий.
— До момента продажи оба ключа PUB1, PRIV1 продавца остаются в секрете. Известен только HASH(PUB1) и соответсвующий ему заводской номер автомобиля.
— Как только собственник хочет продать автомобиль какому-либо покупателю — он пишет открытое письмо, в котором указывает заводской номер и хеш-сумму публичного ключа второго владельца HASH(PUB2). И конечно же подписывает письмо своим секретным ключом PRIV1, прилагая публичный ключ PUB1.
— После передачи собственности секретный ключ перестает быть актуальным — второго такого письма быть не может (см. «Единая история»). Публичным ключом можно проверить само письмо, удостоверить второго собственника.
— О втором собственнике ничего неизвестно кроме HASH(PUB2), до тех пор пока он не передаст права третьему владельцу. И эта цепочка может быть бесконечной.
— Подписывая передачу прав с использованием ЭЦП, собственник не только удостоверяет себя, но и накладывает на себя обязательство передачи. Как говорится: «слово — не воробей, вылетит — не поймаешь».
— Благодаря HASH(PUB) получается двойная защита. Первая загадка — узнать публичный ключ по его хешу. Вторая загадка — подписаться чужим секретным ключом.
Если заменить автомобиль на bitcoin, то вместо заводского номера выступает хеш предыдущей транзакции. А вся цепочка собственников хранится публично у каждого пользователя.
«А сдачу!?»
Сдачу надо оставить себе. Но так задумано, что секретный ключ используется только один раз, а часть своих монет пересылается на свой же новый, не засвеченный адрес. Из-за этого трудно понять сколько монет принадлежит какому-либо адресу, и тяжело судить об объеме переданных монет за сутки/месяц/год.
Единая история. Что же копают майнеры.
Чтобы не было возможности дважды потратить монеты, должна быть единая история всех сделок. Тогда в журнал будет попадать только первая транзакция (письмо передачи прав на монеты), или в крайнем случае одна из нескольких. Для этого транзакции объединяются в блоки и признаются только «красивые» блоки. «Красивый блок» трудно найти, это подобно тому как из тонн золотой руды попадается лишь один стоящий самородок. В нашем случае хеш-сумма блока должна содержать определенное количество нулей.
Блок состоит из предыдущего блока (хеш-суммы), хеш-суммы всех включенных транзакций, и случайно перебираемого числа (англ: nonce).
Пример bitcoin-блока с сайта blockexplorer.com:* Hash: 00000000000001c21dbf4715d5da1a288061faa21e950dd8df6ae25c8b55d868* Previous block?: 000000000000056a7dcf283f627c2a17c55ffe1937a6ed2bc467d9c524311da2* Difficulty: 1 690 895.803052 ("Bits": 1a09ec04)* Transactions: 184* Total BTC: 4251.63216933* Size: 58.913 kilobytes* Merkle root: 98c5d975bf556f0344770eee7ab31688a1c108223c14cea908ff99b0ab8fe947* Nonce: 3723473450
Видите сколько нулей в начале хеш-суммы блока? Вот поэтому его так трудно было найти. Но каждый легко может проверить подлинность «красоты» блока. Количество нулей в хеше выбирается таким образом, чтобы каждый блок появлялся на свет приблизительно раз в 6 10 минут. За нахождение блока выдается поощрение, сейчас это 50 монет. Также нашедшему выдаются все сборы от платежей (transactions fees), за те транзакции которые включены в его блок.
Единая история достигается за счет того, что всегда побеждает наиболее длинная цепочка блоков. Не проблема, если от биткойн-сети будет отколот изолированый кусочек пользователей — впоследствии все отколотые транзакции войдут в более длинную цепочку (с учетом сложности).
Тонкости работы
— Под хешированием обычно понимается двойной sha256, т.е. sha256(sha256(x)).
— Удивительно, но bitcoin ничего не шифрует. Весь журнал транзакций — полностью открытая информация. Любой может проверить целостность всех транзакций, посчитать количество монет в обороте. Нет никаких шансов для фальшивомонетничества. Единственная возможность для злодейств — лишь приостановить работу биткойн на некоторое время.
— При первом старте bitcoin-приложение создает пару ключей. Точнее он создает их сразу 100 пар заранее, тем самым можно сделать резервирование кошелька (backup) не более чем на 100 операций вперед.
— На самом деле в транзакции указывается алгоритм проверки, помимо самого биткойн-адреса. Внутри биткойн встроен собственный примитивный, намеренно обрезанный язык программирования, который позволяет сделать сложные транзакции. Например можно запрограммировать, чтобы деньги отправлены нескольким адресатам (как сейфовая ячейка с несколькими ключами). Или включить ограничения по времени на трату денег (не раньше 2013 года) и т.д.
— Транзакции в блок укладываются в виде дерева хешей. Таким образом в дальнейшем можно будет выкидывать завершенные транзакции для экономии места на диске, не нарушая целостности блоков.
— Биткойн-адрес содержит в себе контрольную сумму. Поэтому в адресе нельзя ошибиться пропустив или заменив одну или несколько символов.
В заключение
Вне зависимости от курса монеты (обижаться на систему могут только спекулянты) я считаю что bitcoin стал очень успешным в техническом отношении. Здесь есть чему поучиться и использовать полученый опыт в дальнейшем.
Источник: https://habr.com/