Для понимания статьи понадобится знание об общих принципы работы блокчейна Они описаны в статье про биткоин.
Сеть Ethereum – это развитие идеи использования блокчейна. Помимо собственно криптовалюты (криптовалюту мы будем называть эфир, а всю сеть – Ethereum) Ethereum предоставляет возможность выполнения программного кода (так называемые смарт-контракты). Зачатки смарт-контрактов есть и в биткоин: несложный скриптовый язык, который позволяет описывать различные сценарии проведения платежей. Однако, если в биткоин язык был не тьюринг-полный в целях защиты сети, то Ethereum предоставляет полноценный язык, позволяющий писать сколь угодно сложные программы.
Пример:
Егор хочет продать квартиру, а Женя хочет её купить. Егор опасается, что Женя не заплатит, а Женя – что Егор возьмёт деньги и исчезнет, не передав права на квартиру. В “обычном” мире они обращаются к посреднику (например, банку), который гарантирует проведение сделки для обеих сторон.
В киберпанк-мире со смарт-контрактами роль посредника может играть алгоритм.
Смарт-контракт покупки-продажи квартиры:
- Женя переводит деньги на счёт контракта
- Контракт сообщает об этом Егору
- Егор переоформляет права на квартиру
- Контракт получает цифровой документ и проверяет, что квартира переоформлена
- Контракт отправляет деньги Егору
- Теперь Женя владеет квартирой, а Егор получил деньги
Если в процессе что-то пошло не так, то Женя получает деньги назад и сделка отменяется.
∎
Аккаунты
Аккаунты в Ethereum делятся на два типа:
Кошельки (externally owned accounts)
Аккаунты, которые управляются парой ключей. Это привычные аккаунты, ничем принципиально не отличаются от биткоин-аккаунтов.
Контракты (contract accounts)
Аккаунты, управляемые алгоритмами. Код таких аккаунтов пишется на специальном языке программирования, хранится в блокчейне и может быть исполнен при проведении транзакций. Также контракт имеет возможность сохранять данные в блокчейне и считывать их (место хранения данных называется хранилище).
Оба типа аккаунтов могут:
- Хранить, получать и переводить эфир
- Взаимодействовать со смарт-контрактами
Но между ними есть и различия:
Свойство | Кошелёк | Контракт |
---|---|---|
Управляется | Парой ключей | Программой контракта |
Создание | Бесплатно | Стоит эфира |
Транзакции | Транзакция на кошелёк переводит средства | Транзакция на контракт исполняет его код |
Активность | Могут инициировать транзакции | Могут только отвечать на запросы |
Адрес аккаунта | 20 байт, генерируется из публичного ключа | 20 байт, генерируется из адреса создателя |
Транзакции
Транзакция – это криптографически подписанные инструкции, исходящие от аккаунтов.
Транзакции бывают трёх видов: перевод, создание контракта и вызов контракта.
Перевод
Перевод средств c одного аккаунта на другой.
Создание контракта
Транзакция, которая создаёт новый контракт. В блокчейн сохраняется код контракта и создаётся адрес, по которому можно будет обращаться к контракту.
Вызов контракта
Можно вызвать код контракта, передать ему данные и получить ответ. Код контракта может читать и писать в хранилище, вызывать код других контрактов, переводить средства, создавать другие контракты. Это похоже на запуск программы, только она исполняется в блокчейне, а не на вашем компьютере.
Проведение транзакций
Майнер, нашедший новый блок, получает вознаграждение в виде заданного значения эфира (так происходит эмиссия эфира) и комиссии от всех транзакций, включенных в блок. Поскольку транзакции могут включать в себя вызов контрактов, то при добавлении транзакций в блок майнерам нужно выполнять код контрактов. Выполнение кода в сети Ethereum не бесплатное, а стоит так называемого “газа”, который оплачивает аккаунт, создавший транзакцию. Каждая инструкция в языке смарт-контрактов имеет свою цену, выраженную в единицах газа. Также цену имеет запись в хранилище.
При создании транзакции аккаунт указывает:
- GASPRICE – обменный курс газа к эфиру
- STARTGAS – максимальный предел газа, выделенный на полное выполнение транзакции
Примечание
Обычно комиссии указываются в gwei ($10^{-9}$ эфира)Алгоритм проведения транзакции:
- Проверить корректность оформления транзакции. Вернуть ошибку, если что-то не так
- Вычислить комиссию по формуле STARTGAS * GASPRICE
- Вычесть комиссию из баланса отправителя. Если средств на балансе отправителя не хватило – вернуть ошибку
- Если получатель – кошелёк: переслать сумму транзакции с аккаунта отправителя на аккаунт получателя
- Если получатель – контракт: запустить код контракта
- Если на выполнение перевода или контракта не хватило газа, то откатить всё назад, за исключением того, что комиссия переходит майнеру
- В случае успешного выполнения контракта пересчитать стоимость выполнения в эфире по курсу GASPRICE и вернуть остаток отправителю, а весь потраченный эфир перевести майнеру в виде комиссии
Пример:
Алиса хочет перевести Бобу $1000$ эфира. Она устанавливает лимит газа $16$ единиц, а цена газа составляет $40$ эфира. Выполнение транзакции стоит $600$ эфира.
Общая сумма комиссии: $16 * 40 = 640$
Алисе вернётся непотраченный эфир $640 - 600 = 40$
Когда Алиса отправит средства, со счета Алисы будет списано $1000 + 600 = 1600$ эфира. Бобу будет начислен $1000$ эфира. Майнер получит $600$ эфира комиссий.
∎
Базовая комиссия
Начиная с обновления “Лондон”, каждый блок имеет базовую комиссию – минимальную стоимость единицы газа, которая рассчитывается сетью на основе спроса. Эта базовая комиссия сжигается (не начисляется майнеру). Такая система делает комиссии более предсказуемыми.
Пример:
Алиса хочет перевести Бобу $1000$ эфира. Она устанавливает лимит газа $16$ единиц. Базовая комиссия равна $100$ эфира за газ, дополнительно Алиса включает доплату $20$ эфира за газ.
Базовая комиссия: $16 * 100 = 1600$ эфира
Доплата: $16 * 20 = 320$ эфира
Общая комиссия: $1600 + 320 = 1920$ эфира
Когда Алиса отправляет средства, со счета Алисы будет списано $1000 + 1920 = 2920$ эфира. Бобу будет начислено $1000$ эфира. Майнер получит комиссию $320$ эфира. Базовая комиссия в $1600$ эфира будет сожжена.
∎
Комиссии защищают сеть Ethereum. Так как проведение транзакций стоит эфира, любой, кто хочет устроить спам-атаку, сможет делать это только до тех пор, пока его эфир не закончится.
Майнинг
Основа философии майнинга в Ethereum – это достижение максимальной децентрализации. Изначально Ethereum использовал механизм Proof of work. А чтобы затруднить использования ASIC, функция майнинга была спроектирована так, что требовала много памяти и обращений к ней, что нивелирует преимущество ASIC перед обычными компьютерами. C обновлением Casper сеть перешла на механизм консенсуса Proof of stake.
Один их недостатков биткоина – долгое время между блоками, равное 10 минутам. В Ethereum средний интервал блока составляет около 12 секунд. Основной цепочкой по-прежнему признаётся самая длинная цепочка. Но так как блоки идут быстро, блокчейн чаще разветвляется. Получается, что майнеры, которые майнят побочные цепочки, делают это впустую, поэтому у них появляется стимул к объединению, а это ведёт к централизации. Чтобы бороться с этим, был введён протокол GHOST. Суть его в том, что награда даётся не только за блоки в основной цепи, но и за блоки в побочных цепях. Такие блоки, у которых есть общий родитель с блоком из основной цепи, называются дядями (uncle, ommer).
Майнер может при создании блока включить в него также дядю (не старее 7 поколений) – за это он получит 12.5% стандартной награды новых эфиров. Майнер, создавший блок-дядю, получит 87.5% награды. Эта система мотивирует майнить побочные цепочки и также снижает стимул к централизации.
Смарт-контракты
Для написания смарт-контрактов Ethereum использует собственный язык, для которого созданы языки-надстройки высокого уровня. Самый популярный из них Solidity (похож на javascript). Любой разработчик может создать контракт и опубликовать его в сети. Поскольку Ethereum предоставляет полноценный язык программирования, можно реализовать сложные алгоритмы: сделки, голосования, аукционы и т. д.
Но есть некоторые ограничения. Блокчейн должен быть полностью детерминирован, потому что каждый майнер в каждый момент времени должен иметь возможность убедиться в корректности блокчейна, проверив все блоки от первого до текущего. Соответственно, все операции должны быть также детерминированы. Нельзя, например, получить курс доллара с внешней биржи (на момент проверки майнером биржа уже может не существовать), сгенерировать случайное число (майнер не может это повторить, он получит другое случайное число) или получить точное время (“часы” майнера могут показывать немного другое время). Однако можно пользоваться всей информацией внутри блокчейна: например, можно получить время последнего блока или генерировать “случайные” числа на основе хешей блоков.
Собственная криптовалюта
Часто поверх Ethereum создают новые криптовалюты (монеты этих криптовалют обычно называют токенами). Самая простая криптовалюта представляет собой запись о том, у кого сколько токенов и простейшие возможности, вроде перевода токенов между аккаунтами.
Пример реализации простого токена на Solidity:
contract MyCoin {
// Владелец токена
address minter;
// Балансы: у кого сколько токенов на счету
mapping (address => uint) balances;
// Запускается один раз при создании контракта
function MyCoin() {
minter = msg.sender; // Устанавливаем себя владельцем
}
// Создание новых токенов
function mint(address owner, uint amount) {
if (msg.sender != minter) return; // Создавать может только владелец
balances[owner] += amount; // Начисляем токены
}
// Перевод токенов от одного аккаунта к другому
function send(address receiver, uint amount) {
if (balances[msg.sender] < amount) return; // Проверка хватает ли средств у отправителя
balances[msg.sender] -= amount; // Сняли у отправителя
balances[receiver] += amount; // Начислили получателю
}
// Получение баланса: сколько токенов на счету у аккаунта
function queryBalance(address addr) constant returns (uint balance) {
return balances[addr];
}
}
ICO
Другое популярное применение Ethereum – проведение ICO. ICO – это аналог IPO в мире криптовалют. Суть в следующем: вы хотите привлечь финансирование. Для этого создаёте свой токен и предлагает другим купить его за эфир, а условия предложения оформляете в виде смарт-контракта. Зачем кому-то покупать ваши токены? Вы можете пообещать (заложить в контракте) какие-то плюсы для владельцев, например, начисления процентов или последующий выкуп по более высокой цене. Также цена ваших токенов может вырасти в будущем (может, конечно, и упасть до нуля).
Отличия ICO от IPO:
- ICO не проходит никакого контроля или аудита, кто угодно может выпустить токены
- токены не признаются юридически значимыми
- токены не являются ценной бумагой
Покупка токена это скорее пожертвование под обещания создателей, нежели инвестиции, поэтому она сопряжена с большим риском. Токены могут обесцениться + дополнительный риск в том, что с точки зрения закона токены ничего не значат. На волне хайпа было очень модно проводить ICO, а покупали токены все кому не лень. Сейчас хайп поутих, а в сферу пришли более профессиональные игроки.