Глава 2
____________________________________
[ 46 ]
___________________________________
ECDSA (Elliptic Curve Digital Signature Algorithm, алгоритм цифровой подписи на
эллиптических кривых). Транзакция содержит указатель на получателя сообщения,
подпись отправителя, подтверждающую его личность и намерения, количество
эфира для передачи, максимальное количество вычислительных шагов, разрешен-
ных для выполнения транзакции (так называемый
лимит газа
), и стоимость, кото-
рую отправитель транзакции готов заплатить за каждый вычислительный шаг (так
называемая
цена газа
). Если назначение транзакции заключается в вызове метода
контракта, она также содержит входные данные, а если она предназначена для раз-
вертывания контракта, то может содержать код инициализации. Количество газа и
его цена называются
сбором за транзакцию
. Чтобы отправить эфир или выполнить
метод контракта, вам необходимо транслировать транзакцию в сеть. Отправитель
должен подписать транзакцию при помощи закрытого ключа.
Транзакция считается подтвержденной, если мы уверены, что она навсегда оста-
лась в блокчейне
1
. Рекомендуется подождать 15 подтвержденных блоков, преж-
де чем считать транзакцию подтвержденной.
Консенсус
Каждый узел в сети Ethereum хранит копию реестра транзакций. Мы должны быть
уверены, что узел не вмешался в блокчейн, и нам нужен механизм проверки досто-
верности блоков. А также, если мы столкнемся с двумя разными действительными
блокчейнами, у нас должен быть способ узнать, какой из них выбрать.
Ethereum использует протокол с доказательством выполнения работы, чтобы защи-
тить блокчейн от фальсификации. Принцип доказательства работы предусматрива-
ет при создании нового блока решение сложной вычислительной задачи. Решение
задачи должно требовать расходования значительных вычислительных ресурсов,
что делает создание нового блока трудной работой. Процесс создания нового блока
называется
майнингом
. Майнеры — это узлы сети, которые вырабатывают новые
блоки. Все децентрализованные приложения, которые используют доказательство
выполнения работы, не используют абсолютно одинаковый набор алгоритмов. Они
могут различаться в деталях относительно того, какую задачу должен решить май-
нер, насколько сложной должна быть задача, сколько времени занимает решение
и т. п. Мы будем рассматривать алгоритм доказательства работы применительно
к Ethereum.
Любой участник сети может стать майнером. Каждый майнер решает задачу инди-
видуально. Первый майнер, который решил задачу, становится победителем и по-
лучает пять эфиров и сборы от всех транзакций, вошедших в блок. Если ваш про-
цессор мощнее, чем у остальных узлов сети, это не означает, что вы всегда будете
1
Существует вероятность, что транзакция станет недействительной, если сеть придет к соглашению,
что недействительным является блок транзакций, уже помещенный в блокчейн. Отмена более 15 бло-
ков подряд технически невозможна по причине огромного объема вычислений.
Принципы работы Ethereum
____________________________________
[ 47 ]
___________________________________
победителем, потому что параметры задачи не одинаковые для всех майнеров. Од-
нако, если ваш процессор мощнее, у вас больше шансов на успех. Алгоритм дока-
зательства работы похож на лотерею, а вычислительная мощность процессора со-
ответствует количеству купленных лотерейных билетов. Безопасность сети зависит
не от количества майнеров, а от совокупной вычислительной мощности сети.
Не существует ограничения по количеству блоков в блокчейне и по количеству
эфира, который можно выработать. Как только майнер создал блок, он транслирует
его всем остальным узлам сети. Блок содержит заголовок и набор транзакций. Каж-
дый блок содержит хеш предыдущего блока, образуя неразрывную цепь.
Давайте разберемся, какую задачу должен решить майнер и как она решается в об-
щем виде. Чтобы создать блок, майнер первым делом собирает необработанные
(сырые) транзакции, которые выложены в сеть, проверяет их и отбрасывает некор-
ректные. Корректные транзакции должны быть правильно подписаны с использо-
ванием закрытого ключа, счет отправителя должен содержать достаточную сумму
на балансе, чтобы провести транзакцию, и т. д. Далее майнер создает блок, у кото-
рого есть заголовок и содержимое. Содержимое состоит из списка транзакций, ко-
торые включены в блок. Заголовок содержит такие объекты, как хеш предыдущего
блока, номер блока, одноразовое число (nonce
2
), целевое число (target), метку вре-
мени (timestamp), сложность (difficulty), адрес майнера и некоторые другие объек-
ты. Метка времени содержит время добавления блока. Nonce здесь — это ничего не
значащее число, которое майнер должен найти путем перебора, чтобы получить
решение задачи. Обычно задача заключается в том, чтобы найти такое число nonce,
при котором хеш готового блока меньше целевого числа или равен ему. Ethereum
использует алгоритм хеширования Ethash
3
(Ethereum hash). Единственный способ
решения задачи заключается в переборе всех возможных значений nonce. Целевое
число — это 256-битное число, которое вычисляется исходя из различных факто-
ров. Значение сложности в заголовке является другим представлением целевого
числа. Чем меньше целевое число, тем больше времени требуется для нахождения
подходящего значения nonce, и наоборот, чем больше целевое число, тем быстрее
находится nonce. Так выглядит формула для вычисления сложности задачи:
current_block_difficulty = previous_block_difficulty +
previous_block_difficulty / 2048 * max(1 - (current_block_timestamp -
previous_blocktimestamp) / 10, -99) + int(2 ** ((current_block_number /
100000) - 2))
Когда майнер решил задачу и подсоединил к блокчейну новый блок, любой узел
сети может проверить, является ли блокчейн правильным. Для этого он проверяет,
корректны ли транзакции блока, правильно ли указана метка времени, правильно
ли найдено число nonce относительно целевого числа target для всех блоков, пра-
вильно ли майнер указал величину своего вознаграждения и т. д.
2
Производное от «
n
umber used
on
ly on
ce
» — одноразовое число.
3
См.
https://github.com/ethereum/wiki/wiki/Ethash
.
Do'stlaringiz bilan baham: |