ทดลองสร้างเหรียญคริปโตเป็นของตัวเองกันเถอะ
จาก knowledge sharing ของเพื่อนร่วมทีม ผู้เชี่ยวชาญด้าน blockchain และ cryptocurrency มาสอนการสร้างเหรียญคริปโตของตัวเอง ด้วยภาษา Solidity โดยสร้างใน test chain จะเป็นยังไง มาลองทำกันเลย~~
คำเตือน : ในที่นี้เน้นทำเล่นไม่ได้เน้นสร้างมูลค่านะ
ทำไมถึงชื่อ Mira Token หรอ? Mira คือชื่อน้องตุ๊กตาแฮมสเตอร์ตัวกลมตัวกลิ้งสุดน่ารักของเรานั่นเอง จริงๆคือนึกชื่อไม่ออกแหละไม่มีอะไร555
ทำความรู้จักภาษาในการเขียน Smart Contract ในฝั่ง Ethereum กันเถอะ~
Smart Contract คือ สัญญาอัจฉริยะในโลกของ blockchain
รองรับภาษา Solidity และ Vyper
ในที่นี้เราจะเขียนเป็นภาษา Solidity เนื่องจากสามารถ deploy ไปในหลายๆ chain ได้ เช่น BSC, Polygon ทำให้เขียนทีเดียวรองรับได้ทุกที่นั่นเอง
และใน session นี้จะทำบน BSC นะ
ภาษา Solidity
ตอนนี้ Solidity ยังเป็น beta version โดย version ในตอนเขียนบล็อกนี้คือ 0.8.7 นั่นเอง โดย Ethereum Foundation เป็นคนพัฒนา ซึ่งมีกองกลางเป็น ETH เอาไปใช้ทำงาน เช่น งานนี้อยากได้แลมโบ 10 คันเขาก็จัดให้ แต่คนที่ทำโปรเจกต่างๆนั่นเป็นคนที่ geek เอามากๆ เขาเลยไม่อยากได้อะไรแบบนั้น อยากให้เขากินบ้าวบ้างมากกว่า
สิ่งที่ต้องเตรียม
- เราจะใช้ Editor ที่ชื่อว่า Remix เป็น Editor Online ที่เราจะมาสร้างเหรียญกันในวันนี้
ในความเป็นจริงแล้วววว จะใช้ webstorm หรือ IntelliJ ในการ develop จริง
- กระเป๋า MetaMask วิธีการสร้าง ไปที่นี่เลย
.
ข้อสำคัญ จด seed ไว้ในกระดาษ และห้ามให้ใครนะ ส่วน wallet address เป็นบ้านเลขที่กระเป๋าของเรา สามารถแชร์ได้
ใน MetaMask นั้นจะเป็น Ethereum มี Networks แบบ default 2 ประเภทด้วยกัน คือ
- Main Network อันนี้เป็น network ที่เราใช้ทำธุรกรรมจริง
- Test Network เป็นตัวเทสเนอะ เราสามารถหา sidechain check เลือกดูตรง BSC RPC Endpoints ได้ที่นี่
ในที่นี้เราจะเพิ่ม 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 เท่านั้นนะ
ถึงเวลาการ implement
ไปที่ Remix ซึ่งเป็น Editor แล้วสร้างไฟล์ใหม่ อยู่ใน contracts/artifacts
โดยชื่อไฟล์มันต้องนำหน้าด้วย 4_
อ่ะ ไม่งั้นมันไม่ทำงานง่ะ อันนี้ค่อยตามสืบอีกที เราตั้งชื่อว่า 4_MiraToken.sol
แล้วกันเนอะ
เหรียญนี้จะเป็น ERC20 คือ fungible tokens เหมือนเหรียญต่างๆที่เราซื้อขายเทรดกันเนอะ
ก่อนอื่นทำการ 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
เพิ่มขึ้นมาจากปกติ
_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 ของมันเลย
มูลค่าเหรียญ
- เราอาจจะให้เหรียญของเรามีมูลค่าคงที่ก็ได้ โดยไม่ผูกกับ LP
- AMM Calculator ใช้คำนวณสำหรับเหรียญที่ผูก LP โดยราคาจะตามกลไกของตลาดเนอะ
NFT
- ERC721 อันนี้เป็นของ NFT ต่างจาก ERC20 คือเป็นที่เก็บรูป ที่อยู่ใน blockchain ซึ่งมันไม่ได้เก็บเป็นไฟล์รูปนะ แต่เป็น url ของรูปนั้นๆ ของ opensea คือเก็บรูปไว้ที่ server ของเขาที่เดียว ไม่ได้ใช้แบบ IPFS ทำให้ถ้าระบบล่ม รูปที่ซื้อไว้ก็จะหายไป
- IPFS หลักการจะเหมือน Bittorrent เมื่อ server นึงพังแล้ว ก็สามารถดึงภาพจากอีก server นึงได้ เช่นใน foundation
ก็หวังว่าจะเป็นประโยชน์กับคนที่เริ่มศึกษาทางด้านนี้เนอะ ในทาง development นะ ส่วนเรื่องการสร้างมูลค่าอะไรต่างๆน่าจะอีกเรื่องนึงเนอะ
ส่วนโค้ดคร่าวๆ ก็มีแค่นี้เองอ่ะดิ ที่เหลือเขา implement ให้เพื่อให้เราเอาไปใช้ได้สะดวกเนอะ
แหล่งศึกษาเพิ่มเติม
สามารถ support ค่ากาแฟเจ้าของบล็อกได้ที่ปุ่มแดงส้มสุดน่ารักที่มุมซ้ายล่าง หรือกดปุ่มตรงนี้ก็ได้จ้า
กด follow Twitter เพื่อได้รับข่าวสารก่อนใคร เช่น สปอย content ใหม่ หรือสรุป content เร็วๆในนี้จ้า
ติดตามข่าวสารและบทความใหม่ๆได้ที่
download แอพอ่านบล็อกใหม่ของเราได้ที่นี่