Прежде чем мы начнем писать наш токен, а затем систему смарт-контрактов, давайте кратко рассмотрим важные элементы смарт-контрактов для FreeTON.
В предыдущей статье Смарт-контракт Hello Word для TON (FreeTON) мы рассмотрели самое начало работы со смарт-контрактами FreeTON и HelloWorld. Структура этой статьи:
- Типы чисел int и uint, чистые функции и события: напишем калькулятор на блокчейне;
- Структуры и массивы: смарт-контракты как база данных;
- Хэш-таблицы: сопоставление;
- Открытые ключи и требуют.
принять();
поскольку мы все еще рассматриваем образовательные варианты смарт-контрактов.
Калькулятор
Вы можете объявить переменную числового типа, используя интервал (целое число со знаком) и uint (беззнаковое целое число).Вы можете указать количество битов числа в суффиксе указанного числового типа, например: int8, int16, uint128 .
Типы интервал И uint - это то же самое, что int256 И uint256 .
Мы выполняем арифметические операции над числами в смарт-контракте.
Теперь напишем смарт-контракт с калькулятором.
У него одна функция расчет , что занимает 3 uint -параметр: 2 номера операндов и число, указывающее номер операции над операндами, переданными в функцию.
Наша функция расчет еще есть модификатор чистый , а это значит, что эта функция не использует данные смарт-контракта, а выполняет свои операции только с тем, что передано ей в аргументах.
В случае, когда в функцию передается неизвестный номер операции, мы генерируем событие, которое сообщает внешнему приложению, вызывающему наш смарт-контракт, о том, что что-то произошло.
События ( событие ) довольно часто используются в смарт-контрактах, но здесь нам пригодилось для предоставления дополнительной информации о том, что результат 0, возвращаемый функцией, является не результатом, а ошибкой из-за того, что неизвестное число арифметического оператора Сдан.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; } } }
Структуры и массивы
То, что мы объявляем в начале (обычно) смарт-контракта, за пределами функциональной области, принадлежит области памяти, связанной со смарт-контрактом.А поскольку смарт-контракт в конечном итоге загружается в блокчейн, данные смарт-контракта хранятся в блокчейне как в базе данных.
Давайте напишем простой смарт-контракт для хранения данных в блокчейне.
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 #смарт-контракты #смарт-контракты
-
Точность Хронометража, Часы И Их Развитие
19 Oct, 24 -
Хипстер С Дрелью На Марсе
19 Oct, 24 -
«Бегун» Подключил Внешние Системы Статистики
19 Oct, 24