ลองเขียน Code เพื่อสร้าง Transaction ใน web3 Tester provider

หลังจากที่เราเข้าใจพื้นฐาน และการทำงานแล้ว เราก็มาลงมือเขียน Code กันบ้าง เพื่อให้เข้าใจ และเหมือนตอนก่อนหน้า ลองเขียน Code เพื่อสร้าง Wallet ตาม BIP32 BIP39 BIP44 ที่เราจะเอา Google Colab มาใช้อีกครั้ง แต่ถ้าใครจะใช้ Jyputer notebook หรือว่า python ใน linux หรือ windows ก็ไม่ว่ากันนะครับ ได้เหมือนกัน

Web3 package

Web3 เป็น interface ที่รองรับการสั่งงานจาก application ของเรา (หรือตัวเรา) เพื่อให้การสร้าง transaction หรือ กระทำ action ใดๆกับ Blockchain นั้นง่ายมากขึ้น เพราะไม่อย่างนั้นเราต้องทำความเข้าใจการ hash และการ prepare data และ function อีกมากมาย เค้าเลยทำให้เราใช้งานได้ง่ายๆเลย เราเตรียมข้อมูล และเรียกใช้ function ต่างๆอย่างเดียวพอ ที่เหลือ Web3 จัดการให้ รวมทั้งเครื่องมือต่างๆ เช่น การอ่านค่าจาก blockchain หรือการเปลี่ยนหน่วย เป็นต้น

เปิด Google Colab

กดได้เลยครับ https://colab.research.google.com/ จากนั้นให้กดปุ่ม NEW NOTEBOOK เพื่อสร้าง notebook ใหม่ 

ในช่องที่ให้ใส่โค้ด ใส่ไปเลยตามนี้

!pip install web3

แล้วกด shift + enter พร้อมกัน เพื่อสั่ง execute code

และเพื่อให้การทดสอบนี้ เรียบง่าย เราจะใช้งาน TesterProvider (ขอให้เข้าใจ concept ก่อน ครั้งต่อไป จะไปใช้ Provider จริงๆ) ดังนั้นในบรรทัดใหม่ ให้เราใส่โค้ดไปดังนี้

!pip install 'web3[tester]'

เพียงเท่านี้ เราก็จะมี library web3 พร้อมใช้งานแล้ว อีกทั้งมี Ethereum simulate node ให้เราทดสอบ interact มาด้วยพร้อมกันเลย

ลุย!

แต่เดี๋ยวก่อน เนื่องจาก Google Colab มีปัญหากับ library jsonschema ดังนั้นเราต้อง reinstall ซะก่อนด้วย

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

หลังจาก execute แล้วก็กด RESTART RUNTIME (ตามที่ message log บอกเอาไว้ได้เลย)

เชื่อมต่อ network

ให้เราใส่โค้ดดังนี้ 

from web3 import Web3
w3 = Web3(Web3.EthereumTesterProvider())

แล้วกด shift + enter เพื่อ execute บรรทัดแรก คือการสั่งให้ python ของเราเรียกใช้งาน library ตัวนี้ โดยจะเรียกใช้งานได้ผ่านทาง Web3 object

บรรทัดที่สอง เป็นการ initial connection ไปที่ Tester Provider (simulation ethereum node)

โดยในขั้นตอนนี้จะไม่มีอะไรออกมาที่หน้าจอ เพราะเป็นการ initial connection เท่านั้น โดยเก็บเอาไว้ใน object w3

วิธีการทดสอบ

w3.isConnected()

(เหมือนเดิมคือ shift + enter เพื่อเป็นการ execute โดยต่อจากนี้ผมจะถือว่าเป็นอันเข้าใจตรงกันนะครับ) ระบบจะตอบ True กลับมา ก็คือ เชื่อมต่อได้สำเร็จแล้วนั่นเอง

เตรียม Accounts ที่จะใช้งาน

จากการที่เราเชื่อม tester provider อยู่ ซึ่ง library ก็ได้เตรียม Address ให้เราแล้ว โดยการตรวจสอบได้จาก

W3.eth.accounts

จะได้ account ทั้งหมด ที่เราสามารถใช้งานได้ทุกอันในนี้เลย โดยแต่ละอันนี้แหล่ะ ก็คือ public address เหมือนอย่างที่เราสร้างขึ้นมาเองตอนที่ทำตามบทความก่อนหน้านี้ครับ 

['0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf',
 '0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF',
 '0x6813Eb9362372EEF6200f3b1dbC3f819671cBA69',
 '0x1efF47bc3a10a45D4B230B5d10E37751FE6AA718',
 '0xe1AB8145F7E55DC933d51a18c793F901A3A0b276',
 '0xE57bFE9F44b819898F47BF37E5AF72a0783e1141',
 '0xd41c057fd1c78805AAC12B0A94a405c0461A6FBb',
 '0xF1F6619B38A98d6De0800F1DefC0a6399eB6d30C',
 '0xF7Edc8FA1eCc32967F827C9043FcAe6ba73afA5c',
 '0x4CCeBa2d7D2B4fdcE4304d3e09a1fea9fbEb1528']

