อาวุธที่ดีที่สุดของ WebAssembly สำหรับ smart contract (WasmEdge กับ WASM)

ก่อนอื่นไปทำความเข้าใจเกี่ยวกับ EVM คืออะไรกันก่อน… แล้วทำไมต้อง WebAssembly

(บันทึกสั้นๆเก็บไว้อ่านเอง ออกตัวก่อนผู้เขียนไม่ใช่ blockchain developer ส่วนไหนให้ข้อมูลผิดพลาดต้องขออภัยด้วยนะครับ)

EVM กับ WASM ต่างกันยังไง?

EVM หรือ Ethereum Virtual Machine ทำงานบน Stack Machine ของ Ethereum blockchain

ส่วน WASM หรือ WebAssembly เป็นภาษาที่เป็น high-performance language คือคุณสามารถเขียนโปรแกรมด้วยโค้ดภาษาใดๆ ก็ได้ เช่น C/C++ หรือ Rust แล้วคอมไพล์แปลงมันออกมาในรูป .wasm ได้ (เรียกว่า bytecode) และเอาตัว bytecode นี่แหละไปรันไทม์ CosmWasm และ SSVM ครับซึ่ง CosmWasm เป็นรันไทม์ของ Cosmos Blockchain ส่วน build โค้ด smart contract ก็ใช้ Cosmos-SDK

CosmWasm กับ SSVM ต่างกันยังไง

ส่วน SSVM (ย่อมาจาก Second State VM ชื่อปัจจุบัน WasmEdge VM) เป็น WebAssembly VM optimized ประสิทธิภาพสูงสำหรับองค์กรสำหรับ Cloud, AI และ Blockchain DApp สร้างโดยทีม SecondState WasmEdge มีเครื่องมือต่าง ๆ ใช้งานในสภาพแวดล้อม รันไทม์ที่แตกต่างจากรันไทม์ wasm ทั่วไป เช่น ONNC runtime เป็นรันไทม์สำหรับขึ้น AI model เป็นต้น

ปัจจุบัน WasmEdge เวอร์ชั่น 0.9.1 และ WasmEdge ยังเป็นโปรเจคอยู่ใน sandbox project ของ CNCF อีกด้วย 

หรือ WasmEdge ถูกนำมาเป็นรันไทม์ของโปรเจคอย่างเช่น ParaState (บล็อกเชนที่รันอยู่บน Substrate framework) และโปรโคตอลสร้างจาก EVM-pallet ที่ปรับปรุงแก้ไขจาก SputnikVM ดั่งเดิมที่พัฒนาโดย Parity และ ParaState อิมพลีเม้นท์เอา eWASM เข้าสู่ production โหมดพร้อมใช้งาน

ที่จะแปลงจาก EVM จากเชน Ethereum ไปเป็น WASM ที่เข้ากันได้กับ Substrate network ของ Polkadot blockchain โดยแพลตฟอร์ม ParaState จะช่วยให้นักพัฒนาสามารถย้าย หรือ migrate EVM แอพพลิเคชั่น ไปเป็น eWASM ได้โดยไม่ต้องแก้ไขโค้ชใดๆ ทั้งสิ้น

กลับกันครับ หากเป็นฝั่ง Web application (ที่ไม่ใช่ Blockchain application) หากเป็นเอ็นจิ้นของ web browser เช่น WebKit, Blink หรือ Gecko ต่างก็รองรับ WebAssembly อยู่แล้ว นั้นหมายความว่าหากพัฒนาเว็บแอพพลิเคชั่นด้วยภาษาใดภาษาหนึ่ง แล้วแปลงคอมไพล์ให้อยู่ในรูปแบบ WebAssembly (.wasm) เพียงเท่านี้ก็สามารถรันบน Chrome, Firefox ได้โดยตรง เพราะ .wasm เป็น binary code (machine code) ภาษาเครื่องที่คอมพิวเตอร์เข้าใจแล้ว (แต่คนไม่เข้าใจ)

WebAssembly VM

จุดเริ่มต้น Blockchain Smart Contract

งั้นมาลองเรียงลำดับการเขียน Blockchain Smart Contract กันดูหน่อย
เวลาเขียนโค๊ด Smart contract ตัวโค้ดทั้งหมดจะถูกแปลงออกมา (คอมไพล์) ให้อยู่ในรูปแบบ Bytecode
ที่ต้องมีตัวรันไทม์อยู่ และตัวรันไทม์ที่เราใช้อยู่ปัจจุบันก็คือ EVM โดยซอฟต์แวร์ทีนิยมใช้ก็คือ Geth กับ openethereum โดย Geth เขียนด้วยภาษา Go

