Протоколы биткоин

Многие тысячи статей были написаны с целью объяснить Биткойн, онлайн-пиринговую валюту. В большинстве этих статей дается подробный отчет о базовом криптографическом протоколе, опуская многие детали. Даже те статьи, которые копают глубже, часто замалчивают важные моменты. Моя цель в этом посте-объяснить основные идеи, лежащие в основе биткойн-протокола, ясным, легко понятным способом. Мы начнем с первых принципов, создадим широкое теоретическое понимание того, как работает протокол, а затем углубимся в детали, изучая необработанные данные в биткойн-транзакции.

Понимание протокола таким детальным образом-это тяжелая работа.

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

Поговорим о веселье!

Я опишу биткойн-скрипты и концепции, такие как смарт-контракты, в будущих постах. Этот пост сосредоточен на объяснении гаек и болтов Биткойн-протокола. Чтобы понять сообщение, вы должны быть знакомы с криптографией с открытым ключоми с тесно связанной идеей цифровых подписей. Я также предполагаю, что вы знакомы с криптографическим хэшированием Все это не особенно сложно. Основные идеи могут быть преподаны на первом курсе университета математике или информатике.

Идеи прекрасны, поэтому, если вы не знакомы с ними, я рекомендую потратить несколько часов, чтобы ознакомиться.

Может показаться удивительным, что основой Биткойна является криптография. Разве Биткойн-это не валюта, а не способ отправки секретных сообщений? На самом деле, проблемы, которые Биткойн должен решить, в основном связаны с обеспечением безопасности транзакций — убедившись, что люди не могут украсть друг у друга или выдать себя за другого, и так далее. В мире атомов мы достигаем безопасности с помощью таких устройств, как замки, сейфы, подписи и банковские хранилища.

В мире битов мы достигаем такого рода безопасности с помощью криптографии. И именно поэтому биткойн в основе своей является криптографическим протоколом.

Моя стратегия в этом посте заключается в том, чтобы строить Биткойн поэтапно. Я начну с объяснения очень простой цифровой валюты, основанной на идеях, которые почти очевидны. Мы будем называть эту валюту Инфокоин, чтобы отличить ее от биткоина. Конечно, наша первая версия Infocoin будет иметь много недостатков, и поэтому мы пройдем через несколько итераций Infocoin, с каждой итерацией вводя только одну или две простые новые идеи.

После нескольких таких итераций мы придем к полному протоколу биткойна. Мы заново изобрели Биткойн!

Эта стратегия работает медленнее, чем если бы я объяснил весь биткойн-протокол одним выстрелом. Но хотя вы можете понять механику биткойна с помощью такого одноразового объяснения, было бы трудно понять, почему Биткойн спроектирован таким образом. Преимущество более медленного итеративного объяснения заключается в том, что оно дает нам гораздо более четкое понимание каждого элемента биткойна.

Наконец, я должен упомянуть, что я относительный новичок в Биткойне. Я слабо следил за ним с 2011 года (а криптовалюты-с конца 1990-х), но только в начале этого года всерьез занялся деталями Биткойн-протокола.

Так что я, безусловно, буду признателен за исправление любых недоразумений с моей стороны. Кроме того, в пост я включил ряд “проблем для автора Вы можете найти их интересными, но вы также можете пропустить их полностью, не теряя след основного текста.

Первые шаги: подписанное письмо о намерениях

Так как же мы можем создать цифровую валюту?

На первый взгляд, цифровая валюта кажется невозможной. Предположим, у какого – то человека – назовем его Алисой-есть цифровые деньги, которые он хочет потратить.

Если Алиса может использовать строку битов в качестве денег, как мы можем помешать ей использовать одну и ту же строку битов снова и снова, таким образом чеканя бесконечный запас денег? Или, если мы можем как-то решить эту проблему, как мы можем помешать кому-то другому подделать такую цепочку битов и использовать ее, чтобы украсть у Алисы?

Это лишь две из многих проблем, которые необходимо преодолеть, чтобы использовать информацию в качестве денег.

В качестве первой версии Infocoin давайте найдем способ, которым Алиса может использовать строку битов в качестве (очень примитивной и неполной) формы денег, таким образом, чтобы дать ей хотя бы некоторую защиту от подделки.

Предположим, Алиса хочет дать другому человеку, Бобу, инфокоин. Для этого Алиса записывает сообщение: “Я, Алиса, даю Бобу один инфокоин”. Затем она подписывает сообщение с помощью частного криптографического ключа и объявляет подписанную строку битов всему миру.

(Кстати, я использую заглавную “Infocoin” для обозначения протокола и общей концепции, а строчную “infocoin” — для обозначения конкретных номиналов валюты. Подобное использование распространено, хотя и не универсально, в мире биткойнов.)

Это не так уж впечатляюще, как прототип цифровой валюты!

Но у него есть некоторые достоинства. Любой человек в мире (включая Боба) может использовать открытый ключ Алисы, чтобы убедиться, что Алиса действительно была тем человеком, который подписал сообщение “Я, Алиса, даю Бобу один инфокоин”. Никто другой не смог бы создать эту битовую строку, и поэтому Алиса не может обернуться и сказать: “Нет, я не собиралась давать Бобу инфокоин”. Таким образом, протокол устанавливает, что Алиса действительно намерена дать Бобу один инфокоин. Тот же самый факт – никто другой не смог бы составить такое подписанное сообщение-также дает Алисе некоторую ограниченную защиту от подделки. Конечно, после того, как Алиса опубликовала свое сообщение, другие люди могут дублировать его, так что в этом смысле подделка возможна. Но это невозможно сделать с нуля. Эти два свойства-установление намерения со стороны Алисы и ограниченная защита от подделки – являются действительно примечательными особенностями этого протокола.

Я еще не сказал (вполне) точно, что такое цифровые деньги в этом протоколе. Чтобы сделать это явным: это просто само сообщение, то есть строка битов, представляющая собой сообщение с цифровой подписью “Я, Алиса, даю Бобу один инфокоин”. Более поздние протоколы будут аналогичны, в том смысле, что все наши формы цифровых денег будут просто все более и более сложными сообщениями [1].

Использование серийных номеров для уникальной идентификации монет

