เรียนปูพื้นฐานพร้อมสร้างเหรียญ ใน Discord Naga DAO

Programming Jun 24, 2022

ถ้าจำไม่ผิดน่าจะเห็นจากน้องม่อนในห้อง Stocker DAO จริงๆเข้า discord ของ Naga DAO ช่วง Crypto Expo พอเห็นกิจกรรมน่าสนใจเลยเข้าไปจอยจ้า

เนื่องจากตอนที่คุณเอฟสอน แล้วมีเหตุขัดข้องในการอัดย้อนหลัง เลยเป็น exclusive content เฉพาะคนที่ได้เรียนในวันนั้นไปเลย 5555555 เราก็เลยมาสรุปให้ฟังว่าได้เรียนอะไรบ้าง

ก่อนอื่นขอเกริ่นพื้นฐานของเราก่อน เราเป็น Android Developer ที่พอได้เรียนรู้เรื่องเกี่ยวกับ Smart Contract มาบ้าง เรียน Cryptozombies ไปบทเดียวเอง และได้ฟัง session จากงานอื่นๆที่เกี่ยวกับเรื่องนี้มาบ้าง แต่ยังไม่เคยลงมือทำ product จริงๆเนอะ

ในวันนั้นใครที่ยังไม่มีพื้นฐานตรงนี้ คุณเอฟอธิบายเข้าใจง่ายมากๆนะ เหมาะกับคนที่ยังมีพื้นฐานไม่เยอะ (เพราะถ้าเราๆสอนกันน่าจะสอนแล้วเข้าใจยากกว่านี้ 555)

Blockchain คืออะไร?

นิยามของ blockchain คือ database แบบกระจาย โดยแบบ centralized เราจะเชื่อใจคนกลางที่เดียว เช่น มีธนาคารเป็นศูนย์กลาง ซึ่งบางธนาคารของโลกใบนี้ไว้ใจไม่ได้ ไม่มีประสิทธิภาพมากเพียงพอ และไม่ตอบโจทย์ จึงเกิด decentralized ขึ้นมา เพื่อกระจายอำนวจให้ประชาชน

ภาพเอามาจาก https://www.imf.org/external/pubs/ft/fandd/2016/06/adriano.htm ขี้เกียจทำเอง

การทำธุรกรรมต่างๆ เช่น โอนเงิน เราจะทำผ่าน 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 นะ

อันนี้แอบไปหาเพิ่มเติมมา

Script - Bitcoin Wiki
Bitcoin script 101
In this tutorial we will be looking into the scripting language used by bitcoin. Bitcoin script is a simple forth-like stack based language, basically meaning that it operates using a first-in-last-out principle (FILO) upon a stack based data structure.

Vitalik Buterin มองว่าตัว Bitcoin มันควรทำอย่างอื่นได้ จึง suggest ให้ทาง Bitcoin เพิ่มให้ แต่ทางเขาไม่เอา เพราะการอัพเดต blockchain ไม่ใช่เรื่องง่าย และไม่อยากให้มันล่มสลายในยุคที่ตัวเองอยู่

คือในสไลด์เอามาจากเพจ ไบแง๊นน - Bingaence มาอีกทีจริงๆนะ

จึงกลายเป็น 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

Photo by Ji Seongkwang / Unsplash

Benefits of smart contracts

แบบ ideal ที่นิยามโดย IBM

  • Speed, efficiency and accuracy : ความเร็ว ประสิทธิภาพ และความถูกต้องแม่นยำในการทำธุรกรรม
  • Trust and transparency : เนื่องจากไม่มีตัวกลางในการทำธุรกรรม ทำให้สามารถเชื่อมั่น และตรวจสอบได้
  • Security : ความปลอดภัย จะไม่สามารถแก้ transaction ที่เกิดขึ้นได้ และถ้าจะแก้ จะต้องแก้ทั้งหมดในระบบ
  • Savings : ประหยัดเวลาในการทำธุรกรรม
What are smart contracts on blockchain? | IBM
Learn about smart contracts and how a blockchain network can automatically execute a contract when predetermined terms and conditions are met
https://www.ibm.com/topics/smart-contracts#anchor-1705310497

ในความเป็นจริงจะมีแค่ 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 — Solidity 0.8.15 documentation

ส่วนภาษาอื่นๆที่ใช้กัน แต่น้อยกว่า Solidity ก็จะมี Vyper, Rust แล้วก็ Cairo

หลักการทำงาน

มีความเข้าใจ และสื่อสารกับคอมพิวเตอร์ที่เป็น Ethereum ได้ คุยกันเป็น bytecode (คุยกันด้วยเลข 0, 1) มีตัวแปลงภาษา Solidity เป็น byte code โดยผ่าน compiler

ในที่นี้เราจะใช้ Remix เป็น editor นะ

ทดลองใช้ Remix เขียน Solidity กันเถอะ

ไปที่ Remix

Remix - Ethereum IDE

ใน 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 เนอะ โดยไปที่เว็บนี้

Faucets | Chainlink
Get testnet LINK for an account on one of the supported blockchain testnets so you can create and test your own oracle and Chainlinked smart contract.
https://faucets.chain.link/rinkeby

จากนั้นทำการเชื่อมต่อกระเป๋าของเราให้เรียบร้อย จะได้ 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 และนี่คือผลลัพธ์ที่ได้

