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


Язык 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.


О массивах и соответствиях поговорим далее в этом курсе.

Comments 6


Зачем же сразу учить плохому? )
Для доступа к переменным достаточно сделать их public (на самом деле даже это не обязательно). А если очень хочется доступ через метод, объявить возвращаемое значение как constant.
Так можно получать значения без необходимости отправлять транзакцию и без расхода газа.

04.09.2017 14:10
0

Спасибо.В первом уроке с Hello, World! Я демонстрировал подобный метод использования с возвратом constant. Далее мы на примере этих функций будем изучать добавление данных в массивы и соответствия, а также управление доступом к этим функциям (owner).

04.09.2017 14:24
0

Ага, прошёлся назад по постам, вижу упоминание. Вы кстати сами материал пишете или на основе чего-то/перевод?

04.09.2017 14:58
0

Про типы данных я немного из wiki гитхаба взял. А в основном сам. Что придумаю то и пишу))

04.09.2017 16:37
0