1. Code smart contract ที่เขียนด้วยภาษา Solidity (ตัวโค้ดคนอ่านเข้าใจ)

2. เมื่อเอาโค้ดไปรันบน Ethereum blockchain ต้องแปลงให้อยู่ในรูปแบบ Bytecode
(คอมไพล์เป็น hexadecimal เป็นเลขฐาน 16 เครื่องอ่านเข้าใจ เช่น Remix IDE)

3. ส่วนกลางระหว่าง Solidity โค้ดที่เขียนกับคอมไพล์ออกเป็น bytecode
เรืยกว่า opcode (operation code) ที่เราจะบอก EVM ว่าต้องการทำอะไร เช่น PUSH1 0x60โดยส่วนของ opcode ก็จะกายเป็น bytecode อีกที

แล้วทำไมต้องคอมไพล์ไปที่ WebAssembly VM?

อาวุธที่ดีที่สุดของ WebAssembly สำหรับ smart contract ที่เขียนด้วยภาษา Solidity ก็คือ ความเร็ว, น้ำหนักเบา และความปลอดภัย + Compile ที่มีประสิทธิภาพสูง

cr image: secondstate.io

ระหว่าง WebAssemble กับ WebAssembly Virtual Machine

อันนี้ต้องแยกเป็น 2 ประเด็นก่อนนะครับ

1. WebAssembly สำหรับ web application (Web 2.0)

2. WebAssembly VM ที่เป็นรันไทม์ สำหรับ blockchain application (Web 3.0)

ก็เมื่อเขียนเว็บด้วย JavaScript อาทิ JS Framework ยอดนิยมอย่าง Angular, React, Vue อื่นๆ ก็ performance ดีอยู่แล้วจะเขียนโค้ดด้วย WebAssemble ไปทำไม่? อย่างแรกเลย…

1. WebAssembly มีประสิทธิภาพที่สูงกว่า JavaScript มาก

2. โค้ดอยู่ในรูปแบบ binary format ทำให้มีขนาดเล็ก

3. machine code คุยกับคอมพิวเตอร์ได้เลย ไม่ต้องเสียเวลาแปลง

4. เขียนได้ทั้ง front-end & back-end

5. wasm รันบน Serverless แพลตฟอร์มไร้เซิร์ฟเวอร์ได้

6. สามารถเรียกใช้โดยไม่ผ่าน web browser ได้อย่างปลอดภัยและรวดเร็ว (เรียกจาก sandbox)

สรุป: JavaScript สำหรับงานหลังบ้าน back-end หรือ server-side นั้นดีแต่งานประมวลผลลักษณะ real-time อย่าง 3D gaming, AR/VR นั้นประสิทธิภาพต่ำ เพราะต้องคอมไพล์ผ่าน JavaScript engines ชื่อ JIT compiler แต่หากเป็นโค้ดในรูปแบบ WebAssembly มันไม่ต้องเสียเวลาที่ web browser ต้องคอมไพล์ เพราะ web browser มีเอ็นจิ้น WebKit, Blink หรือ Gecko รองรับ WebAssembly อยู่แล้ว (หรือใครจะคอมไพล์ด้วย Emscripten ก็ถามถนัดเลย) ส่วน WebAssembly สำหรับพัฒนา Blockchain application

ต้อง note ไว้ตัวใหญ่ๆ เพราะคุณสมบัติหลายอย่างยังอยู่ในระหว่างการพัฒนานะครับ (proposal stage)

ผู้ร่วมก่อตั้ง Docker, Solomon Hykes (CTO) เคยทวีตไว้ว่าเมื่อ WebAssembly everywhere (WASM+WASI) พร้อมใช้แล้ว Docker ก็ไม่จำเป็น!

source:
[1] https://github.com/WasmEdge/WasmEdge
[2] https://medium.com/@blockchain101/solidity-bytecode-and-opcode-basics-672e9b1a88c2
[3] https://arghya.xyz/articles/webassembly-wasm-wasi/
[4] https://v8.dev/blog/emscripten-llvm-wasm
[5] https://www.secondstate.io/articles/manage-webassembly-apps-in-wasmedge-using-docker-tools/

Scroll to top