เรื่องพื้นฐาน ก่อนเริ่มสร้าง Transaction และ Ethereum EVM

หลังจากที่เราสร้าง Crypto wallet ขึ้นมาได้แล้ว ขั้นต่อไป ก็คือหยิบมาใช้งาน คราวนี้ เราจะเจอความยากอีกรูปแบบหนึ่งแทน นั่นก็คือ เราต้องเลือก network ที่จะทำงานด้วย (protocol) และจะต้องเข้าใจ รวมทั้งปฏิบัติตามข้อกำหนดของ Protocol นั้นๆที่เค้ากำหนดเอาไว้ ซึ่งเรื่องนี้ ก็ต้องว่ากันในรายละเอียดของแต่ละ protocol อีกที ซึ่งอาจจะเหมือนหรือต่างกันได้ เช่น ถ้าคุณเข้าใจเรื่อง EVM ของ Ethererum network คุณก็จะสั่งให้ทำงานบน BSC network ได้ด้วย เพราะว่าเป็น EVM compatible ด้วยเช่นกัน อะไรแบบนี้

เข้าใจเรื่อง Blockchain

ก่อนที่เราจะไปสร้าง transaction ได้ เราจำเป็นที่จะต้องเข้าใจกลไก การทำงานของ Blockchain จริงๆก่อน แนะนำ Blockchain คืออะไร พื้นฐานความรู้ที่ควรเข้าใจ ทุกคน เพื่อให้เข้าใจการทำงานภายในของ blockchain เพราะการต่อยอดจะได้ไม่ งง และ optional เสริม คือการทำความเข้าใจ และใช้งาน Smart contract Smart contract คืออะไร สำคัญกับการฟาร์มอย่างไร เพื่อให้เข้าใจมากขึ้น เนื่องจาก transaction ที่ว่านี้จะมีแบบ External account กับ smart contract account มันจะทำงานแตกต่างกัน และใช้งานไม่เหมือนกันด้วย จะได้แยกแยะออกจากกันได้

เลือก Blockchain protocol เพื่อมาศึกษา

อย่างที่บอกถ้าเราจะศึกษาการสร้าง transaction เราก็ต้องเลือก blockchain protocol สักอันนึงขึ้นมา ในที่นี้ ผมจะเลือก EVM ของ Ethereum เพราะมันมีการใช้งานกันอย่างแพร่หลาย และหลาย network ก็เลือกใช้งาน EVM นี้ด้วยเหมือนกัน อีกทั้งมี knowledge เยอะ มี developer และ library อีกเพียบเลย ดังนั้นปัญหาที่เราจะไปเจอ ไม่ใช่เราคนเดียวและคนแรกอย่างแน่นอน

ทำความรู้จัก  Ethereum EVM

ในบทความของทาง Ethereum เองได้มี slide อธิบาย EVM เอาไว้อย่างละเอียดมากๆเลย จำนวน 116 หน้า  ซึ่งขออ้างอิงมาเลย เพราะมันดีอยู่แล้ว แต่เยิ่นเย้อหน่อย แต่ผมจะช่วยสรุปให้ครับ

พื้นฐาน Blockchain

  • Transaction จะเกิดขึ้นระหว่าง world state t ไปจบที่ world state t + 1 กล่าวคือ ไม่มี ทำแล้วจบใน state เดิมได้ นั่นคือ real time ที่สุดแล้ว
  • โดย Transaction ที่ต้องทำงาน จะบันทึกใน block ของ blockchain 
  • และ block ก็คือ transaction storage ที่คั่นอยู่ระหว่าง state t ไปยัง t +1 นั่นเอง
  • แต่ละ block จะเชื่อมโยงกันโดยมีข้อมูลอ้างอิงจาก block ก่อนหน้า มาใช้ hash ใน block ปัจจุบันด้วย ต่อเนื่องไปเรื่อยๆ
  • ถ้าดูภาพรวมๆ block ก็คือ การบันทึกธุรกรรมเท่านั้น (ศัพท์ทางบัญชี เรียกว่า ledger)

