COSCUP 2024

SuiGPT - 用 AI 反編譯器,讓大家的智能合約「被開源」
2024-08-03, 15:30–16:00 (Asia/Taipei), TR213

SuiGPT 是一款利用大型語言模型對 Sui 智能合約進行反編譯和美化的工具。本演講將介紹我們如何進行 Prompt Engineering 來開發 AI 工具來 Decompile 區塊鏈上的智能合約。

智能合約是 Sui 生態系統的重要組成部分。然而,由於大多數智能合約是用 Move 語言編寫並以 bytecode 發布。非技術使用者常常難以理解他們打算使用的智能合約的功能。進而導致質疑與不信任。

此外,閱讀現有的智能合約是學習編寫智能合約的絕佳方式。然而,Sui 的智能合約大多是不開源的,即使可以使用諸如 Revela 之類的工具進行反編譯,開發者仍很難理解它們的工作原理。因此,開發者可能會對如何開始編寫自己的合約或如何在他們的項目中正確使用現有模塊感到困惑。

為了解決上述兩個問題,SuiGPT 應運而生,使非技術用戶和新手開發者能夠輕鬆理解、審查和審計 Sui Move 智能合約。借助最先進的人工智能技術,任何用戶都可以透過 SuiGPT 輕鬆閱讀、理解和審計 Sui 區塊鏈上的智能合約。


為什麼要分享 SuiGPT?

Sui Move 是一個 ChatGPT 不認識的新興語言,但是我們依舊能讓 ChatGPT 處理 Sui 的合約並順利的反編譯與美化,這過程面對許多挑戰,我總共花迭代了超過 50 版的 Prompt,但是我最終成功了。希望這過程帶來的啟發,能夠讓開源社群,特別是在區塊鏈領域各種 Domain Specific Language 不斷推陳出新的情況下,更好的運用 AI 來幫助未來的開源與推廣。

專案背景說明

SuiGPT 最初並不是要 Decompile 而是要做 Code Generation,那部分目前還在開發中,其階段性成果在在 Taipei Blockchain Week 獲得第一名與 $5000 獎金,並且得到 Sui Foundation 的 25k 的 Grant。不過其與開源的關係並不大,因此在 COSCUP 的演講,主要會專注在 SuiGPT Decompiler。

SuiGPT Decompiler 最初提出為 SolidityGPT Code Decompiler and Explainer 並且於 EthDenver 黑客松上取得第二名的成果與 $4000 獎金,該工具可以 Load 合約並且讓使用者選取並讓 AI 進行解釋

https://devfolio.co/projects/soliditygpt-decompile-and-explain-smart-contract-3fc4

然而在 Solidity 上,因為其 Import 的機制會讓程式碼與引用套件全部混再一起,有些功能如用 GPT 美化 Decompile 難以完全實踐,加上我跟的團隊主要專注在 Sui 的開發,因此我們改成開發 SuiGPT,目標是能夠完全的 Decompile Sui 的合約。

成果取得非常好的成效。基本上給定任何合約,都可以從他的 Bytecode 還原回原始碼。請參考此 Demo 影片 https://youtu.be/JJQED7dq5i8?si=n4w3YdJML8CYwpYn,或者實際前往 https://suigpt.tools/openai/apikey 並且輸入 Code: “I Love COSCUP” 嘗試。

範例

輸入:

init(Arg0: FUD, Arg1: &mut TxContext) {
L0: loc2: TreasuryCap<FUD>
B0:
    0: MoveLoc[0](Arg0: FUD)
    1: LdU8(5)
    2: LdConst[0](Vector(U8): 03465544)
    3: LdConst[0](Vector(U8): 03465544)
    4: LdConst[1](Vector(U8): 19546865..)
    5: LdConst[2](Vector(U8): f7606461..)
    6: Call url::new_unsafe_from_bytes(vector<u8>): Url
    7: Call option::some<Url>(Url): Option<Url>
    8: CopyLoc[1](Arg1: &mut TxContext)
    9: Call coin::create_currency<FUD>(FUD, u8, vector<u8>, vector<u8>, vector<u8>, Option<Url>, &mut TxContext): TreasuryCap<FUD> * CoinMetadata<FUD>
    10: StLoc[2](loc0: CoinMetadata<FUD>)
    11: StLoc[4](loc2: TreasuryCap<FUD>)
    12: MoveLoc[2](loc0: CoinMetadata<FUD>)
    13: Call transfer::public_freeze_object<CoinMetadata<FUD>>(CoinMetadata<FUD>)
    14: CopyLoc[1](Arg1: &mut TxContext)
    15: FreezeRef
    16: Call tx_context::sender(&TxContext): address
    17: StLoc[3](loc1: address)
    18: MutBorrowLoc[4](loc2: TreasuryCap<FUD>)
    19: LdU64(10000000000000000000)
    20: MoveLoc[3](loc1: address)
    21: MoveLoc[1](Arg1: &mut TxContext)
    22: Call coin::mint_and_transfer<FUD>(&mut TreasuryCap<FUD>, u64, address, &mut TxContext)
    23: MoveLoc[4](loc2: TreasuryCap<FUD>)
    24: LdConst[3](Address: 00000000..)
    25: Call transfer::public_transfer<TreasuryCap<FUD>>(TreasuryCap<FUD>, address)
    26: Ret
}

