วิธี deploy และ การเรียกใช้ Smart contract ที่อยู่บน blockchain network(infura) แบบละเอียดยิบ ด้วย Truffle [Part2]

Supamongkon R
5 min readNov 28, 2022

--

หลังจากตอนที่แล้วที่เราได้ Deploy smart contract ขึ้นไปบน Infura (blockchin test net) ด้วยตัวช่วยที่สุดแสนจะทรงพลังอย่าง Truffle แล้วนั้น ใน Part นี้เราจะมาทำการ Interact กับตัว Smart contract กันครับ

โดยการ interact กับ Smart contract นั้นมีความสำคัญเป็นจำนวนมากเพราะว่าเมื่อเราทำการ deploy smart contract ขึ้นไปแล้วแต่ถ้าเราไม่สามารถ interact กับตัว smart contract ได้ก็จะนับได้ว่าเป็นอุปสรรค์อย่างมากในการที่จะทำให้ web ของเราเป็น web3 หรือ Dapp

และ Part นี้ผมจะมาอธิบายและแนะนำ Pattern ในการเชื่อมต่อและ interact กับตัว smart contract ด้วย node js ให้ดูกันและเราจะเริ่มไปพร้อมๆกันครับ โดยในแต่ละ Pattern ก็จะมีความยากความง่ายต่อความเข้าใจของเรา ขึ้นอยู่กับว่าเราอยากเลือกใช่วิธีไหน

มาเริ่มด้วยวิธีแรกกันเลยครับ Pattern แรก คือ Sign Transaction and Send Transaction

  • อธิบายเกี่ยวกับ Pattern แรกว่าทำไมต้อง Sign กับ Send, คือในการที่เราจะทำ Transaction อะไรสักอย่างบน Blockchain เราจำเป็นที่จะต้อง Sign Transaction ก่อนโดยที่เราจะ sign ด้วย Private key ของเรา หรือที่ถูกเรียกว่า Signature เพื่อให้ยืนยันว่า คนทำ Transaction นี้คือเรา ไม่ใช่คนอื่น และหลังจากนั้น Transaction ที่ถูก Sign เรียบร้อยแล้ว ก็จะถูก Send ไปยัง network เพื่อทำการ Proof ให้ Transaction นั้นเป็น Valid Transaction ก่อนและหลังจากนั้นค่อย Distribute ไปอยู่ในแต่ละ node ของ network
  • โดยใน Pattern แรก เวลาที่เราต้องการจะทำ Transaction นั้นเราจำเป็นต้องใส่รายละเอียดเกี่ยวกับการทำ Transaction หรือ Argument ที่จำเป็นอยู่ 6 Argument โดยเรามาทำความเข้าใจกับแต่ละ Argument กันก่อน ได้แก่
  • to => คือ address ที่เราต้องการจะทำ Transaction ด้วย
  • data => คือ ข้อมูลที่เราจะส่งเข้าไปใน Function ของ smart contract
  • gas => คือ จะเป็นการ estimate gas price ที่เราจะใช้ต่อการทำ 1 Transaction ด้วย data ที่เราใส่ไปใน smart contract
  • gas price => คือการ เช็ค ราคา gas ณ ตอนนั้นว่า gas price per unit อยู่ที่เท่าไหร่เพราะราคามันขึ้นๆลงๆตลอด ตาม ETH
  • nonce => คือตัวเลขที่จะใช้ในการ Proof transaction
  • Chain id => คือ blockchain network id ที่เราจะทำ transaction ในนั้น

ก่อนเริ่มเขียนเราอย่าลืมนะครับว่า network ของเรา บน infura นั้น Available อยู่ โดยเข้าไปเช็คที่ infura=> project => setting => infura transaction เพื่อทำการ make sure ว่า network เรา Available อยู่

โอเคพอกล่าวถึงรายละเอียดแล้วเรามาเริ่มเขียน code กัน โดยตอนแรกสร้างไฟล์ขึ้นมา 1 ไฟล์ ชื่อ interact1.js

Create node.js file

หลังจากนั้นทำการ import web3js library และตัว ไฟล์ smartcontract.json ที่เรา compile ด้วย Truffle ไปใน part 1 ก่อนหน้านี้ เพราะเราจะเอา abi และ contract address ออกมาใช้งาน และเตรียม account กับตัว endpoint(infura blockhain network) ของเราให้เรียบร้อยเพื่อเตรียมพร้อมในการใช้งาน ตามนี้เลย

หลังจากนั้นเราจะมาทำการสร้าง Web3 instance ด้วย endpoint URL(infura) เพื่อเราจะสามารถ ใช้ modules ของ web3js library เพื่อดึงค่าส่งค่าใน network(infura)ได้

Create web3 instance and contract instance

หลังจาก นำ Argument ที่เราประกาศไว้ข้างบน มาสร้าง web3 instance และ contract instance มาถึงตรงนี้ผมจะอธิบายว่า method ใน web3js นั้นจะมีการรับค่า parameter แตกต่างกันออกไปในแต่ละ method สามารถเข้าไปดู Document ได้ที่ https://web3js.readthedocs.io/en/v1.2.11/getting-started.html ครับ

และหลายๆคนอาจจะสงสัยว่าทำไม networkID เราไม่ประกาศมันพร้อมๆกับเพื่อนๆข้างบน คำตอบคือ เราจะใช้ method ของ web3js ในการดึงข้อมูลบน network มาครับเพราะฉะนั้นมันต้องถูกประกาศภายใน function เท่านั้นเองครับ

โดย code ที่เราเขียนไปคือ

  • เราสร้าง web3 instance มาจาก endpoint url(infura)
  • เราสร้าง smart contract instance ด้วย ABI และ Contract address

และผมจะทำการแสดงหน้าตาของ contract address และ ตัว ABI ให้ทุกๆคนดูว่าหน้าตามันเป็นยังไง โดยเราจะ console.log ออกมาดูเลย

Contract address
ABI

สังเกตุไหมครับว่า ABI ที่เราทำการเอาออกมาดูนั้นประกอบด้วย 2 function คือ getNumber กับ SetNumber ตรงเป๊ะตามที่เราเขียนไว้ใน Smart contract ใน Part 1

หลังจากนั้นมาต่อกันครับโดยเราจะทำการ ประกาศข้อมูลที่จะต้องใช้ในการส่ง Transaction ทั้งหมดตามที่ผมได้อธิบายไว้ข้างบน โดยผมจะ log ออกมาให้ดูแต่ละตัวเลยว่าหน้าตามันเป็นยังไง

argument for sign transaction

ตามนี้เลยครับ เราได้ทำการสร้าง ค่าต่างๆเอาไว้สำหรับใช้ในการ sign transaction เรียบร้อยแล้วต่อมามาดูหน้าตาของแต่ละตัวกันเลยครับว่าข้อมูลเป็นยังไง

โดยตัวแรกคือ Transaction ที่เป็นการบอกว่าเราจะกำหนดค่าตัวเลข 10 ลงไปใน function ของ samart contract ที่ชื่อ setNumber แต่เราไม่ได้ใส่ผ่าน smart contract โดยตรง เราใส่ไปใน ABI ของมันแทนครับ หน้าตาก็จะเป็นแบบนี้

inside smartcontract.method.setNumber(10)

สังเกตุเห็น เลข 10 สีเหลืองๆนั่นไหมครับนั่นคือ ค่าที่เราได้ทำการส่งเข้าไปแล้วใน ABI function ถ้ามันขึ้นแบบนี้แสดงว่า ค่าถูกส่งเข้าไปแล้วเรียบร้อยครับ โอเคไปดูหน้าตาของตัวอื่นๆกันต่อเลย

another velue
  • data(abi and value after encode) => คือ ไอ้ตัว ABI function ที่เราใส่ค่า 10 ลงไปเมื่อกี้นั่นเองครับ แต่เราจะส่งแบบนั้นไปทื่อๆเลยไม่ได้เพราะ EVM จะสามารถรับรู้ได้แค่ ภาษาของคอมพิวเตอร์(binary) ซึ่งเราต้องทำการ encode มันก่อนที่จะส่งเข้าไปเป็น parameter เพื่อใช้ในการ sign transaction
  • Gas (gas use)=> คือจำนวน gas unit ที่จะใช้ทั้งหมดใน การทำ transaction นี้ (บันทึกเลข 10 ลงใน blockchain)
  • gas price (current gas price) => ค่า gas ต่อ unit ณ ปัจจุบัน หน่วยเป็น Gwei
  • nonce (nonce number) => ค่า nonce ที่เราจะใช้ใน Transaction นี้ครับ

โอเคหลังจากเห็นหน้าเห็นตาของ agrument ทั้งหมดที่จะใช้ sign transaction แล้ว เราจะมาทำการ รวมทั้งหมดเป็นก้อนพร้อมแนบ private key เข้าไปเพื่อเป็นการ Sign transaction กันครับ

โดยที่เราจะใช้ method signTransaction ของ web3js และยัดค่าทั้งหมดลงไป และพ่วงด้วย private key เพื่อใช้ในการ sign แต่ก่อนอื่นเรามาดูหน้าตาของ transaction ที่ถูก sign เรียบร้อยแล้วกันครับว่ามีอะไรข้างใน และ step ต่อไปเราจะใช้อะไร

inside sign transaction obj

จะเห็นได้ว่าข้างในนั้นจะมี Raw Transaction อยู่ เราจะนำ Raw Transaction นี่แหละครับ send เข้าไปบน blockchain network เพื่อให้ทำการ Proof ให้ Raw Transaction เปลี่ยนเป็น valid transaction เพื่อข้อมูลของเราจะได้ถูกบันทึกลง blockchain ส่วนข้อมูลอื่นๆ เราค่อยมาว่ากันครับ

หลังจากนั้นเราจะมา ทำการ send Raw transaction ที่เรา Sign ด้วย Private key กันครับ

send signed transaction to blockchain network

ขั้นตอนสุดท้ายเป็นการ ส่ง Raw transaction ของเราไปที่ blockchain network เพื่อทำการ proof เพื่อให้มันเป็น valid transaction และบันทึก transaction ลง block ครับ จะสังเกตุได้ว่าชื่อ method จะเป็น sendSignedTrasaction คำว่า Signed มันจะเติม ed แสดงว่ามันต้องการส่ง transaction ที่ sign แล้วเท่านั้น และค่า ที่จะส่งไปก็คือ raw transaction เพื่อเอาไปทำการ proof

โดยผลลัพธ์ของ pattern แรกของเราก็จะออกมาดังนี้

result

และเรียบร้อยครับ !! ค่า number ใหม่ของเราถูกบันทึกเข้าไปใน blockchain แล้ว หลังจากนั้นให้เราลองเอา Transaction hash ไปตรวจสอบดูใน https://goerli.etherscan.io/

etherscan goerli

หลังจากเอา transaction hash ไป search ดูใน etherscan เราก็จะพบข้อมูลภายในว่าใครทำอะไรนะครับ โดย From และ To จะเป็นการบอกว่าเราได้ทำ Transaction กับ smart contract ดูได้จาก Address ครับ เหมือนใน part ที่ 1 ที่เคยอธิบายไป

และให้เราเลื่อลงมาดูข้างล่างและกด see more

หลังจากนั้นจะเจอกับ detail ด้านล่าง

input data

เห็นไหมครับว่าใน input data จะบอกว่าเราทำอะไรใน smart contract สิ่งที่มันบอกคือ เราใช้ function อะไรในนั้น และหลังจากนั้นกดที่ decode input data ครับ

decode input data

เห็นไหมครับหลังจากเรากด Decode แล้วเราจะเห็นค่าที่เราส่งเข้าไปนั่นก็คือ เลข 10 ที่เราต้องการบันทึกลงไปนั่นเอง

และนี่คือ code ทั้งหมดครับ

interact1.js

และทั้งหมดทั้งมวลนี้ก็คือ วิธีการที่เราทำ Transaction ใน smart contract แบบที่ inside และละเอียดที่สุด ถามว่าข้อดีของการใช้ pattern นี้คืออะไร ข้อดีของการใช้ pattern นี้คือจะทำให้เรานั้น ได้เข้าใจถึง under the hood เวลาที่เราจะทำ transaction บน smart contract มันจะทำให้เราได้เห็นถึงไส้ถึงพุงว่า flow มันเป็นยังไง ส่งอะไรไปบ้าง และทำให้เห็นภาพการทำงาน ของ blockchain ยิ่งขึ้น

ส่วนข้อเสียก็คือมันเยอะและอาจจะดูยุ่งยากครับ

ส่วนอีกสองวิธีเอาไว้ Part ต่อๆไปนะครับผม ขอบคุณที่เข้ามาอ่านครับ

--

--