ทดลองสร้างเหรียญคริปโตเป็นของตัวเองกันเถอะ

programming Oct 1, 2021

จาก knowledge sharing ของเพื่อนร่วมทีม ผู้เชี่ยวชาญด้าน blockchain และ cryptocurrency มาสอนการสร้างเหรียญคริปโตของตัวเอง ด้วยภาษา Solidity โดยสร้างใน test chain จะเป็นยังไง มาลองทำกันเลย~~

คำเตือน : ในที่นี้เน้นทำเล่นไม่ได้เน้นสร้างมูลค่านะ

ทำไมถึงชื่อ Mira Token หรอ? Mira คือชื่อน้องตุ๊กตาแฮมสเตอร์ตัวกลมตัวกลิ้งสุดน่ารักของเรานั่นเอง จริงๆคือนึกชื่อไม่ออกแหละไม่มีอะไร555

ทำความรู้จักภาษาในการเขียน Smart Contract ในฝั่ง Ethereum กันเถอะ~

Smart Contract คือ สัญญาอัจฉริยะในโลกของ blockchain

รองรับภาษา Solidity และ Vyper

ในที่นี้เราจะเขียนเป็นภาษา Solidity เนื่องจากสามารถ deploy ไปในหลายๆ chain ได้ เช่น BSC, Polygon ทำให้เขียนทีเดียวรองรับได้ทุกที่นั่นเอง

Smart contract languages | ethereum.org
An overview and comparison of the two main smart contract languages – Solidity and Vyper.
https://ethereum.org/en/developers/docs/smart-contracts/languages/

และใน session นี้จะทำบน BSC นะ

ภาษา Solidity

ตอนนี้ Solidity ยังเป็น beta version โดย version ในตอนเขียนบล็อกนี้คือ 0.8.7 นั่นเอง โดย Ethereum Foundation เป็นคนพัฒนา ซึ่งมีกองกลางเป็น ETH เอาไปใช้ทำงาน เช่น งานนี้อยากได้แลมโบ 10 คันเขาก็จัดให้ แต่คนที่ทำโปรเจกต่างๆนั่นเป็นคนที่ geek เอามากๆ เขาเลยไม่อยากได้อะไรแบบนั้น อยากให้เขากินบ้าวบ้างมากกว่า

Solidity — Solidity 0.8.7 documentation
https://docs.soliditylang.org/en/v0.8.7/

สิ่งที่ต้องเตรียม

  • เราจะใช้ Editor ที่ชื่อว่า Remix เป็น Editor Online ที่เราจะมาสร้างเหรียญกันในวันนี้
Remix - Ethereum IDE

ในความเป็นจริงแล้วววว จะใช้ webstorm หรือ IntelliJ ในการ develop จริง

  • กระเป๋า MetaMask วิธีการสร้าง ไปที่นี่เลย

.

ข้อสำคัญ จด seed ไว้ในกระดาษ และห้ามให้ใครนะ ส่วน wallet address เป็นบ้านเลขที่กระเป๋าของเรา สามารถแชร์ได้

ใน MetaMask นั้นจะเป็น Ethereum มี Networks แบบ default 2 ประเภทด้วยกัน คือ

  • Main Network อันนี้เป็น network ที่เราใช้ทำธุรกรรมจริง
  • Test Network เป็นตัวเทสเนอะ เราสามารถหา sidechain check เลือกดูตรง BSC RPC Endpoints ได้ที่นี่
RPC - Binance Chain Docs
Binance Chain Technology Documentation
https://docs.binance.org/smart-chain/developer/rpc.html

ในที่นี้เราจะเพิ่ม network กระเป๋าเทสของเรา ดังนี้

Network Name: BSC Testnet
New RPC URL: https://data-seed-prebsc-1-s1.binance.org:8545
ChainID: 97
Symbol: BNB
Block Explorer URL: https://explorer.binance.org/smart-testnet

จากนั้นเพิ่มเหรียญสำหรับเทสโดยเปิดไปที่เว็บนี้ โดยกดได้ฟรีวันละ 1 BNB เท่านั้นนะ

Binance Smart Chain: Faucet
https://testnet.binance.org/faucet-smart

ถึงเวลาการ implement

ไปที่ Remix ซึ่งเป็น Editor แล้วสร้างไฟล์ใหม่ อยู่ใน contracts/artifacts โดยชื่อไฟล์มันต้องนำหน้าด้วย 4_ อ่ะ ไม่งั้นมันไม่ทำงานง่ะ อันนี้ค่อยตามสืบอีกที เราตั้งชื่อว่า 4_MiraToken.sol แล้วกันเนอะ

เหรียญนี้จะเป็น ERC20 คือ fungible tokens เหมือนเหรียญต่างๆที่เราซื้อขายเทรดกันเนอะ

ERC20 - OpenZeppelin Docs
https://docs.openzeppelin.com/contracts/4.x/erc20