SuiGPT 輸出:

fun init(
        fud: FUD,
        ctx: &mut tx_context::TxContext,
    ) {
        let (treasury_cap, coin_metadata) = coin::create_currency<FUD>(
            fud,
            5,
            b"FUD",
            b"FUD",
            b"The community coin of Sui",
            option::some(url::new_unsafe_from_bytes(b"data:image/webp;base64,Data_Omitted_Because_It_Is_Too_Long")),
            ctx
        );
        transfer::public_freeze_object(coin_metadata);
        coin::mint_and_transfer<FUD>(
            &mut treasury_cap,
            10000000000000000000,
            tx_context::sender(ctx),
            ctx
        );
        transfer::public_transfer(treasury_cap, @0x0);
    }

演講大綱與時間分配

預計在演講期間按照以下大綱介紹

  1. 開場與自我介紹 (3 min)
  2. 專案緣起
    1. 什麼是 Sui Move? (4 min)
      1. 花四分鐘簡單介紹 Sui 是什麼,有哪些特性,為什麼要寫 Move 而不是用 Solidity
    2. 為什麼需要 SuiGPT (3 min)
      1. Sui-Move 才推出一年,學習資源有限,並且不在 ChatGPT 的訓練資料中因此 ChatGPT 很難正確處理 Sui Move
      2. Sui 專案大多不開源,開發者難以學習,用戶也難以了解合約運作原理
      3. Sui 使用 use 的方法可以直接使用其他合約的程式碼,但是不知道原始碼也無法串接
    3. Demo (5 min)
    4. 為什麼會想到 SuiGPT (1 min)
      1. Eason 作為 ChatGPT 重度用戶,有一天突然想到「欸有沒有可能讓 ChatGPT 來 Decompile 智能合約」然後就開始做 SuiGPT,初步測試發現很可以,就開始寫了
  3. 專案開發
    1. Prompt Engineering (9 min)
      1. 在這個專案中使用哪些 Prompt Engineering 的技巧?分別簡單介紹並附上案例
        1. Retrieval Augmented Generation
        2. In Context Learning
        3. Few-shot learning
        4. Structured Output
        5. Chain of Thought
      2. 成果:短的合約很成功,但長的合約每次 Decompile 要等很久而且會出錯 (Hallunication)
    2. Prompt Optimization (4 min)
      1. 分片,針對每個 Function 分別 Convert
      2. 優化,調整 in-context learning 的費用
      3. 成果:無論合約長短都可以有效輸出正確格式,並且速度小於一分鐘。
    3. AI Question Answering 的部分解釋 (1 min)
      1. Retrieval Augmented Generation 來得到對應資訊回答問題
  4. 額外內容補充
    1. 目前正在做讓 AI 幫開發者寫 Sui Move Unit Test 的功能,如果有成果,會加入這段演講中一起分享。
  5. 成果與未來展望 (5 min)
    1. 案例:SuiGPT 幫助 Sui Community 可以快速參考其他人的程式碼完成開發
    2. 討論:這樣「借鑑」會不會有什麼問題?訪問 Sui 開發者們的看法
    3. 結語:希望 SuiGPT 能作為案例,幫助 Sui 與其他區塊鏈的 FATE 變得更好
      1. FATE: Fairness, Accountability, Transparency, and Ethics

嗨,我是 Eason,是卡內基梅隆大學人機交互研究所的二年級博士生。並且現在在開發 Sui 的公司:Mysten Labs 擔任暑期實習研究員。

我堅信區塊鏈技術有能力增強世界的開放性、透明度、公平性和效率。此外,我認為人工智能可以在區塊鏈技術領域中,提高使用者和開發者的可訪問性和易懂性。

我目前正在 Sui 區塊鏈上開發。

想了解更多關於我的信息,請訪問我的網站 https://eason.phd

This speaker also appears in: