Введение в смарт контракты
DLИ биткоин, и этереум работают на блокчейне. Для связывания блоков используются разные хэш-функции, блоки генерируются с разной частотой... Но суть остается та же.
Более существенная разница заключается в том, что происходит на компьютерах майнеров помимо поддержания распределенной базы балансов.
Биткоин и Script
Большинство людей скорее всего считает, что чтобы потратить деньги с биткоин аккаунта, нужно подписать транзакцию приватным ключом от этого аккаунта. Но это не совсем вся правда.
![](/file/fcc7988682c054a104391.png)
На самом деле транзакция должна удовлетворять набору правил аккаунта, написанному на встроенном языке Script. В большинстве случаев это действительно просто проверка валидности подписи, но не всегда.
Например, можно сделать multisignature аккаунт. Чтобы потратить деньги с такого аккаунта, нужно подписать транзакцию двумя ключами (или в общем случае M ключами из N возможных).
Script - очень простой язык: он не является полным по Тьюрингу, в нем нет циклов, классов, функций, и даже нет переменных (вычисления производятся на стеке).
Его интерпретатор встроен в ноду и занимает полторы тысячи строк. Программы как правило не превышают нескольких команд, плохо структурированы и поэтому сложно читаются.
Соответственно, на нем очень неудобно писать что-то сложнее аккаунта с несколькими подписями, а какие-то вещи написать просто невозможно.
Но плюсы такого подхода тоже очевидны: нужно меньше ресурсов на выполнение проверок, меньше вероятность допустить ошибку.
Этереум и Solidity
Команда этереума решила пойти на несколько шагов дальше и сделать полноценный язык программирования Solidity, полный по Тьюрингу. И исполнять его код не только для проверки валидности транзакций, а для чего угодно.
![](/file/d361e3f180a3e0f7fbdae.png)
Вместо обычного аккаунта (кошелька), можно сделать специальный contract account. С этим аккаунтом будет ассоциирован код, который называется смарт контрактом, и выполняется внутри Ethereum Virtual Machine на компьютерах майнеров по всему миру.
Каждый контракт как правило предоставляет внешнему миру функциональный API. Через этот интерфейс можно общаться с контрактом: отправлять на него запросы, получать ответы. Более того, контракты могут общаться между собой.
С точки зрения обычного пользователя смарт контракт мало чем отличается от программы на централизованном удаленном сервере. Если заменить Ethereum Virtual Machine на Google Cloud - мало что будет отличаться для внешнего мира.
Основное преимущество, как и с криптовалютами - распределенность и верифицируемость. Если код запущен, в коде нет багов, и за его выполнение кто-то готов платить - код будет работать корректно.
В этом и есть смысл смарт контрактов. Это контракты, написанные и подписанные без участия юристов и выполняемые без участия полиции. Мне не нужно доверять создателю контракта - я доверяю коду.
При этом аккаунт контракта - это по-прежнему этереум аккаунт. Это значит, что он может из коробки принимать и отправлять эфир. В этом случае платежная система - не отдельный модуль Solidity, а неотъемлемая часть его дизайна.
Зачем это нужно
В первую очередь, можно сделать то же, что и на любой другой облачной платформе. Например, можно сделать контракт, который будет присылать картинки котят всем, кто отправит ему запрос. Или только тем, кто отправит на него эфир.
Или сделать свою распределенную базу данных. Намного дороже и сложнее, чем хранить данные в облаке амазона или гугла, но зато с репликацией на тысячи компьютеров по всему миру.
Но преимущества смарт контрактов проявляются, если действительно важна верифицируемость и неизменяемость (immutability) выполнения.
Например, можно сделать аккаунт, эфир с которого можно будет снять только при выполнении ряда условий. Как в биткоине, только более гибко: можно ввести ограничения на время, на цену, на состояния других контрактов.
Можно реализовать сложные финансовые инструменты, типа фьючерсов и прочих деривативов. Некоторые биржи отлично реализуют все это и без смарт контрактов, но при этом вкладчики должны полностью доверять бирже (а этого делать не стоит, вспомним хотя бы крупнейшие биржи 2013 года: mtgox и cryptsy).
Или можно сделать свой собственный токен (свою криптовалюту). Это, пожалуй, самый распространенный вид контрактов. Очень удобно: не нужно писать свой код блокчейна, свои кошельки под все платформы, и главное, не нужно привлекать майнеров. Большинство ICO (initial coin offering) используют этот механизм: собирают на аккаунт контракта эфир, присваивают отправителю токены взамен.
Более сложные примеры включают распределенное голосование и аукционы. Люди начинают писать распределенные trustless биржи. Теоретически, говорят, смарт контрактами можно во многих случаях заменить юристов, нотариусов и страховщиков. Для этого использования нужно привлекать людей-арбитров, но и такие вещи реализуются распределенно и верифицируемо (арбитров должно быть много, и они должны наказываться деньгами за неправильную оценку).
Мое личное мнение заключается в том, что потенциал смарт контрактов огромен, но на данный момент большинство примеров их использования очень сильно притянуты за уши.
Газ
На этом можно было бы и закончить, но я упомяну еще один термин, который у многих вызывает путаницу. Газ.
Чтобы бороться со спамом, за все действия на блокчейне нужно платить. За перевод средств платится комиссия, которая потом выплачивается майнерам за работу. В сети биткоин комиссия платится в биткоинах.
В сети этереум комиссии платится и за переводы, и за выполнение контрактов. И используется для этого не эфир, как можно было бы подумать, а газ. Но газ, с свою очередь, "покупается" за эфир по рыночной цене.
Сделано это для того, чтобы отделить меру работы от цены эфира. Газ - это как бензин: чтобы фиксированная машина проехала фиксированное расстояние, нужно потратить фиксированное количество бензина. Все фиксировано с технической точки зрения - очень удобно. Цена бензина может вырасти вдвое, но машина будет потреблять ровно столько же бензина.
Проведение транзакции требует фиксированного количество газа. Исполнение каждой команды смарт контракта требует фиксированного количества газа. Таким образом чем сложнее контракт - тем больше суммарно газа требуется.
![](/file/8654b3d4651e7cae1b75b.png)
Что влияет на цену газа?
- Если цена эфира растет, пользователи (создатели контрактов) начинают платить большие комиссии в долларах. Пользователям это не нравится, и они снижают цену газа. Следовательно, чем выше цена эфира в долларах, тем ниже цена газа в эфире.
- Чтобы повысить приоритет выполнения смарт контракта или подтверждения транзакции, можно повысить цену газа. Таким образом, чем больше популярность эфира и смарт контрактов, тем больше цена газа (например, во время популярных ICO цена газа часто поднимается в разы).
- Чем больше популярность эфира и смарт контрактов, тем больше людей покупают его (для пользования или выплаты комиссий), тем выше цена эфира.
Можно заметить, что пункты 1, 2 и 3 тянут цену в разные стороны. Вот из такого сложного рыночного равновесия и выставляется цена газа.