forked from CryptozombiesHQ/cryptozombie-lessons
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
38 changed files
with
3,205 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
--- | ||
title: Фабрика Зомби | ||
header: Смелей, человек! | ||
roadmap: roadmap.jpg | ||
--- | ||
|
||
Всё ли у тебя есть для того, чтобы стать **КриптоЗомби**? | ||
|
||
На этом курсе ты научишься, как **создать игру на Ethereum**. | ||
|
||
Курс для новичков в Ethereum, но надеемся, что у тебя есть опыт программирования на других языках (например, на Javascript). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
--- | ||
title: Массивы | ||
actions: ['Проверить', 'Подсказать'] | ||
material: | ||
editor: | ||
language: sol | ||
startingCode: | | ||
pragma solidity ^0.4.19; | ||
contract ZombieFactory { | ||
uint dnaDigits = 16; | ||
uint dnaModulus = 10 ** dnaDigits; | ||
struct Zombie { | ||
string name; | ||
uint dna; | ||
} | ||
// Начало здесь | ||
} | ||
answer: > | ||
pragma solidity ^0.4.19; | ||
contract ZombieFactory { | ||
uint dnaDigits = 16; | ||
uint dnaModulus = 10 ** dnaDigits; | ||
struct Zombie { | ||
string name; | ||
uint dna; | ||
} | ||
Zombie[] public zombies; | ||
} | ||
--- | ||
|
||
Если нужен список из похожих элементов, подойдет **_массив_**. В Solidity есть два типа массивов: **_фиксированный_** и **_динамический_**: | ||
|
||
``` | ||
// Массив фиксированной длины из 2 элементов: | ||
uint[2] fixedArray; | ||
// Другой фиксированный массив из 5 строк: | ||
string[5] stringArray; | ||
// Динамический массив не ограничен по размеру и может увеличиваться: | ||
uint[] dynamicArray; | ||
``` | ||
|
||
Ты можешь создать массив из **_структур_**. Возьми структуру `Person` из предыдущей части: | ||
|
||
``` | ||
Person[] people; // Динамический массив позволяет добавлять в него данные | ||
``` | ||
|
||
Ты не забыл, что переменные состояния сохраняются в блокчейне навсегда? Создание динамического массива из подобных структур полезно для хранения структурированных данных внутри контракта, как в базе данных. | ||
|
||
## Открытые массивы | ||
|
||
Можно задать массив как `public` (открытый), и Solidity автоматически создаст для него **_геттер_** (способ получения). Синтаксис: | ||
|
||
``` | ||
Person[] public people; | ||
``` | ||
|
||
В этом случае другие контракты смогут читать этот массив (но не писать в него). Это образец хранения открытых данных в контракте. | ||
|
||
# Проверь себя | ||
|
||
Армию зомби надо где-то разместить. Мы хотим, чтобы другие приложения видели зомби, поэтому сделаем массив открытым. | ||
|
||
1. Создай открытый массив **_структур_** `Zombie` и назови его `zombies`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
--- | ||
title: Как работать со структурами и массивами | ||
actions: ['Проверить', 'Подсказать'] | ||
material: | ||
editor: | ||
language: sol | ||
startingCode: | | ||
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) { | ||
// Начало здесь | ||
} | ||
} | ||
answer: > | ||
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) { | ||
zombies.push(Zombie(_name, _dna)); | ||
} | ||
} | ||
--- | ||
|
||
### Создаем новую структуру | ||
|
||
Помнишь структуру `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. Запиши все одной строчкой, чтобы код выглядел чисто. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
--- | ||
title: Контракты | ||
actions: ['Проверить', 'Подсказать'] | ||
material: | ||
editor: | ||
language: sol | ||
startingCode: | | ||
pragma solidity //1. Здесь укажи версию Solidity | ||
//2. Здесь создай контракт | ||
answer: > | ||
pragma solidity ^0.4.19; | ||
contract ZombieFactory { | ||
} | ||
--- | ||
|
||
Начнем с азов: | ||
|
||
Код в 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`(Фабрика Зомби). | ||
|
||
Когда закончишь, кликни «Проверить» внизу. Если затрудняешься, нажми «Подсказать». |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
--- | ||
title: Переменные состояния и целые числа | ||
actions: ['Проверить', 'Подсказать'] | ||
material: | ||
editor: | ||
language: sol | ||
startingCode: | | ||
pragma solidity ^0.4.19; | ||
contract ZombieFactory { | ||
//Начало здесь | ||
} | ||
answer: > | ||
pragma solidity ^0.4.19; | ||
contract ZombieFactory { | ||
uint dnaDigits = 16; | ||
} | ||
--- | ||
|
||
Отличная работа! Теперь, когда у нас есть оболочка контракта, мы можем изучить, как 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`. |
Oops, something went wrong.