[Solidity, Криптовалюты] Основы программирования смарт-контрактов TON (FreeTON)
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Перед тем как мы начнем писать свой токен, а затем систему смарт-контрактов, давайте проведем краткий обзор важных элементов смарт-контрактов для FreeTON.
В предыдущей статье Hello Word смарт-контракт для TON (FreeTON) мы рассмотрели самое начало работы с смарт-контрактами FreeTON и HelloWorld.Структура данной статьи:
- Типы чисел int и uint, pure-функции и event (события): напишем калькулятор на blockchain;
- Структуры и массивы: смарт-контракты как база данных;
- Хеш-таблицы: mapping;
- Публичные ключи и require.
Примечание: в коде далее в начале функций будет присутствовать вызов tvm.accept(); поскольку мы пока что рассматриваем учебные варианты смарт-контрактов.КалькуляторОбъявить переменную с числовым типом можно с помощью int (целое число со знаком) и uint (целое без знака). Можно указать количество бит для числа в суффиксе указанного числового типа, например: int8, int16, uint128. Типы int и uint - это то же что и int256 и uint256. Над числами в смарт-контракте мы производим арифметические операции. Теперь напишем смарт-контракт с калькулятором. Он имеет одну функцию calc, которая принимает 3 uint-параметра: 2 числа-операнда и число, обозначающее номер операции над переданными функции операндами. У нашей функции calc также присутствует модификатор pure, что говорит, о том, что данная функция не использует данные смарт-контракта, а выполняет свои операции только с тем, что ей передано в аргументах.В случае когда в функцию передается неизвестный ей номер операции мы генерируем событие, которое сообщает внешнему вызывающему наш смарт-контракт приложению, что что-то произошло.
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;
}
}
}
События (event) в смарт-контрактах используются весьма часто, а тут оно нам пригодилось, для того, чтобы сообщить дополнительную информацию, о том, что возвращаемый функцией результат 0 это не результат, а ошибка связанная с тем, что передан неизвестный номер арифметического оператора.Структуры и массивыТо что мы объявляем в начале (как правило) смарт-контракта, вне области функций, относится к области памяти, связанной со смарт-контрактом. А так, как смарт-контракт в итоге становится загружен в blockchain, то данные смарт-контракта хранятся в blockchain как в базе данных. Напишем простой смарт-контракт для хранения данных в blockchain.
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;
}
}
Структура User в нашем контракте служит для хранения информации о пользователе, и содержит 2 поля данных типа uint: вес и баланс юзера. Поскольку мы хотим хранить данные не об одном, а о многих юзерах, после объявления структуры, мы объявили массив структур этого типа. Теперь мы можем добавлять в наш массив пользователей с помощью push, а затем вычислив по индексу массива идентификатор нового юзера - возвращаем его в событии NewUser.Обратите внимание на то как выглядит возврат значений функцией GetUser: в данном случае мы объявляем переменные в returns, которым в теле функции присваиваем значения. Также заметьте модификатор pure мы поменяли на view.Хеш-таблицы: mappingВыше мы рассмотрели массивы, у которых ключом к значению (User) является индекс (или порядковый номер, начиная с нуля) элемента в нём. Другой разновидностью коллекций элементов являются отображения mapping. В них также мы можем хранить последовательности элементов заданного типа, как и в случае с массивами, но в отличии от массивов, ключами к таким значениям являются не простые числовые индексы, а значения другого заданного типа. Это позволяет производить поиск элементов в отражении по строке, адресу, публичному ключу и другим значениям.Давайте добавим такой mapping в наш немного переделанный пример:
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;
}
}
Публичные ключи и requireВызов функции смарт-контракта похож на отправку сообщения, в том плане, что мы отправляем на адрес аккаунта со смарт-контрактом объект, содержащий название вызываемой функции и параметры для нее (если они требуются). Помимо этого в сообщение может быть добавлены дополнительные данные: публичный ключ, подпись, значение value для передачи токенов TON Crystal в вызываемый аккаунт. Поговорим о публичном ключе. Получить значение публичного ключа аккаунта отправившего сообщение нашему смарт-контракту можно путем вызова API функции msg.pubkey(). В функции NewToken() мы выполнили присваивание accounts[tokens.length-1] = msg.pubkey(); в котором для каждого вновь создаваемого ID токена в отображение accounts помещается публичный ключ создавшего этот токен аккаунта, а в качестве ключа мы используем идентификатор этого токена, который вычисляем после пополнения массива tokens. Затем в SetTokenInfo() где мы можем настроить название и символ для нашего токена, мы задаем требование, только при выполнении которого возможно продолжение вызова функции. Мы берем публичный ключ отправителя по значению tid находим в отображении accounts установленный при создании публичный ключ и сравниваем. Только если они равны мы сможем установить или изменить имя и символ токена.Тут были описаны аспекты, для читателей, изучающих тему смарт-контрактов FreeTON "с нуля", а в следующих статьях мы начнем создавать собственный токен.
===========
Источник:
habr.com
===========
Похожие новости:
- [Распределённые системы, Копирайт, Криптовалюты, Будущее здесь] Истерия с NFT и современным искусством, поданная через призму Пелевина: вам нужно только 10 мин., чтобы быть в теме
- [История IT, Финансы в IT, Криптовалюты] Курс биткоина впервые превысил $60 тысяч
- [Монетизация игр, Распределённые системы, Киберпанк, Криптовалюты, Будущее здесь] Суть NFT и психология их покупок
- [Криптовалюты, Экология] Проблема влияния на климат майнинга Биткоина
- [Платежные системы, Бизнес-модели, Криптовалюты] PayPal покупает криптовалютный стартап Curv
- [Solidity, Криптовалюты] Hello Word смарт-контракт для TON (FreeTON)
- [Законодательство в IT, Криптовалюты] Джона Макафи обвинили в отмывании денег с помощью криптовалют
- [Программирование, Бизнес-модели, Криптовалюты] Продажа твиттов без NFT и СМС
- [Читальный зал, Финансы в IT, Криптовалюты] Превращение искусства в виртуальный актив: зачем сожгли картину Бэнкси?
- [Обработка изображений, Дизайн, Финансы в IT, Криптовалюты] Ответы на часто задаваемые вопросы о NFT (перевод)
Теги для поиска: #_solidity, #_kriptovaljuty (Криптовалюты), #_smart_contracts, #_solidity, #_kriptovaljuty (
Криптовалюты
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 23-Ноя 07:07
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Перед тем как мы начнем писать свой токен, а затем систему смарт-контрактов, давайте проведем краткий обзор важных элементов смарт-контрактов для FreeTON. В предыдущей статье Hello Word смарт-контракт для TON (FreeTON) мы рассмотрели самое начало работы с смарт-контрактами FreeTON и HelloWorld.Структура данной статьи:
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; } } 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; } } =========== Источник: habr.com =========== Похожие новости:
Криптовалюты ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 23-Ноя 07:07
Часовой пояс: UTC + 5