Блокчейн и токены: Транзакции

Блокчейн и криптовалюты. Транзакции.



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

Семантика транзакции


Давайте вспомним как данные хранятся в файлах на компьютере.
На самом деле каждый файл это запись в таблице inode, структура которой определена в коде ОС которая и загружается во время ее запуска.
В этой структуре и содержатся ID файлов и номера секторов на физическом устройстве (диске) с данными файлов. Все остальное ссылки на эту запись (по ее ID). Имена как раз у ссылок.
Однако это лирическое отступление. Нам все же важно, понять принцип записи в файлы. Это может быть:

  1. Текстовая строка (для текстовых файлов).
  2. Структура данных разных типов (двоичные файлы).
    Мы будем предполагать что транзакции это запись в файле второго типа (так как обычно это более компактно хранить).
    Когда такие записи добавляют или считывают их представляют в текстовом структурированом виде - чаще всего в формате JSON.
    Данные описываются в фигурных скобках, и содержат имя и значения полей структуры.

Почему именно транзакция


Такое название скорее всего происходит по двум причинам.

  1. В отличии от обычной записи - все транзакции в пределах одного блокчейна уникальны и атомарны (то есть их нельзя разделить на части иначе потеряется смысл).
  2. Они переносят определенную ценностную информацию и поэтому есть аналогия с банковскими или финансовыми транзакциями.

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

Входы и выходы транзакций


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

{
    "transaction_id":"12345abcdef",
    "in1":"0.3 TKN",
    "in2":"0.5 TKN",
    "out1":"0.7 TKN",
    "out2":"0.1 TKN",
    "address1":"0x9ffdfaa345",
    "address2":"0x33533dfd9a",
    "tx_hash1":"fff78945654dffad89767ffaccf9889976dfa8",
    "tx_hash2":"afa545276d6df67a7dee8b855434fdf990accb"
}

Теперь посмотрим что там у нас.
Первым у нас идентификатор транзакции - это просто число естественно шестнадцатиричное.
Далее я написал два абсолютно ненужных в реальности поля - это входы IN. =)
А вот выходы уже нужны - они выводят соответственно 0.7 токенов на address1 и 0.1 на address2 (а 2-й адрес на самом деле наш же адрес просто мы не можем оставить себе остаток 0.1 токен - мы должны его себе таким образом обратно передать).

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

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

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

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

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

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

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

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

Далее будет рассмотрен принцип формирования блоков, их структура, как они связываются в ту самую цепочку и зачем :)

образованиепрограммированиеблокчейнкриптовалютыкриптография
43
252.472 GOLOS
0
В избранное
Руслан Дорофеев
Сетевое программирование
43
0

Зарегистрируйтесь, чтобы проголосовать за пост или написать комментарий

Авторы получают вознаграждение, когда пользователи голосуют за их посты. Голосующие читатели также получают вознаграждение за свои голоса.

Зарегистрироваться
Комментарии (1)
Сортировать по:
Сначала старые