Ethereum — это децентрализованная платформа, которая позволяет нам создавать на ее основе децентрализованные приложения (DApps). Язык программирования Solidity используется для создания смарт-контрактов. Один или несколько смарт-контрактов используются для разработки DApps. Смарт-контракты — это программы, которые работают точно так, как они запрограммированы, без простоев, цензуры, мошенничества или вмешательства третьих лиц. Смарт-контракты на Ethereum могут быть написаны на разных языках, включая Solidity, LLL и Serpent. Наиболее широко используемый из этих языков — Solidity. Внутренняя валюта Ethereum называется Ether. Эфир нужен для развертывания смарт-контрактов и вызова их методов. У смарт-контракта, как и у любого другого DApp, может быть несколько экземпляров, каждый из которых распознается по уникальному адресу. Ethereum может храниться как в учетных записях пользователей, так и в смарт-контрактах.
Ethereum использует структуру данных блокчейна и консенсусный протокол доказательства работы. Метод смарт-контракта может быть вызван через транзакцию или через другой метод. В сети есть два типа узлов: обычные узлы и майнеры. Обычные узлы — это те, которые просто имеют копию блокчейна, тогда как майнеры строят блокчейн, добывая блоки.
Эфириум-счета
Чтобы создать учетную запись Ethereum, нам просто нужна пара асимметричных ключей. Существуют различные алгоритмы, такие как RSA, ECC и т. д., для создания асимметричных ключей шифрования. Ethereum использует криптографию на основе эллиптических кривых (ECC). ECC имеет различные параметры. Эти параметры используются для настройки скорости и безопасности. Ethereum использует параметр secp256k1. Чтобы углубиться в ECC и его параметры, потребуются математические знания, и нет необходимости глубоко разбираться в этом для создания DApps с использованием Ethereum.
Ethereum использует 256-битную технологию шифрования. 256-битное число — это закрытый/открытый ключ Ethereum. Поскольку компьютеры не могут обрабатывать такие большие числа, они кодируются как 64-битная шестнадцатеричная строка.
Каждая учетная запись представлена адресом. Когда у нас есть ключи, нам нужно сгенерировать адрес. Вот процедура для генерации адреса из открытого ключа:
- Сначала сгенерируйте хэш открытого ключа keccak-256. Это даст вам 256-битное число.
2. Отбросить первые 96 бит, то есть 12 байт. Теперь у вас должно быть 160 бит двоичных данных, то есть 20 байт.
3. Теперь закодируйте адрес в виде шестнадцатеричной строки. Итак, наконец, у вас будет байтовая строка из 40 символов, которая является адресом вашей учетной записи.
Теперь любой желающий может отправить эфир на этот адрес.
В Ethereum есть только один способ начать работу — через транзакцию. Транзакция в Ethereum — это криптографически подписанный пакет данных, который содержит сообщение, отправленное из внешней учетной записи. Рассмотрим подробнее объекты транзакций и сообщений.
Транзакции
Транзакция подписывается с использованием ECDSA (алгоритм цифровой подписи на эллиптических кривых), который представляет собой алгоритм цифровой подписи, основанный на ECC. По сути, в Ethereum можно найти три типа транзакций:
- Передача стоимости от одного субъекта к другому
- Создание смарт-контракта
- Вызов смарт-контракта
Транзакция состоит из атрибутов или полей, а именно:
- От:подписанный адрес отправляющей учетной записи. Он подписывается, чтобы доказать, что отправитель намеревался отправить транзакцию получателю.
- Кому — адрес назначения транзакции, он остается неопределенным для транзакции, создающей контракт.
- Стоимость — сумма стоимости, которая будет передана (всегда выражается в wei). Для транзакции, которая создает контракт, это поле обычно содержит пожертвование.
- Газ – иногда его называют полем "Начальный газ". Это количество топлива, используемого для транзакции, и представляет собой максимальное количество вычислительных шагов для транзакции. Любое неиспользованное топливо будет возвращено отправителю.
- Цена газа — цена газа для этой транзакции (указывается в wei). По умолчанию это цена топлива в основной сети и представляет собой комиссию, которую отправитель платит за каждый вычислительный шаг.
- Данные — можно опустить или определить как строку байтов, содержащую данные для сообщения. Для транзакции, которая создает контракт, это может содержать логику инициализации.
- Ононс — может использоваться для перезаписи ожидающих транзакций, использующих тот же одноразовый номер.
Как видите, первые три поля обязательны для любой финансовой операции, связанной с передачей стоимости. Поле данных имеет множество назначений в зависимости от типа транзакции — как мы уже упоминали, это может быть логика инициализации или данные. Все зависит от требований сделки.
Транзакция считается подтвержденной, если мы уверены, что она всегда будет отображаться в блокчейне. Рекомендуется дождаться 15 подтверждений, прежде чем считать транзакцию подтвержденной.
Консенсус
Каждый узел в сети Ethereum содержит копию блокчейна. Нам нужно убедиться, что узлы не могут вмешиваться в блокчейн, и нам также нужен механизм для проверки того, является ли блок действительным или нет. А также, если мы столкнемся с двумя разными допустимыми блокчейнами, нам нужно найти способ узнать, какой из них выбрать.
Чтобы защитить блок-цепочку от несанкционированного доступа, Ethereum использует протокол консенсуса Proof-of-Work. Чтобы построить новый блок в системе проверки работоспособности, вы должны решить сложную головоломку. Для решения головоломки требуется много вычислительной мощности, что затрудняет создание блоков. Майнинг — это процесс создания блоков в системе проверки работоспособности. Узлы в сети, которые добывают блоки, называются майнерами. Алгоритмы, используемые всеми DApps с доказательством работы, не одинаковы. Они могут различаться с точки зрения того, что должны решить майнеры, сложности головоломки, времени, необходимого для ее решения, и так далее. Мы узнаем о доказательстве работы в отношении Ethereum.
Давайте посмотрим, какую головоломку нужно решить майнерам и как она решается на высоком уровне. Чтобы добыть блок, сначала майнер собирает новые не добытые транзакции, переданные ему, а затем отфильтровывает недействительные транзакции. Чтобы транзакция была действительной, она должна быть правильно подписана с использованием закрытого ключа, на счете должно быть достаточно средств для совершения транзакции и т. д. Теперь майнер создает блок с заголовком и содержимым. Контент — это список транзакций, которые содержит блок. Заголовок содержит такие вещи, как хэш предыдущего блока, номер блока, одноразовый номер, цель, отметка времени, сложность, адрес майнера и так далее. Временная метка представляет время начала блока. Тогда nonce — это бессмысленное значение, которое корректируется для того, чтобы найти решение головоломки. Головоломка в основном состоит в том, чтобы найти такие значения nonce, с которыми при хешировании блока хэш меньше или равен целевому. Ethereum использует алгоритм хэширования ethash. Единственный способ найти одноразовый номер — перебрать все возможности. Целью является 256-битное число, которое рассчитывается на основе различных факторов. Значение сложности в заголовке — это другое представление цели, облегчающее работу с ней. Чем ниже цель, тем больше времени требуется для поиска одноразового номера, а чем выше цель, тем меньше времени требуется для поиска одноразового номера. Вот формула для расчета сложности головоломки:
текущая_сложность_блока = сложность_предыдущего_блока +
previous_block_difficulty // 2048 * max(1 — (current_block_timestamp -
previous_blocktimestamp) // 10, -99) + int(2 ** ((current_block_number //
100000) — 2))
Теперь любой узел в сети может проверить, действителен ли имеющийся у них блокчейн, сначала проверив, действительны ли транзакции в блокчейне, проверив метку времени, а затем действительны ли цель и одноразовый номер всех блоков, назначенных майнером. само действительное вознаграждение и так далее.
Если узел в сети получает два разных допустимых блокчейна, то блокчейн, совокупная сложность всех блоков которого выше, считается действительным блокчейном.
Теперь, например, если узел в сети изменяет некоторые транзакции в блоке, то этому узлу необходимо вычислить одноразовый номер всех последующих блоков. К тому времени, когда он повторно найдет одноразовые номера последующих блоков, сеть добудет гораздо больше блоков и, следовательно, отклонит этот блокчейн, поскольку его совокупная сложность будет ниже.
Временная метка
Текущая временная метка требуется в формуле для вычисления цели блока, и каждый блок имеет текущую временную метку, прикрепленную к его заголовку. Ничто не мешает майнеру использовать временную метку, отличную от текущей, при добыче нового блока, но обычно они этого не делают, потому что проверка временной метки завершится ошибкой, а другие узлы отклонят блок, тратя впустую ресурсы майнера. Когда майнер транслирует только что добытый блок, временная метка проверяется, если она больше, чем временная метка предыдущего блока. Если майнер использует отметку времени, превышающую текущую отметку времени, сложность будет низкой, поскольку сложность обратно пропорциональна текущей отметке времени. Таким образом, майнер, чья временная метка блока является текущей временной меткой, будет принят сетью, поскольку у него будет более высокая сложность. Если майнер использует временную метку, большую, чем временная метка предыдущего блока, и меньшую, чем текущая временная метка, сложность будет выше, и, следовательно, для добычи блока потребуется больше времени. К тому времени, когда блок будет добыт, сеть произведет больше блоков. Следовательно, этот блок будет отклонен, поскольку блокчейн злоумышленника-майнера будет иметь меньшую сложность, чем блокчейн сети. По этим причинам майнеры всегда используют точные временные метки, иначе они ничего не получат.
Одноразовый
Nonce — это 64-битное целое число без знака. Nonce — это решение головоломки. Значение nonce увеличивается майнером до тех пор, пока не будет найдено решение. Теперь вы, вероятно, задаетесь вопросом, всегда ли майнер с более высокой хеш-мощностью, чем любой другой майнер в сети, найдет одноразовый номер первым. Конечно, нет.
Хэш блока, который добывают майнеры, отличается для каждого майнера, потому что хэш зависит от таких вещей, как метка времени, адрес майнера и т. д., и маловероятно, что он будет одинаковым для всех майнеров. Следовательно, это не гонка за решением головоломки; скорее, это лотерейная система. Но, конечно, майнеру может повезти в зависимости от его хеш-мощности, но это не значит, что майнер всегда найдет следующий блок.
Разветвление
Когда между узлами возникает конфликт по поводу действительности блокчейна, происходит форк. Это происходит, когда в сети есть несколько блокчейнов, каждый из которых действителен для некоторых майнеров. Существует три вида форков: обычные форки, софтфорки и хардфорки.
Обычный форк — это временный конфликт, возникающий, когда два или более майнеров находят один и тот же блок практически одновременно. Когда у одного из них больше трудностей, чем у другого, проблема решена.
Изменение исходного кода может вызвать конфликты. В зависимости от типа конфликта, обновление может потребоваться для майнеров с более чем 50% хэш-мощностью или для всех майнеров. Мягкая вилка происходит, когда майнерам с более чем 50% хеш-мощности требуется обновиться, чтобы разрешить конфликт, а хардфорк происходит, когда все майнеры должны обновиться, чтобы разрешить конфликт. Примером софт-форка может быть, если обновление исходного кода делает недействительным подмножество старых блоков/транзакций, тогда это может быть решено, когда майнеры с более чем 50% хеш-мощности обновятся, так что новый блокчейн будет иметь больше трудности и, наконец, получить признание всей сети. Примером хард-форка может быть следующее: если обновление исходного кода должно изменить вознаграждение для майнеров, то всем майнерам нужно будет обновиться, чтобы разрешить конфликт.
С момента своего выпуска Ethereum прошел через ряд хард-форков и софт-форков.
Генезисный блок
Генезисный блок — это первый блок блокчейна. Ему присвоен номер блока 0. Это единственный блок в блокчейне, который не ссылается на предыдущий блок, потому что его нет. Мало того, он не проводит никаких транзакций, потому что эфир еще не произведен.
Два узла в сети будут соединяться только в том случае, если они оба имеют один и тот же блок генезиса, а это означает, что синхронизация блоков произойдет только в том случае, если оба узла имеют один и тот же блок генезиса; в противном случае они оба отвергнут друг друга. Генетический блок высокой сложности не может быть заменен блоком более низкой сложности. Каждый узел отвечает за создание своего собственного блока генезиса. Генезисный блок жестко запрограммирован в клиенте для различных сетей.
Номинал эфира
Эфир имеет различные номиналы, как и любая другая валюта. Вот номиналы:
- 1 Эфир = 10000000000000000000 Вэй
- 1 Эфир = 10000000000000000 Квей
- 1 Эфир = 1000000000000 Мвэй
- 1 Эфир = 1000000000 Гвей
- 1 Эфир = 1000000 Сабо
- 1 эфир = 1000 финни
- 1 Эфир = 0,001 Кетер
- 1 Эфир = 0,000001 Метер
- 1 Эфир = 0,000000001 Гетер
- 1 Эфир = 0,000000000001 Тетер
Виртуальная машина Ethereum
EVM (или виртуальная машина Ethereum) — это среда выполнения байт-кода смарт-контрактов Ethereum. На каждом узле в сети работает EVM. Все узлы выполняют все транзакции, которые указывают на смарт-контракты, используя EVM, поэтому каждый узел выполняет одни и те же вычисления и хранит одни и те же значения. Транзакции, которые только передают эфир, также требуют некоторых вычислений, то есть узнать, есть ли на адресе баланс или нет, и соответственно вычесть баланс.
Сетевое топливо (газ)
Для выполнения транзакций на счете, с которого отправляются транзакции, должно быть достаточно топлива (Ether). Клиент Ethereum, который выполняет транзакцию от имени отправителя и фиксирует результат в блокчейне Ethereum, требует, чтобы Ether оплачивал стоимость выполнения.
Интересно, что атрибуты Gas и Gas Price в транзакции являются важными компонентами схемы предотвращения отказа в обслуживании (DoS) в сети Ethereum. Чтобы предотвратить бесконечные циклы или вычислительные потери (преднамеренные или нет), каждая транзакция должна устанавливать ограничение на количество вычислительных шагов, необходимых для завершения транзакции. Единица вычислений в Ethereum известна как «газ», и каждая операция имеет связанную с ней стоимость газа, которая меняется в зависимости от того, насколько интенсивны вычисления.
Для некоторых операций требуется больше газа просто потому, что они требуют большей вычислительной мощности. В дополнение к плате за вычислительную мощность взимается плата в размере 5 газов за каждый байт данных транзакции. Как указывалось ранее, структура оплаты в этой модели предназначена для обеспечения того, чтобы отправители платили пропорционально за каждый используемый ресурс, будь то вычисления, пропускная способность или хранилище. В результате понятно, что контракты и сообщения, использующие много ресурсов, должны иметь пропорционально высокую плату за газ.
Сообщения
Контракт Ethereum может отправить сообщение другому контракту Ethereum (он может сделать это несколько раз). Поле данных транзакции, инициированной внешней учетной записью, может содержать значения, которые будут использоваться в сообщении.
Стоимость кода операции (инструкции) Эфириума
Сообщение — это виртуальный объект в Ethereum, который никогда не сериализуется и живет только в среде выполнения. Он состоит из следующих разделов:
- Отправитель — отправитель сообщения (неявно).
- Получатель — получатель сообщения.
- Сумма — количество эфира, которое будет передано вместе с сообщением.
- Данные (необязательно) — необязательное поле данных.
- Стартовый газ — значение A
Как видите, сообщение и транзакция очень похожи. Разница в том, что он создается контрактом, а не внешним актором (хотя он может быть вызван им). Когда код контракта выполняется и вызывает функцию CALLopcode, создается и выполняется сообщение. Сообщение передается на учетную запись получателя, которая запускает свой код, аналогично транзакции. Как видите, контракты взаимодействуют друг с другом так же, как и учетные записи внешних субъектов. Важно отметить, что квота газа, указанная в контракте или транзакции, является основной суммой для транзакции и любых и всех зависимых исполнений. Так, например, если учетная запись A отправляет (фиксирует) транзакцию на учетную запись B со 100 газами, B выполняет операции, которые потребляют 70 единиц газа, а затем отправляет сообщение C. Затем C выполняет операции, которые потребляют 25 единиц газа перед возвратом. Затем B может использовать еще 5 газов, прежде чем закончится топливо (исключение «Нет газа»).
Блок Эфириума
Блок в Эфириуме представляет собой набор соответствующих частей информации (известной как заголовок блока), H, вместе с информацией, соответствующей включенным транзакциям, T, и набору других заголовков блоков, U, которые, как известно, имеют родителя. равен родителю текущего блока (такие блоки известны как ommers2).
Ниже приведены поля, существующие в заголовке блока:
- parentHash — 256-битный хэш Keccak заголовка родительского блока целиком; формально лс.
- ommersHash — 256-битный хэш Keccak части списка оммеров этого блока; формально Хо.
- бенефициар — 160-битный адрес, на который переводятся все сборы, полученные от успешного майнинга этого блока; формально Hc.
- stateRoot – 256-битный хэш Keccak корневого узла дерева состояний (дерево Merkle Patricia или radix-дерево) после выполнения всех транзакций и применения финализации; формально Хр.
- transactionsRoot — 256-битный хэш Keccak корневого узла треугольной структуры, заполняемый каждой транзакцией в части списка транзакций блока; формально Хт.
- receiptsRoot — 256-битный хэш Keccak корневого узла треугольной структуры, заполненный квитанциями каждой транзакции в части списка транзакций блока; формально Он.
- logsBloom — фильтр Блума, состоящий из индексируемой информации (адрес регистратора и темы журнала), содержащейся в каждой записи журнала с момента получения каждой транзакции в списке транзакций; формально Hb.
- сложность — скалярное значение, соответствующее уровню сложности этого блока. Это можно рассчитать по уровню сложности предыдущего блока и метке времени; формально Хд.
- число — скалярное значение, равное количеству блоков-предков. Генезисный блок имеет нулевой номер; официально привет.
- gasLimit — скалярная величина, равная текущему лимиту расхода газа на блок; формально гл.
- gasUsed — скалярное значение, равное общему количеству газа, использованного в транзакциях в этом блоке; формально рт.
- timestamp — скалярное значение, равное разумному выходу Unix time() в начале этого блока; формально Hs.
- extraData — произвольный массив байтов, содержащий данные, относящиеся к этому блоку. Это должно быть 32 байта или меньше; формально Hx.
- mixHash — 256-битный хеш, который в сочетании с одноразовым номером доказывает, что в этом блоке было выполнено достаточное количество вычислений; формально Хм.
- nonce — 64-битный хэш, который в сочетании с хэшем-микшером доказывает, что в этом блоке было выполнено достаточное количество вычислений; формально Hn.
Два других компонента в блоке — это просто список заголовков блока (того же формата, что и выше) и последовательность транзакций.
Обнаружение коллег
Чтобы узел был частью сети, ему необходимо подключиться к некоторым другим узлам в сети, чтобы он мог транслировать транзакции/блоки и прослушивать новые транзакции/блоки. Узлу не нужно подключаться к каждому узлу в сети; вместо этого узел соединяется с несколькими другими узлами. И эти узлы соединяются с несколькими другими узлами. Таким образом, вся сеть связана друг с другом.
Но поскольку нет центрального сервера, к которому все узлы могут подключаться для обмена информацией, как узел может найти другие узлы в сети? Чтобы решить эту проблему, Ethereum разработал собственный протокол обнаружения узлов, основанный на протоколе Kadelima. Узлы начальной загрузки — это особый тип узла в протоколе обнаружения узлов. Узлы начальной загрузки отслеживают все узлы, которые к ним подключены с течением времени. У них нет доступа к блокчейну. Пиры подключаются к сети Ethereum через узлы Bootstrap, которые совместно используют списки пиров, которые подключались к ним за последний предопределенный период времени. Затем подключающиеся одноранговые узлы подключаются и синхронизируются с одноранговыми узлами.
Могут быть разные экземпляры Ethereum, то есть разные сети, каждая из которых имеет свой сетевой идентификатор. Две основные сети Ethereum — это основная сеть и тестовая сеть. Основная сеть — это та, чей эфир торгуется на биржах, тогда как тестовая сеть используется разработчиками для тестирования. До сих пор мы узнали все, что касается блокчейна основной сети.
Самой популярной реализацией узла Ethereum Bootstrap является Bootnode. Bootnode – это служба, позволяющая размещать собственный узел Bootstrap.
Шепот и рой
Whisper и Swarm — это децентрализованный протокол связи и децентрализованная платформа хранения соответственно, разрабатываемые разработчиками Ethereum. Whisper — это децентрализованный протокол связи, тогда как Swarm — это децентрализованная файловая система. Whisper позволяет узлам в сети общаться друг с другом. Он поддерживает широковещательную передачу, обмен сообщениями между пользователями, зашифрованные сообщения и т. д. Он не предназначен для передачи больших объемов данных.
Получить
Geth (также известный как go-ethereum) — это реализация узла Ethereum, Whisper и Swarm. Гет может быть частью всего этого или только некоторых из них. Причина их объединения заключается в том, чтобы они выглядели как одно DApp и позволяли клиентам получать доступ ко всем трем DApp из одного узла.
Geth — это приложение с интерфейсом командной строки (CLI). Программное обеспечение написано на языке программирования Go. Он совместим со всеми основными операционными системами. Текущая версия Geth еще не поддерживает Swarm, хотя поддерживает некоторые возможности Whisper.
Кошелек Ethereum
Ethereum Wallet — это пользовательский интерфейс для Ethereum, который позволяет вам создавать учетную запись, отправлять эфир, развертывать контракты, вызывать методы контрактов и многое другое.
Geth входит в состав кошелька Ethereum. Когда вы запускаете Ethereum, он ищет локальный экземпляр geth и подключается к нему, а если не может его найти, запускает собственный узел geth. IPC используется кошельком Ethereum для связи с geth. Файловый IPC поддерживается Geth.
Разделение
В настоящее время каждому узлу необходимо загружать все транзакции, что огромно. С той скоростью, с которой размер блокчейна увеличивается, в ближайшие несколько лет будет очень сложно загрузить весь блокчейн и синхронизировать его.
Вы должны быть знакомы с шардингом, если знакомы с архитектурой распределенной базы данных. Если нет, шардинг — это стратегия распределения данных, использующая несколько компьютеров. Чтобы разделить и распределить блокчейн между узлами, Ethereum реализует шардинг.
Узнать больше о шардинге блокчейна можно здесь