Взгляд венчурного инвестора на Блокчейн | 13: как работают смарт-контракты

Смарт-контракты – это главное, что отличает блокчейны Ethereum и Bitcoin. Благодаря этому стали возможны ICO, NFT, DAO и многое другое. Я за 10 минут расскажу, как и почему это работает.

Взгляд венчурного инвестора на Блокчейн | 13: как работают смарт-контракты

Ethereum – это распределенный компьютер

Как я описывал чуть раньше здесь, блокчейн Ethereum позволяет запускать и выполнять программы, написанные на полноценном языке программирования Solidity. Такие программы принято называть смарт-контрактами. В отличие от весьма ограниченных возможностей блокчейна Биткоина, в Ethereum дозволено практически всё:

  • Смарт-контракт может быть насколько угодно сложным, с его помощью можно реализовать всё то же самое, что реализуется на других языках программирования
  • Любая такая программа всегда открыта для всех участников сети, в том числе – для других программ. То есть смарт-контракт может в ходе работы вызвать любой другой смарт-контракт, когда-либо написанный и реализованный в сети Ethereum
  • Наконец, смарт-контракт имеет доступ к состоянию блокчейна и любым его параметрам

У Ethereum есть память

То есть инструмент очень мощный. Но, чтобы программы были полезны, необходимо как-то хранить данные, например, сколько у кого есть токенов, как называется биржа, каков обменный курс и тп. У компьютеров для этого есть жесткий диск, а в Ethereum практикуется распределенная база данных. Она хранится и многократно копируется на узлах участников сети – тех, которые хранят полную или частичную копию всего блокчейна Ethereum и поддерживают его работу.

Это важное отличие блокчейна Биткоина и Эфира: если в Биткоине хранится только набор связанных транзакций, то в случае с Эфиром – тоже хранятся транзакции, но еще и все данные, сгенерированные смарт-контрактами.

Само собой, такое хранение не бесплатно. Как я писал тут, для работы смарт-контрактов нужен Gas. И запись / изменение значения переменной в распределенную базу данных стоит дорого. Например, создание нового числа будет стоить порядка 15,000 Gas (напомню, что операция сложения стоит всего 3 Gas). С учетом текущих цен на Gas, операция создания нового числа может стоить несколько долларов. Само собой, если ничего долгосрочно хранить не надо, то это гораздо дешевле.

Как выглядит смарт-контракт

Он выглядит как программа, написанная на языке JavaScript. Правда, в отличие от JavaScript, в Solidity есть встроенные фичи, связанные именно с блокчейном. Они позволяют снимать и пересылать «деньги» (ETH), получать адрес человека, который вызвал смарт-контракт, делать вызовы к другим смарт-контрактам по адресам их хранения.

Вот простейший смарт-контракт, который будет работать:

pragma solidity ^0.8.4; contract HelloWorld { string public message; constructor (string memory initMessage) { message = initMessage; } function update (string memory newMessage) public { message = newMessage; } }

Что делает контракт? Говорим, что используется версия Solidity 0.8.4. Создаем контракт с именем HelloWorld. Тот, кто первым добавит контракт в сеть Ethereum (разработчик), должен будет задать изначальное сообщение initMessage. После этого любой желающий может вызвать функцию update и поменять сообщение. Также любой желающий может вызвать переменную message и увидеть, какое сообщение туда записано в данный момент. При этом за вызов функции update нужно будет заплатить, а вот узнать, что записано в переменной message – бесплатно.

Где смарт-контракт «живет»

Напомню, что отправка смарт-контракта в сеть это то же самое, что и сделать обычную транзакцию. Просто вместо «Алиса направила Бобу 2 ETH» там будут записаны бинарный код смарт-контракта + удобочитаемый список его функций и переменных. Первое нужно чтобы хранить контракт наиболее эффективно. Также этот бинарный код можно получить и из других языков программирования (не только Solidity) – у всех ведь свои пристрастия к языкам. Второе же нужно для того, чтобы внешние программы могли бы понять какие функции смарт-контракта можно вызывать и для этого им не пришлось бы расшифровывать бинарный код.

Каждый смарт-контракт в Ethereum имеет собственный адрес, по которому можно вызывать его функции. Это такой же адрес, как и у обычного участника сети. На этом адресе также могут храниться монеты ETH. Например, если смарт-контракт продает токены за ETH, то монеты накапливаются именно на этом адресе. И снять их обычно может только тот, кто создал этот смарт-контракт. Для снятия (пересылки на другой адрес) монет в таком смарт-контракте будет предусмотрена специальная функция, скажем, withdraw (address _to), которая будет «слушаться» только если ее вызвали с адреса владельца контракта (с того адреса, с которого этот контракт первый раз заслали в сеть).

Я рассказал про основы смарт-контрактов, о том, как они устроены, где живут, как выглядят. В следующей статье вооружимся необходимыми инструментами и поохотимся на один из них. Наша цель – какой-нибудь токен, который использовался в 2017/2018 годах в бум ICO. Не пропустите следующей серии.

88
Начать дискуссию