Какой тип записей ведется в блокчейне
Перейти к содержимому

Какой тип записей ведется в блокчейне

  • автор:

# Blockchain data types

The blockchain data types are the data types that are used to describe binary formats of blockchain entities.

# List of blockchain data types

# Keyword Possible values Variable size in bytes
1 Boolean 0 and 1 1
2 Byte Integer from -128 to 127 inclusive 1
3 Int Integer from -2,147,483,648 to 2,147,483,647 inclusive 4
4 Long Integer from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 inclusive 8
5 Short Integer from -32,768 to 32,767 inclusive 2
6 String From 0 to 2,147,483,647 characters inclusive From 1 to 4 bytes per character

Какие существуют типы блоков в блокчейне

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

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

Как работает блокчейн?

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

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

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

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

Как работают блоки?

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

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

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

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

Типы блоков

Существует 3 типа блоков, которые можно найти в блокчейне. В частности, мы говорим о генезисных блоках, действительных блоках и блоках-сиротах. Давайте рассмотрим каждый из них подробнее.

Блок Генезиса

Блок genesis получил свое название, в частности, потому, что это первый блок, созданный в блокчейне.

Первый из них, добытый Сатоши Накамото, дал начало Bitcoin, и положил начало блокчейну и криптовалюте в 2009 году.

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

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

Поскольку это особый блок, и он не похож на остальные блоки, его называют блоком 0.

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

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

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

Действительный блок

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

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

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

Каждый действительный блок содержит определенное количество транзакций, которое зависит от размера блока конкретной цепи. В случае с Биткойном каждый такой действующий блок содержит в среднем 2 100 транзакций.

Структура транзакций в блоке Биткоин

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

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

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

Помимо транзакций, блок содержит корень Меркла, время, nonce и специальную транзакцию, называемую coinbase.

Блоки-сироты

Блоки-сироты — это блоки, которые не являются частью цепочки.

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

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

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

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

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

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

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

Заключение

Теперь вы знаете, что существует 3 типа блоков:

  • генезисные блоки;
  • действительные блоки;
  • блоки-сироты.

Каждый блок занимает важное место в блокчейне и является необходимым или продуктом различных функций блокчейна.

Блокчейн: возможности, структура, ЭЦП и задание для студента, часть 1

Работаю ассистентом в вузе (как хобби), решил написать несколько лабораторных для студентов по дисциплине «распределенные системы». В первой части будет рассказано про возможности блокчейна, структуру и ЭЦП, а во второй части про: проверку подписи, майнинг и примерную организацию сети. Отмечу, что не являюсь специалистом по распределенным системам (организация сети может быть неверной).

Структура и возможности

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

  1. Monegraph позволяет авторам закрепить права на свою работу и установить правила (и выплаты) за использования их работы;
  2. La Zooz это децентрализованный Uber. Предлагай свою машину, найди перевозчика без платы Uber’у;
  3. Augur – это онлайн букмекер. Делай ставки и получай выигрыш;
  4. Storj.io – это P2P хранилище данных. Сдавай свое неиспользуемое место на диске или найди самое дешевое онлайн хранилище;
  5. Muse – это распределенная, открытая и прозрачная база данных специально для музыкальной индустрии;
  6. Ripple позволяет проводить недорогие трансграничные платежи в банки;
  7. Golem – мировой децентрализованный суперкомпьютер с открытым кодом, доступ к которому может получить любой человек, для выполнения распределенных вычислений (от обработки изображений до проведения исследований и запуска веб-сайтов). Используя Golem, пользователи могут покупать или продавать вычислительные мощности между собой;
  8. Множество других криптовалют отличающихся высокой анонимностью работы, низкой стоимостью переводов, умными контрактами и т.д.

База данных

В самом простом виде база данных (БД) представляет из себя цепочку блоков, которая может быть представлена в виде файла формата JSON.

