create account

streems



advanced mode

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

View this thread on golos.io
View on official site
@rusldv ·
$1,058.80
Язык Solidity: Переменные состояния контракта (Урок 3)

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

https://images.golos.io/DQmYUkBcJ2DWV3xrTPXokigVmYP7cJghLXcJrCcmRp5DDeb/sol-logo.jpg

Предыдущие уроки:

Язык 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.
Толку от этого конечно мало, но понимать принцип работы необходимо. Вскоре мы разберем как программировать управление доступом.

https://images.golos.io/DQmTQcV74t6avy9riR3R6bYdiQLViPo8tzkYtk7XagoGX4n/scrn1.jpg

Хранить данные в простых переменных состояния крайне не эффективно, и может пригодиться лишь для простых проектов смарт-контрактов.
Для работы с различными данными практически всегда применяются массивы и соответствия.
Массивы обозначаются типом, за которым идут квадратные скобки. Например uint8[], bytes32[] и т.д.
Такие массивы удобно индексировать в цикле. Если же мы хотим организовать подобие ассоциативного массива, то необходимо воспользоваться функцией mapping.


О массивах и соответствиях поговорим далее в этом курсе.
👍  , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
json_metadata{"tags":["ru--obrazovanie","ru--programmirovanie","ru--blokcheijn","ethereum","solidity"],"users":["vik"],"image":["https://images.golos.io/DQmYUkBcJ2DWV3xrTPXokigVmYP7cJghLXcJrCcmRp5DDeb/sol-logo.jpg","https://images.golos.io/DQmTQcV74t6avy9riR3R6bYdiQLViPo8tzkYtk7XagoGX4n/scrn1.jpg"],"links":["https://golos.io/ru--obrazovanie/@rusldv/yazyk-solidity-nello-world-urok-1","https://golos.io/ru--obrazovanie/@rusldv/yazyk-solidity-urok-2-tipy-dannykh"],"app":"golos.io/0.1","format":"markdown"}
created2017-09-03 18:45:15
active2017-09-04 20:58:12
last_payout2017-10-05 17:03:48
depth0
children6
children_rshares20
net_rshares0
vote_rshares0
children_abs_rshares0
cashout_time1969-12-31 23:59:59
max_cashout_time1969-12-31 23:59:59
total_vote_weight0
reward_weight10,000
total_payout_value937.436 GBG
curator_payout_value121.360 GBG
author_rewards288,903
net_votes81
root_comment1,551,818
modearchived
max_accepted_payout1,000,000.000 GBG
percent_steem_dollars10,000
allow_repliestrue
allow_votestrue
allow_curation_rewardstrue
root_title"Язык Solidity: Переменные состояния контракта (Урок 3)"
total_pending_payout_value0.000 GBG
author_reputation0
promoted0.000 GBG
body_length0
reblogged_by[]
author_curate_reward""
vote details (82)

vote your-acct "rusldv" "yazyk-solidity-peremennye-sostoyaniya-kontrakta-urok-3" 100 true
post_comment your-acct "re-rusldv-yazyk-solidity-peremennye-sostoyaniya-kontrakta-urok-3-20180118t114712271z" "rusldv" "yazyk-solidity-peremennye-sostoyaniya-kontrakta-urok-3" "" "your reply.." "{}" true

View on official site
@zxcat ·
$0.07

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

👍  
json_metadata{"tags":["ru--obrazovanie"],"app":"golos.io/0.1"}
created2017-09-04 14:10:33
active2017-09-04 16:37:00
last_payout2017-10-05 17:03:48
depth1
children3
children_rshares20
net_rshares0
vote_rshares0
children_abs_rshares0
cashout_time1969-12-31 23:59:59
max_cashout_time1969-12-31 23:59:59
total_vote_weight0
reward_weight10,000
total_payout_value0.055 GBG
curator_payout_value0.016 GBG
author_rewards17
net_votes1
root_comment1,551,818
modearchived
max_accepted_payout1,000,000.000 GBG
percent_steem_dollars10,000
allow_repliestrue
allow_votestrue
allow_curation_rewardstrue
root_title"Язык Solidity: Переменные состояния контракта (Урок 3)"
total_pending_payout_value0.000 GBG
author_reputation0
promoted0.000 GBG
body_length0
reblogged_by[]
author_curate_reward""
vote details (1)

