สร้าง Smart Contract บน Binance Smart Chain(BSC) ด้วย Solidity และ Truffle แบบ Step by Step เรียกว่าจับมือทำ
สวัสดีครับทุกท่าน วันนี้ Topic ตามด้านบนเลยครับ ผมจะพาทัวร์การสร้าง Smart Contract บน BSC กัน เพื่อไม่ให้เป็นการเสียเวลา บทความนี้เหมาะกับผู้ที่สนใจใน Smart Contract, Token, Binance Smart Chain, Soldility อะไรที่มันเกี่ยวกับ Blockchain และผู้ที่อยากลองทำดู ไม่เหมาะกับผู้ที่อาจจะยังไม่ทราบคำศัพท์ต่าง ๆ เนื่องจากมันจะมีความ BuzzWord เยอะมาก
Prerequisite
ก่อนที่เราจะเริ่มกัน สิ่งที่เราควรมีก็จะมีประมาณนี้
git-cli
หรือgit command
แล้วก็nodejs
อันนี้ถ้าใครยังไม่มี ข้ามไปเลยครับยกเลิกการอ่านบทความนี้ไปเลยหยอก ๆ- ด้วยความที่เดี๋ยวเราจะมีการ
clone git
ชุดนึง ซึ่งในนั้นจะมีไฟล์ใหญ่ที่เค้าใช้Git large file storage
เอาไว้ผมจึงแนะนำให้ทุกท่านมีlfs
เอาไว้ก่อน ด้วยคำสั่งbrew install git-lfs
ถ้าไม่รู้จักbrew
อ่านได้ที่นี่ - Binance Chain CLI หรือ
bnbcli
เป็นสิ่งที่ขาดไม่เลยจริง ๆ ในการที่เราจะมีการ Interact กับ Binance Chain โดยวิธีการก็ให้เรา ไปที่นี่ หรือไม่อยากไป ก็สามารถclone
ได้เลยด้วยคำสั่งgit clone https://github.com/binance-chain/node-binary.git
(จริง ๆ ในบทความนี้ไม่ได้ใช้มันหรอก) แต่ก็แนะนำให้เข้าไปอยู่ดีนะครับเนื่องจากมันเป็น Document ที่ทุกท่านควรอ่าน - เมื่อ
clone
มาเสร็จแล้ว ไปที่ Directory ของท่าน ตามแต่ใจที่ต้องการจะวาง แล้วไปที่cd node-binary/cli/{network}/{version}/{os}
แนะนำให้ลองกับtestnet
ก่อนนะครับส่วน Version ผมเอาล่าสุด ณ ตอนที่เขียนก็0.8.1
จากนั้นลบไฟล์tbnbcli
ทิ้งไปก่อนทีนึง แล้วพิมพ์git lfs track "tbnbcli"
จากนั้นก็git reset — hard master
แอบวุ่นนิดนึงที่ให้ทำเพราะถ้าเราไม่track
ไฟล์ไว้ที่ Directory เอาไว้ มันจะทำให้คุณใช้bnbcli
ไม่ได้เอาเป็นว่า ทำตามนี้แหละ - Truffle หรือ
truffle
เป็น development environment, testing framework and asset pipeline สำหรับ Ethereum ให้เราเตรียมไว้ก่อนเลย โหลดนานเอาเรื่องnpm install -g truffle
IDE Tool
ในที่นี้ผมใช้เป็นVS Code
Extension เสริมชื่อ solidity บนVS Code
Test CLI
หลังจากที่เราได้ทำการเตรียมตัวกันแล้ว ขั้นต่อมาก็มาทดสอบกันหน่อยว่า คำสั่งที่ลง ๆ กันไปนั้นมันใข้งานได้ใช่ไหม
$cd node-binary/cli/{network}/{version}
$./tbnbcli// ถ้าขึ้นแบบนี้แปลว่า มาถูกทาง
BNBChain light-client
Usage:
bnbcli [command]...$truffle// ถ้าขึ้นแบบนี้แปลว่า มาถูกทาง
Truffle v5.3.2 - a development framework for Ethereum
Usage: truffle <command> [options]...
Create Address
จากด้านบน ตอนนี้เรามี truffle
แล้วซึ่งเราใช้ npm -g
ซึ่งมันจะเป็น Global
เราสามารถเรียกตรงไหนก็ได้ของเครื่องเรา แต่อีกอันนึงที่เรา clone มาให้เราเปิดทิ้งไว้แบบนั้นก่อน ที่ cd node-binary/cli/{network}/{version}/{os}
ของเรา
ที่นี้เราก็จะมาสร้าง Address
กับ Private key
กัน ไปที่ https://vanity-eth.tk/
แล้วเลื่อนลงไปล่างสุด กดปุ่ม Generate ตามภาพ
แทรกนิดนึง vanity-eth
เป็น Open source tool ใช้สำหรับ Generate Ethereum vanity addresses
เมื่อได้ Address กับ Private key มาแล้ว เราจะมาลอง Transfer กันสักหน่อย ไปที่ https://testnet.binance.org/faucet-smart จากนั้น ให้เรากรอก Address ที่เราได้มาจาก vanity-eth.tk
ไปกรอกในช่อง แล้วเลือก Give me 1 BNB แล้วรอมันโหลด ดังภาพ
เมื่อเสร็จสิ้นตรงนี้ให้เราไปดู BscScan
ที่คุ้นเคยกัน ด้วย Url: https://testnet.bscscan.com/ จากนั้นให้เรากรอกค่า Address ที่เราได้มาจาก vanity-eth.tk
เพียงเท่านี้เราก็จะได้น่าตาที่คุ้นเคยแล้ว และตอนนี้เราก็มีอยู่ 1 BNB สวย ๆ
Smart Contract
ถ้าหากทุกท่านมาถึงตรงนี้แล้วนั้นผมก็ยินดีด้วยครับ แต่มันยังไม่เสร็จ เราต้องไปกันต่อ หลังจากนี้จะเป็นการ Coding ด้วย Soldility กับ JavaScript ละ ที่จริงตรงนี้ถ้าแค่จะทำขำ ๆ แบบตัวอย่างที่ผมทำให้ดู ก็ไม่ต้องใช้ความรู้เรื่องภาษาอะไรมาก ลอกได้เลย เมื่อสักครู่เรามี Address ละทีนี้เราก็มาสร้างโปนเจคกัน เอาหละ ลุย
- Create project ผมใช้ชื่อ
$ mkdir PrayuToken
$ npm init
- Create directory
$ mkdir contracts
,$ mkdir migrations
- Create file
$ truffle-config.js
$ cd contracts
>$ touch Migrations.sol
,$ touch PRATUToken.sol
$cd ../migrations
>$ touch 1_initial_migration.js
,$ touch 2_deploy_contracts.js
$ npm install @babel/polyfill
$ npm install truffle-ledger-provider
$ npm install @truffle/hdwallet-provider
$ npm install @openzeppelin/contracts
ภายใน package.json
ของผมประกอบไปด้วยประมาณนี้
"name": "PRAYUToken",
"version": "1.0.0",
"description": "PRAYU Token is test Binance smart chain",
"main": "truffle-config.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
"@babel/polyfill": "^7.12.1",
"@openzeppelin/contracts": "^4.0.0",
"@truffle/hdwallet-provider": "^1.2.6",
"truffle-ledger-provider": "^1.0.3"
},
"devDependencies": {
"truffle-plugin-verify": "^0.5.7"
}
// 1_initial_migration.js
const Migrations = artifacts.require("Migrations");
module.exports = function (deployer) {
deployer.deploy(Migrations);
};// 2_deploy_contracts.js
const PRAYUToken = artifacts.require("PRAYUToken.sol");
module.exports = function (deployer) {
deployer.deploy(PRAYUToken);
};
ทั้ง 2 ไฟล์ด้านบน เป็น การเขียน JavaScript เพื่อที่จะเตรียมใช้สำหรับ Deploy
// Migrations.sol
pragma solidity >=0.4.22 <0.9.0;contract Migrations {
address public owner = msg.sender;
uint public last_completed_migration; modifier restricted() {
require(
msg.sender == owner,
"This function is restricted to the contract's owner"
);
_;
} function setCompleted(uint completed) public restricted {
last_completed_migration = completed;
}
}
// PrayuToken.sol
pragma solidity ^0.8.0;import '@openzeppelin/contracts/token/ERC20/ERC20.sol';contract PRAYUToken is ERC20 {
constructor() ERC20('PRAYU Token', 'PRAYUT') {
_mint(msg.sender, 1000000 * 10 ** 18);
}
}
ทั้ง 2 ไฟล์ด้านบน จะเป็นเรื่องเกี่ยวกับ Smart Contract ละโดยมีการใช้งาน ERC20
ที่เป็นของ Ethereum
ทั้งมีการกำหนดค่าต่าง ๆ แบบพื้นฐานมาก ๆ ๆ ๆ ซึ่งท่านสามารถไปศึกษาต่อได้ (มาสอนผมด้วย)
ส่วนต่อไป จะเป็นไฟล์สุดท้ายละ
// truffle-config.jsconst HDWalletProvider = require('@truffle/hdwallet-provider');
const provider = new HDWalletProvider({
privateKeys: ['{private key}'],
providerOrUrl: 'https://data-seed-prebsc-1-s1.binance.org:8545/'
});module.exports = {
networks: {
bsc: {
// production
},
binanceTestnet: {
provider: () => provider,
network_id: "97",
gas: 1000000,
skipDryRun: true
}
},
compilers: {
solc: {
version: "0.8.3"
}
}
}
// Testnet(ChainID 0x61, 97 in decimal)
ในส่วนของ privateKeys
ให้ท่านกลับไปที่ vanity-eth.tk หวังว่าจะยังไม่ได้ปิดหน้านี้ไปนะครับ ไป copy
มาใส่ จากนั้นตามนี้เลย
Deploy
ในการ deploy
เราจะใช้ truffle
ด้วยคำสั่ง truffle migrate
เพื่อทำการ migrate contract ของเรา แล้วก็ทำการใส่ option reset
และ network
ว่าเราจะใช้ binanceTestnet
ตามที่เราได้เขียนไว้
$ truffle migrate --reset --network binanceTestnetCompiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.Starting migrations...
======================
> Network name: 'binanceTestnet'
> Network id: 97
> Block gas limit: 30000000 (0x1c9c380)1_initial_migration.js
======================
Replacing 'Migrations'
----------------------
> transaction hash: 0xa2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx03
> Blocks: 2 Seconds: 4
> contract address: 0x83xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx04
> block number: 8070745
> block timestamp: 1618702408
> account: 0x93xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxC8
> balance: 0.90948058
> gas used: 191943 (0x2edc7)
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.00383886 ETH> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.00383886 ETH2_deploy_contracts.js
=====================
Replacing 'PRAYUToken'
----------------------
> transaction hash: 0x4fxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8f
> Blocks: 1 Seconds: 4
> contract address: 0xeAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6e
> block number: 8070751
> block timestamp: 1618702426
> account: 0x93xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxC8
> balance: 0.88370008
> gas used: 1246687 (0x1305df)
> gas price: 20 gwei
> value sent: 0 ETH
> total cost: 0.02493374 ETH> Saving migration to chain.
> Saving artifacts
-------------------------------------
> Total cost: 0.02493374 ETHSummary
=======
> Total deployments: 2
> Final cost: 0.0287726 ETH
ถ้าทุกอย่างเรียบร้อยเราจะได้เห็นตั้งแต่ Address, Contract ไปจนถึง Token ไหลเป็น Flow ดังภาพครับ
Conclusion
เราได้ทำการเตรียมเครื่อง แล้วก็ทำการสร้าง Address, Contract และ Token เรียบร้อยแล้ว ถ้าท่านลองจนมั่นใจแล้ว ก็สามารถปรับ จาก Test เป็น Prod ได้ด้วยการ มาใช้ bsc {} ที่เว้นว่างเอาไว้ โดยnetwork_id
จะเป็น 56
URL จาก https://data-seed-prebsc-1-s1.binance.org:8545
เป็น https://bsc-dataseed.binance.org/
(URL)
$ truffle migrate --reset --network bsc
ทั้งนี้อย่าลืมใส่ค่า Gas
ด้วยนะครับ
ขอบคุณทุกท่านที่อ่านมาจนถึงตรงนี้นะครับ ก็หวังว่าบทความนี้จะมีประโยชน์ สำหรับท่านที่ต้องการทดลองสร้าง Smart Contract บน BSC ดู หรือท่านใดไม่ได้คิดว่าจะทำ แต่หลงเข้ามาก็หวังว่าจะมีประโยชน์กับท่านเหมือนกันนะครับ
สุดท้ายนี้ผิดพลาดประการใด ชี้แนะได้เลยนะครับ ผมเองก็มือใหม่มากกับเรื่องนี้