Проблема с первой версией Infocoin заключается в том, что Алиса может продолжать посылать Бобу одно и то же подписанное сообщение снова и снова. Предположим, Боб получает десять копий подписанного сообщения “Я, Алиса, даю Бобу один инфокоинЗначит ли это, что Алиса послала Бобу десять разных инфокоинов? Было ли ее сообщение случайно продублировано? Возможно, она пыталась обмануть Боба, чтобы он поверил, что она дала ему десять различных инфокоинов, когда сообщение только доказывает миру, что она намерена передать один инфокоин.

То, что мы хотели бы, — это способ сделать инфокоины уникальными. Им нужна этикетка или серийный номер. Алиса подписала бы сообщение “ Затем, позже, Алиса могла подписать сообщение “Я, Алиса, даю Бобу один инфокоин с серийным номером 8770431

Чтобы эта схема работала, нам нужен надежный источник серийных номеров для инфокоинов. Один из способов создать такой источник-это ввести банк. Этот банк будет предоставлять серийные номера для инфокоинов, отслеживать, у кого какие инфокоины есть, и проверять, действительно ли транзакции законны,

Более подробно, предположим, Алиса заходит в банк и говорит: “Я хочу снять один инфокоин со своего счета”. Банк уменьшает остаток на ее счете на одну инфокоину и присваивает ей новый, никогда ранее не использовавшийся серийный номер, скажем 1234567. Затем, когда Алиса хочет передать свой инфокоин Бобу, она подписывает сообщение: “Я, Алиса, даю Бобу один инфокоин с серийным номером 1234567”. Но Боб не просто принимает инфокоин. Вместо этого он связывается с банком и проверяет, что: (а) инфокоин с этим серийным номером принадлежит Алисе; и (Б) Алиса еще не потратила инфокоин. Если обе эти вещи верны, то Боб говорит банку, что он хочет принять инфокоин, и банк обновляет свои записи, чтобы показать, что инфокоин с этим серийным номером теперь находится во владении Боба и больше не принадлежит Алисе.

Превращение всех вместе в банк

Это последнее решение выглядит довольно многообещающим. Однако, оказывается, мы можем сделать что-то гораздо более амбициозное. Мы можем полностью исключить банк из протокола. Это существенно меняет природу валюты. Это означает, что больше нет ни одной организации, отвечающей за валюту. И когда вы думаете об огромной власти Центрального банка – контроле над денежной массой – это довольно большое изменение.

Идея состоит в том, чтобы сделать так, чтобы каждый (коллективно) был банком. В частности, мы предположим, что каждый, кто использует Infocoin, ведет полный учет того, какие infocoins принадлежат какому человеку. Вы можете думать об этом как об общей публичной книге, показывающей все транзакции Infocoin. Мы будем называть эту книгу Блокчейн-цепочкой, поскольку именно так будет называться полная запись в биткойне, как только мы доберемся до нее.

Теперь предположим, что Алиса хочет передать инфокоин Бобу. Она подписывает сообщение “Я, Алиса, даю Бобу один инфокоин, с серийным номером 1234567Боб может использовать свою копию цепочки блоков, чтобы проверить, действительно ли инфокоин принадлежит Алисе. Если это подтвердится, то он передаст сообщение Алисы и свое согласие на транзакцию всей сети, и каждый обновит свою копию цепочки блоков.

У нас все еще есть проблема “откуда берется серийный номер”, но она оказывается довольно легко решаемой, и поэтому я отложу ее на более поздний срок, при обсуждении биткойна. Более сложная проблема заключается в том, что этот протокол позволяет Алисе мошенничать, дважды тратя свой инфокоин. Она посылает Бобу подписанное сообщение И Боб, и Чарли используют свою копию блокчейна, чтобы убедиться, что инфокоин принадлежит Алисе. При условии, что они сделают эту проверку почти одновременно (до того, как у них будет возможность услышать друг от друга), оба обнаружат, что да, цепочка блоков показывает, что монета принадлежит Алисе. И таким образом они оба примут сделку, а также передадут свое согласие на сделку. Теперь есть проблема. Как другие люди должны обновлять свои цепочки блоков? Возможно, не существует простого способа создать согласованную общую книгу транзакций. И даже если все смогут договориться о последовательном способе обновления своих цепочек блоков, все равно остается проблема, что либо Боб, либо Чарли будут обмануты.

На первый взгляд двойные траты кажутся Алисе трудновыполнимыми. В конце концов, если Алиса сначала отправит сообщение Бобу, то Боб сможет проверить это сообщение и сказать всем остальным в сети (включая Чарли), чтобы они обновили свою цепочку блоков. Как только это произойдет, Чарли больше не будет обманут Элис. Так что, скорее всего, существует только короткий промежуток времени, в течение которого Алиса может удвоить расходы. Однако, очевидно, нежелательно иметь такой период времени. Хуже того, есть методы, которые Алиса могла бы использовать, чтобы сделать этот период более длительным. Она могла бы, например, использовать анализ сетевого трафика, Чтобы найти моменты, когда Боб и Чарли, вероятно, имеют большую задержку в общении. Или, возможно, она могла бы сделать что-то, чтобы намеренно нарушить их связь. Если она может хоть немного замедлить общение, это значительно облегчает ей задачу удвоения расходов.

Как мы можем решить проблему двойных расходов? Очевидное решение заключается в том, что когда Алиса посылает Бобу инфокоин, Боб не должен пытаться проверить транзакцию в одиночку. Скорее всего, он должен транслировать возможную транзакцию на всю сеть пользователей Infocoin и попросить их помочь определить, является ли транзакция законной. Если они коллективно решат, что транзакция в порядке, то Боб может принять инфокоин, и каждый обновит свою блокчейн-цепочку. Этот тип протокола может помочь предотвратить двойные расходы, так как если Алиса попытается потратить свой инфокоин как с Бобом, так и с Чарли, другие люди в сети заметят, и пользователи Сети скажут Бобу и Чарли, что есть проблема с транзакцией, и транзакция не должна проходить.