vote your-acct "zxcat" "re-rusldv-yazyk-solidity-peremennye-sostoyaniya-kontrakta-urok-3-20170904t141032283z" 100 true
post_comment your-acct "re-zxcat-re-rusldv-yazyk-solidity-peremennye-sostoyaniya-kontrakta-urok-3-20180118t114712275z" "zxcat" "re-rusldv-yazyk-solidity-peremennye-sostoyaniya-kontrakta-urok-3-20170904t141032283z" "" "your reply.." "{}" true

View on official site
@rusldv ·

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

json_metadata{"tags":["ru--obrazovanie"],"app":"golos.io/0.1"}
created2017-09-04 14:24:45
active2017-09-04 16:37:00
last_payout2017-10-05 17:03:48
depth2
children2
children_rshares20
net_rshares0
vote_rshares0
children_abs_rshares0
cashout_time1969-12-31 23:59:59
max_cashout_time1969-12-31 23:59:59
total_vote_weight0
reward_weight10,000
total_payout_value0.000 GBG
curator_payout_value0.000 GBG
author_rewards0
net_votes0
root_comment1,551,818
modearchived
max_accepted_payout1,000,000.000 GBG
percent_steem_dollars10,000
allow_repliestrue
allow_votestrue
allow_curation_rewardstrue
root_title"Язык Solidity: Переменные состояния контракта (Урок 3)"
total_pending_payout_value0.000 GBG
author_reputation0
promoted0.000 GBG
body_length0
reblogged_by[]

vote your-acct "rusldv" "re-zxcat-re-rusldv-yazyk-solidity-peremennye-sostoyaniya-kontrakta-urok-3-20170904t142434465z" 100 true
post_comment your-acct "re-rusldv-re-zxcat-re-rusldv-yazyk-solidity-peremennye-sostoyaniya-kontrakta-urok-3-20180118t114712278z" "rusldv" "re-zxcat-re-rusldv-yazyk-solidity-peremennye-sostoyaniya-kontrakta-urok-3-20170904t142434465z" "" "your reply.." "{}" true

View on official site
@zxcat ·

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

json_metadata{"tags":["ru--obrazovanie"],"app":"golos.io/0.1"}
created2017-09-04 14:58:42
active2017-09-04 16:37:00
last_payout2017-10-05 17:03:48
depth3
children1
children_rshares20
net_rshares0
vote_rshares0
children_abs_rshares0
cashout_time1969-12-31 23:59:59
max_cashout_time1969-12-31 23:59:59
total_vote_weight0
reward_weight10,000
total_payout_value0.000 GBG
curator_payout_value0.000 GBG
author_rewards0
net_votes0
root_comment1,551,818
modearchived
max_accepted_payout1,000,000.000 GBG
percent_steem_dollars10,000
allow_repliestrue
allow_votestrue
allow_curation_rewardstrue
root_title"Язык Solidity: Переменные состояния контракта (Урок 3)"
total_pending_payout_value0.000 GBG
author_reputation0
promoted0.000 GBG
body_length0
reblogged_by[]

vote your-acct "zxcat" "re-rusldv-re-zxcat-re-rusldv-yazyk-solidity-peremennye-sostoyaniya-kontrakta-urok-3-20170904t145842495z" 100 true
post_comment your-acct "re-zxcat-re-rusldv-re-zxcat-re-rusldv-yazyk-solidity-peremennye-sostoyaniya-kontrakta-urok-3-20180118t114712281z" "zxcat" "re-rusldv-re-zxcat-re-rusldv-yazyk-solidity-peremennye-sostoyaniya-kontrakta-urok-3-20170904t145842495z" "" "your reply.." "{}" true

View on official site
@rusldv ·

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

json_metadata{"tags":["ru--obrazovanie"],"app":"golos.io/0.1"}
created2017-09-04 16:37:00
active2017-09-04 16:37:00
last_payout2017-10-05 17:03:48
depth4
children0
children_rshares20
net_rshares0
vote_rshares0
children_abs_rshares0
cashout_time1969-12-31 23:59:59
max_cashout_time1969-12-31 23:59:59
total_vote_weight0
reward_weight10,000
total_payout_value0.000 GBG
curator_payout_value0.000 GBG
author_rewards0
net_votes0
root_comment1,551,818
modearchived
max_accepted_payout1,000,000.000 GBG
percent_steem_dollars10,000
allow_repliestrue
allow_votestrue
allow_curation_rewardstrue
root_title"Язык Solidity: Переменные состояния контракта (Урок 3)"
total_pending_payout_value0.000 GBG
author_reputation0
promoted0.000 GBG
body_length0
reblogged_by[]

