Доброго дня/ночи/луны мои будующие писатели супер-пупур-смарт-контрактов.
Web2 очень интересная и высокотехнологичная отрасль нашего любимого интернета, но пора бы уже и нажать кнопку UPGRADE и начать свое обучение в web3, чего мне так советовали коллеги еще тогда как я начал переводить статьи для форума.
Начнем, конечно, с самого-самого начала. В этой статье Вы вряд ли найдете что-то новое, потому что тут я опишу самые простые вещи, касаемые смартов, блокчейна и Ethereum'а.
Блокчейн, с чем его едят и почему не стоит запивать водкой
Блокчейн (Blockchain, Block Chain) представляет собой цепочку блоков данных, связанных друг с другом определенным образом. В начале цепочки находится первый блок, который
называется первичным блоком (genesis block) или блоком генезиса. За ним следует второй, потом третий и так далее. Все эти блоки данных автоматически дублируются на многочисленных узлах сети блокчейна. Таким образом обеспечивается децентрализованное хранение данных блокчейна. Вы можете представить себе систему блокчейна как большое количество узлов (физических или виртуальных серверов), объединенных в сеть и реплицирующих все изменения в цепочке блоков данных. Это как бы гигантский мультисерверный компьютер, причем узлы такого компьютера (серверы) могут быть разбросаны по всему миру. И вы тоже можете добавить свой компьютер в сеть блокчейна.
Блокчейн можно представить себе как распределенную базу данных, реплицируемую на все узлы сети блокчейна. В теории блокчейн будет работоспособен до тех пор, пока работает
хотя бы один узел, хранящий все блоки блокчейна. Блокчейн можно представить себе как распределенный реестр данных и операций (транзакций). Еще одно название такого реестра – гроссбух. В распределенный реестр можно добавлять данные, но невозможно их изменять или удалять. Такая невозможность достигается, в частности, применением криптографических алгоритмов, специальных алгоритмов добавления блоков в цепочку и децентрализованным хранением данных. При добавлении блоков и выполнении операций (транзакций) используются приватные и публичные ключи. Они ограничивают пользователей блокчейна, предоставляя им доступ только к своим блокам данных.
Блокчейн хранит информацию об операциях (транзакциях) в блоках. При этом старые, уже выполненные транзакции невозможно откатить или изменить. Новые транзакции хранятся
в новых, добавленных блоках. Таким образом в блокчейне может быть записана в неизменном виде вся история транзакций. Поэтому блокчейн может быть использован, например, для надежного хранения банковских операций, сведений об авторском праве, истории изменений владельцев объектов недвижимости и т.п.
Блокчейн Ethereum содержит так называемые состояния системы. По мере выполнения транзакций состояние изменяется от начального до текущего. Транзакции записываются в
блоки.
Тут нужно отметить, что все сказанное верно только для так называемых публичных сетей блокчейн, которые не могут контролироваться никакими отдельными физическими или юри-
дическими лицами, государственными органами или правительствами. Так называемые приватные сети блокчейн находятся под полным контролем их создатлей, и там возможно все, например, полная замена всех блоков цепочки.
Для чего может пригодиться блокчейн?
Если кратко, блокчейн позволяет безопасным образом проводить операции (сделки) между не доверяющими друг другу персонами или компаниями. Записанные в блокчейн данные (транзакции, персональные данные, документы, свидетельства, договоры, накладные и т.п.) невозможно подделать или заменить после записи. Поэтому на базе блокчейна можно
создавать, например, доверенные распределенные реестры различного рода документов. Конечно, вы знаете, что на базе блокчейнов создаются криптовалютные системы, при-
званные заменить обычные бумажные деньги. Бумажные деньги еще называют фиатными (от Fiat Money).
Так называемые смарт-контракты, представляющие собой программное обеспечение, работающее в сети Ethereum, позволяют автоматизировать процесс заключения сделок и кон-
троль их выполнения. Особенно это эффективно, если оплата по сделке проводится криптовалютой Ether (эфир). Блокчейн Ethereum и смарт-контракты Ethereum, написанные на языке программирования Solidity, могут использоваться, например, в таких областях:
Есть проблемы с верификацией данных перед их добавлением в блокчейн (например, не поддельные ли они?), проблемы в безопасности системного и прикладного ПО, применяемого для работы с блокчейном, проблемы с возможностью использования методов социальной инженерии для похищения доступа к кошелькам с криптовалютой и т.п.
Опять же, если речь идет не о публичном блокчейне, узлы которого разбросаны по всему миру, а о приватном блокчейне, принадлежащем персоне или организации, то уровень доверия
здесь будет не выше, чем уровень доверия к этой персоне или этой организации. Также следует учитывать, что данные, записанные в блокчейн, становятся доступны для всех. В этом смысле блокчейн (особенно публичный) не подходит для хранения конфиденциальной информации. Однако тот факт, что информацию в блокчейне невозможно изменить,
может помочь предотвратить или расследовать различного рода мошеннические действия. Децентрализованные приложения Ethereum будут удобны, если платить за их использование криптовалютой. Чем больше людей, владеющих криптовалютой или готовых ее приобрести, тем большую популярность получат приложения DApp и смарт-контракты.
Среди общих проблем блокчейна, затрудняющих его практическое применение, можно упомянуть ограниченную скорость добавления новых блоков и относительно высокую стоимость транзакций. Но технологии в этой области активно развиваются, и есть надежды, что технические проблемы со временем будут решены.
Еще одна проблема заключается в том, что смарт-контракты блокчейна Ethereum работают в изолированной среде виртуальных машин / EVM / и не имеют доступа к данным реального мира. В частности, программа смарт-контракта не может сама прочитать данные с сайтов или каких-либо физических устройств (датчики, контакты и т.п.), а также не может вывести данные на какие-либо внешние устройства. Эту проблему и способы ее решения мы будем обсуждать когда дойдем до так называемых Оракулов – информационных посредников смарт-контрактов.
Также есть ограничения в области законодательства. В некоторых странах, например, запрещается использовать криптовалюту как платежное средство, но можно владеть ей как
неким цифровым активом, наподобие ценных бумаг. Такие активы можно покупать и продавать на бирже. В любом случае, при создании проекта, работающего с криптовалютами, необходимо ознакомиться с законодательством той страны, под юрисдикцию которой попадает ваш проект.
Блокчейн Эфириум является, по сути, системой состояния транзакций. В информатике такое понятие, как «система состояний» или «машина состояний» – это система, которая обрабатывает вводимую информацию и на основании последней преобразуется в новое состояние. В машине состояний Эфириума все процессы начинаются с «первоначального состояния». Такое состояние представляет собой аналог нулевого состояния, в котором находится машина до того момента, как в ее сети начнут происходить какие-либо действия, связанные с транзакциями. Когда такие действия начнут происходить, первоначальное состояние заменяется на конечное, при этом в любой момент времени конечное состояние отображает текущее состояние Эфириума.
Состояние Эфириума имеет миллионы транзакций. Эти транзакции сгруппированы в «блоки». Блок содержит ряд транзакций, при этом каждый последующий блок соединен с предыдущим, благодаря чему обеспечивается своеобразная цепочка блоков.
Блокчейн Ethereum представляет собой платформу, на базе которой можно создавать распределенные приложения DApp. В отличие от других платформ, Ethereum позволяет использовать так называемые умные контракты (смарт-контракты, smart contracts), написанные на языке программирования Solidity. Эта платформа была создана в 2013 году Виталиком Бутериным.
А как-же это всё произошло.
Блок генезиса создается с использованием файла состояния генезиса или genesis.json в Geth / Ethereum на Go /. Этот файл содержит все данные, которые потребуются для генерации блока 0, в том числе, кто начинает с каким количеством эфира. Вот пример пользовательского файла состояния генезиса, который инициализирует этот блок.
Каждый блокчейн должен где-то начинаться, поэтому в начале есть то, что называется блоком генезиса . Это первый блок, и в нем создатели Ethereum могли сказать: «Для начала на всех следующих аккаунтах есть X единиц моей криптовалюты». Любая передача этого эфира в блокчейне будет происходить с одной из этих первоначальных учетных записей (или с майнинга).
Каждый раз, когда мы запускаем Ethereum, мы фактически воссоздаем этот блок генезиса с нуля. Синхронизация блокчейна с пирами начинается только с блока 1.
Если вы сочтете этот пост полезным, не забудьте подписаться на мой Twitter , где я публикую больше контента и руководств по Etheruem.
// genesis.json
{
"alloc": {
"0xca843569e3427144cead5e4d5999a3d0ccf92b8e": {
"balance": "1000000000000000000000000000"
},
"0x0fbdc686b912d7722dc86510934589e0aaf3b55a": {
"balance": "1000000000000000000000000000"
}
},
"config": {
"chainID": 68,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"nonce": "0x0000000000000000",
"difficulty": "0x0400",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x43a3dfdb4j343b428c638c19837004b5ed33adb3db69cbdb7a38e1e50b1b82fa",
"gasLimit": "0xffffffff"
}
Давайте разберем некоторые поля в файле состояния генезиса.
Структура конфигурации в genesis.json связана с настройкой переменных конфигурации для Ethereum и не имеет ничего общего с тем, что находится внутри блока генезиса. Однако эти значения важны, потому что они также должны соответствовать информации о конфигурации любого другого узла, с которым вы хотите взаимодействовать.
Есть три важных момента которые мы рассмотрим при изучении конфигурации.
Это сделано так, чтобы было понятно в какой цепи вы находитесь: если chainID = 1 - означает что вы хотите принять участие в чейто цепочке сети Ethereum, а не начать свою
СhainID впервые был представлен в EIP155 (очень скоро мы разберемся что такое EIP). Цель его добавления заключалась в том, чтобы транзакции в сети Ethereum выглядели иначе, чем в классической сети Ethereum. Транзакции подписываются по-разному в зависимости от chainID - значения.
Далее рассмотрим конфиг GEth
Конфигурация: HomesteadBlock
значение 0 указывает на использование релиза Ethereum Homestead. Это второй из основных релизов Ethereum — а недавно, 16 октября 2017 года, Ethereum форкнулся на релиз Byzantium.
Конфигурация: DAOForkBlock
Номер блока, в котором происходит форк децентрализованной автономной организации (DAO).
Немного предыстории: В 2016 году DAO создала чрезвычайно успешный смарт-контракт для финансирования dApps и предоставления вкладчикам своего рода доли в этих dApps посредством токенов DAO. Этот контракт был новой идеей, которая позволила собрать беспрецедентное количество эфира.
К несчастью, злоумышленник обнаружил вектор атаки, который позволял многократно выводить эфир из контракта в обмен на одни и те же токены DAO. Миллионы были украдены.
В конечном итоге большинство пользователей Ethereum проголосовали за создание жесткого форка в блокчейне, который бы аннулировал действия злоумышленников, и контракт был бы обновлен. Это было спорное решение, поскольку фракция противников форка (по праву) заявила, что оно создает опасный прецедент на будущее: если большинству пользователей не понравится какой-то конкретный результат, теперь есть прецедент для его отмены.
Поскольку большинство проголосовало за продолжение форка, родилась переменная DAOForkBlock, которая появилась на 1920000-м блоке в основной сети. Вот определение переменной в Geth:
Таким образом, любой блок, добытый после этого, должен будет следовать протоколам, установленным этим новым форком, и в противном случае будет отклонен. Если бы мы создавали локальную цепочку Ethereum для тестирования, мы могли бы установить это значение равным 0, чтобы получить наиболее современное поведение транзакций с самого начала, а не использовать устаревший протокол для первых 1919999 блоков.
Конфигурация: EIP150Block
EIP означает предложение по улучшению Ethereum . Ethereum имеет открытый исходный код, поэтому люди делают предложения в форме обсуждений и кода. Одни принимаются, другие отвергаются. EIP150 — одно из таких предложений, которое было принято. Этот EIP вступил в силу на блоке №2463000 и в основном был связан с повышением цен на газ в ответ на проблемы с отказом в обслуживании.
Конфигурация: EIP158Block
EIP158 был принят, чтобы изменить то, как клиенты Ethereum работают с пустыми учетными записями. Этот новый протокол начал рассматривать их как несуществующие, экономя место в блокчейне.
Конфигурация: Ethash
Просто сообщает клиенту, что мы используем Ethash, алгоритм Ethereum Proof of Work, для майнинга блоков.
Наконец-то мы закончили рассматривать переменные конфигурации. Продоллжим изучать остальную часть genesis.json.
alloc
Это поле определяет, кто и сколько эфиров получит в начале работы блокчейна. В основной сети Ethereum первым так сказать повезло - им перепало немного эфира на халяву и теперь, каждый раз, когда мы запускаем Ethereum в основной сети, мы воссоздаем этот первый блок и все те начальные транзакции этих людей.
Вот некоторые из адресов в разделе alloc файла состояния генезиса сети mainnet:
difficulty
Это значение определяет, насколько сложно добыть блок. Разные технологии блокчейна используют разные алгоритмы майнинга - на момент написания этой статьи (а ей 4 года) в сети Ethereum все еще используется Proof of Work. Сложность можно интерпретировать через ее обратную величину; другими словами, если значение равно 0x0400, это означает, что вероятность успеха вашей первой попытки добычи блока составляет 1/1024. Получаем это значение, потому что 0x0400 в шестнадцатеричной системе равно 1024 в десятичной. Обратная величина 1024, очевидно, равна 1/1024, что означает, что в среднем вы можете рассчитывать на успешную добычу после 1024 вычислений хэша. Скорость добычи блока зависит от того, насколько быстро ваш компьютер может произвести в среднем 1024 хэш-вычислений. Считайте это значение "стартовым" для определения сложности добычи любого блока в цепи. Не каждый блок будет иметь такую сложность; вместо этого это значение передается в клиент Ethereum, чтобы алгоритмически определить сложность для последующего блока. Сложность добычи блока меняется по мере роста блокчейна.
mixhash, nonce
mixhash и nonce используются вместе, чтобы определить, был ли блок добыт правильно. Если злоумышленник подделывает блоки с фальшивым nonce, то для других узлов сети может потребоваться много вычислений, чтобы обнаружить, что nonce был подделан. mixhash - это промежуточный расчет для нахождения nonce, который не так затратен для определения. Таким образом, если другие узлы сети обнаруживают ошибочный mixhash при проверке блока, они могут отбросить блок без дополнительной работы по проверке nonce.
В блоке genesis эти значения не имеют смысла, но сделать их случайными - хорошая идея, чтобы другие пиры случайно не подключились к вашей цепи, имея такой же точно файл genesis.json.
parentHash
256-битный хэш Keccak заголовка предыдущего блока. В блоке genesis это значение не имеет смысла, так как у блока 0 нет родителя. Однако целью создания блока genesis было сделать его формат таким же, как у любого другого блока, поэтому у нас есть это поле и мы присваиваем ему значение.
gasLimit
Максимальное количество вычислений, которое может поддерживать любой блок на данной цепочке.
coinbase
Вознаграждения в эфире, полученные за "добычу" блока genesis, отправляются на 160-битный адрес coinbase. В блоке genesis это бессмысленно (тем более что вы вольны распределять столько эфира, сколько хотите, на любой счет), но, опять же, целью было сделать блок genesis идентичным любому другому блоку на блокчейне, поэтому эти значения существуют.
Собственно так вот выглядит конфиг 1 блока, а дальше пора майнить)
Майнинг, или Как создаются блоки
Майнинг (mining) представляет собой довольно сложный и ресурсоемкий процесс добавления новых блоков в цепочку блокчейна, а вовсе не «добычу криптовалют». Майнинг обеспечивает работоспособность блокчейна, т.к. именно этот процесс отвечает за добавление транзакций в блокчейн Ethereum. Люди и организации, занимающиеся добавлением блоков, называются майнерами (miner). Программное обеспечение (ПО), работающее на узлах майнеров, пытается подобрать для
последнего блока параметр хеширования с названием Nonce, чтобы получилось определенное значение хеш-функции, заданной сетью. Алгоритм хеширования Ethash, применяемый в
Ethereum, позволяет получить значение Nonce только путем последовательного перебора.
Если узел майнера нашел правильное значение Nonce, то это является так называемым доказательством работы (PoW, Proof-of-work). В этом случае, если блок будет добавлен в сеть
Ethereum, майнер получает определенное вознаграждение в валюте сети – Ether. Таким образом, майнеры Ethereum обеспечивают работу сети, добавляя блоки, и получают за это криптовалютные деньги. В интернете вы найдете массу информации о майнерах и майнинге, а мы сосредоточимся на создании контрактов Solidity и децентрализованных приложений DApp в сети Ethereum.
Для начала думаю пойдет. Продолжение полюбому
Web2 очень интересная и высокотехнологичная отрасль нашего любимого интернета, но пора бы уже и нажать кнопку UPGRADE и начать свое обучение в web3, чего мне так советовали коллеги еще тогда как я начал переводить статьи для форума.
Начнем, конечно, с самого-самого начала. В этой статье Вы вряд ли найдете что-то новое, потому что тут я опишу самые простые вещи, касаемые смартов, блокчейна и Ethereum'а.
Блокчейн, с чем его едят и почему не стоит запивать водкой
Блокчейн (Blockchain, Block Chain) представляет собой цепочку блоков данных, связанных друг с другом определенным образом. В начале цепочки находится первый блок, который
называется первичным блоком (genesis block) или блоком генезиса. За ним следует второй, потом третий и так далее. Все эти блоки данных автоматически дублируются на многочисленных узлах сети блокчейна. Таким образом обеспечивается децентрализованное хранение данных блокчейна. Вы можете представить себе систему блокчейна как большое количество узлов (физических или виртуальных серверов), объединенных в сеть и реплицирующих все изменения в цепочке блоков данных. Это как бы гигантский мультисерверный компьютер, причем узлы такого компьютера (серверы) могут быть разбросаны по всему миру. И вы тоже можете добавить свой компьютер в сеть блокчейна.
Блокчейн можно представить себе как распределенную базу данных, реплицируемую на все узлы сети блокчейна. В теории блокчейн будет работоспособен до тех пор, пока работает
хотя бы один узел, хранящий все блоки блокчейна. Блокчейн можно представить себе как распределенный реестр данных и операций (транзакций). Еще одно название такого реестра – гроссбух. В распределенный реестр можно добавлять данные, но невозможно их изменять или удалять. Такая невозможность достигается, в частности, применением криптографических алгоритмов, специальных алгоритмов добавления блоков в цепочку и децентрализованным хранением данных. При добавлении блоков и выполнении операций (транзакций) используются приватные и публичные ключи. Они ограничивают пользователей блокчейна, предоставляя им доступ только к своим блокам данных.
Блокчейн хранит информацию об операциях (транзакциях) в блоках. При этом старые, уже выполненные транзакции невозможно откатить или изменить. Новые транзакции хранятся
в новых, добавленных блоках. Таким образом в блокчейне может быть записана в неизменном виде вся история транзакций. Поэтому блокчейн может быть использован, например, для надежного хранения банковских операций, сведений об авторском праве, истории изменений владельцев объектов недвижимости и т.п.
Блокчейн Ethereum содержит так называемые состояния системы. По мере выполнения транзакций состояние изменяется от начального до текущего. Транзакции записываются в
блоки.
Тут нужно отметить, что все сказанное верно только для так называемых публичных сетей блокчейн, которые не могут контролироваться никакими отдельными физическими или юри-
дическими лицами, государственными органами или правительствами. Так называемые приватные сети блокчейн находятся под полным контролем их создатлей, и там возможно все, например, полная замена всех блоков цепочки.
Для чего может пригодиться блокчейн?
Если кратко, блокчейн позволяет безопасным образом проводить операции (сделки) между не доверяющими друг другу персонами или компаниями. Записанные в блокчейн данные (транзакции, персональные данные, документы, свидетельства, договоры, накладные и т.п.) невозможно подделать или заменить после записи. Поэтому на базе блокчейна можно
создавать, например, доверенные распределенные реестры различного рода документов. Конечно, вы знаете, что на базе блокчейнов создаются криптовалютные системы, при-
званные заменить обычные бумажные деньги. Бумажные деньги еще называют фиатными (от Fiat Money).
Так называемые смарт-контракты, представляющие собой программное обеспечение, работающее в сети Ethereum, позволяют автоматизировать процесс заключения сделок и кон-
троль их выполнения. Особенно это эффективно, если оплата по сделке проводится криптовалютой Ether (эфир). Блокчейн Ethereum и смарт-контракты Ethereum, написанные на языке программирования Solidity, могут использоваться, например, в таких областях:
- альтернатива нотариальному заверению документов;
- хранение реестра объектов недвижимости и сведений об операциях с объектами недвижимости;
- хранение сведений об авторских правах на объекты интеллектуальной собственности (книги, изображения, музыкальные произведения и т.п.);
- создание систем независимого голосования;
- сфера финансов и банковская деятельность;
- логистика в международных масштабах, отслеживание перемещения грузов;
- хранение персональных данных как аналог системе удостоверений личности;
- безопасные сделки в коммерческой области;
- хранение результатов медицинских обследований, а также истории назначенных процедур.
Есть проблемы с верификацией данных перед их добавлением в блокчейн (например, не поддельные ли они?), проблемы в безопасности системного и прикладного ПО, применяемого для работы с блокчейном, проблемы с возможностью использования методов социальной инженерии для похищения доступа к кошелькам с криптовалютой и т.п.
Опять же, если речь идет не о публичном блокчейне, узлы которого разбросаны по всему миру, а о приватном блокчейне, принадлежащем персоне или организации, то уровень доверия
здесь будет не выше, чем уровень доверия к этой персоне или этой организации. Также следует учитывать, что данные, записанные в блокчейн, становятся доступны для всех. В этом смысле блокчейн (особенно публичный) не подходит для хранения конфиденциальной информации. Однако тот факт, что информацию в блокчейне невозможно изменить,
может помочь предотвратить или расследовать различного рода мошеннические действия. Децентрализованные приложения Ethereum будут удобны, если платить за их использование криптовалютой. Чем больше людей, владеющих криптовалютой или готовых ее приобрести, тем большую популярность получат приложения DApp и смарт-контракты.
Среди общих проблем блокчейна, затрудняющих его практическое применение, можно упомянуть ограниченную скорость добавления новых блоков и относительно высокую стоимость транзакций. Но технологии в этой области активно развиваются, и есть надежды, что технические проблемы со временем будут решены.
Еще одна проблема заключается в том, что смарт-контракты блокчейна Ethereum работают в изолированной среде виртуальных машин / EVM / и не имеют доступа к данным реального мира. В частности, программа смарт-контракта не может сама прочитать данные с сайтов или каких-либо физических устройств (датчики, контакты и т.п.), а также не может вывести данные на какие-либо внешние устройства. Эту проблему и способы ее решения мы будем обсуждать когда дойдем до так называемых Оракулов – информационных посредников смарт-контрактов.
Также есть ограничения в области законодательства. В некоторых странах, например, запрещается использовать криптовалюту как платежное средство, но можно владеть ей как
неким цифровым активом, наподобие ценных бумаг. Такие активы можно покупать и продавать на бирже. В любом случае, при создании проекта, работающего с криптовалютами, необходимо ознакомиться с законодательством той страны, под юрисдикцию которой попадает ваш проект.
Блокчейн Эфириум является, по сути, системой состояния транзакций. В информатике такое понятие, как «система состояний» или «машина состояний» – это система, которая обрабатывает вводимую информацию и на основании последней преобразуется в новое состояние. В машине состояний Эфириума все процессы начинаются с «первоначального состояния». Такое состояние представляет собой аналог нулевого состояния, в котором находится машина до того момента, как в ее сети начнут происходить какие-либо действия, связанные с транзакциями. Когда такие действия начнут происходить, первоначальное состояние заменяется на конечное, при этом в любой момент времени конечное состояние отображает текущее состояние Эфириума.
Состояние Эфириума имеет миллионы транзакций. Эти транзакции сгруппированы в «блоки». Блок содержит ряд транзакций, при этом каждый последующий блок соединен с предыдущим, благодаря чему обеспечивается своеобразная цепочка блоков.
Блокчейн Ethereum представляет собой платформу, на базе которой можно создавать распределенные приложения DApp. В отличие от других платформ, Ethereum позволяет использовать так называемые умные контракты (смарт-контракты, smart contracts), написанные на языке программирования Solidity. Эта платформа была создана в 2013 году Виталиком Бутериным.
А как-же это всё произошло.
Блок генезиса создается с использованием файла состояния генезиса или genesis.json в Geth / Ethereum на Go /. Этот файл содержит все данные, которые потребуются для генерации блока 0, в том числе, кто начинает с каким количеством эфира. Вот пример пользовательского файла состояния генезиса, который инициализирует этот блок.
Код:
// genesis.json
{
"alloc": {
"0xca843569e3427144cead5e4d5999a3d0ccf92b8e": {
"balance": "1000000000000000000000000000"
},
"0x0fbdc686b912d7722dc86510934589e0aaf3b55a": {
"balance": "1000000000000000000000000000"
}
},
"config": {
"chainID": 68,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"nonce": "0x0000000000000000",
"difficulty": "0x0400",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x43a3dfdb4j343b428c638c19837004b5ed33adb3db69cbdb7a38e1e50b1b82fa",
"gasLimit": "0xffffffff"
}
Арванаги Брэндон 26 января 2018 г. @арванагиКаждый блокчейн должен где-то начинаться, поэтому в начале есть то, что называется блоком генезиса . Это первый блок, и в нем создатели Ethereum могли сказать: «Для начала на всех следующих аккаунтах есть X единиц моей криптовалюты». Любая передача этого эфира в блокчейне будет происходить с одной из этих первоначальных учетных записей (или с майнинга).
Каждый раз, когда мы запускаем Ethereum, мы фактически воссоздаем этот блок генезиса с нуля. Синхронизация блокчейна с пирами начинается только с блока 1.
Если вы сочтете этот пост полезным, не забудьте подписаться на мой Twitter , где я публикую больше контента и руководств по Etheruem.
Бытие
Блок генезиса создается с использованием файла состояния генезиса или genesis.jsonв Гете. Этот файл содержит все данные, которые потребуются для генерации блока 0, в том числе, кто начинает с каким количеством эфира. Вот пример пользовательского файла состояния генезиса, который инициализирует этот блок.// genesis.json
{
"alloc": {
"0xca843569e3427144cead5e4d5999a3d0ccf92b8e": {
"balance": "1000000000000000000000000000"
},
"0x0fbdc686b912d7722dc86510934589e0aaf3b55a": {
"balance": "1000000000000000000000000000"
}
},
"config": {
"chainID": 68,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"nonce": "0x0000000000000000",
"difficulty": "0x0400",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x43a3dfdb4j343b428c638c19837004b5ed33adb3db69cbdb7a38e1e50b1b82fa",
"gasLimit": "0xffffffff"
}
Давайте разберем некоторые поля в файле состояния генезиса.
Структура конфигурации в genesis.json связана с настройкой переменных конфигурации для Ethereum и не имеет ничего общего с тем, что находится внутри блока генезиса. Однако эти значения важны, потому что они также должны соответствовать информации о конфигурации любого другого узла, с которым вы хотите взаимодействовать.
Есть три важных момента которые мы рассмотрим при изучении конфигурации.
- Сама структура в реализации Ethereum Go.
- Как конфигурация фактически инициализируется при использовании Ethereum в основной сети.
- Как переменные определяются при инициализации основной сети.
Код:
type ChainConfig struct {
ChainId *big.Int `json:"chainId"` // Идентификатор цепи идентифицирует текущую цепь и используется для защиты от воспроизведения
HomesteadBlock *big.Int `json:"homesteadBlock,omitempty"` // Блок переключения Homestead (nil = нет форка, 0 = уже Homestead
DAOForkBlock *big.Int `json:"daoForkBlock,omitempty"` // Блок переключения хард-форков TheDAO - цифровая децентрализованная автономная организация, представляющая собой краудфандинговую платформу, основанную на системе умных контрактов и технологии Ethereum
DAOForkSupport bool `json:"daoForkSupport,omitempty"` // Поддерживает ли узел хард-форк DAO или нет
// EIP150 реализует изменение цены на газ (https://github.com/ethereum/EIPs/issues/150)
EIP150Block *big.Int `json:"eip150Block,omitempty"` // EIP150 HF block (nil = no fork)
EIP150Hash common.Hash `json:"eip150Hash,omitempty"` // EIP150 HF hash (помощь при быстрой синхронизации)
EIP155Block *big.Int `json:"eip155Block,omitempty"` // Блок простой защиты от повторных атак
EIP158Block *big.Int `json:"eip158Block,omitempty"` // EIP158 HF block
// Различные механизмы консенсуса
Ethash *EthashConfig `json:"ethash,omitempty"`
...
}
Это сделано так, чтобы было понятно в какой цепи вы находитесь: если chainID = 1 - означает что вы хотите принять участие в чейто цепочке сети Ethereum, а не начать свою
СhainID впервые был представлен в EIP155 (очень скоро мы разберемся что такое EIP). Цель его добавления заключалась в том, чтобы транзакции в сети Ethereum выглядели иначе, чем в классической сети Ethereum. Транзакции подписываются по-разному в зависимости от chainID - значения.
Далее рассмотрим конфиг GEth
Код:
// Copyright 2016 The go-ethereum
// Этот файл является частью библиотеки go-ethereum.
//
// Библиотека go-ethereum является бесплатным программным обеспечением: вы можете распространять ее и/или модифицировать
// на условиях Стандартной общественной лицензии ограниченного применения GNU, опубликованной
// Фонд свободного программного обеспечения, либо версия 3 Лицензии, либо
// (на ваш выбор) любая более поздняя версия.
//
// Библиотека go-ethereum распространяется в надежде, что она будет полезна,
// но БЕЗ КАКОЙ-ЛИБО ГАРАНТИИ; даже без подразумеваемой гарантии
package params
import (
"fmt"
"math/big"
"github.com/ethereum/go-ethereum/common"
)
var (
// MainnetChainConfig это параметры цепочки для запуска узла в основной сети.
MainnetChainConfig = &ChainConfig{
ChainId: MainNetChainID,
HomesteadBlock: MainNetHomesteadBlock,
DAOForkBlock: MainNetDAOForkBlock,
DAOForkSupport: true,
EIP150Block: MainNetHomesteadGasRepriceBlock,
EIP150Hash: MainNetHomesteadGasRepriceHash,
EIP155Block: MainNetSpuriousDragon,
EIP158Block: MainNetSpuriousDragon,
Ethash: new(EthashConfig),
}
TestnetChainConfig = &ChainConfig{
ChainId: big.NewInt(1),
Конфигурация: HomesteadBlock
значение 0 указывает на использование релиза Ethereum Homestead. Это второй из основных релизов Ethereum — а недавно, 16 октября 2017 года, Ethereum форкнулся на релиз Byzantium.
Конфигурация: DAOForkBlock
Номер блока, в котором происходит форк децентрализованной автономной организации (DAO).
Немного предыстории: В 2016 году DAO создала чрезвычайно успешный смарт-контракт для финансирования dApps и предоставления вкладчикам своего рода доли в этих dApps посредством токенов DAO. Этот контракт был новой идеей, которая позволила собрать беспрецедентное количество эфира.
К несчастью, злоумышленник обнаружил вектор атаки, который позволял многократно выводить эфир из контракта в обмен на одни и те же токены DAO. Миллионы были украдены.
В конечном итоге большинство пользователей Ethereum проголосовали за создание жесткого форка в блокчейне, который бы аннулировал действия злоумышленников, и контракт был бы обновлен. Это было спорное решение, поскольку фракция противников форка (по праву) заявила, что оно создает опасный прецедент на будущее: если большинству пользователей не понравится какой-то конкретный результат, теперь есть прецедент для его отмены.
Поскольку большинство проголосовало за продолжение форка, родилась переменная DAOForkBlock, которая появилась на 1920000-м блоке в основной сети. Вот определение переменной в Geth:
Код:
// MainNetDAOForkBlock - это номер блока, на котором начинается хард-форк DAO в основной сети Ethereum.
// основной сети Ethereum.
var MainNetDAOForkBlock = big.NewInt(1920000)
Таким образом, любой блок, добытый после этого, должен будет следовать протоколам, установленным этим новым форком, и в противном случае будет отклонен. Если бы мы создавали локальную цепочку Ethereum для тестирования, мы могли бы установить это значение равным 0, чтобы получить наиболее современное поведение транзакций с самого начала, а не использовать устаревший протокол для первых 1919999 блоков.
Конфигурация: DAOForkBlockSupport
Логическое значение, которое подтверждает, соблюдает ли узел хардфорк DAO.Конфигурация: EIP150Block
EIP означает предложение по улучшению Ethereum . Ethereum имеет открытый исходный код, поэтому люди делают предложения в форме обсуждений и кода. Одни принимаются, другие отвергаются. EIP150 — одно из таких предложений, которое было принято. Этот EIP вступил в силу на блоке №2463000 и в основном был связан с повышением цен на газ в ответ на проблемы с отказом в обслуживании.
Конфигурация: EIP150Hash
Хэш блока EIP150Block, который нужен для быстрой синхронизации .Конфигурация: EIP155Block
EIP155 был принят для предотвращения повторных атак.Конфигурация: EIP158Block
EIP158 был принят, чтобы изменить то, как клиенты Ethereum работают с пустыми учетными записями. Этот новый протокол начал рассматривать их как несуществующие, экономя место в блокчейне.
Конфигурация: Ethash
Просто сообщает клиенту, что мы используем Ethash, алгоритм Ethereum Proof of Work, для майнинга блоков.
Наконец-то мы закончили рассматривать переменные конфигурации. Продоллжим изучать остальную часть genesis.json.
alloc
Это поле определяет, кто и сколько эфиров получит в начале работы блокчейна. В основной сети Ethereum первым так сказать повезло - им перепало немного эфира на халяву и теперь, каждый раз, когда мы запускаем Ethereum в основной сети, мы воссоздаем этот первый блок и все те начальные транзакции этих людей.
Вот некоторые из адресов в разделе alloc файла состояния генезиса сети mainnet:
Код:
{
"alloc": {
"3282791d6fd713f1e94f4bfd565eaa78b3a0599d": {
"balance": "1337000000000000000000"
},
"17961d633bcf20a7b029a7d94b7df4da2ec5427f": {
"balance": "229427000000000000000"
},
"493a67fe23decc63b10dda75f3287695a81bd5ab": {
"balance": "880000000000000000000"
},
"01fb8ec12425a04f813e46c54c05748ca6b29aa9": {
"balance": "259800000000000000000"
}
...
}
difficulty
Это значение определяет, насколько сложно добыть блок. Разные технологии блокчейна используют разные алгоритмы майнинга - на момент написания этой статьи (а ей 4 года) в сети Ethereum все еще используется Proof of Work. Сложность можно интерпретировать через ее обратную величину; другими словами, если значение равно 0x0400, это означает, что вероятность успеха вашей первой попытки добычи блока составляет 1/1024. Получаем это значение, потому что 0x0400 в шестнадцатеричной системе равно 1024 в десятичной. Обратная величина 1024, очевидно, равна 1/1024, что означает, что в среднем вы можете рассчитывать на успешную добычу после 1024 вычислений хэша. Скорость добычи блока зависит от того, насколько быстро ваш компьютер может произвести в среднем 1024 хэш-вычислений. Считайте это значение "стартовым" для определения сложности добычи любого блока в цепи. Не каждый блок будет иметь такую сложность; вместо этого это значение передается в клиент Ethereum, чтобы алгоритмически определить сложность для последующего блока. Сложность добычи блока меняется по мере роста блокчейна.
mixhash, nonce
mixhash и nonce используются вместе, чтобы определить, был ли блок добыт правильно. Если злоумышленник подделывает блоки с фальшивым nonce, то для других узлов сети может потребоваться много вычислений, чтобы обнаружить, что nonce был подделан. mixhash - это промежуточный расчет для нахождения nonce, который не так затратен для определения. Таким образом, если другие узлы сети обнаруживают ошибочный mixhash при проверке блока, они могут отбросить блок без дополнительной работы по проверке nonce.
В блоке genesis эти значения не имеют смысла, но сделать их случайными - хорошая идея, чтобы другие пиры случайно не подключились к вашей цепи, имея такой же точно файл genesis.json.
parentHash
256-битный хэш Keccak заголовка предыдущего блока. В блоке genesis это значение не имеет смысла, так как у блока 0 нет родителя. Однако целью создания блока genesis было сделать его формат таким же, как у любого другого блока, поэтому у нас есть это поле и мы присваиваем ему значение.
gasLimit
Максимальное количество вычислений, которое может поддерживать любой блок на данной цепочке.
coinbase
Вознаграждения в эфире, полученные за "добычу" блока genesis, отправляются на 160-битный адрес coinbase. В блоке genesis это бессмысленно (тем более что вы вольны распределять столько эфира, сколько хотите, на любой счет), но, опять же, целью было сделать блок genesis идентичным любому другому блоку на блокчейне, поэтому эти значения существуют.
Собственно так вот выглядит конфиг 1 блока, а дальше пора майнить)
Майнинг, или Как создаются блоки
Майнинг (mining) представляет собой довольно сложный и ресурсоемкий процесс добавления новых блоков в цепочку блокчейна, а вовсе не «добычу криптовалют». Майнинг обеспечивает работоспособность блокчейна, т.к. именно этот процесс отвечает за добавление транзакций в блокчейн Ethereum. Люди и организации, занимающиеся добавлением блоков, называются майнерами (miner). Программное обеспечение (ПО), работающее на узлах майнеров, пытается подобрать для
последнего блока параметр хеширования с названием Nonce, чтобы получилось определенное значение хеш-функции, заданной сетью. Алгоритм хеширования Ethash, применяемый в
Ethereum, позволяет получить значение Nonce только путем последовательного перебора.
Если узел майнера нашел правильное значение Nonce, то это является так называемым доказательством работы (PoW, Proof-of-work). В этом случае, если блок будет добавлен в сеть
Ethereum, майнер получает определенное вознаграждение в валюте сети – Ether. Таким образом, майнеры Ethereum обеспечивают работу сети, добавляя блоки, и получают за это криптовалютные деньги. В интернете вы найдете массу информации о майнерах и майнинге, а мы сосредоточимся на создании контрактов Solidity и децентрализованных приложений DApp в сети Ethereum.
Для начала думаю пойдет. Продолжение полюбому