ERC20 คืออะไร? เริ่มสร้าง ERC20 token ด้วย Remix ทำยังไง? — Part 1

Wichita Serchuit
Under Ledger
Published in
3 min readMar 16, 2022

อะไรคือ ERC20?

  • แต่ละ token จะมี smart contract เป็นของตัวเอง ซึ่ง ERC20 เองก็เป็นหนึ่งใน Ethereum’s token standard สำหรับ Fungible token (token ที่ไม่มีลักษณะเฉพาะตัว) เช่น ETH, USDT
  • มี fixed supply (re-mint ไม่ได้) แต่สามารถ mint ขึ้นมาใหม่และ burn ทิ้งได้
  • เป็นการใช้งานอินเทอร์เฟซที่กำหนดไว้ใน IERC20

🤍 IERC20 - กำหนด function signature โดยไม่ได้ระบุ behavior, function names, input และ output แต่ว่าไม่ได้มีการทำ process อะไร
🤍 ERC20 - inherit มาจาก interface และต้องใช้ required function ทั้งหมด

เราไม่สามารถสร้าง ERC20 token ที่เปลี่ยนแปลง หรือว่าใช้ชื่อ function ไม่เหมือนตามใน standard ได้ ไม่งั้นจะทำให้ exchange ดีลกับ token ของเราไม่ได้ (คุยคนละ function กันงี้)

แนวคิดเบื้องต้นของ token contract คือแต่ละ address จะมีจำนวน token เป็นของตัวเองซึ่งแต่ละ address สามารถ transfer token ที่ตัวเองมีอยู่ไปยัง address อื่นได้

methods และ events ที่ต้องมีตามที่กำหนดไว้ใน standard มีดังนี้:

  • totalSupply() - จำนวน token ทั้งหมดที่เคยถูก mint
  • balanceOf() - จำนวน token ที่เป็นเจ้าของโดย address นี้
  • transfer() - transfer แบบเจาะจง recipient และจำนวน token
  • transferFrom() - เรียกใช้เพื่อให้ owner ของ address อนุญาตให้ address อื่นๆ สามารถใช้ token ของตัวเองได้ เทียบง่ายๆ เหมือนการใช้บัตรเดบิตเพื่อใช้เงินจากในบัญชี
  • approve() - ใช้เมื่อทำการ transfer “from address” ครั้งแรก เพื่อทำการ allow ให้ผู้ใช้จ่ายใช้เหรียญแทนตนได้
  • allowance() - เช็คจำนวน token ที่ได้รับอนุมัติให้ใช้สำหรับการรวมกันระหว่าง owner และ spender

ERC20 แต่ละเหรียญยังมีการกำหนด maximum spending limit อีกด้วย ถ้าเกินกว่านั้นก็จะไม่สามารถโอนได้เพิ่มอีก

เริ่มต้นสร้าง ERC20 Token กัน

และหลังจากที่ได้ศึกษาการเขียน smart contract โดยพื้นฐานแบบภาพรวมไปบ้างแล้ว ทีนี้ก็มานั่งตกผลึกได้ว่า โอเค เราอ่านรู้เรื่อง อ่านเข้าใจ ทั้ง structure, component, mechanic การทำงาน และสามารถหาเหตุผลของแต่ละบรรทัดที่เขาเขียนกันได้แล้วในระดับนึง

เลยนึกขึ้นได้ว่า เอ๊ะ ยังไม่เคยเขียนอะไรขึ้นมาเป็นชิ้นเป็นอันเลยนี่นา 🤔

ก็เลยเริ่มจากแบบพื้นฐานๆ จะลองสร้าง basic token contract ขึ้นมาสักตัว
ทั้งนี้เพื่อเป็นการทบทวนสิ่งที่ได้อ่านมาและถือโอกาสนี้มาแชร์ให้ทุกคนด้วยค่ะ

How to ศึกษา ERC20 token ให้ลึกซึ้งและเห็นภาพ (ฉบับแตง)

✅ CryptoZombies
✅ ศึกษาตัวอย่างการสร้าง token จาก blog ของคนอื่นๆ
✅ แกะ contract แอบดู token mechanic
⬜ ลองสร้าง token เป็นของตัวเอง

