Основы Программирования Смарт-Контрактов Ton (Freeton)

Прежде чем мы начнем писать наш токен, а затем систему смарт-контрактов, давайте кратко рассмотрим важные элементы смарт-контрактов для FreeTON.

Основы программирования смарт-контрактов TON (FreeTON)

В предыдущей статье Смарт-контракт Hello Word для TON (FreeTON) мы рассмотрели самое начало работы со смарт-контрактами FreeTON и HelloWorld. Структура этой статьи:

  1. Типы чисел int и uint, чистые функции и события: напишем калькулятор на блокчейне;
  2. Структуры и массивы: смарт-контракты как база данных;
  3. Хэш-таблицы: сопоставление;
  4. Открытые ключи и требуют.
Примечание: в коде ниже в начале функций будет вызов твм.

принять(); поскольку мы все еще рассматриваем образовательные варианты смарт-контрактов.



Калькулятор

Вы можете объявить переменную числового типа, используя интервал (целое число со знаком) и uint (беззнаковое целое число).

Вы можете указать количество битов числа в суффиксе указанного числового типа, например: int8, int16, uint128 .

Типы интервал И uint - это то же самое, что int256 И uint256 .

Мы выполняем арифметические операции над числами в смарт-контракте.

Теперь напишем смарт-контракт с калькулятором.

У него одна функция расчет , что занимает 3 uint -параметр: 2 номера операндов и число, указывающее номер операции над операндами, переданными в функцию.

Наша функция расчет еще есть модификатор чистый , а это значит, что эта функция не использует данные смарт-контракта, а выполняет свои операции только с тем, что передано ей в аргументах.

В случае, когда в функцию передается неизвестный номер операции, мы генерируем событие, которое сообщает внешнему приложению, вызывающему наш смарт-контракт, о том, что что-то произошло.

  
  
   

pragma ton-solidity >= 0.35.0; pragma AbiHeader expire; contract HelloCalc { event UnknownOperator(uint op); function calc(uint a, uint b, uint op) public pure returns (uint) { tvm.accept(); if(op == 1) { return a + b; } else if(op == 2) { return a - b; } else if(op == 3) { return a * b; } else if(op == 4) { return a / b; } else if(op == 5) { return a % b; } else if(op == 6) { return a ** b; }else { emit UnknownOperator(op); return 0; } } }

События ( событие ) довольно часто используются в смарт-контрактах, но здесь нам пригодилось для предоставления дополнительной информации о том, что результат 0, возвращаемый функцией, является не результатом, а ошибкой из-за того, что неизвестное число арифметического оператора Сдан.



Структуры и массивы

То, что мы объявляем в начале (обычно) смарт-контракта, за пределами функциональной области, принадлежит области памяти, связанной со смарт-контрактом.

А поскольку смарт-контракт в конечном итоге загружается в блокчейн, данные смарт-контракта хранятся в блокчейне как в базе данных.

Давайте напишем простой смарт-контракт для хранения данных в блокчейне.



pragma ton-solidity >= 0.35.0; pragma AbiHeader expire; contract HelloUser { event NewUser(uint id); struct User { uint weight; uint balance; } User[] users; function AddUser(uint w, uint b) public { tvm.accept(); users.push(User(w, b)); emit NewUser(users.length - 1); } function GetUser(uint id) public view returns (uint w, uint b) { tvm.accept(); w = users[id].

weight; b = users[id].

balance; } }

Состав Пользователь в нашем контракте он используется для хранения информации о пользователе и содержит 2 поля данных типа uint : вес и баланс пользователя.

Поскольку мы хотим хранить данные не об одном, а о многих пользователях, то после объявления структуры мы объявили массив структур этого типа.

Теперь мы можем добавлять пользователей в наш массив, используя толкать , а затем вычисляем идентификатор нового пользователя по индексу массива — возвращаем его в событии Новый пользователь .

Обратите внимание на то, как функция возвращает значения.

GetUser : в этом случае мы объявляем переменные в возвращает , которому мы присваиваем значения в теле функции.

Также обратите внимание на модификатор чистый мы изменили его на вид .



Хэш-таблицы: сопоставление

Выше мы рассмотрели массивы, в которых ключ к значению ( Пользователь ) — индекс (или порядковый номер, начиная с нуля) элемента в нем.

Другой тип коллекций элементов — это отображения.

картографирование .

В них мы также можем хранить последовательности элементов заданного типа, как и в случае с массивами, но в отличие от массивов ключами к таким значениям являются не простые числовые индексы, а значения другого заданного типа.

Это позволяет искать элементы в отражении по строке, адресу, открытому ключу и другим значениям.

Давайте добавим такой картографирование к нашему слегка измененному примеру:

contract HelloToken { event TokenCreated(uint owner, uint tid); struct Token { string name; string symbol; } Token[] tokens; mapping (uint => uint) accounts; function NewToken() public { tvm.accept(); tokens.push(Token("", "")); accounts[tokens.length-1] = msg.pubkey(); emit TokenCreated(msg.pubkey(), tokens.length-1); } function GetTokenOwner(uint tid) public view returns (uint) { tvm.accept(); return accounts[tid]; } function GetTokenInfo(uint tid) public view returns (string _name, string _symbol) { tvm.accept(); _name = tokens[tid].

name; _symbol = tokens[tid].

symbol; } function SetTokenInfo(uint tid, string _name, string _symbol) public { require(msg.pubkey() == accounts[tid], 101); tvm.accept(); tokens[tid].

name = _name; tokens[tid].

symbol = _symbol; } }



Открытые ключи и требуют

Вызов функции смарт-контракта аналогичен отправке сообщения: мы отправляем объект, содержащий имя вызываемой функции и параметры для нее (если требуются), на адрес учетной записи со смарт-контрактом.

Кроме того, в сообщение можно добавить дополнительные данные: открытый ключ, подпись, значение.

ценить для передачи токенов ТОН Кристалл на вызываемый счет. Давайте поговорим об открытом ключе.

Вы можете получить значение открытого ключа учетной записи, которая отправила сообщение в наш смарт-контракт, вызвав функцию API. msg.pubkey() .

В функции НовыйТокен() мы выполнили задание аккаунты[токены.

длина-1] = msg.pubkey(); в котором для каждого вновь созданного ИДЕНТИФИКАТОР токен для отображения Счета Размещается публичный ключ аккаунта, создавшего этот токен, а в качестве ключа мы используем идентификатор этого токена, который вычисляем после пополнения массива жетоны .

Затем в УстановитьТокенИнфо() где мы можем настроить имя и символ для нашего токена, мы устанавливаем требование, согласно которому вызов функции может продолжаться только в случае его выполнения.

Берем открытый ключ отправителя по значению время нашел на дисплее Счета открытый ключ, установленный во время создания и сравнения.

Только если они равны, мы можем установить или изменить имя и символ токена.

Здесь описаны аспекты для читателей, изучающих тему смарт-контрактов FreeTON «с нуля», а в следующих статьях мы приступим к созданию собственного токена.

Теги: #Криптовалюты #Solidity #Solidity #смарт-контракты #смарт-контракты

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.