Учебники

Блокчейн — Краткое руководство

Блокчейн — Введение

В последние годы на Blockchain много шума. Многие описывают это как наиболее разрушительную технологию десятилетия. Особенно финансовые рынки могут быть наиболее затронутыми.

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

Тем не менее, до сих пор наиболее успешной реализацией Blockchain является биткойн — электронно-кассовая система «одноранговой сети», которая, кстати, также является первой реализацией технологии блокчейна. Таким образом, чтобы понять технологию блокчейна, лучше всего понять, как спроектирована и реализована система Биткойн.

В этой статье вы узнаете, что такое Blockchain, его архитектура, как он реализован и его различные функции. Я расскажу о реализации биткойнов, описывая тонкости блокчейна.

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

Блокчейн — двойные расходы

Рассмотрим ситуацию, показанную на рисунке —

Двойные расходы

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

Теперь рассмотрим ситуацию, когда деньги выплачиваются в цифровой форме. Это показано на рисунке —

Платная цифровая форма

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

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

Центральная власть

Централизованный орган, который в общих чертах — ваш банк, ведет бухгалтерскую книгу, в которой записываются все транзакции. Теперь Боб должен отправить свои цифровые деньги в банк, который внесет запись в его бухгалтерскую книгу, списав со счета Боба. Убедившись, что у Боба есть достаточный баланс для оплаты цифровых денег, которые он хочет отправить, отправит деньги Лизе, зачислив ее счет в ее бухгалтерскую книгу.

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

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

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

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

Биткойн — краткая история

Биткойн был представлен в этом мире Сатоши Накамото в научно-исследовательской статье под названием « Биткойн: электронная система наличных денег в 2008 году».

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

Представьте себе, что в этом мире социальных сетей, когда речь идет о неприкосновенности частной жизни каждого человека, мир до сих пор не может отследить, кто такой Сатоши? На самом деле, мы не знаем, является ли Сатоши отдельным человеком или группой людей. Гугл также выявил тот факт, что биткойны, которые держит Сатоши Накамото, стоят около 19,4 млрд долларов — эти деньги сейчас остаются невостребованными в системе Биткойн. Так что же такое Биткойн — давайте посмотрим!

Что такое биткойн?

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

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

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

Эта базовая архитектура — это Blockchain, и это то, о чем этот урок. Чтобы понять архитектуру Blockchain, вам необходимо понять несколько ключевых особенностей, на которых она основана. Итак, давайте начнем с PKI — криптографии с открытым ключом.

Блокчейн — криптография с открытым ключом

Криптография с открытым ключом или коротко PKI также известна как асимметричная криптография. Он использует две пары ключей — открытый и закрытый. Ключ — это какое-то длинное двоичное число. Открытый ключ распространяется по всему миру и является действительно открытым, как следует из его названия. Закрытый ключ должен быть строго закрытым, и его никогда не следует терять.

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

PKI выполняет две функции — аутентификацию и конфиденциальность сообщений с помощью механизма шифрования / дешифрования. Теперь я объясню обе эти функции —

Аутентификация

Когда обе стороны обмениваются сообщениями, важно установить доверие между отправителем и получателем. Особенно, получатель должен доверять источнику сообщения. Переходя к нашему более раннему сценарию (изображенному на рисунке 1), когда Боб отправляет Лизе немного денег для покупки некоторых товаров у нее, давайте посмотрим, как PKI создает это доверие между Бобом и Лизой. Посмотрите на изображение ниже —

Аутентификация

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

Теперь Боб говорит, что он посылает Лизе 10 долларов. Поэтому он создает сообщение (текстовое сообщение), содержащее открытый ключ Боба (отправителя), открытый ключ Лизы (получателя) и сумму (10 долларов США).

Цель этого перевода, например, «Я хочу купить тыкву у вас», также добавлена ​​в сообщение. Все сообщение теперь подписано с использованием закрытого ключа Боба. Когда Лиза получит это сообщение, она будет использовать алгоритм проверки подписи PKI и открытый ключ Боба, чтобы убедиться, что сообщение действительно произошло от Боба. Как работает PKI, выходит за рамки данного руководства. Заинтересованный читатель обращается к этому сайту для более подробного обсуждения PKI. Это устанавливает подлинность отправителя сообщения. Теперь давайте посмотрим на конфиденциальность сообщения.

Конфиденциальность сообщений

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

Конфиденциальность сообщений

Лиза создает сообщение типа «Вот ссылка на мою электронную книгу, которую вы запросили», подписывает ее открытым ключом Боба, который она получила в сообщении с запросом Боба, а также шифрует сообщение с использованием некоторого секретного ключа, который разделяется между ними. во время HTTPS рукопожатия.

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

Рассматривая обе функции, Authentication и Message Privacy, подразумеваемые PKI, давайте продвинемся дальше, чтобы увидеть, как Биткойн использует PKI для защиты публичной книги, о которой я упоминал в главе «Что такое Биткойн?».

Насколько вам известно — наиболее популярными алгоритмами PKI являются RSA и ECDSA , биткойн использует последний.

Блокчейн — Хеширование