https://rinkeby.etherscan.io/verifyContract-solc?a=0x7fe0587ecdb995bad54cf5fdf8834621b1a693e3&c=v0.8.7%2bcommit.e28d00a7&lictype=3

กลับไปดู Contract เราจะเจอโค้ดที่เราเขียนแล้วนะ ทุกคนสามารถเข้ามาดูได้เลย

https://rinkeby.etherscan.io/address/0x7fe0587ecdb995bad54cf5fdf8834621b1a693e3#code

มาสร้าง Token ของตัวเองกันเถอะ

ต่อมาเรามาสร้าง token เป็นของตัวเองกัน ซึ่งสอนแบบง่ายสุดๆ คือ copy แล้ววาง 555

token ที่เราจะสร้าง เป็น ERC20 ดังนั้นเราจึงสร้างไฟล์ใหม่ขึ้นมาเนอะ

ความ copy และ paste มาจากการใช้ tool ที่ชื่อว่า openzeppelin

Contracts Wizard - OpenZeppelin Docs
https://docs.openzeppelin.com/contracts/4.x/wizard

ใช้ Wizard ในการช่วยสร้าง token ของเรา สามารถใส่จำนวนเหรียญตามที่เราต้องการ ทำได้ทั้ง token ที่เป็น ERC20 และ NFT ERC721 และ ERC1155

ก้อปโค้ดที่ได้ไปใส่ใน Remix ของเราเมื่อกี้เนอะ

function mint ก็คือเป็นการเสก token ของเราเข้ากระเป๋านั่นเอง

จากนั้น deploy token ก็จะได้แบบนี้เนอะ

จริงๆเราเคยลองทำ token ของตัวเองบน testnet ซึ่งรายละเอียดของ function ของ openzeppelin สำหรับเกี่ยวกับ token สามารถอ่านได้ที่บล็อกนี้เลย

ทดลองสร้างเหรียญคริปโตเป็นของตัวเองกันเถอะ
จาก knowledge sharing ของเพื่อนร่วมทีม ผู้เชี่ยวชาญด้าน blockchain และ cryptocurrency มาสอนการสร้างเหรียญคริปโตของตัวเอง ด้วยภาษา Solidity โดยสร้างใน test chain จะเป็นยังไง มาลองทำกันเลย~~
https://www.mikkipastel.com/create-your-first-cryptocurrency-coin-in-testnet/

สุดท้ายคือการทำ verify smart contract ของเรา เนื่องจากเราเรียกใช้ library ภายนอก แล้ว EVM จะไม่รู้จัก จึงต้องทำการ flatten เพื่อเอาโค้ดทุกอย่างมาอยู่ในไฟล์เดียวกัน

ดังนั้นเราทำการ flatten โดยการคลิกขวาที่ไฟล์ แล้วเลือก Flatten

มีการขอ permission เล็กน้อย กด accept ไป

ไปที่ตรงนี้ เลือก Save Token_flat.sol นะ เลือกเสร็จจะได้ไฟล์นี้มา

ทำการ deploy 1 รอบ แล้วไปทำการ vertify เหมือนเดิม เป็นอันจบจ้า

ผลงานจ้า

ก็จะประมาณนี้เนอะทุกคน สำหรับการทำ smart contract ในขั้นต้น

อันนี้เป็นตัวอย่างโค้ดของคุณเอฟ สามารถไปดูกันได้จ้า

bitkub-dev-course/MultisenderERC20.sol at main · NuttakitDW/bitkub-dev-course
Contribute to NuttakitDW/bitkub-dev-course development by creating an account on GitHub.

อันนี้แถมเนอะ เกี่ยวกับ Basic NFT ที่คุณเอฟไปพูดใน discord ของ BitToon DAO จ้า ไปอ่านย้อนในทวิตได้เลย ใครชอบ content แบบนี้ในทวิตก็ติดตามกันได้นะ


สามารถ support ค่ากาแฟเจ้าของบล็อกได้ที่ปุ่มแดงส้มสุดน่ารักที่มุมซ้ายล่าง หรือกดปุ่มตรงนี้ก็ได้จ้า

Buy Me a Coffee at ko-fi.com

ติดตามข่าวสารและบทความใหม่ๆได้ที่

อย่าลืมกด like กด share บทความกันด้วยนะคะ :)

Posted by MikkiPastel on Sunday, 10 December 2017

ติดตาม Twitter เพื่อข่าวสารที่รวดเร็วกว่าบนหน้าเพจกับในบล็อกนะ บางทีฟังแล้วก็สรุปทวิตเลย

ช่องทางใหม่ ติดตามทุกๆสตรีมของเราได้ที่

Twitch
Twitch is the world’s leading video platform and community for gamers.
https://www.twitch.tv/mikkipastel

Subscribe ช่อง YouTube ของเราได้ที่

mikkicoding
Android Developer & Content Creator
https://www.youtube.com/c/mikkicoding

download แอพอ่านบล็อกใหม่ของเราได้ที่นี่

MikkiPastel - Apps on Google Play
First application from “MikkiPastel” on play store beta feature- read blog from https://www.mikkipastel.com by this application- read blog content by chrome custom tab- update or refresh new content by pull to refresh- share content to social network
https://play.google.com/store/apps/details?id=com.mikkipastel.blog

Tags

Minseo Chayabanjonglerd

I am a full-time Android Developer and part-time contributor with developer community and web3 world, who believe people have hard skills and soft skills to up-skill to da moon.