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
1 parent
895766d
commit 0fa712c
Showing
21 changed files
with
1,419 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,7 @@ | ||
--- | ||
title: มาสร้างโรงงานซอมบี้กัน | ||
header: Welcome, human! | ||
roadmap: roadmap.jpg | ||
--- | ||
ในบทเรียนนี้จะสอนเกี่ยวกับการสร้างเกมบน Ethereum โดยแพลตฟอร์มนี้ถูกออกแบบขึ้นสำหรับผู้ใช้ Solidity มือใหม่ แต่อย่างไรก็ตามผู้ใช้จะต้องมีประสบการณ์ด้านการเขียนโปรแกรมอื่นๆ มาแล้วด้วยบ้าง (e.g. 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: Arrays | ||
actions: ['checkAnswer', 'hints'] | ||
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; | ||
} | ||
// start here | ||
} | ||
answer: > | ||
pragma solidity ^0.4.19; | ||
contract ZombieFactory { | ||
uint dnaDigits = 16; | ||
uint dnaModulus = 10 ** dnaDigits; | ||
struct Zombie { | ||
string name; | ||
uint dna; | ||
} | ||
Zombie[] public zombies; | ||
} | ||
--- | ||
|
||
เมื่อคุณต้องการชุดข้อมูลของอะไรบางอย่าง คุณสามารถใช้ **_array_** มาช่วยในการจัดการได้ ซึ่งใน Solidity นั้นเราจะมี arrays อยู่2 ชนิด ได้แก่: **_fixed_** arrays และ **_dynamic_** arrays: | ||
|
||
``` | ||
// fixed Array จำกัดความยาวให้มีแค่2 elements : | ||
uint[2] fixedArray; | ||
// หรือจะเป็น fixed Array ที่สามารถมีข้อมูลชนิด Strings ได้ 5 ตัวก็จะเขียนได้ว่า: | ||
string[5] stringArray ; | ||
// Dynamic Array – จะไม่จำกัดขนาดที่แน่นอน ซึ่งแปลว่า array ชนิดนี้สามารถมีขนาดเพิ่มได้เรื่อยๆ : | ||
unit[] dynamicArray; | ||
``` | ||
|
||
เราสามารถที่จะสร้าง array ของ **_structs_** โดยใช้ `Person`‘ struct ที่อยู่ในบทก่อนหน้าได้เลย | ||
|
||
``` | ||
Person[]people; // แปลว่าเป็น dynamic Array ซึ่งเราสามารถเพิ่มค่าลงไปใน array ได้เรื่อยๆ | ||
``` | ||
|
||
จำได้ไหมว่าตัวแปรที่บอกสถานะ จะต้องถูกบรรจุถาวรอยู่ใน blockchain ดังนั้นการสร้างdynamic array ของ structs ในรูปแบบนี้จะมีประโยชน์มากสำหรับการบรรจุข้อมูลต่างๆ ในสัญญา (contract) ของคุณ สามารถเทียบได้ว่าเป็นฐานข้อมูลอย่างหนึ่งก็ว่าได้ | ||
|
||
## Public Arrays | ||
|
||
เราสามารถประกาศ array ให้มีค่าเป็น `public` และ Solidity ก็จะสร้าง **_getter_** method ขึ้นมาโดยอัตโนมัติสำหรับ array นี้ โดยหน้าตาของ syntax จะเป็นดังต่อไปนี้: | ||
|
||
``` | ||
Person[]public people; | ||
``` | ||
|
||
ทำให้ contract อื่นๆ จะสามารถอ่านค่าได้ (แต่ไม่สามารถเขียนได้) ลงใน array นี้ ดังนั้นpattern นี้จึงเหมาะสำหรับการบรรจุข้อมูลที่เป็นสาธารณะหรือว่า public ใน contract ของคุณ | ||
|
||
# ลองมาทดสอบดู | ||
|
||
ตอนนี้เรากำลังต้องการที่จะบรรจุค่าของกองกำลังซอมบี้ ลงในแอพพลิเคชั่นของเรา และต้องการที่จะให้จำนวนของซอมบี้ทั้งหมดนั้น ไปปรากฏอยู่ในแอพพลิเคชั่นอื่นๆ เช่นกัน ซึ่งนั่นก็แปลว่าเราต้องการให้กองกำลังของซอมบี้นั้นมีค่าเป็นสาธารณะ(public) | ||
|
||
1. สร้าง public array ของ `Zombie` **_structs_** แล้วตั้งชื่อว่า `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: ทำงานกับ Structs และ Arrays | ||
actions: ['checkAnswer', 'hints'] | ||
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) { | ||
// เริ่มที่ตรงนี้ | ||
} | ||
} | ||
คำตอบ: > | ||
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)); | ||
} | ||
} | ||
--- | ||
### การสร้าง Structs ใหม่ | ||
ย | ||
ังจำ struct ของเราที่ชื่อว่า `Person` | ||
ในตัวอย่างก่อนหน้าได้มั้ย? | ||
|
||
``` | ||
struct Person { | ||
uint age; | ||
string name; | ||
} | ||
Person[] public people; | ||
``` | ||
|
||
ตอนนี้เราก็จะมาศึกษาว่าจะสามารถสร้าง `Person` ขึ้นมาใหม่ได้อย่างไร และจะเพิ่มลงไปใน array ที่ชื่อว่า `people` ได้อย่างไร | ||
|
||
``` | ||
// สร้างPersonขึ้นมาใหม่: | ||
Person satoshi = Person(172, "Satoshi"); | ||
// เพิ่ม element Person ที่เราสร้างขึ้นนั้นลงไปใน Array: | ||
people.push(satoshi); | ||
``` | ||
|
||
โดยเราสามาถนำมารวมกันให้เป็นคำสั่งภายในบรรทัดเดียว เพื่อความเรียบร้อยของโค้ดได้อีกด้วย: | ||
|
||
``` | ||
people.push(Person(16, "Vitalik")); | ||
``` | ||
|
||
สังเกตได้ว่า `array.push()` จะเป็นคำสั่งที่เพิ่มข้อมูลลงในส่วน **ท้าย** ของ array ดังนั้นก็จะทำให้ข้อมูลที่อยู่ใน array นั้นก็จะถูกเรียงตามลำดับที่เราเพิ่มเข้าไป ดูได้จากตัวอย่างดังต่อไปนี้ | ||
|
||
``` | ||
uint[] numbers; | ||
numbers.push(5); | ||
numbers.push(10); | ||
numbers.push(15); | ||
// ซึ่งจะทำให้ numbersในตอนนี้มีค่า [5, 10, 15] | ||
``` | ||
|
||
# มาลองทดสอบ | ||
|
||
เริ่มจากการให้ ฟังก์ชั่น createZombie ของเราทำอะไรบางอย่างดู! | ||
|
||
1. เติม function ในส่วนของ body โดยทำให้มันสร้าง new `Zombie` ใหม่ขึ้นมา จากนั้นก็ให้เพิ่มลงไปยัง array ที่ชื่อว่า `zombies` โดย `name` และ `dna` ที่เป็นข้อมูลของ new ‘Zombie’ นั้นควรถูกนำมาจาก function arguments | ||
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: "Contracts" | ||
actions: ['checkAnswer', 'hints'] | ||
material: | ||
editor: | ||
language: sol | ||
startingCode: | | ||
pragma solidity //1. ระบุเวอร์ชั่นของ Solidity ตรงนี้ | ||
//2. สร้างContract ตรงนี้ | ||
คำตอบ: > | ||
pragma solidity ^0.4.19; | ||
contract ZombieFactory { | ||
} | ||
--- | ||
|
||
เริ่มต้นด้วยขั้นตอนที่ง่ายๆ ก่อน: | ||
|
||
โค้ดของ Solidity นั้นจะอยู่ในส่วนของ **contracts** โดย `contract` นั้นจะเรียกว่าเป็นบล็อคโครงสร้างพื้นฐานในแอพพลิเคชั่น Ethereum ซึ่งมีตัวแปรและฟังชั่นต่างๆ ขึ้นอยู่กับ contract ทั้งสิ้น สิ่งนี้จะเป็นจุดเริ่มต้นโปรเจคทั้งหมดทั้งมวลของคุณนั่นเอง | ||
|
||
contract ว่างๆ ซึ่งเราใช้ชื่อว่า `HelloWorld` ก็จะมีหน้าตาดังนี้: | ||
|
||
``` | ||
contract HelloWorld { | ||
} | ||
``` | ||
|
||
## Version Pragma | ||
|
||
ในทุกๆ โค้ดต้นฉบับของ Solidity จะต้องเริ่มต้นด้วยคำว่า “version pragma” หมายถึงการประกาศเวอร์ชั่นคอมไพล์เลอร์หรือตัวแปลภาษาของ Solidity ที่โค้ดนี้ควรใช้ ทั้งนี้ก็เพื่อป้องกันปัญหาที่โค้ดของคุณจะถูกทำลายเมื่อคอมไพล์เลอร์ในอนาคตนั้นมีการปรับเปลี่ยนไป โดยหน้าตาของขั้นตอนดังกล่าวเป็นดังนี้ : | ||
|
||
`pragma solidity ^0.4.19;` (สำหรับ Solidity เวอร์ชั่นล่าสุดขณะทำการเขียนโค้ดนี้ ซึ่งก็คือเวอร์ชั่น 0.4.19) | ||
|
||
หากนำมาวางร่วมกันกับ contract เราก็จะได้โครงสร้างเริ่มต้นว่างๆ ที่คุณจะต้องเขียนเป็นสิ่งแรกในทุกๆครั้งเมื่อสร้างโปรเจคใหม่ขึ้น: | ||
|
||
``` | ||
pragma solidity ^0.4.19; | ||
contract HelloWorld { | ||
} | ||
``` | ||
|
||
# ทดสอบ | ||
|
||
ในการที่จะสร้างกองทัพซอมบี้ เรามาลองสร้างฐานของ contract โดยใช้ชื่อว่า `ZombieFactory` | ||
|
||
1. ในกล่องด้านขวาให้ระบุตามขั้นตอนที่ได้กล่าวมา เพื่อให้เวอร์ชั่นของ Solidity ที่เราจะใช้คือเวอร์ชั่น `0.40.19` | ||
|
||
2. สร้าง contract เปล่าขึ้นมาแล้วใช้ชื่อว่า `ZombieFactory` | ||
|
||
เมื่อทำสำเร็จแล้ว ให้คลิกที่ “check answer” ด้านล่าง หรือหากขัดข้องส่วนไหนให้คลิกคำสั่ง “hint” |
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: State Variables & Integers | ||
actions: ['checkAnswer', 'hints'] | ||
material: | ||
editor: | ||
language: sol | ||
startingCode: | | ||
pragma solidity ^0.4.19; | ||
contract ZombieFactory { | ||
//start here | ||
} | ||
answer: > | ||
pragma solidity ^0.4.19; | ||
contract ZombieFactory { | ||
uint dnaDigits = 16; | ||
} | ||
--- | ||
|
||
ยอดเยี่ยม! ตอนนี้เราก็จะได้ส่วน shell ของ contractแล้ว ต่อจากนี้เราก็จะมาเรียนรู้กันว่า Solidity จะจัดการกับตัวแปรต่างๆ ได้อย่างไรบ้าง | ||
|
||
**_State variables_** จะถูกจัดเก็บถาวรลงในส่วนจัดเก็บของ contract ซึ่งนั่นก็หมายความว่ามันก็จะถูกเขียนลงในบล็อคเชนของ Ethereum เช่นกัน | ||
|
||
##### ตัวอย่าง: | ||
``` | ||
contract Example { | ||
// ในส่วนนี้จะถูกจัดเก็บถาวรลงในบล็อคเชน | ||
uint myUnsignedInteger = 100; | ||
} | ||
``` | ||
|
||
ในตัวอย่างของ contract เราจะสร้าง `uint` โดยใช้ชื่อว่า `myUnsignedInteger` และตั้งให้มีค่าเท่ากับ 100 | ||
|
||
## Unsigned Integers: `uint` | ||
|
||
ข้อมูลชนิด `uint` หรือ unsigned integer มีความหมายว่า**ค่าของมันจะต้องไม่ติดลบ** ซึ่งนอกจากนี้ก็ยังมีข้อมูลชนิด int สำหรับ signed integers เช่นกัน | ||
|
||
> โน้ต: ใน Solidity นั้น `uint` จริงๆ แล้วก็คือนามแฝงสำหรับ `uint256` หรือ 256-bit unsigned integer นั่นเอง คุณสามารถประกาศข้อมูล uints เป็นจำนวนบิทที่น้อยกว่าได้ เช่น `uint8`, `uint16`, `uint32` เป็นต้น แต่โดยปกติแล้วก็จะใช้แค่ `uint` เท่านั้น เว้นเพียงแต่ในบางกรณีซึ่งเราจะกล่าวในบทต่อๆ ไป | ||
# ทดสอบ | ||
|
||
Zombie DNA ของเรานั้นจะถูกกำหนดโดยตัวเลขจำนวน 16 ตัว | ||
|
||
ประกาศข้อมูลชนิด `uint` โดยใช้ชื่อว่า `dnaDigits` และตั้งให้มีค่าเท่ากับ `16` |
Oops, something went wrong.