Главная страница

КриптоЗомби. Контракты Начнем с азов


Скачать 26.82 Kb.
НазваниеКонтракты Начнем с азов
Дата02.09.2022
Размер26.82 Kb.
Формат файлаdocx
Имя файлаКриптоЗомби.docx
ТипГлава
#659724

Глава 2: Контракты

Начнем с азов:

Код в Solidity помещают внутри контрактов. contract — это базовый блок для создания приложений на Ethereum. Все переменные и функции принадлежат контракту, он — отправная точка проекта.

Пустой контракт под названием HelloWorld (Привет, мир!) будет выглядеть так:

contract HelloWorld {


}

Версия pragma

Любой код на Solidity начинается с «версии pragma» — объявления, с какой версией компилятора Solidity совместим код. Это делается для того, чтобы избежать проблем с будущими версиями компилятора, содержащими изменения и потенциально способными испортить код.

Вот так: pragma solidity ^0.4.19; (на момент написания кода используется версия Solidity 0.4.19).

Соберем все вместе и получим скелет будущего контракта. Ты будешь начинать с этого каждый раз, когда создаешь новый проект:

pragma solidity ^0.4.19;
contract HelloWorld {
}

Проверь себя

Чтобы начать создавать армию зомби, напишем базовый контракт и назовем его ZombieFactory (Фабрика Зомби).

  1. В поле справа обозначь версию контракта Solidity как 0.4.19.

  2. Создай пустой контракт с именем ZombieFactory(Фабрика Зомби).

Когда закончишь, кликни «Проверить» внизу. Если затрудняешься, нажми «Подсказать».

Глава 3: Переменные состояния и целые числа

Отличная работа! Теперь, когда у нас есть оболочка контракта, мы можем изучить, как Solidity работает с переменными.

Переменные состояния записываются в хранилище контракта. Это означает, что они сохраняются в блокчейне Ethereum, как в базе данных.

Пример:

contract Example {

// Контракт навсегда сохранен в блокчейне

uint myUnsignedInteger = 100;

}

В этом примере контракта мы создали uint под названием myUnsignedInteger и присвоили ему значение 100.

Целые числа без знака: uint

Тип данных uint — это целые числа без знака, то есть их значение не может быть отрицательным. Еще есть тип данных int для целых чисел со знаком.

Примечание: в Solidity uint используют как синоним для uint256, 256-битного целого числа без знака. Можно задать uint с меньшим количество битов — uint8, uint16, uint32 и.т.д. Но обычно используют просто uint, кроме особенных случаев, о которых мы поговорим далее.

Проверь себя

ДНК зомби будет определяться номером из 16 цифр.

Задай переменную состояния uint под названием dnaDigits (номер ДНК) и установи ее значение равным 16.

Глава 4: Математические операции

Математика в Solidity довольна проста. Операции точно такие же, как в большинстве языков программирования:

  • Сложение: x + y

  • Вычитание: x - y,

  • Умножение: x * y

  • Деление: x / y

  • Модуль и остаток от деления: x % y (например, 13 % 5 будет равно 3, если разделить 13 на 5, в остатке 3)

Solidity поддерживает экспоненциальные операции exponential operator — возведение в степень (например "x в степени y", x^y):

uint x = 5 ** 2; // 5 в квадрате = 25

Проверь себя

Чтобы убедиться, что ДНК зомби составляет всего 16 символов, создадим еще один uint со значением 10^16. Таким образом, мы сможем позже использовать оператор модуля % для сокращения целого числа до 16 цифр.

  1. Создай uint под названием dnaModulus, и задай его равным 10 в степени dnaDigits.

  2. pragma solidity ^0.4.19;



  3. contract ZombieFactory {



  4. uint dnaDigits = 16;



  5. uint dnaModulus = 10 ** dnaDigits;

  6. }

Глава 5: Структуры

Часто нужны более сложные типы данных. Для этого в Solidity есть structs (структуры):

struct Person {

uint age;

string name;

}
С помощью структур ты создашь более сложные типы данных с несколькими свойствами.

Примечание: мы только что ввели новый тип string (строка). Строки используются для данных в кодировке UTF-8 произвольной длины. Пример строки приветствия = «Привет, мир!»

