TON Smart Contracts: базовый минимум за 5 минут

Если бы я наткнулся на эту статью в самом начале работы с блокчейном ТОН, это бы сэкономило мне кучу времени на понимание архитектуры и принципов работы смарт контрактов.
Что такое смарт контракт с точки зрения разработчика.
Я постараюсь уберечь вас от терминологии блокчейна, вместо этого на пальцах показать из чего состоит смарт контракт и как его собрать. Если говорить совсем просто, то смарт контракт - это ячейка в памяти, хранящая в себе:
Адрес
Баланс
Любые данные, которые вы туда запишите
Код смарт контракта
Текущий статус смарт контракта
Ну или если перевести вышесказанное в код, то:
class SmartContract{ readonly address: string; readonly balance: number; readonly code: string; readonly status: 'uninitialized' | 'active' | 'frozen'; storage: object; ... }
Плавное погружение...
Представьте, вы написали код класса на своем любимом языке программирования, как полагается, с полями и методами, и превратили этот код в строку. Code - это и есть код вашего смарт контракта. Он будет выполняться в блокчейне. Точкой входа в таком коде будет метод onInternalMessage или onExternalMessage. Чтобы состояние полей класса можно было сохранять и перезаписывать, к смарт контракту прилагается объект Storage , в котором хранятся значения ваших полей.
При сохранении смарт контракта в блокчейн вы отправляете { code, data } , где code - это код вашего смарт контракта, data - начальные данные. По этим двум полям вычисляется будущий адрес смарт контракта: address = hash({ code, data }). По этому адресу будет доступен ваш смарт контракт в блокчейне ТОН. На него можно совершать переводы, просматривать историю транзакцию, с него может переводить средства и вызывать другие смарт контракты.
Как происходит деплой смарт контракта.
Каждый смарт контракт платит немного комиссии по факту своего существования, в пример вспоминается налог на недвижимость. Чем больше жилплощадь - тем больше налог. Но в рамках ТОН вы платите за количество данных, которое хранит ваш смарт контракт, включая сам код вашего смарт контракта. Поэтому при создании на нем должно лежать как минимум чуть-чуть ТОН(как правило копейки). Создать смарт контракт можно 2 способами:
1) Другой смарт контракт делает перевод ТОН, прикрепляя код вашего смарт контракта вместе с начальными значениями(data) в поле Init = { code, data }. Блокчейн видит в переводе это поле и автоматически делает деплой. Статус смарт контракта становится "active".
2) Другой смарт контракт так же делает перевод ТОН, но только не прикрепляя ничего. В таком случае средства останутся висеть на адресе пустого смарт контракта, который будет выглядеть примерно так:
{ "address": "401bf...3004", "balance": 3000, "code": "", "storage": {}, "status": "uninitialized" }
Он ждет внешнее сообщение, где в него передадут код и начальные данные таким образом, чтобы address = hash({ code, data }), только тогда он сохранит код и сможет выполняться. Для вызова внешнего сообщения используется обычное API, где передается адрес и Init = { code, data } . Запрос сначала попадет в блокчейн, после чего при совпадении адреса address = hash({ code, data }) произойдет деплой, и статус станет "active".
Заключение
В этой статье мы с вами закрепили азы архитектуры блокчейна ТОН, где каждый адрес является адресом смарт контракта. Разобрали структуру и механику создания. Рады вашему фидбеку или вопросам! Следите за нашими анонсами и новостями в Telegram.