ก่อนอื่นทำการ constructing มันก่อน โดยการสร้าง ERC20 token contract ที่เป็นเหรียญที่เราจะทำการสร้างเนอะ ในตัวอย่าง document ใช้คำว่า Gold แล้วเราใช้ชื่อซํ้าได้ไหม? ได้ แต่ แต่ละเหรียญมี address ที่ไม่เหมือนกัน ดังนั้นเราควร check จาก official ก่อนเสมอว่าเป็นเหรียญนั้นจริงๆไหม ไม่งั้นเราจะโดนหลอกได้น้าาา

.

  • ERC20("Mira Token", "MIRA") เป็นการสร้าง contract ประกอบไปด้วย _name คือ Mira Token และ _symbol คือ MIRA ปกติเราจะเห็นชื่อเหรียญตามกระดานเทรดมักจะ 3 ตัว ที่มากกว่า 3 ที่เราคุ้นเคยกันก็จะมี BAKE, CAKE, ALPHA
  • _mint(msg.sender, initialSupply); mint คือ การผลิตเหรียญนั้นขึ้นมา อันนี้คือ เราจะผลิตเหรียญให้ใคร จำนวนเท่าไหร่

ตัว Remix จะมี class การผลิตเหรียญขั้นต้นไว้ให้แล้ว ทำให้เราไม่ต้องเริ่มต้นเขียนใหม่ตั้งแต่ 0 อย่างเหรียญนี้เราก็ implement จาก ERC20.sol มาได้เลย

และในนี้มีอะไรบ้างนะ?

  • _balances เรามีเงินในกระเป๋าเท่าไหร่
  • _allowances เราอนุญาตให้ใคร
  • _totalSupply มีเหรียญนี้ในระบบเท่าไหร่ อาจจะมีจำกัดหรือไม่มีจำกัดก็ได้ ถ้าไม่มีจำกัดอาจจะควบคุมไม่ให้เฟ้อโดยการ burn ทิ้ง
  • approve(address spender, uint256 amount) เป็นการ approve กระเป๋าของเราเข้ากับระบบ
  • transferFrom(address sender, address recipient, uint256 amount) เป็นการดึงเงินออกจากกระเป๋า จะทำได้เมื่อผ่านการ approve เท่านั้นนะ ดังนั้น

เช่น ใน pancake farm จะมี MasterChef มาควบคุม farm หรือ pool ต่างๆ และมี Governance Token สามารถโหวตได้ โดยมี function getCurrentVotes เพิ่มขึ้นมาจากปกติ

เอามาจาก https://github.com/pancakeswap/pancake-farm/blob/a61313bf107c7f82e1a0f5736d815041fbf8cdff/contracts/CakeToken.sol ใครบอกวิธีแปะเป็นโค้ดได้วานบอกบุญด้วยครับ
  • _transfer(address sender, address recipient, uint256 amount) ประมาณแก้ไขสมุดบัญชี หลักการการทำงานคือ เป็นการลบคนส่ง เพิ่มคนรับ เช่น ตอนนี้เรามี 1000 MIRA  เราส่ง Mira Token ให้เพื่อน 100 MIRA ดังนั้นเราจะมี 1000 - 100 = 900 MIRA ส่วนเพื่อนก็จะมี x + 100 MIRA
  • _burn(address account, uint256 amount) คือการเผาเหรียญ เนื่องจากหลักการของ blockchain ไม่สามารถลบ smart contract ออกจากระบบได้ เลยเป็นการโอนเหรียญไปให้ address 0 แทน ซึ่งเป็น address ตั้งต้นของ smart contract ของระบบ ซึ่งเราอาจจะทำ manual โดยการ transfer ไปที่ address 0 ก็ได้นะ

เสกเหรียญเข้ากระเป๋า

ต่อมาทำการ compile ไฟล์ที่เราเพิ่งจัดการมันไปเนอะ แนะนำให้กด auto compile เพื่อความรวดเร็วเนอะ จากนั้นจิ้มปุ่ม compile 1 ที รอมัน compile สักพัก ถ้าไม่มีอะไรพังก็จะขึ้น badge ติ๊กถูกเขียวๆมาให้จ้า

เทสกันแบบ local กันต่อเลย ไปที่ DEPLOY & RUN TRANSACTIONS เลือก ENVIRONMENT เป็น Injected Web3 มันจะเด้งไป MetaMask โดยเราเลือก chain BSC Testnet ที่เพิ่งสร้างไว้ในกระเป๋า

ไม่ต้องสนใจ gas limit กับ value ส่วนตัว CONTRACT ก็จะเชื่อมจากที่เราสร้างไว้เนอะ

ค่าใน Smart Contract เป็นจำนวนเต็มเนอะ ดังนั้น initialSupply ใน _mint(msg.sender, initialSupply); ก็จะส่งให้เป็นจำนวนเต็มด้วย ถึงแม้หน่วยของเหรียญจะเป็นทศนิยมตำแหน่งต่างๆได้ก็เถอะนะ

โดย default จะมี decimal เป็น 18 ที่ส่วนใหญ่นิยมใช้กันเนอะ