Одной из наиболее важных функций в PKI является функция хеширования. Хеш-функция отображает данные любого произвольного размера на данные фиксированного размера. Биткойн использует хэш-функцию SHA-256, которая создает хэш (вывод) размером 256 бит (32 байта). Это показано на рисунке —

хеширования

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

Убедившись в важности хеширования, давайте перейдем к другой концепции биткойнов — майнингу.

Биткойн — майнинг

Когда Боб создает запрос на покупку Лизы, он не отправляет его Лизе в одиночку. Скорее сообщение запроса передается по всей сети, к которой он подключен. Сеть Боба изображена на картинке.

Добыча полезных ископаемых

Сообщение отправляется на все подключенные узлы (машины). Некоторые из узлов на диаграмме отмечены как майнеры. Это машины, на которых запущено программное обеспечение для майнинга сообщений биткойнов. Теперь я объясню вам, что означает этот майнинг.

Процесс добычи

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

Процесс добычи

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

Блокчейн — Цепные блоки

Блоки, созданные разными майнерами, объединяются в цепочки, образуя то, что известно как действительно распределенная открытая книга.

Цепные блоки

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

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

Блокчейн — доказательство работы

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

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

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

Таким образом, сгенерированный хеш будет выглядеть как 000010101010xxx. Как правило, майнер начинает со значения Nonce, равного 0, и продолжает увеличивать его, пока сгенерированный хэш не удовлетворяет указанному критерию.

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

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

Блокчейн — Сеть и Майнинг

Теперь я подведу итог описанным выше шагам; это то, что происходит в сети —

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

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

  • Все транзакции транслируются в сети на все узлы. Обратите внимание, что нет необходимости, чтобы данная транзакция достигала всех остальных узлов в сети.

  • Каждый узел собирает новые транзакции в блок. Обратите внимание, что набор транзакций в каждом блоке не зависит от набора в блоках, созданных другими, и, естественно, будет отличаться от других. Это не имеет значения; система гарантирует, что каждая трансляция транзакции в сети будет включена в некоторый блок в течение разумного периода времени. Как правило, отправитель будет стимулировать узел, предлагая майнеру определенное количество биткойнов за его усилия. Майнер может выбрать предоставление приоритета для включения в блок тем, у кого более высокие стимулы.

  • Теперь узел работает над поиском доказательства работы для своего собранного блока.

  • Когда узел находит подтверждение работы, он транслирует собранный блок в сети.

  • Узлы, которые получают новый блок, примут его только после проверки того, что все транзакции в блоке действительны и еще не потрачены.

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

  • Точно так же блокчейн продолжает расти вечно.

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

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

Все транзакции транслируются в сети на все узлы. Обратите внимание, что нет необходимости, чтобы данная транзакция достигала всех остальных узлов в сети.

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

Теперь узел работает над поиском доказательства работы для своего собранного блока.

Когда узел находит подтверждение работы, он транслирует собранный блок в сети.

Узлы, которые получают новый блок, примут его только после проверки того, что все транзакции в блоке действительны и еще не потрачены.

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

Точно так же блокчейн продолжает расти вечно.

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

Блокчейн — Стимулы для шахтеров

Как мы видели в главе «Биткойн — майнинг», майнер может быть затоплен множеством транзакций в любой данный период времени. Максимальный размер для блока заранее определен в системе, что требует включения в блок только определенного количества транзакций.

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

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

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

Блокчейн — Меркл Три

Проблема дискового пространства в узле легко решается, потому что все транзакции в блоке хэшируются в дереве Меркле, как показано на рисунке —

Меркл Три

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

Корневой хэш

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

Блокчейн — Подтверждение оплаты

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

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

Подтверждение оплаты

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

Блокчейн — разрешение конфликтов

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

Разрешение конфликтов

Теперь у нас есть две ветви после блока 3. Обе ветви действительны. Таким образом, следующий добытый блок может быть добавлен в любую из ветвей. Предположим, что майнер добавляет вновь добытый блок в блок 104-A, ветвь, содержащая блок 104-A, будет длиннее, чем ветвь, содержащая блок 104-B. Это показано на рисунке ниже —

Биткойн Архитектура

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

Блокчейн — Конфиденциальность

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

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

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

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

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

Биткойн — Смягчающие атаки

Я буду обсуждать три различных типа вероятных атак в системе Биткойн —

Раса Атака

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

Финни Атака

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

Атака 51%

При такой атаке мы получаем непрактичное предположение, что кому-то принадлежит 51% вычислительной мощности сети. Атакующий в такой атаке добывает частную блокчейн, где он дважды тратит монеты.

Поскольку он владеет большей частью вычислительной мощности, ему гарантировано, что его частный блокчейн в какой-то момент будет длиннее, чем цепочка «честной» сети. Затем он выпускает свой личный блокчейн в систему, делая все транзакции, ранее записанные в честном блокчейне, недействительными.

Этот вид атаки является вымышленным, поскольку очень дорого приобретать вычислительную мощность, которая равна или превышает 51% вычислительной мощности всей сети.

Блокчейн — Вывод

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

Оригинальная статья Satoshi — Биткойн: электронная кассовая система

Официальный сайт — Bitcoin.org