Теория о TVM
Всю необходимую информацию о самом блокчейне вы сможете найти на официальном сайте
Отмечу пару деталей.
Каждая сущность в блокчейне TVM является смарт-контрактом. Вы сможете отправить монеты на любой адрес в сети, но управлять теми монетами получится только если вы сохраните на этот же адрес контракт, в котором будут соответствующие методы управления. При этом, отправить контракт на произвольный адрес тоже не получится, так как адрес высчитывается исходя из хеша кода контракта, публичного ключа и значений статических переменных контракта.
Все данные в блокчейне хранятся в формате BOC. Это специальная структура хранения данных, которую можно формировать автоматически передавая в клиент структуру данных и интерфейс (ABI)
Для обращения к блокчейну выбран клиент командной строки ever-cli.
Вот этим мы и займемся дальше.
Объекты конфигурации
В реализации нет ничего сложного, кроме затраченного времени.
Созданы общие модули Блокчейн, БлокчейнВызовСервера и РаботаСКонтрактами, остальные стянуты в БСП для вызова метода ФайловаяСистема.ЗапуститьПрограмму. Которая как раз и вызывает клиент ever-cli с необходимыми параметрами.
Все методы клиента используют универсальный метод запуска клиента Блокчейн.ВыполнитьКоманду
В модуле БлокчейнВызовСервера реализованы обертки большинства команд клиента.
Методы с параметрами реализованы похожим способом
В модуле РаботаСКонтрактами реализованы методы для упрощения кода
Структура справочников следующая
В общем то это все что необходимо для работы.
Как все работает
Типы контрактов
Каждый контракт в сети содержит набор данных. К примеру по Хеш кода контракта можно найти в сети все идентичные контракты. Это могут быть все адреса контрактов кошельков или токенов. Интерфейс позволяет взаимодействовать с контрактом, код заполняется в формате base64, он нужен для определения адреса на который произведется деплой (сохранение в сети) контракта и для самого деплоя.
Многие типовые контракты в сети идентифицированы и их данные вы сможете получить прямо в эксплорере. Вот пример контракта токена. На закладке "Source code" вы сможете найти Интерфейс ABI, а в полях Code и Code Hash соответственно получить код и хеш кода этого контракта. Создаете новый элемент справочника Типы контрактов, заполняете эти поля и готово. Теперь вы сможете создать копию контракта или взаимодействовать с существующим.
Аккаунты
Тут можно создавать новые сид фразы и пары ключей, которые используются для подписания сообщений, которые в свою очередь будут отправляться в сеть. Под сообщениями подразумевается Отправка монет из кошельков, деплой контрактов и вызов методов контрактов.
Контракты
Каждый элемент справочника - это фактически адрес в сети с указанным Типом контракта. Заполнив эти данные вы сможете выполнять его методы, также как это реализовано в эксплорере на закладке Source code.
К примеру, вы можете получить имя токена.
Тут нужно отметить три варианта вызова метода контракта.
Выполнить локально: Этот метод скачивает BOC контракта, в котором есть скомпилированный код контракта и его текущие данные. И запускает выполнение метода на локальной машине. Используется для вызова ГЕТ методов, то есть тех, которые не требуют вызов каких то связанных контрактов в сети и не требуют сохранения контрактов в сеть.
Отправить внешнее сообщение. Метод вызывается в контракте который находится в сети. Параметры кодируются в формат BOC и подписываются ключами Аккаунта. Таких методов мало, их обычно не делают, так как каждый вызов метода в сети списывает с контракта плату за выполнение.
Отправить внутреннее сообщение. Метод также вызывается в контракте в сети, но есть нюанс. Необходимо указать Кошелек, который является вашим, то есть управляется ключами вашего аккаунта и количество монет (в нано токенах, то есть в 10-9) которые будут отправлены с него на адрес контракта в котором вызывается метод. Поэтому сообщение и называется внутренним, так как идет от кошелька на адрес контракта, а не напрямую.
К примеру, через внутреннее сообщение вы сможете создать новый токен
Контракт TokenFactory и его данные можете найти в мейн сети.
Деплой нового контракта
Деплой выполняется в два этапа (кодом можно автоматизировать естественно)
Первый этап - определение будущего адреса контракта. Выбираете метод "constructor". Если у контракта есть статические поля, от значений которых также зависит адрес, на который будет сохранен контракт, они будут указаны в поле "Параметры инициализации"
В этом примере для контракта с типом "Wallet" есть параметр инициализации "_randomNonce", в которое можно указывать различные случайные значения. В отличие от контракта с типом "Multisig Wallet", в котором нет статических переменных, это позволяет создавать несколько кошельков на один аккаунт.
Нажимаете "Получить адрес". Адрес рассчитывается и заполняется в поле Адрес на форме. Деплой контракта требует наличие на этом адресе монет. Следовательно вам нужно пополнить на нем баланс.
В тестовой сети вы можете запросить монеты у бота EverdevGiver (@everdev_giver_bot). В мейн сети, отправить монеты из своего кошелька. Как вариант это может быть кошелек в расширении браузера Хром Ever Wallet.
После пополнения, можете найти этот адрес в эксплорере и увидеть на нем баланс и статус "State UnInit". То есть монеты пришли, но адрес не инициализирован, так как контракта на нем еще нет.
Теперь можно выполнять Деплой контракта. Если все прошло успешно, вы увидите изменение статуса в эксплорере и уже можете выполнять его методы.
Для удобства на форме есть кнопки:
"Получить инфо" - Получает статус аккаунта в сети, его баланс и другие параметры.
"Получить данные" - Получает данные контракта которые сохранены в его переменных. Состав таких переменных вы можете найти в поле data Интерфейса (ABI) контракта.
Вот в общем то и все по работе с контрактами.
Получение данных из сети и другие методы
В конфигурации есть обработка для демонстрации других полезных методов.
Через нее вы сможете:
- Отправить монеты с кошелька на другой адрес. Тоже что вы можете выполнять в расширении браузера
- Получить инфо аккаунта по адресу. Как по кнопке в форме Аккаунты.
- Декодировать данные Аккаунта по адресу. Как по кнопке в форме Аккаунты.
- Декодировать Сообщение. Это то сообщение которое отправляется от кошелька на адрес аккаунта
- Декодировать тело сообщения. Это тело внешнего сообщения.
- Получить список аккаунтов по хеш кода. К примеру получить все токены которые есть в сети по хеш кода Типа контракта "TokenRootUpgradeable" равный e8801282233f38ad17fead83aeac1820e40598de98675106b0fd91d9524e9141
- Получить список входящих и исходящих сообщений по адресу аккаунта.
- Получить список транзакций по адресу аккаунта.
- На последней закладке можно переключаться между тестовой и мэйн сетью
По умолчанию клиент взаимодействует с тестовой сетью, в обработке можно переключить на мэйн сеть и обратно.
Для чего все это нужно?
Идеи можно подчерпнуть в чат ГПТ. На вскидку полезными механизмами могли бы быть:
Публикация прайсов на товары, где нет единого сервера и всем доступны предложения от других компаний. Для этого можно создать контракт, в котором сохраняются и обновляются таблицы прайс листов и контакты продавца. Найти по хеш кода все контракты в сети и получить все возможные предложения.
Публикация запросов на закупку. Аналогично первому примеру, но вы можете искать все запросы на приобретение и присылать на указанные контакты свои предложения.
Глобальная система программы лояльности, основанная на токенах, тут зависит от воображения и целей.
А еще можно просто познакомиться с работой контрактов из 1С и придумать какие-то новые идеи как это все можно использовать с пользой для себя и для других.
Стоимость газа
Одна из причин почему для взаимодействия выбран именно этот блокчейн - дешевые транзакции.
Для примера:
- Отправка нативных монет с одного кошелька на другой примерно 0,004256031 EVER. По текущему курсу это 0,000085$
- Создание нового токена примерно 1 EVER. Они хранятся на балансе аккаунта токена. По текущему курсу это 0,02$
- Отправка токена с одного кошелька на другой примерно 0,076761324 EVER. По текущему курсу это 0,0015$
Тестирование
Конфигурация тестировалась на платформе версии: 8.3.25.1374
P.S. Решение не претендует на идеальность выполнения и красоту кода. Конфигурация предназначена для демонстрации возможностей интеграции 1С с блокчейном на TVM и не является конечным продуктом.