Более подробно давайте предположим, что Алиса хочет дать Бобу инфокоин. Как и прежде, она подписывает сообщение “Я, Алиса, даю Бобу один инфокоин с серийным номером 1234567 Кроме того, как и раньше, Боб делает проверку на здравомыслие, используя свою копию цепочки блоков, чтобы проверить, действительно ли монета в настоящее время принадлежит Алисе. Но в этот момент протокол модифицируется. Боб не просто идет вперед и принимает сделку. Вместо этого он передает сообщение Алисы по всей сети. Другие члены сети проверяют, владеет ли Алиса этим инфокоином. Если это так, они передают сообщение “Да, Алиса владеет infocoin 1234567, теперь он может быть передан Бобу”. как только достаточное количество людей передали это сообщение, все обновляют свою блокчейн-цепочку, чтобы показать, что infocoin 1234567 теперь принадлежит Бобу, и транзакция завершена.

В настоящее время этот протокол содержит много неточных элементов. Например, что означает фраза “как только достаточное количество людей передаст это сообщение”? Что именно означает здесь “достаточноЭто не может означать всех в сети, так как мы не априори знайте, кто находится в Сети Infocoin. По той же причине это не может означать некоторую фиксированную долю пользователей в сети. Мы не будем пытаться сделать эти идеи точными прямо сейчас. Вместо этого в следующем разделе я укажу на серьезную проблему с описанным подходом. Исправление этой проблемы в то же время будет иметь приятный побочный эффект, делая идеи выше намного более точными.

Доказательство работы

Предположим, Алиса хочет удвоить расходы в сетевом протоколе, который я только что описал. Она могла бы сделать это, взяв на себя сеть Infocoin. Предположим, она использует автоматизированную систему для установки большого количества отдельных идентификаций, скажем, миллиарда, в Сети Infocoin. Как и прежде, она пытается дважды потратить один и тот же инфокоин с Бобом и Чарли. Но когда Боб и Чарли просят сеть подтвердить их соответствующие транзакции, кукольные личности Алисы захлестывают сеть, объявляя Бобу, что они подтвердили его транзакцию, и Чарли, что они подтвердили его транзакцию, возможно, обманывая одного или обоих, чтобы принять транзакцию.

Есть умный способ избежать этой проблемы, используя идею, известную как доказательство работы. Эта идея противоречит здравому смыслу и включает в себя комбинацию двух идей: (1) чтобы (искусственно) сделать вычислительно дорогостоящим для пользователей Сети проверку транзакций; и (2) чтобы вознаградить их за то, что они пытаются помочь проверить транзакции. Вознаграждение используется для того, чтобы люди в Сети попытались помочь проверить транзакции, даже если это теперь стало вычислительно дорогостоящим процессом. Преимущество дорогостоящей проверки транзакций состоит в том, что проверка больше не может зависеть от количества сетевых идентификаторов, которыми кто-то управляет, а только от общей вычислительной мощности, которую они могут использовать для проверки. Как мы увидим, с помощью некоторого умного дизайна мы можем сделать так, что мошеннику понадобятся огромные вычислительные ресурсы, чтобы обмануть, что делает его непрактичным.

Вот в чем суть доказательства работы. Но чтобы действительно понять доказательство работы, нам нужно пройти через детали.

Предположим, Алиса передает в сеть новость о том, что”я, Алиса, даю Бобу один инфокоин с серийным номером 1234567

Когда другие пользователи Сети слышат это сообщение, каждый добавляет его в очередь ожидающих транзакций, о которых им сообщили, но которые еще не были одобрены сетью. Например, другой сетевой пользователь по имени Дэвид может иметь следующую очередь ожидающих транзакций:

Я, том, даю Сью один инфокоин с серийным номером 1201174.

Я, Сидни, даю Синтии один инфокоин с серийным номером 1295618.

Я, Алиса, даю Бобу один инфокоин с серийным номером 1234567.

Дэвид проверяет свою копию цепочки блоков и видит, что каждая транзакция действительна. Он хотел бы помочь, транслируя новости об этой действительности на всю сеть.

Однако, прежде чем сделать это, в рамках протокола проверки Дэвид должен решить сложную вычислительную головоломку – доказательство работы. Без решения этой головоломки остальная часть сети не примет его подтверждение транзакции.

Какую головоломку должен решить Дэвид? Чтобы объяснить это, пусть хбудет фиксированная хэш-функция, известная всем в сети – она встроена в протокол. Биткойн использует хорошо известную хэш-функцию SHA-256, но подойдет любая криптографически безопасная хэш-функция. Давайте дадим очереди ожидающих транзакций Дэвида ярлыкл, просто чтобы у нее было имя, на которое мы можем ссылаться. Предположим, Дэвид добавляет число икс(называемое nonce)ли хэширует комбинацию. Например, если мы используем l = “Hello, world! x = 0, то (вывод осуществляется в шестнадцатеричном формате)