เริ่มเลย!

.

.

Step 1: Decide what you want your token to be

กำหนดสิ่งที่จำเป็นในการสร้าง ERC20 token:

  • Name: MLAB team token
  • Symbol: MLAB
  • Decimal places: 2
  • Amount of Tokens in Circulation: 100,000

ซึ่งเหรียญโดยส่วนมากจะเซต decimal places ไว้ที่ 18 ตำแหน่ง ซึ่งนั่นแปลว่า token holder สามารถมี token ได้มากถึง .0000000000000000001 (ทศนิยมเยอะจัดๆ)

เลขทศนิยมจะถูกใช้โดย wallets เพื่อแสดงจำนวนของ token ที่ถูกต้องเราเป็นเจ้าของอยู่ แต่ function อื่นๆ ใน smart contract จะไม่ใช้ decimals parameter

ดูรายละเอียดเพิ่มเติมเกี่ยวกับ ERC20 token สามารถอ่านได้จาก doc ของ OpenZeppelin เลยค่ะ โดยส่วนตัวคิดว่าละเอียดกว่าของ Ethereum เยอะอยู่ 😄

Step 2: Code contract

ในที่นี้จะใช้ Remix IDE เป็น editor ในการ implement contract นะคะ

เริ่มต้นโดยการสร้างไฟล์ contract ใหม่จากของเดิมที่มีอยู่แล้ว ซึ่งเราจะเอาไว้เป็นไฟล์ของ token

ในบทความนี้จะใช้ solidity เวอร์ชั่น 0.8.5 นะคะ

ก่อนอื่นเลยก็ต้องมา construct token ที่เราได้ทำการแพลนไว้แล้วก่อนเพื่อทำการเสก token ขึ้นมา

constructor() เป็น special function จะถูก executed แค่ครั้งเดียวเมื่อตอนที่ contract ถูกสร้างขึ้นเท่านั้น

จากโค้ดด้านบนจะเห็นว่าแตง import ERC20 จาก OpenZeppelin มาใช้ ซึ่งจริงๆ แล้วเราสามารถ import มาจากที่อื่นแบบที่เขียนนี้ก็ได้ (เป็นการเรียกใช้ contract จากที่อื่น) จะเก็บแยกเป็นอีกไฟล์แล้วค่อย import เข้ามาก็ได้

import "./ERC20.sol"

หรือยกทั้ง ERC20 contract มาวางไว้ในไฟล์เดียวกับ token contract เลยก็ได้เหมือนกันค่ะ

ในบรรทัดที่ 16 มีการเรียก ERC20 และส่งค่า name, symbol เข้าไปเพื่อสร้าง contract ใหม่ และบรรทัดที่ 17 เราสั่งให้ทำการเรียก _mint() function ที่ได้ inherit มาจาก ERC20 contract ให้ mint token แก่ msg.sender จำนวน 10,000 tokens

ลองเทสด้วยการ compile

ใน Remix IDE เราสามารถเลือก complier ที่ต้องการใช้ได้ตามความต้องการและตาม solidity version และกดเลือก Auto compile ไว้ด้วยเพื่อความรวดเร็ว

เสร็จแล้วลอง deploy เลย

ทีนี้ลองมาเช็คดูว่ามีเหรียญถูกเสกขึ้นมาใน test environment ที่เรากำลังทำนี้อยู่จริงอ่ะป่าว

จะเห็นได้ว่าเมื่อลองเรียก function balanceOf() ดูจะเห็นว่ามีค่า return ออกมาเป็น 10000000 (ศูนย์เจ็ดตัว เพราะคูณกับ decimal ที่กำหนดไว้) เป็นอันเสร็จเรียบร้อย เหรียญถูก mint ขึ้นมาแล้วค่า ✨

ในเบื้องต้นเราสามารถเสกเหรียญ โอนเหรียญไปมาระหว่าง address ได้แล้ว ต่อไปจะมีการเพิ่ม token functionalities ด้วยการเอาไปใช้ในการทำ DAO vote และการ deploy ขึ้นบน test net

รอติดตามพาร์ทถัดๆ ไปนะคะ

Reference:

--

--