ดังนั้น 1 token ของเราจะเท่ากับ 1000000000000000000 หรือ 1e18 (1 × 1018) นั่นเอง

ถ้า 0.1 token จะเท่ากับ 1000000000000000000 * 0.1 = 100000000000000000

ดังนั้นถ้าเราอยากเสก 1000 token จะเท่ากับ  1000000000000000000 * 1000 = 1000000000000000000000 นั่นเอง

ตอนนี้เราจะเสกเหรียญที่ชื่อว่า MIRA เข้าไปในกระเป๋าเราแล้ว ตรง CONTRACT ให้เลือกเป็นเหรียญที่เราเพิ่งสร้างไว้ และใส่จำนวนที่เราต้องการลงไป จากนั้นกดปุ่ม transact แล้วมันจะเด้งเข้า MetaMask ของเรา แน่นอนว่ามีการหักค่า gas ด้วย แต่ในที่นี้มันทิพย์หมดไม่เป็นไร กดๆไป

มาดูในกระเป๋าของเรากันเถอะ มูลค่าหลักจากเสียค่า gas ไป แล้วเหรียญ MIRA ของเราหล่ะ?

เมื่อกดไปดู activity ของการ Contract Deployment จะพบกับหน้าเว็บที่เป็น 404 ดังนั้นให้ไปหน้าเว็บแบบนี้แทนนะ แล้ว copy transaction id จาก MetaMask มาแปะใส่ใน format แบบนี้นะ

https://testnet.bscscan.com/tx/{transaction_id}

วิธีการเพิ่ม token ใน MetaMask ให้กดลิ้งของ Mira Token แล้วเราก็จะได้ url แบบนี้มา

https://testnet.bscscan.com/token/{contract}

เราจะเห็นได้ว่าเหรียญ MIRA ที่เราผลิตนั้น ถูกส่งมาจาก address 0 แล้วเข้ากระเป๋าของเราเนอะ

แล้ว Copy address ไปที่ MetaMask จ้า

เบ็ดเตล็ดอื่นๆ

Address 0

คือกระเป๋าที่เอาไว้เผาเหรียญ ซึ่งเป็นกระเป๋าที่ไม่มีเจ้าของ และก็ไม่รู้ว่าใครเป็นคนสร้างเช่นกัน จึงไม่สามารถแฮกกระเป๋าใบนี้ได้ เนื่องจากไม่มีใครรู้ seed ของมันเลย

https://bscscan.com/address/0x0000000000000000000000000000000000000000

มูลค่าเหรียญ

  • เราอาจจะให้เหรียญของเรามีมูลค่าคงที่ก็ได้ โดยไม่ผูกกับ LP
  • AMM Calculator ใช้คำนวณสำหรับเหรียญที่ผูก LP โดยราคาจะตามกลไกของตลาดเนอะ

NFT

  • ERC721 อันนี้เป็นของ NFT ต่างจาก ERC20 คือเป็นที่เก็บรูป ที่อยู่ใน blockchain ซึ่งมันไม่ได้เก็บเป็นไฟล์รูปนะ แต่เป็น url ของรูปนั้นๆ ของ opensea คือเก็บรูปไว้ที่ server ของเขาที่เดียว ไม่ได้ใช้แบบ IPFS ทำให้ถ้าระบบล่ม รูปที่ซื้อไว้ก็จะหายไป
ERC721 - OpenZeppelin Docs
https://docs.openzeppelin.com/contracts/4.x/erc721
  • IPFS หลักการจะเหมือน Bittorrent เมื่อ server นึงพังแล้ว ก็สามารถดึงภาพจากอีก server นึงได้ เช่นใน foundation

ก็หวังว่าจะเป็นประโยชน์กับคนที่เริ่มศึกษาทางด้านนี้เนอะ ในทาง development นะ ส่วนเรื่องการสร้างมูลค่าอะไรต่างๆน่าจะอีกเรื่องนึงเนอะ

ส่วนโค้ดคร่าวๆ ก็มีแค่นี้เองอ่ะดิ ที่เหลือเขา implement ให้เพื่อให้เราเอาไปใช้ได้สะดวกเนอะ

Remix - Ethereum IDE

แหล่งศึกษาเพิ่มเติม

Developer learning tools | ethereum.org
Web-based coding tools and interactive learning experiences to help you experiment with Ethereum development.
File Explorers — Remix - Ethereum IDE 1 documentation

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

Buy Me a Coffee at ko-fi.com

กด follow Twitter เพื่อได้รับข่าวสารก่อนใคร เช่น สปอย content ใหม่ หรือสรุป content เร็วๆในนี้จ้า

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

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

Posted by MikkiPastel on Sunday, 10 December 2017

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

Android Developer ผู้เป็นเจ้าของบล็อก MikkiPastel ที่ชอบทำหลายๆอย่างนอกจากเขียนแอพแอนดรอยด์ เช่น เขียนบล็อก เขียนแชทบอท เรียนออนไลน์ อ่านหนังสือ วาดรูปเล่น ดู netfilx สั่งอาหารอร่อยๆกัน เป็นต้น

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.