h (1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64 

Загадка, которую Дэвид должен решить-доказательство работы – состоит в том, чтобы найти nonce икстакой, что когда мы добавляем иксли хэшируем комбинацию, выходной хэш начинается с длительного пробега нулей. Головоломку можно сделать более или менее сложной, варьируя количество нулей, необходимых для решения головоломки. Относительно простая головоломка с доказательством работы может потребовать всего три или четыре нуля в начале хэша, в то время как более сложная головоломка с доказательством работы может потребовать гораздо более длительного набора нулей, скажем, 15 последовательных нулей. В любом случае, вышеописанная попытка найти подходящее nonce, с x = 0, является неудачей, так как вывод вообще не начинается ни с каких нулей. Попытка x = 1тоже не работает:

h (

Мы можем продолжать пробовать разные значения для nonce, x = 2, 3,\ldots. Наконец, при x = 4250этом мы получаем:

h (0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9 

Этот nonce дает нам строку из четырех нулей в начале вывода хэша. Этого будет достаточно, чтобы решить простую головоломку доказательства работы, но недостаточно, чтобы решить более сложную головоломку доказательства работы.

Что делает эту головоломку трудной для решения, так это тот факт, что выход из криптографической хэш-функции ведет себя как случайное число: измените вход даже на крошечный бит, и выход из хэш-функции изменится полностью, таким образом, что его трудно предсказать. Поэтому, если мы хотим, чтобы выходное хэш-значение начиналось, скажем, с 10 нулей, то Дэвиду нужно будет в среднем попробовать разные значенияикс, прежде чем он найдет подходящий nonce. Это довольно сложная задача, требующая больших вычислительных мощностей.

Очевидно, что можно сделать эту головоломку более или менее трудной для решения, требуя большего или меньшего количества нулей в выходных данных хэш-функции. На самом деле, протокол Биткойн получает довольно тонкий уровень контроля над сложностью головоломки, используя небольшую вариацию головоломки доказательства работы, описанной выше. Вместо того чтобы требовать ведущих нулей, головоломка Биткойн-доказательства работы требует, чтобы хэш заголовка блока был ниже или равен числу, известному как цель Эта цель автоматически корректируется, чтобы гарантировать, что биткойн-блок занимает в среднем около десяти минут для проверки.

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

Ладно, предположим, Дэвиду повезет и он найдет подходящую Нонку икс. Праздник! (Он будет вознагражден за то, что нашел nonce, как описано ниже). Он передает блок транзакций, которые он одобряет, в сеть вместе со стоимостью икс. Другие участники сети Infocoin могут проверить, что иксэто является действительным решением головоломки доказательства работы. А затем они обновляют свои цепочки блоков, чтобы включить в них новый блок транзакций.

Чтобы идея доказательства работы имела хоть какой-то шанс на успех, пользователи сети нуждаются в стимуле, чтобы помочь проверить транзакции. Без такого стимула у них нет причин тратить ценную вычислительную мощность, просто чтобы помочь проверить транзакции других людей. И если пользователи Сети не готовы тратить эту энергию, то вся система не будет работать. Решение этой проблемы заключается в вознаграждении людей, которые помогают проверять транзакции. В частности, предположим, что мы вознаграждаем тех, кто успешно проверяет блок транзакций, кредитуя их некоторыми инфокоинами. При условии, что вознаграждение infocoin достаточно велико, что даст им стимул участвовать в валидации.

В протоколе Биткойн этот процесс проверки называется майнингом. За каждый проверенный блок транзакций успешный майнер получает вознаграждение в биткоинах. Первоначально это было установлено как вознаграждение в размере 50 биткоинов. Но за каждые 210 000 проверенных блоков (примерно раз в четыре года) вознаграждение уменьшается вдвое. На сегодняшний день это произошло всего один раз, и поэтому текущая награда за майнинг блока составляет 25 биткоинов. Это сокращение вдвое будет продолжаться каждые четыре года вплоть до 2140 года н. э. В этот момент вознаграждение за майнинг упадет ниже биткоинов за блок. биткойны на самом деле являются минимальной единицей биткойна и известны как Сатоши. Таким образом, в 2140 году н. э. общее предложение биткоинов перестанет увеличиваться. Однако это не отменит стимула помогать проверять транзакции. Биткойн также позволяет выделить некоторую валюту в транзакции в качестве комиссии за транзакцию, который идет к Шахтеру, который помогает проверить его. В первые дни существования биткойна транзакционные сборы были в основном установлены на ноль, но по мере того, как биткойн набирал популярность, транзакционные сборы постепенно росли и теперь являются существенным дополнительным стимулом в дополнение к 25 биткойн-вознаграждению за майнинг блока.

Вы можете думать о доказательстве работы как о конкурсе на одобрение сделок. Каждая запись в конкурсе стоит немного вычислительной мощности. Шансы Шахтера на победу в конкурсе (приблизительно и с некоторыми оговорками) равны доле общей вычислительной мощности, которую они контролируют. Так, например, если майнер контролирует один процент вычислительной мощности, используемой для проверки биткойн-транзакций, то у него есть примерно один процент шансов выиграть конкурс. Таким образом, при условии, что большая вычислительная мощность используется для борьбы с конкурентами, нечестный майнер, скорее всего, будет иметь лишь относительно небольшой шанс испортить процесс проверки, если только он не израсходует огромное количество вычислительных ресурсов.

Конечно, обнадеживает то, что у недобросовестной стороны есть лишь относительно небольшой шанс развратить блокчейн, но этого недостаточно, чтобы дать нам уверенность в валюте. В частности, мы еще окончательно не решили вопрос о двойных расходах.

В ближайшее время я проанализирую двойные расходы. Прежде чем сделать это, я хочу заполнить важную деталь в описании Infocoin. В идеале мы хотели бы, чтобы сеть Infocoin согласовала заказ в которых произошли сделки. Если у нас нет такого заказа, то в любой данный момент может быть неясно, кто владеет какими инфокоинами. Чтобы помочь сделать это, мы потребуем, чтобы новые блоки всегда включали указатель на последний блок, проверенный в цепочке, в дополнение к списку транзакций в блоке. (На самом деле указатель-это просто хэш предыдущего блока). Таким образом, обычно блокчейн-это просто линейная цепочка блоков транзакций, один за другим, с более поздними блоками, каждый из которых содержит указатель на непосредственно предшествующий блок:

Иногда в цепочке блоков появляется вилка. Это может произойти, например, если случайно два майнера проверяют блок транзакций почти одновременно – оба транслируют свой недавно проверенный блок в сеть, и некоторые люди обновляют свою цепочку блоков в одну сторону, а другие обновляют свою цепочку блоков в другую сторону:

Это вызывает именно ту проблему, которую мы пытаемся избежать – больше не ясно, в каком порядке происходили транзакции, и может быть неясно, кто владеет какими инфокоинами. К счастью, есть простая идея, которая может быть использована для удаления любых вилок. Правило таково: если происходит вилка, люди в сети отслеживают обе вилки. Но в любой данный момент времени майнеры работают только для того, чтобы расширить ту вилку, которая является самой длинной в их копии блокчейн-цепочки.

Предположим, например, что у нас есть вилка, в которой некоторые майнеры получают блок A первым, а некоторые майнеры получают блок B первым. Те шахтеры, которые получат блок а первыми, продолжат добычу вдоль этой развилки, в то время как другие будут добывать вдоль развилки В. предположим, что шахтеры, работающие на развилке В, будут следующими, кто успешно добудет блок:

После того как они получат известие о том, что это произошло, шахтеры, работающие на вилке а, заметят, что вилка в теперь длиннее, и переключатся на работу на этой вилке. Вуаля, в скором времени работа над вилкой а прекратится, и все будут работать по одной и той же линейной цепочке, а блок а можно будет проигнорировать. Конечно, любые все еще ожидающие транзакции в A все еще будут ожидаться в очередях майнеров, работающих на форке B, и поэтому все транзакции в конечном итоге будут проверены.

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

Независимо от результата, этот процесс гарантирует, что цепочка блоков имеет согласованный порядок времени блоков. В самом Биткойне транзакция не считается подтвержденной до тех пор, пока: (1) она не является частью блока в самой длинной вилке, и (2) по крайней мере 5 блоков следуют за ней в самой длинной вилке. В этом случае мы говорим, что сделка имеет “6 подтвержденийЭто дает Сети время прийти к согласованному порядку блоков. Мы также будем использовать эту стратегию для Infocoin.

Теперь, когда порядок распределения времени понят, давайте вернемся к размышлениям о том, что произойдет, если нечестная сторона попытается удвоить расходы. Предположим, Алиса попытается удвоить расходы с Бобом и Чарли. Один из возможных подходов заключается в том, чтобы попытаться проверить блок, включающий обе транзакции. Предполагая, что у нее есть один процент вычислительной мощности, ей иногда повезет и она проверит блок, решив доказательство работы. К несчастью для Алисы, двойные расходы будут немедленно замечены другими людьми в Сети Infocoin и отклонены, несмотря на решение проблемы доказательства работы. Так что нам не о чем беспокоиться.

Более серьезная проблема возникает, если она транслирует две отдельные транзакции, в которых она тратит один и тот же инфокоин с Бобом и Чарли соответственно. Она могла бы, например, транслировать одну транзакцию подмножеству майнеров, а другую транзакцию-другому набору майнеров, надеясь таким образом получить подтверждение обеих транзакций. К счастью, в этом случае, как мы уже видели, сеть в конечном итоге подтвердит одну из этих транзакций, но не обе. Так, например, сделка Боба в конечном счете может быть подтверждена, и в этом случае Боб может уверенно идти вперед. Тем временем Чарли увидит, что его сделка не была подтверждена, и поэтому отклонит предложение Элис. Так что это тоже не проблема. На самом деле, зная, что это будет так, у Алисы мало причин пытаться сделать это в первую очередь.

Важный вариант двойных расходов — если Алиса = Боб, то есть Алиса пытается потратить монету с Чарли, которую она также Это звучит так, как будто это должно быть легко обнаружить и справиться с этим, но, конечно, в сети легко настроить несколько идентификаций, связанных с одним и тем же человеком или организацией, поэтому эту возможность необходимо рассмотреть. В этом случае стратегия Алисы заключается в том, чтобы дождаться, пока Чарли примет инфокоин, что происходит после того, как транзакция была подтверждена 6 раз в самой длинной цепочке. Затем она попытается разветвить цепочку перед транзакцией с Чарли, добавив блок, который включает транзакцию, в которой она платит сама:

К несчастью для Алисы, теперь ей очень трудно догнать длинную вилку. Другие шахтеры не захотят ей помогать, так как будут работать на более длинной развилке. И если Алиса не сможет решить доказательство работы по крайней мере так же быстро, как все остальные в сети вместе взятые-грубо говоря, это означает, что она контролирует более пятидесяти процентов вычислительной мощности-тогда она будет просто продолжать отставать все дальше и дальше. Конечно, ей может повезти. Мы можем, например, представить себе сценарий, в котором Алиса контролирует один процент вычислительной мощности, но случается, что ей везет и она находит шесть дополнительных блоков подряд, прежде чем остальная часть сети найдет какие-либо дополнительные блоки. В этом случае она могла бы вырваться вперед и получить контроль над цепочкой блоков. Но это конкретное событие произойдет с большой вероятностью . Более общий анализ в этом направлении показывает, что вероятность того, что Алиса когда-нибудь наверстает упущенное, бесконечно мала, если только она не сможет решать головоломки доказательства работы со скоростью, приближающейся ко всем другим шахтерам вместе взятым.

Конечно, это не строгий анализ безопасности, показывающий, что Алиса не может удвоить расходы. Это просто неофициальный аргумент правдоподобия. Оригинальная статья, вводящая биткойн, на самом деле не содержала строгого анализа безопасности, а только неофициальные аргументы в том духе, который я здесь представил. Сообщество безопасности все еще анализирует Биткойн и пытается понять возможные уязвимости. Вы можете увидеть некоторые из этих исследований, перечисленных здесь, и я упоминаю несколько связанных с этим проблем в разделе “Проблемы для автора” ниже. На данный момент я думаю, что будет справедливо сказать, что присяжные все еще не знают, насколько безопасен Биткойн.

Идеи доказательства работы и добычи полезных ископаемых вызывают много вопросов. Сколько вознаграждения достаточно, чтобы убедить людей заняться добычей? Как изменение предложения инфокоинов влияет на экономику Инфокоинов? Будет ли добыча Инфокоинов в конечном итоге сосредоточена в руках немногих или многих? Если это всего лишь несколько, не угрожает ли это Безопасности Системы? Вероятно, плата за транзакции в конечном итоге уравновесится – не приведет ли это к нежелательному источнику трений и не сделает ли мелкие транзакции менее желательными? Это все великие вопросы, но они выходят за рамки этого поста. Я могу вернуться к этим вопросам (в контексте биткойна) в будущем посте. А пока мы сосредоточимся на понимании того, как работает биткойн-протокол.

Проблемы для автора

  • Я не понимаю, почему двойные расходы не могут быть предотвращены более простым способом с помощью двухфазной фиксации Предположим, Алиса пытается дважды потратить инфокоин с Бобом и Чарли. Идея заключается в том, что Боб и Чарли будут транслировать свои соответствующие сообщения в Сеть Infocoin вместе с просьбой: “должен ли я принять это?” Затем они ждали некоторое время-возможно, десять минут — чтобы услышать скептиков, которые могли бы доказать, что Алиса пытается удвоить расходы. Если такие возражения не будут услышаны (и при условии, что нет никаких признаков попыток нарушить работу сети), они примут транзакцию. Этот протокол должен быть укреплен против сетевых атак, но мне кажется, что он является ядром хорошей альтернативной идеи. Насколько хорошо это работает? Какие недостатки и преимущества он имеет по сравнению с полным протоколом Биткойн?
  • В начале раздела я упомянул, что существует естественный способ уменьшить разницу во времени, требуемую для проверки блока транзакций. Если эта дисперсия уменьшается слишком сильно, то это создает интересную возможность атаки. Предположим, Алиса пытается разветвить цепочку таким образом, что: (а) одна вилка начинается с блока, в котором Алиса платит сама, в то время как другая вилка начинается с блока, в котором Алиса платит Бобу; (б) оба блока объявляются почти одновременно, так что примерно половина шахтеров попытается добыть каждую вилку; (в) Алиса использует свою силу майнинга, чтобы попытаться сохранить вилки примерно одинаковой длины, добывая ту вилку, которая короче – это обычно трудно осуществить, но становится значительно легче, если стандартное отклонение времени до проверки намного короче, чем задержка сети; (г) после того, как 5 блоков были добыты на обеих вилках, Алиса бросает свою силу майнинга, чтобы сделать более вероятным подтверждение транзакции Чарльза; и (д) После подтверждения транзакции Чарльза она затем бросает свою вычислительную мощность в другую вилку и пытается вернуть лидерство. Эта балансирующая стратегия будет иметь лишь небольшой шанс на успех. Но хотя вероятность невелика, она, безусловно, будет намного больше, чем в стандартном протоколе, с высокой дисперсией во времени проверки блока. Есть ли способ избежать этой проблемы?
  • Предположим, что программное обеспечение для майнинга биткойнов всегда исследовало nonces, начиная сx = 0, то x = 1, x = 2,\ldots Если это делают все (или даже только значительная часть) биткойн-майнеров, то это создает уязвимость. А именно, кто-то может улучшить свои шансы на решение доказательства работы, просто начав с какого-то другого (гораздо большего) nonce. В более общем плане злоумышленники могут использовать любые систематические паттерны в том, как майнеры исследуют пространство nonces. В более общем плане, при анализе этого раздела я неявно предположил некую симметрию между различными шахтерами. На практике будут наблюдаться асимметрии, и для учета этих асимметрий потребуется тщательный анализ безопасности.

Биткоин

Давайте отойдем от Инфокоина и опишем сам биткоин-протокол. Здесь есть несколько новых идей, но за одним исключением (обсуждается ниже) они в основном являются очевидными модификациями Infocoin.

Чтобы использовать биткойн на практике, вы сначала устанавливаете программу кошелька на свой компьютер. Чтобы дать вам представление о том, что это значит, вот скриншот кошелька под названием Multbit. Вы можете увидеть баланс Биткоина слева-0.06555555 биткоинов, или около 70 долларов по курсу на день, когда я сделал этот скриншот — — а справа две недавние транзакции, в которых были депонированы эти 0.06555555 биткоинов:

Предположим, вы продавец, который открыл интернет-магазин, и вы решили позволить людям платить с помощью Биткойна. То, что вы делаете, — это говорите своей программе кошелька сгенерировать биткойн-адрес. В ответ он сгенерирует пару открытый / закрытый ключ, а затем хэширует открытый ключ, чтобы сформировать ваш биткойн-адрес:

Затем вы отправляете свой биткойн-адрес человеку, который хочет купить у вас. Вы можете сделать это по электронной почте или даже разместить адрес публично на веб-странице. Это безопасно, так как адрес-это просто хэш вашего открытого ключа, который в любом случае может быть безопасно известен миру. (Позже я вернусь к вопросу о том, почему биткойн-адрес является хэшем, а не просто открытым ключом.)

Человек, который собирается заплатить вам, затем генерирует транзакцию. Давайте взглянем на данные реальной транзакции по переводу 0.31900000биткоинов. То, что показано ниже, очень близко к необработанным данным. Он изменился тремя способами: (1) данные были десериализованы; (2) номера строк были добавлены для удобства использования; и (3) я сократил различные хэши и открытые ключи, просто вставив первые шесть шестнадцатеричных цифр каждого, когда на самом деле они намного длиннее. Вот данные::

1. {3. 4. 5. 6. 7. 8. {

Давайте пройдем через это, строка за строкой.

Строка 1 содержит хэш оставшейся части транзакции, 7c4025..., выраженный в шестнадцатеричном формате. Это используется в качестве идентификатора транзакции.

Строка 2 говорит нам, что это транзакция в версии 1 протокола Биткойн.

Строки 3 и 4 говорят нам, что транзакция имеет один вход и один выход соответственно. Ниже я расскажу о транзакциях с большим количеством входов и выходов и о том, почему это полезно.

Строка 5 содержит значение lock_time, которое можно использовать для контроля завершения транзакции. Для большинства биткойн-транзакций, осуществляемых сегодня, lock_time устанавливается равным 0, что означает, что транзакция завершается немедленно.

Строка 6 сообщает нам размер (в байтах) транзакции. Обратите внимание, что это не денежная сумма, которая переводится! Это придет позже.

Строки с 7 по 11 определяют входные данные для транзакции. В частности, строки с 8 по 10 говорят нам, что входные данные должны быть взяты из выходных данных более ранней транзакции с заданным хэшем, который выражается в шестнадцатеричном виде как 2007ae.... N=0 говорит нам, что это будет первый выход из этой транзакции; скоро мы увидим, как работают несколько выходов (и входов) из транзакции, так что пока не беспокойтесь об этом слишком сильно. Строка 11 содержит подпись лица, отправляющего деньги, 304502..., за которой следует пробел, а затем соответствующий открытый ключ, 04b2d... Опять же, они оба в шестнадцатеричном формате.

Одна вещь, которую следует отметить о входных данных, заключается в том, что нет ничего явно указывающего, сколько биткоинов из предыдущей транзакции должно быть потрачено в этой транзакции. По сути, все биткоины с n=0-го вывода предыдущей транзакции расходуются. Так, например, если n=0th вывод предыдущей транзакции составил 2 биткоина, затем 2 биткоина будут потрачены в этой транзакции. Это кажется неудобным ограничением – например, пытаться купить хлеб с 20-долларовой банкнотой и не иметь возможности сломать банкноту. Решение, конечно, состоит в том, чтобы иметь механизм для обеспечения изменений. Это можно сделать с помощью транзакций с несколькими входами и выходами, которые мы обсудим в следующем разделе.

Строки 12-14 определяют выходные данные транзакции. В частности, строка 13 сообщает нам значение выходного сигнала-0,319 биткоина. Строка 14 несколько усложнена. Главное отметить, что строка a7db6f... является биткоин-адресом предполагаемого получателя средств (записывается в шестнадцатеричном формате). Фактически, строка 14 — это выражение на языке сценариев биткойна. Я не собираюсь подробно описывать этот язык в этом посте, важно только то, что a7db6f... это биткойн-адрес.

Кстати, теперь вы можете видеть, как биткойн решает вопрос, который я замел под ковер в последнем разделе: откуда берутся серийные номера биткойнов? На самом деле роль серийного номера играют хэши транзакций. В приведенной выше транзакции, например, получатель получает 0,319 биткоина, которые выходят из первого вывода более ранней транзакции с хэшем 2007ae... (строка 9). Если вы пойдете и посмотрите в цепочке блоков для этой транзакции, вы увидите, что ее выход происходит из еще более ранней транзакции. И так далее.

Есть две умные вещи, связанные с использованием хэшей транзакций вместо серийных номеров. Во-первых, в биткойне на самом деле нет никаких отдельных, постоянных “монет” вообще, просто длинная серия транзакций в блокчейне. Это умная идея, чтобы понять, что вам не нужны постоянные монеты, и вы можете просто обойтись без книги транзакций. Во-вторых, действуя таким образом, мы устраняем необходимость в каком-либо центральном органе, выдающем серийные номера. Вместо этого серийные номера могут быть сгенерированы самостоятельно, просто путем хэширования транзакции.

На самом деле, можно продолжать следить за цепочкой транзакций дальше в истории. В конечном счете, этот процесс должен прекратиться. Это может произойти одним из двух способов. Первая возможность заключается в том, что вы придете к самой первой биткойн-транзакции, содержащейся в так называемом блоке Genesis Это специальная транзакция, не имеющая входов, но имеющая выход в 50 биткоинов. Другими словами, эта сделка устанавливает первоначальную денежную массу. Блок Genesis рассматривается отдельно Биткойн-клиентами, и я не буду вдаваться в подробности здесь, хотя это похоже на транзакцию выше. Вы можете увидеть десериализованные необработанные данные здесь, а также прочитать о блоке Genesis здесь.

Вторая возможность, когда вы следуете цепочке транзакций назад во времени, заключается в том, что в конечном итоге вы придете к так называемой транзакции coinbase. За исключением блока Genesis, каждый блок транзакций в цепочке блоков начинается со специальной транзакции coinbase. Это транзакция, вознаграждающая майнера, который проверил этот блок транзакций. Он использует аналогичный, но не идентичный формат транзакции выше. Я не буду подробно останавливаться на этом формате, но если вы хотите увидеть пример, смотрите здесь. Вы можете прочитать немного больше о транзакциях coinbase здесь.

Что-то я не был точен выше, так это то, что именно подписывается цифровой подписью в строке 11. Очевидно, что плательщик должен подписать всю транзакцию (кроме хэша транзакции, который, конечно же, должен быть сгенерирован позже). В настоящее время это не то, что делается – некоторые части сделки опущены. Это делает некоторые части сделки податливыми, то есть они могут быть изменены позже. Однако эта гибкость не включает в себя выплачиваемые суммы, отправителей и получателей, которые не могут быть изменены позже. Должен признаться, я не стал вдаваться в подробности. Я так понимаю, что эта податливость обсуждается в сообществе разработчиков биткойнов, и предпринимаются усилия, чтобы уменьшить или устранить эту податливость.

Транзакции с несколькими входами и выходами

В предыдущем разделе я описал, как работает транзакция с одним входом и одним выходом. На практике часто бывает чрезвычайно удобно создавать биткойн-транзакции с несколькими входами или несколькими выходами. Ниже я расскажу о том, почему это может быть полезно. Но сначала давайте взглянем на данные из реальной транзакции:

1. {3. 4. 5. 6. 7. 8. {12. {16. {21. {23. {

Давайте пройдемся по данным, строка за строкой. Это очень похоже на транзакцию

Строка 1 содержит хэш оставшейся части транзакции. Это используется в качестве идентификатора транзакции.

Строка 2 говорит нам, что это транзакция в версии 1 протокола Биткойн.

Строки 3 и 4 говорят нам, что транзакция имеет три входа и два выхода соответственно.

Строка 5 содержит lock_time. Как и в случае с одним входом-одним выходом, это значение равно 0, что означает, что транзакция завершается немедленно.

Строка 6 сообщает нам размер транзакции в байтах.

Строки с 7 по 19 определяют список входных данных для транзакции. Каждый из них соответствует выходу из предыдущей биткойн-транзакции.

Первый вход определяется в строках с 8 по 11.

В частности, строки с 8 по 10 говорят нам, что входные данные должны быть взяты из n=0-го вывода транзакции с хэшем 3beabc.... Строка 11 содержит подпись, за которой следует пробел, а затем открытый ключ человека, отправляющего биткоины.

Строки с 12 по 15 определяют второй вход, формат которого аналогичен строкам с 8 по 11. А строки 16-19 определяют третий вход.

Строки 20-24 определяют список, содержащий два вывода из транзакции.

Первый вывод определяется в строках 21 и 22. Строка 21 сообщает нам значение выходного сигнала, 0,01068000 биткоинов. Как и прежде, строка 22 — это выражение на языке сценариев биткойна. Главное, что нужно здесь убрать, — это то, что строка e8c30622... является биткоин-адресом предполагаемого получателя средств.

Второй вывод определяется строками 23 и 24, имеющими аналогичный формат с первым выводом.

Одна очевидная странность в этом описании заключается в том, что, хотя каждый выход имеет значение биткойна, связанное с ним, входные данные этого не делают. Конечно, значения соответствующих входных данных можно найти, сверившись с соответствующими выходными данными в предыдущих транзакциях. В стандартной биткойн-транзакции сумма всех входов в транзакцию должна быть по крайней мере такой же, как сумма всех выходов. (Единственным исключением из этого принципа является блок Genesis и транзакции coinbase, оба из которых добавляют к общему предложению биткойна.) Если входы суммируются больше, чем выходы, то избыток используется в качестве комиссии за транзакцию. Это выплачивается тому майнеру, который успешно проверяет блок, частью которого является текущая транзакция.

Это все, что нужно для транзакций с несколькими входами и несколькими выходами! Это довольно простая вариация транзакций с одним входом и одним выходом.

Одним из хороших применений транзакций с несколькими входами и несколькими выходами является идея изменения Предположим, например, что я хочу отправить вам 0,15 биткоина. Я могу сделать это, потратив деньги с предыдущей транзакции, в которой я получил 0,2 биткоина. Конечно, я не хочу посылать вам все 0,2 биткойна. Решение состоит в том, чтобы отправить вам 0,15 биткойна и отправить 0,05 биткойна на биткойн-адрес, которым я владею. Эти 0,05 биткойна-это изменение. Конечно, это немного отличается от сдачи, которую вы могли бы получить в магазине, так как сдача в этом случае-это то, что вы платите сами. Но общая идея схожа.

Вывод

Это завершает базовое описание основных идей, лежащих в основе биткойна. Конечно, я опустил многие детали – это не формальная спецификация. Но я описал основные идеи, лежащие в основе наиболее распространенных вариантов использования биткойна.

Хотя правила биткойна просты и понятны, это не значит, что легко понять все последствия этих правил. Есть гораздо больше того, что можно было бы сказать о биткойне, и я исследую некоторые из этих вопросов в будущих сообщениях.

Но сейчас я закончу, обратившись к нескольким свободным концам.

Насколько анонимен биткоин? Многие люди утверждают, что биткойн можно использовать анонимно. Это утверждение привело к образованию таких рынков, как Шелковый путь (и различных его преемников), которые специализируются на нелегальных товарах. Однако утверждение, что биткойн является анонимным, является мифом. Блокчейн-цепочка является публичной, а это означает, что любой желающий может видеть каждую биткойн-транзакцию когда-либо. Хотя биткойн-адреса не сразу ассоциируются с реальными личностями, компьютерные ученые проделали большую работу выясняем, как обезличить “анонимные Блокчейн — прекрасная мишень для этих техник. Я буду крайне удивлен, если подавляющее большинство пользователей Биткойна не будут идентифицированы с относительно высокой уверенностью и легкостью в ближайшем будущем. Уверенность не будет достаточно высокой, чтобы добиться убеждения, но будет достаточно высокой, чтобы определить вероятные цели. Кроме того, идентификация будет ретроспективной, а это означает, что человек, купивший наркотики на Шелковом пути в 2011 году, все равно будет идентифицирован на основе блокчейн-цепочки, скажем, в 2020 году. Эти методы деанонимизации хорошо известны ученым-компьютерщикам, а следовательно, и АНБ. Я бы нисколько не удивился, если бы АНБ и другие агентства уже деанонимизировали многих пользователей. На самом деле, ирония заключается в том, что биткойн часто рекламируется как анонимный. Это не. Биткойн-это, пожалуй, самый открытый и прозрачный финансовый инструмент, который когда-либо видел мир.

Можете ли вы разбогатеть с помощью Биткойна? Ну, может быть. Тим О’Рейли однажды сказал: Большая часть интереса к биткоину исходит от людей, чья жизненная миссия, похоже, состоит в том, чтобы найти действительно большой заправка. Должен признаться, меня это озадачивает. Я считаю, что гораздо интереснее и приятнее думать о биткойне и других криптовалютах как о способе создания новых форм коллективного поведения. Это интеллектуально увлекательно, предлагает удивительные творческие возможности, социально ценно и может просто положить немного денег в банк. Но если деньги в банке-это ваша главная забота, то я считаю, что другие стратегии гораздо более успешны.

Детали, которые я опустил: хотя в этом посте были описаны основные идеи Биткойна, есть много деталей, которые я не упомянул. Один из них-хороший трюк экономии места, используемый протоколом, основанный на структуре данных, известной как Дерево Меркла. Это деталь, но великолепная деталь, и стоит проверить, являются ли забавные структуры данных вашей вещью. Вы можете получить обзор в оригинальной Биткойн-бумаге. Во-вторых, я мало говорил о биткойн-сети – такие вопросы, как то, как сеть справляется с атаками отказа в обслуживании, как узлы присоединяются и покидают сеть и так далее. Это увлекательная тема, но в ней также есть какая-то путаница деталей, и поэтому я ее опустил. Вы можете прочитать больше об этом по некоторым ссылкам выше.

Биткойн-скриптинг: в этом посте я объяснил биткойн как форму цифровых, онлайн-денег. Но это лишь малая часть гораздо более масштабной и интересной истории. Как мы уже видели, каждая Биткойн-транзакция связана со сценарием на языке программирования Биткойн. Сценарии, которые мы видели в этом посте, описывают простые транзакции, такие как “Алиса дала Бобу 10 биткоинов”. Но язык сценариев может также использоваться для выражения гораздо более сложных транзакций. Другими словами, Биткойн-это программируемые деньги В следующих постах я объясню систему сценариев и то, как можно использовать биткойн-скриптинг в качестве платформы для экспериментов со всевозможными удивительными финансовыми инструментами.

Спасибо за чтение. Нравится эссе? Вы можете дать мне чаевые с биткоином (!) по адресу: 17ukkKt1bNLAqdJ1QQv8v9Askr6vy3Mztz. Вы также можете насладиться первой главой моей будущей книги о нейронных сетях и глубоком обучении и, возможно, захотите следить за мной в Twitter.

Сноска

[1] в Соединенных Штатах вопрос “Являются ли деньги формой речи?” является важным юридическим вопросом из-за защиты, предоставляемой речи в соответствии с Конституцией США. По моему (юридически неосведомленному) мнению, цифровые деньги могут усложнить этот вопрос. Как мы увидим, протокол Биткойн-это действительно способ встать перед остальным миром (или, по крайней мере, остальной частью биткойн-сети) и признаться: “я собираюсь дать такое-то количество биткойнов такому-то человеку” таким образом, что очень трудно отказаться. По крайней мере, наивно, это больше похоже на речь, чем на обмен медными монетами, скажем.