Взгляд венчурного инвестора на Блокчейн | 13: как работают смарт-контракты
Смарт-контракты – это главное, что отличает блокчейны Ethereum и Bitcoin. Благодаря этому стали возможны ICO, NFT, DAO и многое другое. Я за 10 минут расскажу, как и почему это работает.
Ethereum – это распределенный компьютер
Как я описывал чуть раньше здесь, блокчейн Ethereum позволяет запускать и выполнять программы, написанные на полноценном языке программирования Solidity. Такие программы принято называть смарт-контрактами. В отличие от весьма ограниченных возможностей блокчейна Биткоина, в Ethereum дозволено практически всё:
- Смарт-контракт может быть насколько угодно сложным, с его помощью можно реализовать всё то же самое, что реализуется на других языках программирования
- Любая такая программа всегда открыта для всех участников сети, в том числе – для других программ. То есть смарт-контракт может в ходе работы вызвать любой другой смарт-контракт, когда-либо написанный и реализованный в сети Ethereum
- Наконец, смарт-контракт имеет доступ к состоянию блокчейна и любым его параметрам
У Ethereum есть память
То есть инструмент очень мощный. Но, чтобы программы были полезны, необходимо как-то хранить данные, например, сколько у кого есть токенов, как называется биржа, каков обменный курс и тп. У компьютеров для этого есть жесткий диск, а в Ethereum практикуется распределенная база данных. Она хранится и многократно копируется на узлах участников сети – тех, которые хранят полную или частичную копию всего блокчейна Ethereum и поддерживают его работу.
Это важное отличие блокчейна Биткоина и Эфира: если в Биткоине хранится только набор связанных транзакций, то в случае с Эфиром – тоже хранятся транзакции, но еще и все данные, сгенерированные смарт-контрактами.
Само собой, такое хранение не бесплатно. Как я писал тут, для работы смарт-контрактов нужен Gas. И запись / изменение значения переменной в распределенную базу данных стоит дорого. Например, создание нового числа будет стоить порядка 15,000 Gas (напомню, что операция сложения стоит всего 3 Gas). С учетом текущих цен на Gas, операция создания нового числа может стоить несколько долларов. Само собой, если ничего долгосрочно хранить не надо, то это гораздо дешевле.
Как выглядит смарт-контракт
Он выглядит как программа, написанная на языке JavaScript. Правда, в отличие от JavaScript, в Solidity есть встроенные фичи, связанные именно с блокчейном. Они позволяют снимать и пересылать «деньги» (ETH), получать адрес человека, который вызвал смарт-контракт, делать вызовы к другим смарт-контрактам по адресам их хранения.
Вот простейший смарт-контракт, который будет работать:
Что делает контракт? Говорим, что используется версия Solidity 0.8.4. Создаем контракт с именем HelloWorld. Тот, кто первым добавит контракт в сеть Ethereum (разработчик), должен будет задать изначальное сообщение initMessage. После этого любой желающий может вызвать функцию update и поменять сообщение. Также любой желающий может вызвать переменную message и увидеть, какое сообщение туда записано в данный момент. При этом за вызов функции update нужно будет заплатить, а вот узнать, что записано в переменной message – бесплатно.
Где смарт-контракт «живет»
Напомню, что отправка смарт-контракта в сеть это то же самое, что и сделать обычную транзакцию. Просто вместо «Алиса направила Бобу 2 ETH» там будут записаны бинарный код смарт-контракта + удобочитаемый список его функций и переменных. Первое нужно чтобы хранить контракт наиболее эффективно. Также этот бинарный код можно получить и из других языков программирования (не только Solidity) – у всех ведь свои пристрастия к языкам. Второе же нужно для того, чтобы внешние программы могли бы понять какие функции смарт-контракта можно вызывать и для этого им не пришлось бы расшифровывать бинарный код.
Каждый смарт-контракт в Ethereum имеет собственный адрес, по которому можно вызывать его функции. Это такой же адрес, как и у обычного участника сети. На этом адресе также могут храниться монеты ETH. Например, если смарт-контракт продает токены за ETH, то монеты накапливаются именно на этом адресе. И снять их обычно может только тот, кто создал этот смарт-контракт. Для снятия (пересылки на другой адрес) монет в таком смарт-контракте будет предусмотрена специальная функция, скажем, withdraw (address _to), которая будет «слушаться» только если ее вызвали с адреса владельца контракта (с того адреса, с которого этот контракт первый раз заслали в сеть).
Я рассказал про основы смарт-контрактов, о том, как они устроены, где живут, как выглядят. В следующей статье вооружимся необходимыми инструментами и поохотимся на один из них. Наша цель – какой-нибудь токен, который использовался в 2017/2018 годах в бум ICO. Не пропустите следующей серии.