สร้าง Smart Contract บน Binance Smart Chain(BSC) ด้วย Solidity และ Truffle แบบ Step by Step เรียกว่าจับมือทำ

Sakul Montha
6 min readApr 18, 2021

--

สวัสดีครับทุกท่าน วันนี้ Topic ตามด้านบนเลยครับ ผมจะพาทัวร์การสร้าง Smart Contract บน BSC กัน เพื่อไม่ให้เป็นการเสียเวลา บทความนี้เหมาะกับผู้ที่สนใจใน Smart Contract, Token, Binance Smart Chain, Soldility อะไรที่มันเกี่ยวกับ Blockchain และผู้ที่อยากลองทำดู ไม่เหมาะกับผู้ที่อาจจะยังไม่ทราบคำศัพท์ต่าง ๆ เนื่องจากมันจะมีความ BuzzWord เยอะมาก

CREATE SMART CONTRACT ON BINANCE SMART CHAIN

Prerequisite

ก่อนที่เราจะเริ่มกัน สิ่งที่เราควรมีก็จะมีประมาณนี้

  1. git-cli หรือ git command แล้วก็ nodejs อันนี้ถ้าใครยังไม่มี ข้ามไปเลยครับยกเลิกการอ่านบทความนี้ไปเลยหยอก ๆ
  2. ด้วยความที่เดี๋ยวเราจะมีการ clone git ชุดนึง ซึ่งในนั้นจะมีไฟล์ใหญ่ที่เค้าใช้ Git large file storage เอาไว้ผมจึงแนะนำให้ทุกท่านมี lfs เอาไว้ก่อน ด้วยคำสั่ง brew install git-lfs ถ้าไม่รู้จัก brew อ่านได้ที่นี่
  3. Binance Chain CLI หรือ bnbcli เป็นสิ่งที่ขาดไม่เลยจริง ๆ ในการที่เราจะมีการ Interact กับ Binance Chain โดยวิธีการก็ให้เรา ไปที่นี่ หรือไม่อยากไป ก็สามารถ clone ได้เลยด้วยคำสั่ง git clone https://github.com/binance-chain/node-binary.git (จริง ๆ ในบทความนี้ไม่ได้ใช้มันหรอก) แต่ก็แนะนำให้เข้าไปอยู่ดีนะครับเนื่องจากมันเป็น Document ที่ทุกท่านควรอ่าน
  4. เมื่อ 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 ไม่ได้เอาเป็นว่า ทำตามนี้แหละ
  5. Truffle หรือ truffle เป็น development environment, testing framework and asset pipeline สำหรับ Ethereum ให้เราเตรียมไว้ก่อนเลย โหลดนานเอาเรื่อง npm install -g truffle
  6. 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 ตามภาพ

ภาพตัวอย่างการ Generate Address และ Private key

แทรกนิดนึง 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 แล้วรอมันโหลด ดังภาพ

ภาพตัวอย่าง Smart Chain Faucet

เมื่อเสร็จสิ้นตรงนี้ให้เราไปดู BscScan ที่คุ้นเคยกัน ด้วย Url: https://testnet.bscscan.com/ จากนั้นให้เรากรอกค่า Address ที่เราได้มาจาก vanity-eth.tk เพียงเท่านี้เราก็จะได้น่าตาที่คุ้นเคยแล้ว และตอนนี้เราก็มีอยู่ 1 BNB สวย ๆ

ภาพตัวอย่าง BscScan

Smart Contract

ถ้าหากทุกท่านมาถึงตรงนี้แล้วนั้นผมก็ยินดีด้วยครับ แต่มันยังไม่เสร็จ เราต้องไปกันต่อ หลังจากนี้จะเป็นการ Coding ด้วย Soldility กับ JavaScript ละ ที่จริงตรงนี้ถ้าแค่จะทำขำ ๆ แบบตัวอย่างที่ผมทำให้ดู ก็ไม่ต้องใช้ความรู้เรื่องภาษาอะไรมาก ลอกได้เลย เมื่อสักครู่เรามี Address ละทีนี้เราก็มาสร้างโปนเจคกัน เอาหละ ลุย

  1. Create project ผมใช้ชื่อ $ mkdir PrayuToken
  2. $ npm init
  3. Create directory $ mkdir contracts, $ mkdir migrations
  4. Create file $ truffle-config.js
  5. $ cd contracts > $ touch Migrations.sol, $ touch PRATUToken.sol
  6. $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"
}
ภาพตัวอย่าง Structure
// 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 ETH
2_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 ETH
Summary
=======
> Total deployments: 2
> Final cost: 0.0287726 ETH

ถ้าทุกอย่างเรียบร้อยเราจะได้เห็นตั้งแต่ Address, Contract ไปจนถึง Token ไหลเป็น Flow ดังภาพครับ

ภาพตัวอย่าง ที่มี Transaction เกิดขึ้น
ภาพตัวอย่าง เมื่อคลิกเข้ามาที่ Contract Creation
ภาพตัวอย่าง เมื่อคลิกต่อเข้ามาที่ PRAYU Token

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 ดู หรือท่านใดไม่ได้คิดว่าจะทำ แต่หลงเข้ามาก็หวังว่าจะมีประโยชน์กับท่านเหมือนกันนะครับ

สุดท้ายนี้ผิดพลาดประการใด ชี้แนะได้เลยนะครับ ผมเองก็มือใหม่มากกับเรื่องนี้

--

--

Sakul Montha

Chief Product Officer, a man who’s falling in love with the galaxy.