เรียนปูพื้นฐานพร้อมสร้างเหรียญ ใน Discord Naga DAO
ถ้าจำไม่ผิดน่าจะเห็นจากน้องม่อนในห้อง Stocker DAO จริงๆเข้า discord ของ Naga DAO ช่วง Crypto Expo พอเห็นกิจกรรมน่าสนใจเลยเข้าไปจอยจ้า
เนื่องจากตอนที่คุณเอฟสอน แล้วมีเหตุขัดข้องในการอัดย้อนหลัง เลยเป็น exclusive content เฉพาะคนที่ได้เรียนในวันนั้นไปเลย 5555555 เราก็เลยมาสรุปให้ฟังว่าได้เรียนอะไรบ้าง
ก่อนอื่นขอเกริ่นพื้นฐานของเราก่อน เราเป็น Android Developer ที่พอได้เรียนรู้เรื่องเกี่ยวกับ Smart Contract มาบ้าง เรียน Cryptozombies ไปบทเดียวเอง และได้ฟัง session จากงานอื่นๆที่เกี่ยวกับเรื่องนี้มาบ้าง แต่ยังไม่เคยลงมือทำ product จริงๆเนอะ
ในวันนั้นใครที่ยังไม่มีพื้นฐานตรงนี้ คุณเอฟอธิบายเข้าใจง่ายมากๆนะ เหมาะกับคนที่ยังมีพื้นฐานไม่เยอะ (เพราะถ้าเราๆสอนกันน่าจะสอนแล้วเข้าใจยากกว่านี้ 555)
Blockchain คืออะไร?
นิยามของ blockchain คือ database แบบกระจาย โดยแบบ centralized เราจะเชื่อใจคนกลางที่เดียว เช่น มีธนาคารเป็นศูนย์กลาง ซึ่งบางธนาคารของโลกใบนี้ไว้ใจไม่ได้ ไม่มีประสิทธิภาพมากเพียงพอ และไม่ตอบโจทย์ จึงเกิด decentralized ขึ้นมา เพื่อกระจายอำนวจให้ประชาชน
การทำธุรกรรมต่างๆ เช่น โอนเงิน เราจะทำผ่าน node ต่างๆผ่านระบบ blockchain แต่ละ node ก็จะมีการแข่งขันในการยืนยันธุรกรรมที่เกิดขึ้นในนั้น โดยใช้วิธีแบบ Proof-of-work (POW) เช่นของ Bitcoin, Etheruem
Bitcoin เป็นสกุลเหรียญดิจิตอนแรกที่ใช้ blockchain และ cryptography การเข้ารหัสต่างๆ กำเนิดขึ้นในปี 2009 เป็นตัวบุกเบิกที่สำคัญ ส่วน Etheruem เป็นตัวริเริ่มในการทำ smart contract
History of Ethereum
เนื่องจาก Bitcoin ยังไม่ตอบโจทย์หลายๆอย่าง เพราะมันทำหน้าที่ได้แต่รับส่งเหรียญอย่างเดียว ทำ for-loop ไม่ได้ เลยต่อยอดไปทำ Dapp ไม่ได้ จริงๆตัว Bitcoin มันมี script เป็น stack based นะ
อันนี้แอบไปหาเพิ่มเติมมา
Vitalik Buterin มองว่าตัว Bitcoin มันควรทำอย่างอื่นได้ จึง suggest ให้ทาง Bitcoin เพิ่มให้ แต่ทางเขาไม่เอา เพราะการอัพเดต blockchain ไม่ใช่เรื่องง่าย และไม่อยากให้มันล่มสลายในยุคที่ตัวเองอยู่
จึงกลายเป็น Ethereum ในยุค blockchain 2.0 กำเนิดขึ้นในปี 2015 มี smart contracts program (Turing Completeness) เขียนอะไรต่างๆได้มากขึ้น และใช้ UTXO (unspent transaction output) อย่างมีนัยสำคัญ คือ สามารถทำ parallel กันได้ แต่คนอ่านจะงง จึงทำเป็น account balance ทำบัญชีรายรับรายจ่าย ปรับความยุ่งยากที่มีให้เข้าใจได้ง่ายขึ้น แต่ละ transaction จะต้องรออันก่อนหน้าทำให้เสร็จก่อน เพื่อไม่ให้เกิดปัญหา
ตัว Ethereum มีทั้ง token ERC20 คือเหรียญ ETH (Ether) และ ERC721 เป็นของ NFT
Smart Contract : ทำงานยังไง และต้องเข้าใจและ control มันให้ได้
มีคนนิยาม Smart Contract ว่าเป็น vending machine กดซื้อเครื่องดื่มในตู้ มีการทำงานทั้งแบบ manual และ auto
Benefits of smart contracts
แบบ ideal ที่นิยามโดย IBM
- Speed, efficiency and accuracy : ความเร็ว ประสิทธิภาพ และความถูกต้องแม่นยำในการทำธุรกรรม
- Trust and transparency : เนื่องจากไม่มีตัวกลางในการทำธุรกรรม ทำให้สามารถเชื่อมั่น และตรวจสอบได้
- Security : ความปลอดภัย จะไม่สามารถแก้ transaction ที่เกิดขึ้นได้ และถ้าจะแก้ จะต้องแก้ทั้งหมดในระบบ
- Savings : ประหยัดเวลาในการทำธุรกรรม
ในความเป็นจริงจะมีแค่ 3 อย่างนี้เท่านั้น
- Immutable : ไม่สามารถเปลี่ยนได้ นอกจากสร้างช่องว่างบางอย่างให้เข้าไปแก้อะไรบางอย่างได้บ้าง
- Transparency : โปร่งใส ตรวจสอบได้
- Programable : เขียนโปรแกรมให้ทำอะไรก็ได้ ตราบใดที่มีจินตนาการ และเงินที่มากเพียงพอ
มาทำความรู้จัก Solidity ผ่านการลงมือทำกันเถอะ
Solidity เป็น programming language ในการเขียน smart contract บน EVM (Ethereum Virtual Machine) ซึ่งนอกจาก chain Ethereum แล้ว ยังมี Binance Smart Chain, Avalance, Kub chain, Optimism, Arbitrum เป็นต้น
ตัวภาษา Solidity ได้รับอิทธิพลจากภาษา C++, Python และ JavaScript
ส่วนภาษาอื่นๆที่ใช้กัน แต่น้อยกว่า Solidity ก็จะมี Vyper, Rust แล้วก็ Cairo
หลักการทำงาน
มีความเข้าใจ และสื่อสารกับคอมพิวเตอร์ที่เป็น Ethereum ได้ คุยกันเป็น bytecode (คุยกันด้วยเลข 0, 1) มีตัวแปลงภาษา Solidity เป็น byte code โดยผ่าน compiler
ในที่นี้เราจะใช้ Remix เป็น editor นะ
ทดลองใช้ Remix เขียน Solidity กันเถอะ
ไปที่ Remix
ใน Editor Online ตัวนี้มี default_workspace
ให้เราอยู่แล้วเนอะ
สร้างไฟล์ใหม่โดยการกดตรง icon กระดาษเปล่า
แล้วสร้างไฟล์ที่ชื่อว่า HelloWorld.sol
เราจะได้ไฟล์เปล่าๆมาเนอะ
จากนั้นมา import Solidity โดยเราจะใช้ version 0.8.0 ขึ้นไป เป็นการบอกว่าจะใช้ version ภายใน 0.8.0 เท่านั้น ทำให้เราเรียนรู้มันได้ง่ายขึ้น
pragma solidity ^0.8.0;
และใช้ ;
เพื่อบอกว่าจบบรรทัดแล้วนะ
การขึ้น smart contract ใหม่ จะทำแบบ single-file template คือ มี 1 contract ต่อ 1 file โดยเราจะสร้าง contract ใหม่ ชื่อว่า HelloWorld
ตามชื่อไฟล์
pragma solidity ^0.8.0;
contract HelloWorld {
//todo
}
เมื่อเขียนแล้วลองกด Ctrl + s หรือไปที่ tab ตัวโลโก้ของภาษา Solidity แล้วกดปุ่ม Compile HelloWorld.sol เพื่อ compile และ deploy แล้วทำการ check error ให้เราด้วย
ถ้าขี้เกียจกดปุ่ม compile บ่อยๆ ให้ติ๊กถูกที่ Auto compile ได้เลย
พบว่าจะมี warning ให้ใส่ license ในที่นี้จะใช้ของ MIT เนอะ ไว้บรรทัดบนสุดเลย
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract HelloWorld {
//todo
}
จากนั้นมาเริ่มสร้างตัวแปร โดยการประกาศตัวแปรนนั้นว่ามี data type อะไร ซึ่งก็เหมือนภาษาปกติทั่วไป และอย่าลืม ;
สำหรับชาวคนใช้ภาษาโปรแกรมที่ไม่ใช่เจ้านี่จบบรรทัดนะ เช่น
string hello = "Hello World";
ตัวแปร hello
เป็น data type แบบ String มีค่าเป็น Hello World
จากนั้นลองกด deploy ไปหนึ่งรอบ พบว่าเราจะไม่เห็นค่าของเจ้า hello
นะ เนื่องจาก permission ของตัวแปรนี้ เป็นแบบ private คือสามารถเห็นและใช้งานได้ใน class ของ contract นี้เท่านั้น แต่ก็แกะได้ ป้องกันการ decode ได้ในระดับนึง
ดังนั้นจึงใส่ public
เพิ่มไป เพื่อให้เราเห็นค่าของตัวแปร hello
เมื่อกด deploy แล้ว เราสามารถกดเล่นเพื่อดูค่าได้ เพราะว่าถ้าเราประกาศตัวแปรแบบ public ใครๆก็สามารถเข้าถึงได้นั่นเอง
string public hello = "Hello World";
นอกจากตัวแปรประเภท String แล้ว มีอื่นๆอีกไหมนะ?
มีเหมือนภาษาปกติทั่วไปเลย ถ้าเป็น data type แบบตัวเลข มักจะใช้ unit256 กัน uint คือ unsigned integer เนื่องจาก int ปกติสามารถติดลบได้ ทำให้อาจจะเกิด overflow หรือ underflow ได้ เลยเป็น 256 bit เก็บค่าตัวเลขที่ติดลบไม่ได้
uint256 public money = 100;
ต่อมาสร้าง function ซึ่งก็เหมือนภาษาอื่นๆแหละ เป็นแบบนี้
function deposit(uint256 _amount) public {
//todo
}
function นี้มีชื่อว่า deposit
เอาไว้ฝากเงินนะ มี parameter คือ _amount
เป็น data type แบบ unit256
โดยเป็น public class
ข้างในเราเอาตัวแปร money
มาทำการบวกเพิ่มอีก 1000 จะเป็นแบบนี้
function deposit(uint256 _amount) public {
money += _amount;
}
โดย money += _amount;
ก็คือ money = money + _amount;
เป็นการเขียนแบบย่อนั่นเอง
เมื่อกด deploy แล้วลองเล่นดู พบว่าเราสามารถใส่ค่า _amount
เพื่อฝากเงินเพิ่มเข้าไปในระบบได้ และดู money ที่เราฝากไว้ได้
ต่อมาลอง deploy กับ web 3 จริงๆ เปลี่ยนจาก JavaScript VM (London) เป็น Injected Web3 แล้วมันก็เด้งให้เราเข้าไปเชื่อมต่อกับ Metamask เลือก account ที่เราต้องการ
เมื่อกด Deploy จะเด้งหน้า Metamask เพื่อกดยืนยัน transaction ของเรา
แต่ก่อนจะยืนยันธุรกรรม เราจะต้องมีเหรียญ ETH ติดกระเป๋าไว้ก่อน ในที่นี้จะทำผ่าน Rinkeby Test Network เนอะ โดยไปที่เว็บนี้
จากนั้นทำการเชื่อมต่อกระเป๋าของเราให้เรียบร้อย จะได้ wallet address ของเรามา (แต่ขอลบเพื่อ censor ไว้ก่อน)
จากนั้นรอระบบ confirm แปปนึง เราก็จะได้เหรียญมาใช้เทสแล้วนะ
สุดท้าย ทำการ verify contract ของเรา โดยกดไปดูที่ transaction ที่เราได้ทำการ deploy smart contract นี้ แล้วกด View on block explorer จะเข้าสู่หน้า Transaction Details
จากนั้นคลิกลิงค์ไปของ contract ของเรา ไปที่แท็บ Contract กด Verify and Publish
เรา copy code ที่เขียนไว้เมื่อกี้ใส่ลงไป เพิ่มเติมข้อมูลไปดังนี้
- Compiler Type : Solidity (Single file)
- Compiler Version : ใส่ version ของ Solidity ที่เรา compile ในที่นี้เป็น v0.8.7
- Open Source License Type : เลือกเป็น MIT ที่เราได้ใส่ comment ไปเนอะ
เมื่อกรอกเรียบร้อยแล้ว จิ้มปุ่ม Continue
ต่อมา copy code ที่เราเขียน smart contract ไว้เมื่อกี้ ไปแปะไว้ตามรูปเลย ในช่อง Solidity Contract Code เนอะ
อันนี้โค้ดรวมเนอะ
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract HelloWorld {
string public hello = "Hello World";
uint256 public money = 100;
//function
function deposit(uint256 _amount) public {
money += _amount;
}
}
เรียบร้อยยืนยันตัวตนว่าไม่ใช่บอท แล้วกด Verify and Publish และนี่คือผลลัพธ์ที่ได้
กลับไปดู Contract เราจะเจอโค้ดที่เราเขียนแล้วนะ ทุกคนสามารถเข้ามาดูได้เลย
มาสร้าง Token ของตัวเองกันเถอะ
ต่อมาเรามาสร้าง token เป็นของตัวเองกัน ซึ่งสอนแบบง่ายสุดๆ คือ copy แล้ววาง 555
token ที่เราจะสร้าง เป็น ERC20 ดังนั้นเราจึงสร้างไฟล์ใหม่ขึ้นมาเนอะ
ความ copy และ paste มาจากการใช้ tool ที่ชื่อว่า openzeppelin
ใช้ Wizard ในการช่วยสร้าง token ของเรา สามารถใส่จำนวนเหรียญตามที่เราต้องการ ทำได้ทั้ง token ที่เป็น ERC20 และ NFT ERC721 และ ERC1155
ก้อปโค้ดที่ได้ไปใส่ใน Remix ของเราเมื่อกี้เนอะ
function mint
ก็คือเป็นการเสก token ของเราเข้ากระเป๋านั่นเอง
จากนั้น deploy token ก็จะได้แบบนี้เนอะ
จริงๆเราเคยลองทำ token ของตัวเองบน testnet ซึ่งรายละเอียดของ function ของ openzeppelin สำหรับเกี่ยวกับ token สามารถอ่านได้ที่บล็อกนี้เลย
สุดท้ายคือการทำ verify smart contract ของเรา เนื่องจากเราเรียกใช้ library ภายนอก แล้ว EVM จะไม่รู้จัก จึงต้องทำการ flatten เพื่อเอาโค้ดทุกอย่างมาอยู่ในไฟล์เดียวกัน
ดังนั้นเราทำการ flatten โดยการคลิกขวาที่ไฟล์ แล้วเลือก Flatten
มีการขอ permission เล็กน้อย กด accept ไป
ไปที่ตรงนี้ เลือก Save Token_flat.sol นะ เลือกเสร็จจะได้ไฟล์นี้มา
ทำการ deploy 1 รอบ แล้วไปทำการ vertify เหมือนเดิม เป็นอันจบจ้า
ผลงานจ้า
ก็จะประมาณนี้เนอะทุกคน สำหรับการทำ smart contract ในขั้นต้น
อันนี้เป็นตัวอย่างโค้ดของคุณเอฟ สามารถไปดูกันได้จ้า
อันนี้แถมเนอะ เกี่ยวกับ Basic NFT ที่คุณเอฟไปพูดใน discord ของ BitToon DAO จ้า ไปอ่านย้อนในทวิตได้เลย ใครชอบ content แบบนี้ในทวิตก็ติดตามกันได้นะ
สามารถ support ค่ากาแฟเจ้าของบล็อกได้ที่ปุ่มแดงส้มสุดน่ารักที่มุมซ้ายล่าง หรือกดปุ่มตรงนี้ก็ได้จ้า
ติดตามข่าวสารและบทความใหม่ๆได้ที่
ติดตาม Twitter เพื่อข่าวสารที่รวดเร็วกว่าบนหน้าเพจกับในบล็อกนะ บางทีฟังแล้วก็สรุปทวิตเลย
ช่องทางใหม่ ติดตามทุกๆสตรีมของเราได้ที่
Subscribe ช่อง YouTube ของเราได้ที่
download แอพอ่านบล็อกใหม่ของเราได้ที่นี่