Programming

Inside Ethereum transaction

ในช่วงที่ผ่านมา หลายๆท่านคงเคยใช้ Ethereum wallets หลายๆเจ้า เช่น ยอดฮิตอย่าง Metamask, MathWallet หรือ MyEtherWallet ในการส่งธุรกรรมไปยัง Blockchain แต่คุณเคยสงสัยหรือไม่ว่า raw transaction ของ Ethereum นั้นมีข้อมูลอะไรอยู่บ้าง วันนี้เรามาดูกันครับ

eth transaction

จะยกตัวอย่างด้วยธุรกรรมนี้ 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 ตำแหน่งแบบนี้

  1. Nonce หรือ Number only used once มีไว้สำหรับการป้องกันการทำธุรกรรมซ้ำ โดยทุกๆครั้งที่ทำธุรกรรม เราจะต้องเอา nonce ของธุรกรรมล่าสุดมาบวกด้วย 1 เสมอ สำหรับธุรกรรมนี้มีค่าเป็น 32
  2. Gas price คือราคาของ Gas ที่เราจะจ่ายเพื่อทำธุรกรรมนี้ เมื่อเรานำ 0xe8d4a51000 หรือ 1,000,000,000,000 WEI
  3. Gas limit คือจำนวน Gas สูงสุดที่เรายอมที่จะจ่าย เมื่อเรานำ 0x9c40 หรือ 40,000 Gas unit
  4. To address คือ Address ปลายทางที่เราจะทำธุรกรรมด้วย ในธุรกรรมนี้จะหมายถึงการส่ง ETH ไปหา Address 0x220866b1a2219f40e72f5c628b65d54268ca3a9d
  5. Value คือจำนวน ETH ที่จะส่งไปให้ปลายทาง โดยธุรกรรมนี้เมื่อนำ 0x43c33c19375648000000 หรือ 320,000,000,000,000,000,000,000 WEI และนำมาหารด้วย 10^18 จะเท่ากับ 320,000 ETH
  6. Input data ไว้สำหรับระบุข้อความในธุรกรรม หรือทำการเรียกใช้ Smart contract ในธุรกรรมนี้เราไม่ได้ใช้งาน
  7. Signature v  มีไว้สำหรับคำนวนหา Public Key
  8. Signature r คือ ECDSA signature
  9. 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 ในเครือข่ายก็จะอัพเดทยอดของกระเป๋าทั้งสองเป็นอันเสร็จสิ้นการทำธุรกรรม