Язык Solidity: Переменные состояния контракта (Урок 3)

Предыдущие уроки:
Язык Solidity. Урок 1. Основные принципы и пишем Неllo World
Язык Solidity: Типы данных (Урок 2)
Почему так важно состояние смарт-контракта
Решил не торопить события, а проводить обучение более развернуто. Здесь важно понимать, что блокчейн ошибок не прощает - карает токеном, и как правильно заметил @vik любая незамеченная ошибка в смарт-контракте может привести к потере сбережений, как у разработчика контракта, так и у его пользователей. В предыдущем уроке мы рассмотрели типы данных и привели примеры функций работы с ними. Однако переменные внутри функций локальные (типа memory). Они имеют толк только во время выполнения функции, затем стираются из памяти. Другое дело переменные состояния контракта (типа storage). Они напоминают свойства класса, если мы подразумневаем под ним контракт, и живут в блокчейне вместе с контрактом. Таким образом контракт можно рассматривать как специальный элемент базы данных на блокчейне. То есть мы можем использовать контракт как надежное хранилище данных.Я придумал небольшой простой пример, но на мой взгляд он показывает суть того, что я хочу обьяснить:
pragma solidity ^0.4.0;
contract Stat {
// The stat properties is this contract
string text = "";
uint num = 0;
// property for text
function setText() {
text = "Привет, Контракт!";
}
function getText() returns (string) {
return text;
}
// property for num
function setNum(uint n) returns (bool) {
if(n > 0) {
num = n;
return true;
} else {
return false;
}
}
function getNum() returns (uint) {
return num;
}
}
Мы объявляем переменные
string text = "";
uint num = 0;
в начале контракта, точно так же как обьявляют свойства класса.
В нашем случае это называется переменные состояния контракта.
После того, как мы добавим этот контракт в блокчейн Ethereum, они станут некоторыми ячейками для хранения данных указанного типа в блокчейне, связанные с нашим контрактом.
Так как аккаунты (пользователи и другие контракты) напрямую с переменными состояния контракта взаимодействовать не могут, мы определяем функции для работы с нашими переменными состояния.
Функции просто записывают и возвращают значения переменных.
Что здесь следует понимать:
Сам по себе контракт ни как не разлечает аккаунты, вызывающие его функции. Этот функционал разработчик должен обеспечить сам и мы вскоре это разберем.
Таким образом, любой может записать значение, перезаписать и соответственно считываемое значение, будет определяться последней записью в переменные состояния.
У нас можно менять значение переменной num - любой может вызвать функцию, например setNum(29); и в переменной num так и будет храниться значение 29, всем кто вызовет getNum(); оно и будет возвращаться, пока кто-нибудь не изменит его с помощью setNum.
Толку от этого конечно мало, но понимать принцип работы необходимо. Вскоре мы разберем как программировать управление доступом.

Хранить данные в простых переменных состояния крайне не эффективно, и может пригодиться лишь для простых проектов смарт-контрактов.
Для работы с различными данными практически всегда применяются массивы и соответствия.
Массивы обозначаются типом, за которым идут квадратные скобки. Например uint8[], bytes32[] и т.д.
Такие массивы удобно индексировать в цикле. Если же мы хотим организовать подобие ассоциативного массива, то необходимо воспользоваться функцией mapping.
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
t3ran13, sergiy, chiliec, lelya, vik, amikphoto, semasping, gromozeka, voltash, karusel1, oksana0407, vika-teplo, mr-nikola, novy, dimas102, nerengot, wind33, dignityinside, verdon
Поэтому я тоже проголосовал за него!
Узнать подробности о сообществе можно тут:
Разрешите представиться - Кит Добрый
Правила
Инструкция по внесению Инвестиционного взноса
Вы тоже можете стать Инвестором и поддержать проект!!!
Если Вы хотите отказаться от поддержки Доброго Кита, то ответьте на этот комментарий командой "!нехочу"
@rusldv Поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Вы можете нажать на любой бейдж, чтобы увидеть свою страницу на Доске Почета.
Чтобы увидеть больше информации о Доске Почета, нажмите здесь
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп
Зачем же сразу учить плохому? )
Для доступа к переменным достаточно сделать их
public
(на самом деле даже это не обязательно). А если очень хочется доступ через метод, объявить возвращаемое значение какconstant
.Так можно получать значения без необходимости отправлять транзакцию и без расхода газа.
Спасибо.В первом уроке с Hello, World! Я демонстрировал подобный метод использования с возвратом constant. Далее мы на примере этих функций будем изучать добавление данных в массивы и соответствия, а также управление доступом к этим функциям (owner).
Ага, прошёлся назад по постам, вижу упоминание. Вы кстати сами материал пишете или на основе чего-то/перевод?
Про типы данных я немного из wiki гитхаба взял. А в основном сам. Что придумаю то и пишу))