World state & Account

  • แต่ละ Address จะมี Account state ได้เพียง state เดียวเท่านั้นในแต่ละช่วงเวลา และจะ mapping 1 ต่อ 1 เสมอ
  • ใน Account state จะมี
    • nonce
    • balance
    • (อาจจะมี) storage hash 
    • (อาจจะมี) code hash
  • กระเป๋ามีสองแบบ
    • Externally owned account (EOA) จะใช้ private key ควบคุม เรียกได้ว่า กระเป๋าทั่วไป (ที่เราอธิบายเรื่อง BIP32 ไปแล้ว) และจะไม่มี EVM code
    • Contract account (CA) จะทำงานด้วย EVM code ที่เก็บอยู่ใน Account ซึ่งไม่มีคนควบคุมได้ เพราะมันจะทำงานตาม EVM code เท่านั้น
  • Address ของกระเป๋าสองแบบได้มาจาก
    • Externally owned account (EOA) ได้มาจาก private key > public key (hash) > address ขนาด 160 bits (ตามที่อธิบายไปในเรื่อง BIP32)
    • Contract account ได้มาจาก sender address กับ nonce (RLP,KEC, 160 bits ขวาสุด)

Transaction

  • มีสองแบบ คือ 
    • Contract creation ใช้สำหรับการสร้าง Contract account โดยการป้อนข้อมูลเป็น init code เพื่อสร้าง address ใหม่ขึ้นมา และมี EVM + ข้อมูลใน storage 
    • Message call ใช้สำหรับ sign transaction ไปที่ EOA หรือ CA โดยการป้อนข้อมูลเป็น parameter ต่างๆที่ต้องใช้ เพื่อเป็นการเปลี่ยน state และ ข้อมูลใน storage เท่านั้น
  • Transaction แต่ละอัน require ข้อมูลดังนี้
    • Nonce
    • gasPrice
    • gasLimit
    • To (160 bits address หรือ 0 ถ้าเป็น contract creation)
    • Value (wei)
    • V,r,s
    • Init or data (ขึ้นอยู่กับ transaction แบบใด)

Decentralized database

  • ให้มองว่า world state คือ database ที่คนจำนวนมากบนโลกถือข้อมูลที่หน้าตาเหมือนกันอยู่ และทำงานเชื่อมโยงกันด้วย P2P network 
  • การที่เราจะทำ transaction ต้องทำผ่าน interface เข้าไป เช่น web3 API (มีหลายแบบ) เพื่อไปติดต่อกับ world state ซึ่งเป็น Ethereum node ต่างๆที่มีให้บริการอยู่
  • Space ใน evm จะมี
    • Stake memory ขนาด 256 bits x 1024 elements เก็บข้อมูลแบบเรียงกันเป็น series
    • Memory เป็นพื้นที่ memory ชั่วคราว
    • Storage (ที่เก็บใน account) เก็บเป็น key value ขนาด 256 bits ในแต่ละ key

Atomicity & Order

  • Transaction จะทำงานเป็น Atomic operation ซึ่งหมายความว่า ไม่สามารถแบ่ง thread หรือ สั่งหยุดการทำงานได้
  • Result มันจึงเป็นไปได้เพียงแค่ สำเร็จ หรือ ไม่เกิดอะไรขึ้น เท่านั้น (All or Nothing)
  • Transaction จะต้องทำเป็นเรียงต่อกัน ไม่มีแบบ 2 thread จาก cpu 2 core อะไรแบบนี้ ไม่ได้ (ก็คือ block ต่อ block เสมอนั่นแหล่ะ ช่วงเวลาหนึ่งมีสอง block ไม่ได้)
  • ไม่มีการการันตี ว่าคนที่ส่ง transaction ก่อน จะถูก process ก่อน แม้กระทั่งใน block เดียวกันเอง ก็ด้วยเช่นกัน แต่ใน แต่ละ block คนที่ทำหน้าที่ขุด จะเป็นคนเรียงเอง (พวกเครื่องขุด)
  • ถ้าอยากได้เร็วกว่าเพื่อนต้องให้ คนขุดเลือกเข้ามาให้ในกระบวนการ consensus protocol เช่น POW ใน ETH (และโดยปกติคนขุดจะเลือกจาก transaction ที่ยอมจ่าย gasPrice ราคาแพงที่สุด)

Ethereum virtual machine (EVM)

  • EVM คือ runtime environment สำหรับ smart contract ใน ethereum โดย evm code หรือ storage และ transaction ก็จะรันใน EVM ทั้งหมด
  • EVM code มีทั้งแบบ assembly และ bytecode (แค่ view แตกต่างกัน แต่ code เดียวกันทำงานเหมือนกัน)

Message call

  • EVM code สามารถสร้าง message call ไปที่ EOA หรือ Contract account ก็ได้
  • Message จะ trigger ด้วยคำสั่ง CALL และ parameter ต่างๆ รวมทั้ง return จะส่งผ่านมาจาก memory

