ว่าด้วยเรื่อง CosmWasm: SubMsg

เรื่องมันมีอยู่ว่า ไปเจอ Repository ของ Nexus Protocol ของ Terra บน Github ก็เลยไปนั่งแกะดูพบสิ่งที่น่าสนใจหลายอย่าง หนึ่งในนั้นคือการใช้ SubMsg

พอไปลองอ่านใน Official Docs ของ CosmWasm พบว่า จริงๆแล้ว SubMsg ถูกเพิ่มมาตั้งแต่ CosmWasm 0.14 (April 2021) แล้วหละ แล้ว Use-case ที่เราเห็นการใช้ SubMsg ส่วนใหญ่จะเป็นการทำ HookMsg ของพวก Factory ทั้งหลาย เช่น Swap Factory ที่จะสั่งให้ LP ที่ถูกสร้างขึ้นมาใหม่ ส่งข้อมูลการ Create Pool กลับมาที่ Factory หรือ Router เพื่อทำ Indexing หรือ Routing

อธิบายหลักการทำงานของ SubMsg แบบง่าย คือ เราสามารถ dispatch call แยกออกไปจาก smart contract โดยสามารถสั่งให้ปลายทางตอบกลับมาตาม condition ที่กำหนดได้ แต่ฝั่ง parent contract ต้อง implement reply ฟังก์ชันเอาไว้รับ reply_msg ด้วย หรือรวมถึงการ limit ค่า gas ของ SubMsg เพื่อป้องกันการเกิด infinity loop

pub enum ReplyOn {
    /// Always perform a callback after SubMsg is processed
    Always,
    /// Only callback if SubMsg returned an error, no callback on success case
    Error,
    /// Only callback if SubMsg was successful, no callback on error case
    Success,
}

สำหรับผม ความน่าสนใจของเจ้า SubMsg คือตรง ReplyOn ซึ่งนอกจากที่มันจะสามารถ reply ข้อมูลกลับมาที่ parent contract ได้ มันยังทำให้เราสามารถ capture error ที่เกิดขึ้นที่ SubMsg ได้ โดยไม่ทำให้ parent transaction ถูก revert ทั้งหมดได้ (🎉 ชาบู) เช่น สมมุติว่าเรา call smart contract ด้วย Msg:0 แล้วข้างใน smart contract มีการสร้างและ execute SubMsg A และ B ตามลำดับ แล้วการ B เกิด revert ขึ้นมา เราสามารถเลือกที่จะ override ผลลัพธ์ของ B ได้ และปล่อยให้ A มีผลลัพธ์ success ต่อไปได้เลย

SubMsg Ordering

ทั้งนี้ SubMsg จะถูก execute ก่อน Msg ใดๆ เสมอ เช่น จากตัวอย่างด้านบนจะเป็น SubMsg:A > Reply:A > SubMsg:B > Reply:B ตามลำดับ

ผมเชื่อว่าท่ามันซับซ้อนได้มากกว่านี้แน่ๆ เพราะปกติแต่ตอนที่ implement CosmWasm เมื่อก่อนจะใช้ Msg ธรรมดาตอบกลับไปมาเสมอ การได้มาซึ่งท่า SubMsg สามารถลดความซับซ้อนลงได้เยอะเลย 😅

Leave a Reply