HD Wallet และ Transaction บน BSC Network

หลังจากที่เราไปลุยกันมาแล้วทั้ง ETH network , TRON network คราวนี้ ก็มาถึง BSC network กันบ้างแล้ว จริงๆ ก็ลืมไปว่าทำไมเราไม่เริ่มที่ BSC network นะ ทั้งๆที่คนก็ใช้เยอะอยู่ แต่ไม่เป็นไร เราก็จะได้มาอ่านกันในเนื้อหาคราวนี้กันครับ

เหตุผลส่วนหนึ่ง ที่ผมเริ่มต้นที่ ETH network ก่อน เพราะ ETH network นั้นคือต้นฉบับของ อีกหลายๆ blockchain network ด้วยเหมือนกัน โดยเฉพาะส่วนใหญ่ที่สามารถรัน Smart Contract ได้ (แต่ก็ไม่ใช่ทั้งหมดนะ อย่าเข้าใจผิด) ซึ่ง BSC ก็ด้วยเช่นกัน เรียกได้ว่า ช่วงแรก ก็ fork มาปรับตั้งค่า แล้วก็รันเป็นของตัวเองเลยล่ะ

เชื่อม BSC Testnet network

เช่นเคยกับ Python และ Web3 เหมือนบทความก่อนหน้า เขียน Code เพื่อสร้าง Transaction ใน web3 Blockchain จริงๆ

!pip install web3
!pip install --force-reinstall jsonschema==3.2.0

หลังจากติดตั้งเสร็จ ก็เชื่อมต่อ network กันต่อ

from web3 import Web3
from web3.middleware import geth_poa_middleware
node_url = 'https://data-seed-prebsc-1-s1.binance.org:8545'
w3 = Web3(Web3.HTTPProvider(node_url))
w3.middleware_onion.inject(geth_poa_middleware, layer=0)
w3.isConnected()

ถ้าสังเกตโค้ดดีๆจะเห็นว่า มีการ import geth_poa_middleware เข้ามาด้วย รวมทั้งมีการ inject เข้าไปใน w3 ที่เป็นอย่างนั้น ก็เพราะ เราต้องสร้าง middleware ขึ้นมาเพื่อคั่นการทำงานของ web3 กับ network ทีนึงก่อน เพราะ default web3 ถูกสร้างขึ้นมาเพื่อทำงานกับ ETH network เป็นหลัก การเอาไปใช้งาน network อื่น จำเป็นต้องมี middleware เข้ามาช่วยเหลืออย่างในกรณีนี้

ข้อดีของ BSC Testnet ก็คือ เราไม่ต้องตั้ง node เอง แต่เราสามารถเรียกใช้งาน testnet node ได้เลยทันที

อ่านค่า block

หลังจากที่เราเชื่อมต่อ network เรียบร้อย ก็ทำการเรียกใช้งาน function กันต่อ เพื่อทดสอบว่าอ่านค่าจาก block ได้จริง

w3.eth.get_block('latest')

ขอรับ TBNB , Token BEP20

และเช่นเคย ก่อนที่เราจะไปใช้งานหรือว่าทำงานอะไรบน network เราก็ต้องขอรับ Native token , Token BEP20 (ตาม standard ของ BSC network) บน Testnet กันก่อน เพื่อให้เราลองทดสอบสิ่งต่างๆต่อได้ ซึ่งผมขอรับมาจาก https://testnet.binance.org/faucet-smart ซึ่งเค้าให้วันละครั้ง ผมก็ขอ BNB วันนึง อีกวันนึงก็เป็น BUSD ซึ่ง BUSD ก็คือ Teken ที่เหมือน standard ERC20 ที่เราเคยเล่าไปใน Ethereum network แต่ว่านี่เป็น standard BEP20 บน BSC network เท่านั้นเองครับ

อ่านค่า native token balance

ควรจะง่ายมากๆ ก็เพียงแค่ใช้คำสั่ง get_balance() เหมือนอย่างเคย

my_address = '0x14Ca6e7EeA0Fa533986BC01501EFf9393AB50780'
to_address = '0x34652b56ab34E1aDE3FD6106dD6098E61597B72D'
w3.eth.get_balance(my_address)

ได้ผลลัพท์ 1000000000000000000 และเช่นเคย หน่วยเป็น wei ครับ (ก็เพราะลอก ETH มานั่นไง)

อ่านค่า BEP20 Token

เช่นเคย การอ่านค่า BEP20 Token ก็จะต้อง call contract ของ BEP20 token ตัวนั้น และเรียกใช้ function ที่มีข้างในเพื่ออ่านค่าครับ ซึ่งก็จะอ้างอิงมาจากบทความ เขียน Code คุยกับ smart contract กับการจัดการ Token ERC20 เริ่มต้นที่ setup ABI ก่อน เอาที่พอใช้งานเหมือนเดิม

minABI = [
    {
        'inputs': [{'internalType': 'address', 'name': 'account', 'type': 'address'}],
        'name': 'balanceOf',
        'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
        'stateMutability': 'view', 'type': 'function', 'constant': True
    },
    {
        'inputs': [],
        'name': 'decimals',
        'outputs': [{'internalType': 'uint8', 'name': '', 'type': 'uint8'}],
        'stateMutability': 'view', 'type': 'function', 'constant': True
    },
    {
        'inputs': [],
        'name': 'symbol',
        'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
        'stateMutability': 'view', 'type': 'function', 'constant': True
    },
    {
        'constant': False,
        'inputs': [
            {
                'name': '_to',
                'type': 'address'
            },
            {
                'name': '_value',
                'type': 'uint256'
            }
        ],
        'name': 'transfer',
        'outputs': [
            {
                'name': '',
                'type': 'bool'
            }
        ],
        'payable': False,
        'stateMutability': 'nonpayable',
        'type': 'function'
    }
]

