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

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

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

отредактировано December 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.

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

На цьому другий урок закінчується. Продовження читати тут.

Комментарии

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