КриптоЗомби. Контракты Начнем с азов
Скачать 26.82 Kb.
|
Глава 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 (Фабрика Зомби). В поле справа обозначь версию контракта Solidity как 0.4.19. Создай пустой контракт с именем 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 цифр. Создай uint под названием dnaModulus, и задай его равным 10 в степени dnaDigits. pragma solidity ^0.4.19; contract ZombieFactory { uint dnaDigits = 16; uint dnaModulus = 10 ** dnaDigits; } Глава 5: Структуры Часто нужны более сложные типы данных. Для этого в Solidity есть structs (структуры): struct Person { uint age; string name; } С помощью структур ты создашь более сложные типы данных с несколькими свойствами. Примечание: мы только что ввели новый тип string (строка). Строки используются для данных в кодировке UTF-8 произвольной длины. Пример строки приветствия = «Привет, мир!» Проверь себя Мы собираемся создать зомби! У них будет несколько свойств, поэтому структура подойдет как нельзя лучше. Создай struct (структуру) с именем Zombie. У нашей структуры Zombie будет 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; } // Начало здесь } Глава 6: МассивыЕсли нужен список из похожих элементов, подойдет массив. В Solidity есть два типа массивов: фиксированный и динамический: // Массив фиксированной длины из 2 элементов: uint[2] fixedArray; // Другой фиксированный массив из 5 строк: string[5] stringArray; // Динамический массив не ограничен по размеру и может увеличиваться: uint[] dynamicArray; Ты можешь создать массив из структур. Возьми структуру Person из предыдущей части: Person[] people; // Динамический массив позволяет добавлять в него данные Ты не забыл, что переменные состояния сохраняются в блокчейне навсегда? Создание динамического массива из подобных структур полезно для хранения структурированных данных внутри контракта, как в базе данных. Открытые массивыМожно задать массив как public (открытый), и Solidity автоматически создаст для него геттер (способ получения). Синтаксис: Person[] public people; В этом случае другие контракты смогут читать этот массив (но не писать в него). Это образец хранения открытых данных в контракте. Проверь себяАрмию зомби надо где-то разместить. Мы хотим, чтобы другие приложения видели зомби, поэтому сделаем массив открытым. Создай открытый массив структурZombie и назови его zombies. pragma solidity ^0.4.19; contract ZombieFactory { uint dnaDigits = 16; uint dnaModulus = 10 ** dnaDigits; struct Zombie { string name; uint dna; } Zombie[] public zombies; // Начало здесь } Глава 7: Как задавать функции Вот как задать функцию в Solidity : function eatHamburgers(string _name, uint _amount) { } Функция eatHamburgers (есть гамбургеры) берет два параметра: string и uint. Пока тело функции оставим пустым. Примечание: обычно (но не обязательно) имена переменных в параметрах функций записывают со знаком подчеркивания в начале, чтобы было проще отличить их от глобальных переменных. В наших урокам мы тоже будем пользоваться этим обычаем. Примерно так будет называться функция: eatHamburgers("vitalik", 100); Проверь себя Чтобы начать производить зомби, зададим функцию. Создай функцию под названием 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 что-нибудь сделать! Заполни тело функции таким образом, чтобы она создавала нового Zombie и добавляла его в массив zombies. Имя name и ДНК dna нового зомби должны браться из параметров функции. Запиши все одной строчкой, чтобы код выглядел чисто. |