Структура блока

  • Адрес – публичный ключ, генерируемый ассиметричным алгоритмом шифрования (например, RSA), на основе придуманного пользователем приватного ключа;
  • Дата и время – тот момент, когда был создан блок (у транзакции тоже есть дата и время создания);
  • Хэш (связующий) – вычисляется с помощью SHA512 от адреса предыдущего блока и суммы хэшей всех транзакций текущего блока, почему связующий? Потому что при его вычислении требуется адрес предыдущего блока;
  • Информация — сообщение, сумма денег (криптовалюты), документы, история болезней, программный код (умные контракты) и т.д.

Рисунок 1 – блокчейн из 3-ех блоков

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

Электронная цифровая подпись

  • симметричное шифрование использует один и тот же ключ и для зашифровывания, и для расшифровывания;
  • асимметричное шифрование использует два разных ключа: один для зашифровывания (который также называется открытым), другой для расшифровывания (называется закрытым).

Закрытый и открытый ключи

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

Алгоритм подписания информации (документа)

Для создания подписи потребуется:

  • Асимметричный алгоритм шифрования (например, RSA);
  • Хэш-функция (например, SHA512);
  • Информация, которую собираемся подписывать.

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

  1. С помощью RSA, генерируем пару публичный и приватный ключи;
  2. Подписываемые данные подставляем в функцию SHA512 и получаем хэш;
  3. Полученный хэш и закрытый ключ подставляем в функцию асимметричного шифрования RSA, то есть RSAEncode(хэш от информации, закрытый ключ), на выходе получим строку – ЭЦП.

Алгоритм подписи данных продемонстрирован на рисунке 2.

Рисунок 2 — алгоритм подписи данных

Связующий хэш блока

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

Хэш (связующий) = SHA512(block_prev_adress_hash + transaction_hash1 + transaction_hash2 + … + transaction_hashN)

Например, из рисунка 1 видно, что хэш 3-го блока вычислялся как адрес второго блока и два хэша двух внутренних транзакций:

Хэш 3 блока = SHA512(JD9100. NNBAXVB + B35BCA. H78C + A144. 875D)

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

Пример подписи на языке C#

Для генерации ключевой пары можно воспользоваться различными библиотеками, например, язык C# имеет встроенный пакет для работы с алгоритмами шифрования и ЭЦП.

 // Создание новой пары ключей размера 1024 бит RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024); // приватный ключ, представляется ввиде строки XML string privateKey = rsa.ToXmlString(true); // публичный ключ, редставляется ввиде строки XML string publicKey = rsa.ToXmlString(false); 

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

 private static string SignData(string data, string privateKey) < // Получаем объект класса RSA через провайдер RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024); // Говорим, что у нас уже есть приватный ключ (например взятый из файла) и следует использовать его rsa.FromXmlString(privateKey); // Преобразуем символы строки в последовательность байтов byte[] byteData = Encoding.UTF8.GetBytes(data); // Хэшируем наши данные с помощью SHA512 и подписываем уже полученный хэш (то есть, берется уже хэш от данных, а не сами данные) byte[] signedByteData = rsa.SignData(byteData, CryptoConfig.MapNameToOID("SHA512")); // Конвертируем массив байтов в строкове представление в кодировке Base64 string signedData = Convert.ToBase64String(signedByteData); // Возвращаем ЭЦП return signedData; >

Задание

  1. Регистрация нового пользователя (один блок = 1 пользователь) – то есть создать новый блок, вернуть пользователю закрытый ключ, а публичный использовать как адрес блока;
  2. Авторизация – доступ к ячейке блокчейна, логином является адрес блока, паролем – закрытый ключ;
  3. После прохождения авторизации — вставить транзакцию с произвольной информацией в блок (не в любой, а в тот к которому есть доступ);
  4. Просмотр списка блоков и транзакций в понятном виде.

Продолжение — проверка подписи, майнинг и примерная организация сети

Источники

  • Habrahabr // Habrahabr — Электронная цифровая подпись для чайников
  • Электронная цифровая подпись // Материал из википедии – свободной энциклопедии
  • Habrahabr // Habrahabr — Bitcoin. Как это работает
  • Medium // Биткоин за 5 минут: Блок
  • Beyond Techs // RSA Digital Signature C#

