พื้นฐาน EVM Transaction

หลังจากที่เราเข้าใจพื้นฐาน EVM แล้ว ใน เรื่องพื้นฐาน ก่อนเริ่มสร้าง Transaction และ Ethereum EVM และเข้าใจเรื่อง Wallet แล้ว ใน  BIP32 BIP39 BIP44 คราวนี้เราจะมีทำความเข้าใจพื้นฐานสำหรับการทำงานกับ Transaction ใน EVM กันต่อ

การคุยกับ Blockchain network

โดยปกติการคุยกับ Ethereum node นั้น จะมี 3 แนวทางก็คือ IPC (inter process communication) , HTTP, Websocket โดยมักจะใช้เครื่องมือในการแปลง message ที่เราต้องการส่ง เพื่อให้ส่งไปได้ตามมาตรฐาน ถ้าเอาที่นิยม และใช้งานง่าย และแพร่หลาย ก็ต้อง Web3 โดยโค้ด หรือ ข้อมูลก็เข้าใจได้ไม่ยาก และ มีตัวอย่างให้ดูอย่างมากมายด้วย

ถ้าวาดเป็น diagram ก็จะเป็นแบบนี้ครับ

https://ethereum.org/static/444b28339f09cde0e26cce6850490964/29007/web3py-and-nodes.png

เจาะลึกเรื่อง Transaction

Transaction คือบันทึกที่เปลี่ยนแปลง state ใน Account state โดยจะมีผลที่ t + 1 อย่างที่เล่าไปก่อนหน้า ซึ่งจะต้องทำงานใน EVM โดยมี Miner เป็นผู้ที่ช่วยบันทึก transaction ของเราลงไป โดยก่อนที่เราจะสร้าง transaction ได้ เราจะต้องเตรียมข้อมูลขั้นต้นก่อนการ sign transaction อันประกอบด้วย

  • recipient : ไม่ว่าจะเป็น EOA หรือ CA ก็ได้ ถ้าเป็น EOA จะได้แค่ transfer coin/token เท่านั้น ถ้าเป็น CA ก็คือ CALL contract 
  • Signature : เป็นลายเซ็นต์ digital ที่ได้จากการ sign ร่วมกันจากทั้ง private key และ input data และจะถูกใช้เพื่อตรวจสอบกลับว่าเจ้าตัวได้เป็นคนทำ transaction จริงได้อีกด้วย
  • Value : จำนวนที่จะโอนให้ ในหน่วย wei
  • Data : input data ที่ส่วนใหญ่จะใช้สำหรับการ call contract
  • gasLimit : ปริมาณ gas สูงสุดที่ให้ใช้งานได้ เกินกว่านี้จะ fail
  • maxPriorityFeePerGas : tip คนขุด
  • maxFeePerGas : ค่าธรรมเนียมที่ยอมจ่ายสูงสุด สำหรับธุรกรรมนั้นๆ

ตัวอย่างข้อมูล Transaction

{
  from: "0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8",
  to: "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a",
  gasLimit: "21000",
  maxFeePerGas: "300",
  maxPriorityFeePerGas: "10",
  nonce: "0",
  value: "10000000000"
}

และเราก็ต้องเอาข้อมูลทั้งหมดไป sign transaction เพื่อให้ได้ signature ออกมา ซึ่งมันจะได้หน้าตาออกมาเป็นแบบนี้

{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "raw": "0xf88380018203339407a565b7ed7d7a678680a4c162885bedbb695fe080a44401a6e4000000000000000000000000000000000000000000000000000000000000001226a0223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20ea02aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",
    "tx": {
      "nonce": "0x0",
      "maxFeePerGas": "0x1234",
      "maxPriorityFeePerGas": "0x1234",
      "gas": "0x55555",
      "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",
      "value": "0x1234",
      "input": "0xabcd",
      "v": "0x26",
      "r": "0x223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20e",
      "s": "0x2aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",
      "hash": "0xeba2df809e7a612a0a0d444ccfa5c839624bdc00dd29e3340d46df3870f8a30e"
    }
  }
}

จะเห็นได้ว่า ก็มี field เพิ่มเติมขึ้นมาอีกหลายตัว ใน “raw” คือ data ที่ sign แล้วเก็บในรูปของ Recursive Length Prefix (RLP) encoded และ “tx” ก็คือ data ที่ผ่านการ sign แล้วเก็บในรูป JSON

Gas

ปัจจุบัน (หลังจากที่ผ่าน London Upgrade) ก็มีการคิดค่า Gas แบบใหม่ใน Ethereum (ใน BSC หรืออีกหลาย chain ไม่ได้เปลี่ยนตาม) โดย Total transaction fee จะได้มาจาก Gas units (limit) * (Base fee + Tip) เช่น Bob ส่ง 1 ETH ให้ Alice โดยให้ baseFeePerGas 190 gwei และ maxPriorityFeePerGas 10 gwei ซึ่งโดยปกติการส่ง ether ให้กัน จะต้องใช้ 21000 gas unit ดังนั้น จะได้ว่า (190 + 10) * 21000 = 4,200,000 gwei หรือคิดเป็น 0.0042 ETH นั่นเอง

ต9u8

Bob จะต้องโดนหักออกไป -1.0042 ETH
Alice จะได้เพิ่ม +1.0 ETH
The base fee ที่จะถูก Burn ออกไปจาก network -0.00399 ETH
Miner จะได้ Tip ไป +0.000210 ETH

ซึ่งจะแตกต่างจาก Bitcoin หรือ Ethereum แต่เดิม (เช่น BSC) ที่เมื่อ miner mine block ได้แล้ว native coin จะเปลี่ยนมืออย่างเดียว แต่แบบใหม่ จะถูก burn ทิ้งไปบางส่วนด้วย

เพียงเท่านี้ ก็น่าจะเข้าใจการ prepare transaction กันมากขึ้นแล้ว เดี่ยเนื้อหาหน้า เราจะมาลอง make transaction กันแบบง่ายๆ โดยใช้พื้นฐานตามที่เล่ามาทั้งหมดนี้

Leave a Reply