Exception

  • Out of gas ก็คือ ใส่ gas ไปน้อยเกิน
  • Invalid jump destination
  • Invalid instruction
  • Stack underflow

Gas & Fee

  • เราต้องกำหนด gas ที่จะใช้เข้าไป เช่น ใช้ได้ไม่เกิน 20 ลิตรนะ (gasLimit Y gwei)
  • ถ้าใช้ไม่หมด เหลือเท่าไรจะคืนส่วนที่เหลือมา
  • จะใช้ gas กับ operation , message call , storage

Input & Output

  • Input จะต้องได้จาก External actor เท่านั้น ไม่มีกรณีที่อยู่ดีๆ ก็ตึ่นขึ้นมาทำงานเอง
  • Output นี้ จะสามารถ return ไปที่ External actor หรือส่งไปให้ EVM ตัวอื่น หรือเขียน log ก็ได้
  • Input data แบ่งได้สองส่วนใน EVM
    • CALLDATALOAD จะทำงานกับ Stack
    • CALLDATACOPY จะทำงานกับ memory

ทั้งหมดนี้ ถ้าดูเอกสารจะเข้าใจมากขึ้น เพราะเค้ามีรูปประกอบให้ดูด้วย และเราจะเข้าใจการทำงานเวลาที่ใช้งานจริงๆด้วย ว่ามันทำงานอย่างไร มีองค์ประกอบข้างในเป็นแบบไหนอย่างไร ทำงานยังไง และ contract ทั้งหลายนั่น ภาษาตลาด ก็คือ smart contract ที่เรารู้จักกันนั่นล่ะครับ

รู้จักหน่วย WEI

ต้องบอกว่า ปัญหาหนึ่งของ computer กับการประมวลผลตัวเลข คือการประมวลผลเลขทศนิยม เพราะมันมักจะคำนวณผิดบ่อย หรือ เกิด overflow ได้ง่ายมากๆ ในหลายๆเคส (ถ้าใครเคยเขียนตัวคำนวณตัวเลข ที่ต้องทำงานกับทศนิยมมาเยอะๆจะรู้ ว่ามันมีปัญหาในแทบทุกภาษาเลย) ลองดูตัวอย่างกรณีนี้ครับ Is floating point math broken?ดังนั้น เพื่อแก้ปัญหานี้ และ เพื่อให้การทำงานทางด้านตัวเลข เป็นไปได้อย่างถูกต้อง ก็เลยกำหนดให้การทำงานกับตัวเลขนั้น ต้องแตกย่อยลงไป 18 ลำดับ ให้ถือเป็นหน่วยย่อยที่สุด และทำงานบน standard ที่ไม่มีทศนิยม

ถ้าพูดให้เข้าใจง่ายๆ ก็คือ Ethereum เนี่ย มีหน่วยที่ย่อยที่สุด ก็คือ 0.00000000000000001 ก็คือทศนิยม 18 ตำแหน่ง แต่ว่า ถ้าต้องทำงานแบบไม่มีทศนิยมแล้ว ก็จะหมายความว่า

1 Ethereum มีค่าท่ากับ 1000000000000000000 wei < มันคือหน่วยเรียกที่เล็กที่สุด ถ้า Bitcoin เราจะเรียกว่า Sat

นั่นเอง และทางกลับกัน ถ้าเราจะพูดกันให้เข้าใจในแบบทศนิยมที่เราเคยเรียน ก็คือ 1 wei มีค่าเท่ากับ 0.000000000000000001 Ethereum

ดังนั้น หน่วยย่อยที่สุด คือ 1 wei จะไม่มีย่อยกว่านี้ และเลขที่ใช้คำนวณใน Ethereum ก็คือ 1 ไม่มี 0.1 หรือ 0.000000000000000001 เลย (เพราะอย่างที่บอกว่าเวลาใช้งานต้องไม่มีทศนิยม)

ทีนี้ด้วยความที่ 1000000000000000000 wei มันยาวมาก ก็เลยมีตัวย่อยที่นิยมใช้กัน ก็คือ gwei ซึ่ง gwei เนี่ย มันก็คือตัวคูณนั่นแหล่ะ โดย 1 gwei มีค่าเท่ากับ 1000000000 wei (10 ตำแหน่ง จาก 18 ตำแหน่ง) ดังนั้น 1 Ethereum เราก็จะเรียกว่า 1 ether นั่นเอง พวกนี้ Web3 จะช่วยเราให้ง่ายขึ้นครับ
ส่วนตารางแปลงหน่วยอื่นๆ ดูได้จาก Web3 currency denominations

Leave a Reply