vote your-acct "rusldv" "re-zxcat-re-rusldv-re-zxcat-re-rusldv-yazyk-solidity-peremennye-sostoyaniya-kontrakta-urok-3-20170904t163656614z" 100 true
post_comment your-acct "re-rusldv-re-zxcat-re-rusldv-re-zxcat-re-rusldv-yazyk-solidity-peremennye-sostoyaniya-kontrakta-urok-3-20180118t114712284z" "rusldv" "re-zxcat-re-rusldv-re-zxcat-re-rusldv-yazyk-solidity-peremennye-sostoyaniya-kontrakta-urok-3-20170904t163656614z" "" "your reply.." "{}" true

View on official site
@dobryj.kit ·
$0.09

Ваш пост поддержали следующие Инвесторы Сообщества Добрый кит:
t3ran13, sergiy, chiliec, lelya, vik, amikphoto, semasping, gromozeka, voltash, karusel1, oksana0407, vika-teplo, mr-nikola, novy, dimas102, nerengot, wind33, dignityinside, verdon
Поэтому я тоже проголосовал за него!
Узнать подробности о сообществе можно тут:
Разрешите представиться - Кит Добрый
Правила
Инструкция по внесению Инвестиционного взноса
Вы тоже можете стать Инвестором и поддержать проект!!!


Если Вы хотите отказаться от поддержки Доброго Кита, то ответьте на этот комментарий командой !нехочу
👍  ,
created2017-09-04 14:46:33
active2017-09-04 14:46:33
last_payout2017-10-05 17:03:48
depth1
children0
children_rshares20
net_rshares0
vote_rshares0
children_abs_rshares0
cashout_time1969-12-31 23:59:59
max_cashout_time1969-12-31 23:59:59
total_vote_weight0
reward_weight10,000
total_payout_value0.090 GBG
curator_payout_value0.003 GBG
author_rewards28
net_votes2
root_comment1,551,818
modearchived
max_accepted_payout1,000,000.000 GBG
percent_steem_dollars10,000
allow_repliestrue
allow_votestrue
allow_curation_rewardstrue
root_title"Язык Solidity: Переменные состояния контракта (Урок 3)"
total_pending_payout_value0.000 GBG
author_reputation0
promoted0.000 GBG
body_length0
reblogged_by[]
author_curate_reward""
vote details (2)

vote your-acct "dobryj.kit" "re-dobryj-kit-yazyk-solidity-peremennye-sostoyaniya-kontrakta-urok-320170904t100939658z" 100 true
post_comment your-acct "re-dobryj.kit-re-dobryj-kit-yazyk-solidity-peremennye-sostoyaniya-kontrakta-urok-320170904t100939658z-20180118t114712291z" "dobryj.kit" "re-dobryj-kit-yazyk-solidity-peremennye-sostoyaniya-kontrakta-urok-320170904t100939658z" "" "your reply.." "{}" true

View on official site
@golosboard ·
$0.07

@rusldv Поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:

Награда за количество голосов

Вы можете нажать на любой бейдж, чтобы увидеть свою страницу на Доске Почета.
Чтобы увидеть больше информации о Доске Почета, нажмите здесь

Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом стоп

Голосуя за это уведомление, вы помогаете всем пользователям Голоса. Узнайте, как здесь.

👍  
json_metadata{"image":["http://i.imgsafe.org/13373383d1.jpg"]}
created2017-09-04 20:58:12
active2017-09-04 20:58:12
last_payout2017-10-05 17:03:48
depth1
children0
children_rshares20
net_rshares0
vote_rshares0
children_abs_rshares0
cashout_time1969-12-31 23:59:59
max_cashout_time1969-12-31 23:59:59
total_vote_weight0
reward_weight10,000
total_payout_value0.055 GBG
curator_payout_value0.016 GBG
author_rewards17
net_votes1
root_comment1,551,818
modearchived
max_accepted_payout1,000,000.000 GBG
percent_steem_dollars10,000
allow_repliestrue
allow_votestrue
allow_curation_rewardstrue
root_title"Язык Solidity: Переменные состояния контракта (Урок 3)"
total_pending_payout_value0.000 GBG
author_reputation0
promoted0.000 GBG
body_length0
reblogged_by[]
author_curate_reward""
vote details (1)

vote your-acct "golosboard" "golosboard-notify-rusldv-20170904t205814000z" 100 true
post_comment your-acct "re-golosboard-golosboard-notify-rusldv-20180118t114712295z" "golosboard" "golosboard-notify-rusldv-20170904t205814000z" "" "your reply.." "{}" true