โดย BUSD ใน Testnet มี contract address คือ 0xeD24FC36d5Ee211Ea25A80239Fb8C4Cfd80f12Ee ดังนั้น เราก็สร้าง instance เพื่อเตรียมสำหรับเรียกใช้ contract ขึ้นมา

--------------------------------------------------------------

เนื้อหาพิเศษ ต้องแลกด้วย Reach เท่านั้น

เนื้อหาส่วนนี้เป็นเนื้อหาพิเศษ จะต้องใช้ reach ในการเข้าอ่านเนื้อหาจุดนี้ เมื่อแลกด้วย reach แล้วจะสามารถอ่านเนื้อหาที่ซ่อนอยู่เพิ่มเติมได้ หากมี reach แล้วกรุณา login ก่อน อ่านรายละเอียดเพิ่มเติมเรื่อง Reach

ก็จะได้ 10000000000000000000 หรือ 10000000000000000000/1e18 = 10 นั่นเองครับ ตรงตามที่เราขอรับมาเลย

สั่งโอน Native Token

เมื่อเราอ่านค่าได้แล้ว เราก็จะสั่งโอนออกไปที่ wallet ที่ 2 ของเราเอง และก็ไม่ยากเกินไป ด้วยการ setup transaction การโอน

--------------------------------------------------------------

เนื้อหาพิเศษ ต้องแลกด้วย Reach เท่านั้น

เนื้อหาส่วนนี้เป็นเนื้อหาพิเศษ จะต้องใช้ reach ในการเข้าอ่านเนื้อหาจุดนี้ เมื่อแลกด้วย reach แล้วจะสามารถอ่านเนื้อหาที่ซ่อนอยู่เพิ่มเติมได้ หากมี reach แล้วกรุณา login ก่อน อ่านรายละเอียดเพิ่มเติมเรื่อง Reach

หรือว่าเราจะไปดูที่ account ปลายทางก็ได้เหมือนกัน ว่าจะนวนที่เราโอนนั้นเข้าจริงมั้ย ใช้โค้ดเดียวกับข้างบน แต่เปลี่ยน address ที่จะเช็คเท่านั้น

โอน BEP20 Token

ซึ่งตอนนี้ ABI เรามี function transfer ให้เรียกใช้งานได้อยู่แล้ว เรามาดำเนินการกัน โดยเริ่มต้นด้วยการตั้งค่า transaction กันก่อน โดยจะแตกต่างจากโอน native token เล็กน้อย เพราะเราต้องไป call transaction

--------------------------------------------------------------

เนื้อหาพิเศษ ต้องแลกด้วย Reach เท่านั้น

เนื้อหาส่วนนี้เป็นเนื้อหาพิเศษ จะต้องใช้ reach ในการเข้าอ่านเนื้อหาจุดนี้ เมื่อแลกด้วย reach แล้วจะสามารถอ่านเนื้อหาที่ซ่อนอยู่เพิ่มเติมได้ หากมี reach แล้วกรุณา login ก่อน อ่านรายละเอียดเพิ่มเติมเรื่อง Reach

โดยเราจะโอนกัน 1 BUSD นะครับ (หน่วยเป็น wei) ส่วนตัวแปรต่างๆ ก็อิงมาจากข้างบนๆเลย ส่วน chainId นั้นเป็น 97 สำหรับ testnet ครับ และ nonce ก็ get มาจากค่าล่าสุดเลย และต่อมาเราก็ sign transaction เพื่อยืนยันว่าเราเป็นคนดำเนินการกันต่อ

signed = w3.eth.account.sign_transaction(transfer_txn, key)
print(signed)

และก็ส่ง transaction เข้า BSC network กันไป

tx_hash = w3.eth.send_raw_transaction(signed.rawTransaction)

3 วินาทีก็จะ mine ถ้าไม่มีอะไรผิดพลาด แล้วมาดูผลกันต่อด้วย

w3.eth.get_transaction_receipt(tx_hash)

หรือว่า จะไปเปิดดูที่หน้า blockchain explorer ก็ได้นะครับ https://testnet.bscscan.com/address/0x14ca6e7eea0fa533986bc01501eff9393ab50780#tokentxns จะเห็นว่ามีการโอนออกไปแล้ว เท่านี้ก็เรียบร้อยแล้วครับ

เป็นอย่างไรกันบ้างครับ คราวนี้เรียกได้ว่า บทความเดียวครบถ้วนทุกอย่างเลย และในขั้นตอน call contract สำหรับการโอนนั้น เราสามารถไปประยุกต์ต่อในการเรียกใช้งาน smart contract อื่นๆได้ต่อนะครับ โดยใช้หลักการเดียวกันกับการสั่งโอนนี่แหล่ะ แต่แตกต่างตรงที่ function กับ parameter ที่เรียกใช้งานเท่านั้นเองครับ

และเช่นเคย source code ทั้งหมดในรูปแบบของ jupyter notebook (google colab ก็ใช้ได้) วางให้ download ไปใช้งานได้แล้วครับ

--------------------------------------------------------------

เนื้อหาพิเศษ ต้องแลกด้วย Reach เท่านั้น

เนื้อหาส่วนนี้เป็นเนื้อหาพิเศษ จะต้องใช้ reach ในการเข้าอ่านเนื้อหาจุดนี้ เมื่อแลกด้วย reach แล้วจะสามารถอ่านเนื้อหาที่ซ่อนอยู่เพิ่มเติมได้ หากมี reach แล้วกรุณา login ก่อน อ่านรายละเอียดเพิ่มเติมเรื่อง Reach