ทีนี้ถ้าเราอยากรู้ว่า account ที่เราจะดูนั้นมี Ether balance เหลือเท่าไร ให้เราสั่งดังนี้

w3.eth.get_balance(w3.eth.accounts[0])

หมายความว่า อ่าน balance จาก account ลำดับที่ 0 (account แรก) จะได้ 1000000000000000000000000 ซึ่งมันคือ wei นะครับ อย่าลืมตามที่เล่าไปก่อนหน้าแล้ว หรือถ้าอยากเห็นเป็น ether ก็แปลงโดยการใช้

w3.fromWei(1000000000000000000000000, 'ether')

จะได้ Decimal(‘1000000’) หรือ 1 ล้าน ether นะครับ 

ซึ่ง เราจะสั่งอ่าน balance โดยระบุ address ตรงๆเลยก็ได้ครับ แบบนี้ 

w3.eth.get_balance('0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf')

สร้าง Transaction

เอาล่ะ มาถึง Highlight กันสักที กับการเรียก และ ส่ง transaction เราจะ setup transaction และสั่งรัน หน้าตาแบบนี้ครับ

tx_hash = w3.eth.send_transaction({
   'from': w3.eth.accounts[0],
   'to': w3.eth.accounts[1],
   'value': w3.toWei(3, 'ether'),
   'gas': 21000
})

หมายความว่า เราสั่งโอน ether จาก account ลำดับที่ 0 ไป account ลำดับที่ 1 จำนวน 3 ether (ที่มีคำสั่งแปลงให้เป็น Wei เพราะอย่างที่บอกว่า ธุรกรรมจะทำงานด้วย Wei เท่านั้น เรื่องนี้ ต้องระวังมากในชีวิตจริง เพราะเคยมีคนเอางาน NFT ราคา 444ETH (ประมาณ 33 ล้านบาท) ไปขายในราคา 444 Wei มาแล้ว ก็คือความผิดพลาดในตำแหน่งนี้เลย คือใช้ ‘value’: 444 ก็คือเรียบร้อยเลย มันคือ 444 Wei นั่นเอง ส่วน gas ก็คือ gas limit สำหรับ transfer นั่นเองครับ 

ซึ่งคำสั่งนี้ จริงๆแล้ว จะต้องรอการ mine จาก network ให้เรียบร้อยก่อน จึงจะได้ผลลัพท์กลับมาใน tx_hash โดยขั้นตอนเบื้องหลังจะมี step ดังนี้

  1. ส่ง transaction เข้าไปใน network และจะเป็นสถานะ pending แล้วก็จะได้กลับมาเป็น transaction hash
  2. รอให้ transaction mine ให้เสร็จด้วย w3.eth.wait_for_transaction_receipt(tx_hash)
  3. เราไม่ต้องหยุดรอก็ได้ ไปทำงานส่วนอื่นก่อน และค่อยวนกลับมาตรวจสอบ ตรวจสอบ transaction ได้จาก w3.eth.get_transaction(tx_hash)

แต่ด้วยความเราใช้ tester provider ทุกอย่างจึงเสร็จในเสี้ยววินาทีเลย

ถ้าเราตรวจสอบยอดคงเหลือ จะได้ว่า

w3.eth.get_balance(w3.eth.accounts[0])

จะได้ 999996999979000000000000 จะเห็นได้ว่า ไม่ได้หายไป 3 ether แต่มีเศษด้วย นั่นเป็นเพราะว่า ต้องเสียอีกส่วนหนึ่งไปกับค่า gas fee นั่นเอง ส่วน account ขารับ

w3.eth.get_balance(w3.eth.accounts[1])

1000003000000000000000000 จะได้ 3 ether เป๊ะๆครับ 

ทั้งหมดนี้ก็คือแนวทางที่ใช้ Web3 เป็นเครื่องมือสำหรับการสร้างและส่ง Transaction ใน Tester Provider ที่ Web3 เองได้เตรียมเครื่องมืออะไรต่างๆเอาไว้ให้ทั้งหมดแล้ว

เดี๋ยวครั้งหน้าเราจะไปใช้งาน Provider ของจริง + Local private key ที่เราได้มาจากการสร้างขึ้นมาเองก่อนหน้านี้ ซึ่งนั่นก็จะพร้อมสำหรับการเอาไปใช้งานจริงๆได้แล้วครับ

และเช่นเคย ก็คือ download python notebook file ได้เลยครับ เอาไป import ใน jupyter notebook หรือ google colab ได้เลย

Leave a Reply