Проверь себя

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

  1. Создай struct (структуру) с именем Zombie.

  2. У нашей структуры Zombie будет 2 свойства: name (имя) (string (строка)), и dna (ДНК) (uint).

  3. pragma solidity ^0.4.19;



  4. contract ZombieFactory {



  5. uint dnaDigits = 16;

  6. uint dnaModulus = 10 ** dnaDigits;



  7. struct Zombie {

  8. string name;

  9. uint dna;

  10. } // Начало здесь



  11. }


Глава 6: Массивы


Если нужен список из похожих элементов, подойдет массив. В Solidity есть два типа массивов: фиксированный и динамический:

// Массив фиксированной длины из 2 элементов:

uint[2] fixedArray;

// Другой фиксированный массив из 5 строк:

string[5] stringArray;

// Динамический массив не ограничен по размеру и может увеличиваться:

uint[] dynamicArray;

Ты можешь создать массив из структур. Возьми структуру Person из предыдущей части:

Person[] people; // Динамический массив позволяет добавлять в него данные

Ты не забыл, что переменные состояния сохраняются в блокчейне навсегда? Создание динамического массива из подобных структур полезно для хранения структурированных данных внутри контракта, как в базе данных.

Открытые массивы


Можно задать массив как public (открытый), и Solidity автоматически создаст для него геттер (способ получения). Синтаксис:

Person[] public people;

В этом случае другие контракты смогут читать этот массив (но не писать в него). Это образец хранения открытых данных в контракте.

Проверь себя


Армию зомби надо где-то разместить. Мы хотим, чтобы другие приложения видели зомби, поэтому сделаем массив открытым.

  1. Создай открытый массив структурZombie и назови его zombies.

  2. pragma solidity ^0.4.19;



  3. contract ZombieFactory {



  4. uint dnaDigits = 16;

  5. uint dnaModulus = 10 ** dnaDigits;



  6. struct Zombie {

  7. string name;

  8. uint dna;

  9. }



  10. Zombie[] public zombies; // Начало здесь



  11. }



Глава 7: Как задавать функции

Вот как задать функцию в Solidity :

function eatHamburgers(string _name, uint _amount) {
}

Функция eatHamburgers (есть гамбургеры) берет два параметра: string и uint. Пока тело функции оставим пустым.

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

Примерно так будет называться функция:

eatHamburgers("vitalik", 100);

Проверь себя

Чтобы начать производить зомби, зададим функцию.

  1. Создай функцию под названием createZombie (создать зомби), которая берет 2 параметра: _name (имя, строка string) и _dna (ДНК, тип uint).

Пока оставь тело функции пустым, мы заполним его позже.

pragma solidity ^0.4.19;
contract ZombieFactory {
uint dnaDigits = 16;

uint dnaModulus = 10 ** dnaDigits;
struct Zombie {

string name;

uint dna;

}
Zombie[] public zombies;
function createZombie(string _name, uint _dna) {

}
}

Глава 8: Как работать со структурами и массивами

Создаем новую структуру

Помнишь структуру Person (личность) из предыдущего примера?

struct Person {

uint age;

string name;

}
Person[] public people;

Посмотри, как создать новые личности Person и добавить их в массив people(люди):

// Создать новую личность:

Person satoshi = Person(172, "Satoshi");
// Добавить личность в массив:

people.push(satoshi);

Можно совместить и записать одной строчкой, чтобы код выглядел чище:

people.push(Person(16, "Vitalik"));

Обрати внимание, что array.push() обозначает конец массива, поэтому элементы выстраиваются в порядке добавления. Пример:

uint[] numbers;

numbers.push(5);

numbers.push(10);

numbers.push(15);

// Числа равны [5, 10, 15]

Проверь себя

Заставим функцию createZombie что-нибудь сделать!

  1. Заполни тело функции таким образом, чтобы она создавала нового Zombie и добавляла его в массив zombies. Имя name и ДНК dna нового зомби должны браться из параметров функции.

  2. Запиши все одной строчкой, чтобы код выглядел чисто.


написать администратору сайта