Множество неоднозначных статей написаных про биткойн побудили
написать меня статью о внутреннем устройстве этой системы. Меня удивило,
что некоторые авторы писали о цифровых монетах без понимания внутреннего устройства, и смысл
длительных рассуждений был безуспешной попыткой узнать лохотрон ли это.
Надеюсь после данной статьи вера или доверие 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 года) и т.д. (СТАТЬЯ ОТ 2011 ГОДА!)
— Транзакции в блок укладываются в виде дерева хешей. Таким образом в
дальнейшем можно будет выкидывать завершенные транзакции для экономии
места на диске, не нарушая целостности блоков.
— Биткойн-адрес содержит в себе контрольную сумму. Поэтому в адресе нельзя ошибиться пропустив или заменив одну или несколько символов.
В заключение
Вне зависимости от курса монеты (обижаться на систему могут только
спекулянты), я считаю, что bitcoin стал очень успешным в техническом
отношении. Здесь есть чему поучиться и использовать полученый опыт в
дальнейшем.
Вернуться назад
|