Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
rusldv
7 лет назад

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


О массивах и соответствиях поговорим далее в этом курсе.
117
326.039 GOLOS
На Golos с November 2016
Комментарии (6)
Сортировать по:
Сначала старые