Множество неоднозначных статей написаных про биткойн побудили написать меня статью о внутреннем устройстве этой системы. Меня удивило, что некоторые авторы писали о цифровых монетах без понимания внутреннего устройства, и смысл длительных рассуждений был безуспешной попыткой узнать лохотрон ли это. Надеюсь после данной статьи вера или доверие 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:
Видите сколько нулей в начале хеш-суммы блока? Вот поэтому его так трудно было найти. Но каждый легко может проверить подлинность «красоты» блока. Количество нулей в хеше выбирается таким образом, чтобы каждый блок появлялся на свет приблизительно раз в6 10 минут. За нахождение блока выдается поощрение, сейчас это 50 монет. Также нашедшему выдаются все сборы от платежей (transactions fees), за те транзакции которые включены в его блок.
Единая история достигается за счет того, что всегда побеждает наиболее длинная цепочка блоков. Не проблема, если от биткойн-сети будет отколот изолированый кусочек пользователей — впоследствии все отколотые транзакции войдут в более длинную цепочку (с учетом сложности).
— Под хешированием обычно понимается двойной sha256, т.е. sha256(sha256(x)).
— Удивительно, но bitcoin ничего не шифрует. Весь журнал транзакций — полностью открытая информация. Любой может проверить целостность всех транзакций, посчитать количество монет в обороте. Нет никаких шансов для фальшивомонетничества. Единственная возможность для злодейств — лишь приостановить работу биткойн на некоторое время.
— При первом старте bitcoin-приложение создает пару ключей. Точнее он создает их сразу 100 пар заранее, тем самым можно сделать резервирование кошелька (backup) не более чем на 100 операций вперед.
— На самом деле в транзакции указывается алгоритм проверки, помимо самого биткойн-адреса. Внутри биткойн встроен собственный примитивный, намеренно обрезанный язык программирования, который позволяет сделать сложные транзакции. Например можно запрограммировать, чтобы деньги отправлены нескольким адресатам (как сейфовая ячейка с несколькими ключами). Или включить ограничения по времени на трату денег (не раньше 2013 года) и т.д.
— Транзакции в блок укладываются в виде дерева хешей. Таким образом в дальнейшем можно будет выкидывать завершенные транзакции для экономии места на диске, не нарушая целостности блоков.
— Биткойн-адрес содержит в себе контрольную сумму. Поэтому в адресе нельзя ошибиться пропустив или заменив одну или несколько символов.
Вне зависимости от курса монеты (обижаться на систему могут только спекулянты) я считаю что 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
Видите сколько нулей в начале хеш-суммы блока? Вот поэтому его так трудно было найти. Но каждый легко может проверить подлинность «красоты» блока. Количество нулей в хеше выбирается таким образом, чтобы каждый блок появлялся на свет приблизительно раз в
Единая история достигается за счет того, что всегда побеждает наиболее длинная цепочка блоков. Не проблема, если от биткойн-сети будет отколот изолированый кусочек пользователей — впоследствии все отколотые транзакции войдут в более длинную цепочку (с учетом сложности).
Тонкости работы
— Под хешированием обычно понимается двойной sha256, т.е. sha256(sha256(x)).
— Удивительно, но bitcoin ничего не шифрует. Весь журнал транзакций — полностью открытая информация. Любой может проверить целостность всех транзакций, посчитать количество монет в обороте. Нет никаких шансов для фальшивомонетничества. Единственная возможность для злодейств — лишь приостановить работу биткойн на некоторое время.
— При первом старте bitcoin-приложение создает пару ключей. Точнее он создает их сразу 100 пар заранее, тем самым можно сделать резервирование кошелька (backup) не более чем на 100 операций вперед.
— На самом деле в транзакции указывается алгоритм проверки, помимо самого биткойн-адреса. Внутри биткойн встроен собственный примитивный, намеренно обрезанный язык программирования, который позволяет сделать сложные транзакции. Например можно запрограммировать, чтобы деньги отправлены нескольким адресатам (как сейфовая ячейка с несколькими ключами). Или включить ограничения по времени на трату денег (не раньше 2013 года) и т.д.
— Транзакции в блок укладываются в виде дерева хешей. Таким образом в дальнейшем можно будет выкидывать завершенные транзакции для экономии места на диске, не нарушая целостности блоков.
— Биткойн-адрес содержит в себе контрольную сумму. Поэтому в адресе нельзя ошибиться пропустив или заменив одну или несколько символов.
В заключение
Вне зависимости от курса монеты (обижаться на систему могут только спекулянты) я считаю что bitcoin стал очень успешным в техническом отношении. Здесь есть чему поучиться и использовать полученый опыт в дальнейшем.