กระแส Cryptocurrency มาแรงในโลกอนไลน์ประกอบกับ Binance Smart Chain ได้ประกาศว่า Anyone can create their own BEP20 token ก็เลยลองสร้าง BEP20 Token เป็นของตัวเองดูกันหน่อยว่ามันทำยังไง?
- ออกตัวก่อนว่า Tutorial นี้ไม่จบ ไม่มีค่า GAS
- ออกตัวก่อนว่า Tutorial ทำขึ้นเพราะแค่สงสัย
เราจะสร้างเหรียญของตัวเอง สร้างสกุลเงินดิจิทัลของตัวเอง แน่นอนว่าเราต้องเลือกแพลตฟอร์ม Blockchain ที่เหมาะสมกับกรณีการใช้งานที่เราต้องการก่อน ซึ่งก็มีมากมายเลย และถ้าหากว่าต้องเลือกมองหาแพลตฟอร์มที่มีค่าธรรมเนียมที่ไม่แพง ใช้เวลาในการทำธุรกรรมที่รวดเร็วพอรับได้ อีกทั้งเรื่องของ Smart Contract มือใหม่แบบเราก็ต้องเลือก Binance Smart Chain (BSC ) เป็น DApps (Decentralized Application) ซึ่งก็คือแอปพลิเคชันที่ไม่มีคนกลาง สร้างอยู่บนเครือข่าย Blockchain ที่เป็น Peer-to-Peer จึงไม่ถูกควบคุมหรือถูกยกเลิกได้โดยฝ่ายใดฝ่ายหนึ่ง
ทีนี้ ถ้าจะสร้างเหรียญของสกุลดิจิทัลของเราเองบน Binance Smart Chain ที่เราเลือกแล้ว ก็ต้องใช้มาตรฐาน BEP20 Token ครับ ข้อมูลอยู่ที่นี่: Introduction – Binance Chain Docs (https://docs.binance.org/smart-chain/developer/BEP20.html)
-
ลองไปศึกษาพวกการทำ NVM และ Smart Contract กันก่อนก็ดีนะครับ มีให้อ่านเยอะแยะเลยบนเว็บไซต์
ภาษาที่ใช้จะเป็น Solidity ครับ (นามสกุล .sol) ซึ่งใน Binance Chain Docs จะมีไฟล์ Template ของเจ้า BEP20Token.template มาให้เราศึกษาเรียบร้อย มีฟังก์ชันต่างๆ ครับในไฟล์นั้น พร้อมคำอธิบาย มี Interface มาให้ด้วยในไฟล์ IBEP20.sol ดาวน์โหลดลงมาแกะดูศึกษาได้ครับ
ดู Code กันหน่อยดีกว่า ลองเปิดไฟล์ใน VS Code ให้ติดตั้ง Add-ons ของ Solidity ก่อนนะครับ แล้วเปิด code ขึ้นมาจะเห็นว่าแต่ละฟังก์ชันใน Interface นั้นมันจะมีคำอธิบายให้หมดแล้ว อีกอย่างคือ pragma solidity ตอนดาวน์โหลดมันจะเป็นเวอรืชันเก่าให้เปลี่ยนเป็น 0.8.4 (สำหรับเครื่องของผมนะ)
จะเห็นว่า มีฟังก์ชันมี Template ให้สร้างครบแล้ว ทีเหลือก็แค่ลองเขียน Solidity ของเราใหม่ครับ ให้ทำการสร้าง Work Space ใหม่ และสร้างไฟล์ชื่อ MyToken.sol ขึ้นมาดีกว่า ประกาศ Contract ของผมตามนี้ก่อน:
pragma solidity 0.8.4; contract MyToken { mapping(address => uint) public balances; mapping(address => mapping(address => uint)) public allowance; uint public decimals = 18; string public symbol = "KUAY"; string public name = "Kuay Token"; uint public totalSupply = 10000* 10 ** 18; }
- totalSupply นี่กำหนด Supply หรืออุปทานคือ หมายถึงอุปทานทั้งหมดจะเท่ากับ 10,000 × 10 ยกกำลัง 18 Token
- ทศนิยม เหรียญใส่ไป 18 จุดครับ
- ชื่อToken ผมใช้ชื่อว่า “กล้วย, มันคือกล้วย!” ใส่ “Kuay Token” ดังนั้น Symbol ที่อยากให้แสดงบน BEP20 นั้นก็คือ “KUAY“
- allowance เบี้ยน้อยหอยน้อย
สร้าง Constructor รับ msg ของ Sender ครับใน Contract ของเรา:
constructor() { balances[msg.sender] = totalSupply; }
ใน Contract ของเราให้ไปเปิด Template ครับเราจะใช้ คำสั่งของ balanceOf() และ transfer() รูปแบบการทำงานคือ:
function balanceOf(address account) external view returns (uint256);
และ
function transfer(address recipient, uint256 amount) external returns (bool);
ดังนั้นให้เรา implement กันหน่อยเป็น
สร้าง Event ขึ้นมาตั้งชื่อว่า TransferValue เพื่อกำหนดค่า ผู้ส่ง ผู้รับ และ ค่า value:
event TransferValue(address indexed from, address indexed to, uint value);
ดังนั้นเรา Implement ส่วนของ balanceOf() และ transfer() ได้ดังนี้:
event TransferValue(address indexed from, address indexed to, uint value); function balanceOf(address reciever) public view returns(uint){ return balances[reciever]; } function transfer(address sendto, uint value) public returns(bool){ require(balanceOf(msg.sender) >= value,'balance too low'); balances[sendto] += value; balances[msg.sender] -= value; emit TransferValue(msg.sender, sendto, value); return true; }
กำหนด Event ใหม่ในการ Approve ขึ้นมา ชื่อว่า Approval():
event Approval(address indexed reciever, address indexed spender, uint value);
ทำการใช้ BEP20 ส่วนของฟังก์ชัน approve() แล้ว Implement ใหม่เป็น:
function approve(address spender, uint value) public returns(bool){ allowance[msg.sender][spender] = value; emit Approval(msg.sender, spender,value); return true; }
รับ address จาก Spender และ value โดยไปเรียก Event ที่เราสร้างขึ้น Aproval() เพื่อทำการยืนยัน เมื่อเสร็จให้ คืนค่า true
พิจารณาฟังก์ชันจาก Template คือ transferFrom()
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
เอามา implement ใหม่ใน Contract เราเลยดังนี้:
function transferFrom (address sender, address reciever, uint value) public returns(bool){ require(balanceOf(sender) >= value, 'blance too low'); require(allowance[sender][msg.sender] >= value, 'allowance to low'); balances[reciever] += value; balances[sender] -= value; emit TransferValue(sender, reciever, value); return true; }
ดังนั้นไฟล์ MyToken.sol ของผมจะเป็นดังนี้:
pragma solidity 0.8.4; contract MyToken { mapping(address => uint) public balances; mapping(address => mapping(address => uint)) public allowance; uint public decimals = 18; string public symbol = "KUAY"; string public name = "Kuay Token"; uint public totalSupply = 10000* 10 ** 18; constructor() { balances[msg.sender] = totalSupply; } event TransferValue(address indexed from, address indexed to, uint value); event Approval(address indexed reciever, address indexed spender, uint value); function balanceOf(address reciever) public view returns(uint){ return balances[reciever]; } function transfer(address sendto, uint value) public returns(bool){ require(balanceOf(msg.sender) >= value,'balance too low'); balances[sendto] += value; balances[msg.sender] -= value; emit TransferValue(msg.sender, sendto, value); return true; } function approve(address spender, uint value) public returns(bool){ allowance[msg.sender][spender] = value; emit Approval(msg.sender, spender,value); return true; } function transferFrom (address sender, address reciever, uint value) public returns(bool){ require(balanceOf(sender) >= value, 'blance too low'); require(allowance[sender][msg.sender] >= value, 'allowance to low'); balances[reciever] += value; balances[sender] -= value; emit TransferValue(sender, reciever, value); return true; } }
ทำการอัพโหลด หรือจะ Copy หรือจะอะไนก็ได้ไปบนเว็บไซต์: https://remix.ethereum.org/
ตั้งค่า Compiler ตามนี้ครับ:
ตั้งค่า Deploy เป็น Inject Web 3 มันจะเด้งเรียกให้เราเปิด Wallet ผมใช้ Meta Mask ดังนั้นก็ connect Mata Mask เปลี่ยน เป็น BEP20 มาตรฐานของ Binance Smart Chain เติมค่า Gas ลงไปนะจ๊ะ (มันมีค่า Gas)
มีสองกระเป๋า แต่ก็ไม่พอจ่ายจ้า!!!!!!
เมื่อ Deploy มันจะบอกว่า เราต้องจ่ายค่า Gas เท่าไร ถ้ากดก็จะเห็นว่า Token เหรียญเราจะอยู่ที่ Binance (BNB) Blockchain Explorer (bscscan.com) ครับ
ส่วนตัวคือ ไม่มีค่า GAS กับ Tutorial นี้ครับ รอมีก่อนแต่ถ้าใครทำได้ก็แชร์กันหน่อยเน้อ