Наконец-то мы завершили вводную часть курса, где познакомились с криптографическими примитивами, на основе понимания которых будет строится наше понимание того, как работают криптовалюты.
Перед тем, как читать этот материал, рекомендую ознакомиться с предыдущими статьями в цикле Bitcoin and Cryptocurrency Technologies, который я создаю на основе одноименного онлайн-курса Принстонского Университета на Coursera:
- Криптографическая хэш-функция и ее свойства!
- Что за чудо дивное эта функция SHA-256?
- Структуры данных Блокчейн и Дерево Меркля
- Цифровая подпись
- Публичный ключ как личность
Помните, я просто студентка и своими словами описываю то, как поняла материал. Пожалуйста, исправляйте меня, если больше в этом понимаете и видите неточности.
GoofyCoin
Представляю вашему вниманию GoofyCoin - это простейшая криптовалюта, которую только можно представить. У нее есть всего 2 правила:
Правило GoofyCoin №1: Goofy может создавать монеты.
Он может создать монету когда пожелает и все новые монеты принадлежат Goofy.
Структура данных новой монеты выглядит так:
На слайде видно:
- операцию по созданию новой монеты CreateCoin
- каждой монете присваивается уникальный идентификатор uniqueCoinID
- эта операция по созданию монеты подписана/sign Goofy и мы можем проверить/verify подпись с помощью публичного ключа pk
Ага, монета - это строчка кода, по сути.
Правило GoofyCoin №2: Кто бы не владел монетой, он может передать ее кому-то другому, потратить.
Goofy платит Alice (смотреть на картинку снизу вверх)
- Goofy берет монету, которой он владеет (мы ее создание только что разобрали)
- Он создает на нее хеш-указатель
- Далее он делает заявление/statement заплатить/pay эту монету Alice (ее публичному ключу как личности)
- Далее эта операция заплатить/pay подписывается/sign Goofy (его публичным ключом как личностью)
- Теперь Alice владеет монетой и может подтвердить это с помощью той части схемы, в которой Goоfy заплатил ее публичному ключу и подписался своим публичным ключом, а из-за хеш-указателя мы видим, что эта монета была создана Goofy и принадлежала ему
Хорошо, Alice теперь тоже может потратить монету, передать ее кому-то другому. Она точно также делает заявление о платеже публичному ключу pk, которым владеет Bob + создает хеш-указатель на монету + подписывается своим pk.
Теперь монетой владеет Bob.
Давайте представим, что Alice решила обмануть систему и сделала новое заявление, в котором она передает ту же самую монету кому-то другому. Chunk, который получил ту же монету, что и Bob может и не знать о подлых действиях Alice.
Такая ситуация двойной траты одной и той же монеты в мире криптовалют называется double spending attack. Эта угроза, решение которой не предусмотрено в GoofyCoin. Но зато знаменитый всем с детства богач Скрудж Макдак сделал свой ScroogeCoin и решил эту проблему двойной траты. Посмотрим как.
ScroogeCoin
Scrooge решил проблему double spending attack таким образом: он будет публиковать всю историю транзакций!
Структура ScroogeCoin выглядит как нам уже знакомый блокчейн. Мистер Scrooge подписывает хеш-указатель на всю структуру и каждый может видеть историю транзакций и, соответственно, может проверить не происходит ли двойная трата.
То есть, при таком раскладе, если Alice сначала отправит деньги Бобу, а потом попытается отправить Чарли, то Чарли сможет посмотреть в опубликованную историю и увидеть, что Alice мошенничает. Вообще-то и Scrooge увидит и все будут видеть и знать, что нельзя доверять Alice.
В ScroogeCoin есть два типа операций (транзакций).
Одна из них CreateCoins, работает почти также как в GoofyCoin, только во время одной транзакции может быть создано несколько монет. Вот как схематично это выглядит:
Здесь мы видим:
- номер транзакции transID: 73
- тип транзакции (операции): type:CreateCoins
- в таблице указаны серийные номера num монет 0, 1, 2
- далее столбик value с количеством ScroogeCoin в одной монете
- третий столбик recipient - это получатели монет, их публичные ключи
- когда монета создается, каждой присваивается coinID на основе номера транзакции transID и серийного номера монеты num
Профессор обращает наше внимание на то, что эта операция по созданию монет валидна по определению. То есть, если мистер Скрудж создал монеты и подписался своим ключом, то они появились и это верно в рамках системы. Он может создать сколько угодно монет. Нам не стоит беспокоится о том, имеет ли право мистер Скрудж создавать монеты. Не зря же они называются ScroogeCoin :)
Вторая транзакция в ScroogeCoin называется PayCoins - во время этой операции монеты разрушаются(потребляются) и создаются новые, точно такого же значения, только с новыми владельцами (recipients).
Что мы видим на схеме:
- номер транзакции transID: 73
- тип транзакции (операции) type:PayCoins
- далее мы видим блок с указанием coinsIDs, которые потребляются
- ниже мы видим таблицу с новыми монетами coins created
- таблице указаны серийные номера num монет 0, 1, 2
- есть столбик value с количеством ScroogeCoin в одной монете
- третий столбик recipient - это получатели монет, их публичные ключи
- нижняя часть - это подписи всех кому ранее принадлежали монеты (владельцы тех монет, что будут consumed)
В ScroogeCoin есть 4 правила, которые должны быть соблюдены, чтобы транзакция состоялась:
- потребляемые монеты валидны - благодаря хеш-указателям мы проверяем, действительно ли эти монеты были созданы в предыдущих транзакциях
- монеты не были ранее consumed (потреблены) - это как раз защита от двойной траты (double spending attack)
- сумма монет на выходе равна сумме монет на входе
- есть валидные подписи владельцев потребляемых монет
Если эти правила выполнены и при проверке true, то мистер Скрудж примет эту транзакцию, внесет ее в блокчейн, подпишет и опубликует. Вот тогда все могут удостовериться, что транзакция состоялась.
Важно понимать, что в этой системе монету нельзя поделить, она неизменна (immutable). Монета может быть один раз создана и потом один раз потреблена.
То есть, когда тебе нужно, например, поделить (разменять) один ScroogeCoin на 2 части - ты создаешь транзакцию, в которой потребляешь 1 ScroogeCoin и создаешь две монеты по 0.5 ScroogeCoin и указываешь себя же среди получателей (recipient).
Проблема ScroogeCoin
Мы разобрались как работает ScroogeCoin и подошли к основной проблеме с этой криптовалютой. Проблема в самом мистере Скрудже. А вдруг он перестанет быть честным? А вдруг ему надоест ScroogeCoin и он перестанет им заниматься, перестанет проверять, подписывать, публиковать?
Цитирую профессора:
So the central technical challenge that we need to solve in order to improve on ScroogeCoin is, can we descroogify the system?
Можем ли мы избавить систему от Скруджа? Как нам организовать работу системы так, чтобы все действия, которые делал Скрудж, выполнялись в условиях децентрализации. Это темы следующих лекций и я попробую во всем разобраться и простыми словами изложить вам, мои дорогие читатели :)
Следующий шаг в курсе - домашнее задание по ScroogeCoin. Я еще не приступала, немного страшно, что не справлюсь. Ну ладно, посмотрим :)
Надеюсь вам полезен этот материал и вы подпишитесь на мой дневник!
Привет!
Этот пост был выбран Академией Голоса и попал в список программы поддержки качественных образовательных постов.
Ссылка на твой пост будет опубликована в отчете Академии.
Спасибо за полезный контент (ノ◕ヮ◕)ノ*:・゚✧
Это лекции Принстона, переведённые на другом ресурсе. Как сие понимать? Тут (на голосе) это норм? Вы авторство проверяете или тут анархия?
http://forklog.com/opublikovan-perevod-lektsij-prinstona-o-kriptografii-tsifrovyh-valyut/
Привет, @a1oleg!
Спасибо за бдительность :)
Я занимаюсь Академией и проверяю авторство постов. В этом посте плагиата или копипасты замечено не было. По твоей ссылке перевод курса, а в этом посте, насколько я могу проверить, авторский текст.
Буду благодарен, если ты укажешь на конкретные факты плагиата или копипасты.
Спасибо, в первом комментарии к моей первой статье в этом цикле есть ссылка на этот перевод. Вы можете быть уверенны, что я использую первоисточник - онлайн-курс, так как перевод на сайте forklog не самый качественный, во многом даже запутывает. Пожалуйста, проверяйте хоть каждое предложение из моих публикаций, никакого копирования там нет. Наоборот, я стараюсь добавить читаемости и простоты в структуру, быть более понятной :)