Привет, незнакомец!

Похоже, вы здесь новенький. Чтобы принять участие, нажмите одну из кнопок ниже!

Смарт-контракт на Solidity: Часть 2 — визитка — mapping

отредактировано November 2017 Раздел: Смарт Контракты

Серия уроков были взяты с сайте inaword.ru

В сегодняшнем уроке мы напишем смарт-контракт визитку и познакомимся с двумя типами данных — mapping и uint:

Пусть наша визитка хранит только имя и возраст. Т.е. внутри контракта будет две переменные.

  1. name — имя — переменная уже знакомого нам по первому уроку типа string
  2. age — возраст — переменная типа uint. uint — сокращенно от unsigned int — беззнаковое целое. Целое положительное число по русски.

Также в контракте будут функции для доступа к нашим переменным. Итак, наш контракт:

    pragma solidity ^0.4.13;

    contract BusinessCard {

        string name;

        uint age;

        function getName() constant returns (string) {
            return name;
        }

        function setName(string newName) {
            name = newName;
        }

        function getAge() constant returns (uint) {
            return age;
        }

        function setAge(uint newAge) {
            age = newAge;
        }

    }

Запустите (как запускать контракт описано в первом уроке) контракт и поиграйтесь с ним. Установите и получите возраст и имя.

Теперь попробуйте самостоятельно добавить поле «год рождения». Внизу решение. Постарайтесь не подсматривать.

pragma solidity ^0.4.13;

contract BusinessCard {

    string name;

    uint age;

    uint year;

    function getName() constant returns (string) {
        return name;
    }

    function setName(string newName) {
        name = newName;
    }

    function getAge() constant returns (uint) {
        return age;
    }

    function setAge(uint newAge) {
        age = newAge;
    }

    function getYear() constant returns (uint) {
        return year;
    }

    function setYear(uint newYear) {
        year = newYear;
    }

}

На данный момент наша визитка хранит три поля — год рождения, имя и возраст. А что если нам потребуется добавить еще какую-нибудь информацию? Добавлять поля в код контракта как вы уже убедились очень просто. Но каждый раз когда мы меняем контракт его нужно заново заливать в блокчейн. И это уже будет новый контракт. Поэтому нам нужно как-то решить эту проблему.

На помощь нам придет тип данных — mapping. Записывается он так:

mapping (тип_ключей => тип_значений) имя_переменной;

Это массив, который хранит пары (ключ => значение). Если вы не сталкивались с этим типом данных раньше, то можно его представлять себе как таблицу из двух столбцов, которую можно расширять. При этом каждый столбец имеет тип.

Для нашей карточки ключи — это имена полей. Данные нашей визитной карточки разных типов. А в mapping значения иметь должны один общий тип. Проще всего все значения представить в виде строк. А выглядеть это будет так

mapping (bytes32 => string) data;

Почему ключ типа bytes32? Дело в том что ключем не может быть строка, поэтому мы строку будем преобразовывать в тип bytes32 с помощью функции sha256. Вдаваться в подробности пока не будем, просто примите это пока как данное.

Тогда добавление в mapping нового элемента в нашем случае будет выглядеть следующим образом:

data[sha256("newFiled")] = "new value";

а получение соответственно:

string returnedValue = data[sha256("newField")];

Таким образом мы можем записывать в mapping произвольное количество значений. Перепишем наш контракт-визитку:

pragma solidity ^0.4.13;

contract BusinessCard {

    mapping (bytes32 => string) data;

    function setData(string key, string value) {
        data[sha3(key)] = value;
    }

    function getData(string key) constant returns(string) {
        return data[sha3(key)];
    }

}

Запишем его в блокчейн (как это делать описано в первом уроке) и попробуем записать электронную почту в нашу визитку. Обратите внимание как прописывать параметры функции при вызове, когда параметров несколько — через запятую:

Прописывает почту, нажимаем setData. А потом пробуем получить данные. Пишем что хотим получить «email» и вызываем getData.

Поиграйтесь с контрактом, попробуйте добавить другие поля, например телефон или город.

На этом второй урок заканчивается. Продолжение читать тут.

Войдите или Зарегистрируйтесь чтобы комментировать.