«Криптография в блокчейнах»: о хеш-функциях, ключах и цифровых подписях

Криптография — это сердце блокчейна, которое обеспечивает работу системы. Архитектура блокчейна предполагает, что доверие между участниками сети базируется на принципах математики и экономики, то есть является формализованным. Криптография также гарантирует безопасность, причем основанную на прозрачности и проверяемости всех операций, а не на традиционном для индустрии ограничении видимости системы (perimeter security).

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

/ изображение BTC Keychain CC

Хеш-функции

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

Хеш-функции имеются практически в любом языке программирования. Например, они используются для реализации хеш-таблиц и множеств (HashMap/HashSet в Java, dict и set в Python, Map, Set и объекты в JavaScript и так далее). Отдельная категория хеш-функций — криптографические хеш-функции. К ним предъявляются существенно более строгие требования, чем к функциям, обычно используемым в хеш-таблицах. Поэтому и применяются они в более «серьезных» случаях, например для хранения паролей. Криптографические хеш-функции вырабатываются и тщательно проверяются исследователями по всему миру.

Поэкспериментировать с хеш-функциями можно, написав простую программу на Python:

import hashlib def hash_hex(message): return hashlib.sha256(message.encode()).hexdigest()

Функция hash_hex() рассчитывает представление хеша в шестнадцатеричной записи для строки. В приведенном примере используется функция SHA-256 — та же, что и в биткойне.

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

>>> hash_hex('Blockchain') '625da44e4eaf58d61cf048d168aa6f5e492dea166d8bb54ec06c30de07db57e1' >>> hash_hex('blockchain') 'ef7797e13d3a75526946a3bcf00daec9fc9c9c4d51ddc7cc5df888f74dd434d1' >>> hash_hex('Bl0ckchain') '511429398e2213603f4e5dd3fff1f989447c52162b0e0a28fe049288359220fc'

Хеш-функции в блокчейнах гарантируют «необратимость» всей цепочки транзакций. Дело в том, что каждый новый блок транзакций ссылается на хеш предыдущего блока в реестре. Хеш самого блока зависит от всех транзакций в блоке, но вместо того, чтобы последовательно передавать транзакции хеш-функции, они собираются в одно хеш-значение при помощи двоичного дерева с хешами (дерево Меркла). Таким образом, хеши используются как замена указателям в обычных структурах данных: связанных списках и двоичных деревьях.

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

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

import hashlib def merkle_root(lst): # Биткойн использует для склеивания хешей два прогона SHA-256 и изменение # порядка байтов. Зачем, не до конца понятно. sha256d = lambda x: hashlib.sha256(hashlib.sha256(x).digest()).digest() hash_pair = lambda x, y: sha256d(x[::-1] + y[::-1])[::-1] if len(lst) == 1: return lst[0] # Дублирование элементов в дереве приводит к интересной уязвимости - # получается, что различные списки транзакций могут иметь один и тот же хеш. # По этой причине в биткойне даже есть специальный комментарий, # предостерегающий разработчиков новых криптовалют: # https://github.com/bitcoin/bitcoin/blob/master/src/consensus/merkle.cpp#L9 if len(lst) % 2 == 1: lst.append(lst[-1]) return merkle_root([ hash_pair(x, y) for x, y in zip(*[iter(lst)] * 2) ]) 

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

Цифровые подписи

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

Существует множество различных схем криптографии с открытым ключом. Две самые популярные из них — это схемы на основе разложения на множители (RSA) и схемы на основе эллиптических кривых. Последние более популярны в блокчейнах из-за меньшего размера ключей и подписей. Например, в биткойне используется стандарт эллиптической криптографии ECDSA вместе с эллиптической кривой secp256k1. В ней закрытый ключ имеет длину 32 байта, открытый — 33 байта, а подпись — около 70 байт.

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

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

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

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

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

P.P.S. Немного дополнительных источников:

  • Наш англоязычный блог
  • «C чем это едят»: что такое блокчейн
  • Подтверждение доли и доказательство выполнения работы (PoS vs PoW)
  • Смарт-контракты в биткойн-блокчейне

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *