Inside Ethereum transaction
ในช่วงที่ผ่านมา หลายๆท่านคงเคยใช้ Ethereum wallets หลายๆเจ้า เช่น ยอดฮิตอย่าง Metamask, MathWallet หรือ MyEtherWallet ในการส่งธุรกรรมไปยัง Blockchain แต่คุณเคยสงสัยหรือไม่ว่า raw transaction ของ Ethereum นั้นมีข้อมูลอะไรอยู่บ้าง วันนี้เรามาดูกันครับ
จะยกตัวอย่างด้วยธุรกรรมนี้ 0x422026c8dcceb72f21955c4118e02344cb0d7169f56599ce32f7e73bf96f11b0 ซึ่งธุรกรรมนี้จะมี raw transaction แบบข้างล่างนี้ ซึ่ง raw transaction ของ Ethereum นั้นสามารถถอดรหัสได้ด้วย RLP(Recursive-length prefix) encoding function
0xf86e2085e8d4a51000829c4094220866b1a2219f40e72f5c628b65d54268ca3a9d8a43c33c1937564800 0000801ca0f6824c5858813643a83b89cdc7a5b9bcdfa8ada0bcb5fcae883041a6fa3116e2a04dfd29a87c 746f8ce7508899d74c65aa10a002999c2798eafb7b641c4b38b31b
หลังจากนั้นเมื่อเราถอดรหัสธุรกรรมออกมาโดยใช้ฟังก์ชัน RLP เราจะได้ธุรกรรมในรูปแบบของ Array ดังนี้
[ "0x20", "0xe8d4a51000", "0x9c40", "0x220866b1a2219f40e72f5c628b65d54268ca3a9d", "0x43c33c19375648000000", "0x", "0x1c", "0xf6824c5858813643a83b89cdc7a5b9bcdfa8ada0bcb5fcae883041a6fa3116e2", "0x4dfd29a87c746f8ce7508899d74c65aa10a002999c2798eafb7b641c4b38b31b" ]
แล้วเราจะสามารถอธิบายข้อมูลใน Array ทั้ง 9 ตำแหน่งแบบนี้
- Nonce หรือ Number only used once มีไว้สำหรับการป้องกันการทำธุรกรรมซ้ำ โดยทุกๆครั้งที่ทำธุรกรรม เราจะต้องเอา nonce ของธุรกรรมล่าสุดมาบวกด้วย 1 เสมอ สำหรับธุรกรรมนี้มีค่าเป็น 32
- Gas price คือราคาของ Gas ที่เราจะจ่ายเพื่อทำธุรกรรมนี้ เมื่อเรานำ 0xe8d4a51000 หรือ 1,000,000,000,000 WEI
- Gas limit คือจำนวน Gas สูงสุดที่เรายอมที่จะจ่าย เมื่อเรานำ 0x9c40 หรือ 40,000 Gas unit
- To address คือ Address ปลายทางที่เราจะทำธุรกรรมด้วย ในธุรกรรมนี้จะหมายถึงการส่ง ETH ไปหา Address 0x220866b1a2219f40e72f5c628b65d54268ca3a9d
- Value คือจำนวน ETH ที่จะส่งไปให้ปลายทาง โดยธุรกรรมนี้เมื่อนำ 0x43c33c19375648000000 หรือ 320,000,000,000,000,000,000,000 WEI และนำมาหารด้วย 10^18 จะเท่ากับ 320,000 ETH
- Input data ไว้สำหรับระบุข้อความในธุรกรรม หรือทำการเรียกใช้ Smart contract ในธุรกรรมนี้เราไม่ได้ใช้งาน
- Signature v มีไว้สำหรับคำนวนหา Public Key
- Signature r คือ ECDSA signature
- Signature s คือ ECDSA signature
สุดท้ายถ้าเราสังเกตดีๆจากข้อมูลที่อยู่ใน raw transaction จะเห็นว่า ธุรกรรมไม่มีระบุว่าถูกส่งออกจาก Address ไหน แล้วแบบนี้ Miner หรือ Validator รู้ได้ยังไงว่าธุรกรรมนี้ส่งมาจากใคร?
คำตอบคือรู้ได้จาก ลำดับแรกนำ Signature V R S มายืนยันความถูกต้องของ Signature ว่าข้อมูลทุกอย่างถูกต้องไม่มีการเปลี่ยนแปลง เมื่อ Signature นั้นถูกต้อง เราจะสามารถหา Address เจ้าของธุรกรรมได้จากนำ Signature ทั้ง 3 มาคำนวนหา Public key และนำ Public key มาแปลงเป็น Address เราก็จะทราบได้ว่าธุรกรรมนี้เป็นของใคร จากนั้นก็จะประกาศธุรกรรมนี้ลง Block และทุกๆ Node ในเครือข่ายก็จะอัพเดทยอดของกระเป๋าทั้งสองเป็นอันเสร็จสิ้นการทำธุรกรรม