Сергей Журавлев
10
All posts from Сергей Журавлев
Сергей Журавлев in Сергей Журавлев,

3 века денег: наличные, банки, криптовалюты, ч.2

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

Водяные знаки на купюрах из битов

Когда я даю кассиру супермаркета рубль за купленную бутылку водки (на практике рублей за это нужно серьёзно больше, чем 1, но для примера неважно), понимание «подлинности» этой транзакции включает в себя 3 составляющих: (i) я должен понять, что даю рубль именно тому, кому следует – в данном случае человеку, обладающему правом легально выпустить меня из магазина с бутылкой; (ii) кассир должен (по внешнему виду и, возможно, защитным признакам) понять, что я дал ему «законное платёжное средство»; (iii) не обязательно, но в принципе не лишне для кассира понять, что именно я имею право распоряжаться в данной транзакции этим рублём, т.е. что я достал его из своих широких штанин, а не из штанов соседа по очереди.

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

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

Чтобы это заявление приобрело общепринятые атрибуты денег, оно должен включать в себя следующие 3 ссылки: (i) «адрес» - некоторое уникальное «имя» получателя («кассира» в нашем примере), позволяющее ему и только ему распорядиться полученным от меня «рублём», т.е. «выкрикнуть» в дальнейшем аналогичную фразу типа «Я, «имя кассира», даю рубль <кому-то>?»; (ii) «подпись», позволяющую однозначно установить, что именно я и никто иной, так распорядился данным рублём и имел на это право, т.е. был «адресатом» в некоем предыдущем «выкрике»; (iii) «имя» этого предыдущего выкрика, т.е. «рубля», который я теперь хочу сделать достоянием кассира.

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

[Техническое] Техпроцесс чеканки биткойнов

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

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

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

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

В итоге у нас получается цифровая монетка (транзакция) примерно следующего вида:

{хеш; хеш предыдущей транзакции; подпись и публичный ключ отправителя для ее проверки; адрес (публичный ключ) получателя},

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

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

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

ЖЖ