Блокчейн и токены: Транзакции
Блокчейн и криптовалюты. Транзакции.
В предыдущем уроке я писал про работу цифровой подписи.
Как мы выяснили она позволяет заверить текст, однозначно подтвердив его владельца, а также его полномочия.
Однако не только текст можно подписывать таким образом. В его качестве может быть особая структура данных - транзакция.
Семантика транзакции
Давайте вспомним как данные хранятся в файлах на компьютере.
На самом деле каждый файл это запись в таблице inode, структура которой определена в коде ОС которая и загружается во время ее запуска.
В этой структуре и содержатся ID файлов и номера секторов на физическом устройстве (диске) с данными файлов. Все остальное ссылки на эту запись (по ее ID). Имена как раз у ссылок.
Однако это лирическое отступление. Нам все же важно, понять принцип записи в файлы. Это может быть:
- Текстовая строка (для текстовых файлов).
- Структура данных разных типов (двоичные файлы).
Мы будем предполагать что транзакции это запись в файле второго типа (так как обычно это более компактно хранить).
Когда такие записи добавляют или считывают их представляют в текстовом структурированом виде - чаще всего в формате JSON.
Данные описываются в фигурных скобках, и содержат имя и значения полей структуры.
Почему именно транзакция
Такое название скорее всего происходит по двум причинам.
- В отличии от обычной записи - все транзакции в пределах одного блокчейна уникальны и атомарны (то есть их нельзя разделить на части иначе потеряется смысл).
- Они переносят определенную ценностную информацию и поэтому есть аналогия с банковскими или финансовыми транзакциями.
Да кстати о финансах. Токены по блокчейну передаются не совсем транзакциями. Транзакции служат некими цифровыми документами, которые заверяются цифровыми подписями. Сами токены передаются с помощью входов и выходов транзакции. Рассмотрим это подробнее.
Входы и выходы транзакций
Транзакции могут содержать любое число входов и выходов.
Допустим в нашем учебном варианте транзакция может выглядеть так:
{
"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 и т.п), в зависимости от типа у них разные поля, и даже они могут храниться в разных файлах на диске.
Однако принцип их работы такой.
Таким образом чтобы проверить баланс вашего кошелька, нужно взять последнюю транзакцию, точнее ее все входы (хэши транзакций) которые в качестве получателя токенов указали ваш открытый ключ и сложить переданные по ним токены, а затем сложить все токены на выходах и вычесть.
Однако для безопасного функционирования блокчейна одних транзакций и подписаных их хэшей недостаточно.
Мы также должны заставить работать сеть блокчейна синхронно. То есть не должна каждая нода заниматься в асвояси.
Иначе довольно быстро произойдет сбой и транзакции то начнут пропадать, то дублироваться.
Но даже не это самое страшное. Без блоков сеть не смогла бы подтвердить (или опровергнуть) транзакцию, как единственную уникальную. Может быть кто-то одновременно создаст и отправит точно такую-же (временная метка тут не поможет, она весьма относительна и также может быть подделана).
Так же существует еще несколько веских причин, связанных с самой сутью изобретения блокчейна. Ну об этом и конкретно о блоках, я расскажу в следующем уроке.