本文透過解釋 Sui 的設計特點,幫助讀者認識 Sui。

作者: Johan,Victory,慢霧安全團隊

封面: Sui

背景

前段時間,我們在初識 TON:帳號、Token、交易與資產安全中討論了 TON 的特點及用戶資產安全問題。今天,我們一起來學習另一個新興的高效能區塊鏈平台— Sui,它具備多項創新技術和獨特特性,吸引了開發者和研究人員的注意。 Sui 專注於提供快速、安全的交易體驗,適合各種應用場景。本篇文章將透過解釋 Sui 的帳號模型、代幣管理、交易機制和資產安全等內容,幫助讀者認識 Sui。 

圖片

帳號模型

地址

Sui 遵循加密貨幣產業中​​廣泛接受的錢包規範,包括 BIP-32(及其變種 SLIP-0010)、BIP-44 和 BIP-39,以便為用戶提供金鑰管理。

圖片

為了派生一個 32 位元組的 Sui 位址,Sui 使用 BLAKE2b(256 位元輸出)雜湊函數將簽章方案標誌(1 位元組)與公鑰位元組連接起來。 Sui 位址目前支援純 Ed25519、Secp256k1、Secp256r1 和 MultiSig,對應的標誌位元組分別為 0x00、0x01、0x02 和 0x03。

餘額

在 Sui 上,一切都是對象,使用者的餘額也是對象。在轉帳過程中,如果物件中包含的餘額不等於所需的數值,則需要將物件拆分或合併。例如,你有一個包含 100 SUI 的對象,但你只想轉帳 30 SUI,那麼系統會將這個物件拆分為兩個物件:一個包含 30 SUI,另一個包含 70 SUI。你可以轉移包含 30 SUI 的對象,而保留剩下的對象。反之,如果需要更大的金額,你也可以將多個餘額物件合併,形成一個更大的數額物件。

圖片

代幣管理

Sui 官方實作了 Coin 的標準程式碼,開發者在發行 Coin 時只需要在合約裡呼叫`use sui::coin;` 就可以使用這個標準函式庫的所有功能。

由於使用了 Move 語言,與其他區塊鏈常用的程式語言(如 Solidity)有所不同,開發者在使用時需要了解並注意一些獨特的功能或特性,我們來看一段程式碼:

module regulated_coin_example::regulated_coin {
    use std::option;

    use sui::coin;
    use sui::coin::{TreasuryCap};
    use sui::transfer;
    use sui::tx_context::{Self, TxContext};

    struct REGULATED_COIN has drop {}
    
    fun init(otw: REGULATED_COIN, ctx: &mut TxContext) {
        let (treasury_cap, deny_cap, meta_data) = coin::create_regulated_currency(
            otw,
            5,
            b"tUSD",
            b"Test USD",
            b"Example Regulated Coin",
            option::none(),
            ctx
        );

        let sender = tx_context::sender(ctx);
        transfer::public_transfer(treasury_cap, sender);
        transfer::public_transfer(deny_cap, sender);
        transfer::public_transfer(meta_data, sender);
    }

    public fun mint(
        treasury_cap: &mut TreasuryCap<REGULATED_COIN>, 
        amount: u64, 
        recipient: address, 
        ctx: &mut TxContext,
    ) {
        let coin = coin::mint(treasury_cap, amount, ctx);
        transfer::public_transfer(coin, recipient)
    }
}

這是一個完整的 Coin 發行合約,Sui 上的智慧合約設計與以太坊或 Solana 等區塊鏈平台有所不同,我們在原始碼中看不到權限的管理。使用該函數建立 Coin 時 (coin::create_regulated_currency),合約的創建者會收到一個 TreasuryCap 對象,該對像是鑄造新 Coin 或銷毀現有 Coin 所必需的。只有有權存取此物件的地址才能維護 Coin 發行。

對於收到 Coin 的用戶來說,他的帳號控制了這些代幣的所有權,在調用智能合約使用這些代幣時,也需要傳入這些對象,並對交易進行簽名。

交易機制

交易是基本的區塊鏈世界中的概念,它是與區塊鏈互動的一種方式。交易用於更改區塊鏈的狀態,並且是唯一的方法。在 Sui 使用的 Move 程式語言中,交易用於呼叫套件中的函數、部署新套件以及升級現有套件。

在建立交易時需要注意,每筆交易要明確地指定其操作的物件!這點和 Solana 的交易需要傳入帳號有些相似。

交易包含的內容:

  • 發送方-- 簽署交易的帳戶
  • 指令清單(或指令鏈)-- 要執行的操作
  • 指令輸入-- 指令的參數:純文字-- 簡單的值,如數字或字串,或物件-- 交易將存取的對象
  • Gas 對象-- 用於支付交易的 Coin 對象
  • Gas 價格與預算-- 交易成本

合約安全

Sui 使用 Move 做為智能合約的程式語言,在某種程度上能解決 Solidity 高發的漏洞問題,如重入攻擊、整數溢位、雙花、DoS 攻擊和編譯器問題,但避免不了開發者在程式碼中引入錯誤,因此安全審計依舊是必要的。以下是開發者在開發過程中需要注意的一些事項:

1. 權限檢查:分析對外函數所接收的物件類型,對於涉及敏感操作的特權函數,需要確保傳入的物件是具有特權的物件。如果函數接收並使用了特權對象,那麼函數呼叫者必須是該對象的合法擁有者。

2. 對外函數檢查:有些函數本身不應該被外部直接調用,如果有不應該外放的函數接口,開發者要提出該函數不宜公開。

3. 物件分析檢查:由於 Sui 裡面的物件可以被轉換成公共物件 (Shared Object),因此,開發者要整理出所有用到的物件的類型,確認它們是靜態的還是公共的,以及是否存在錯誤。如果把應該私有化的對象轉換成了公共對象,那麼任何人都可以使用這個對象,這就存在安全風險。

4. Coin 消耗檢定: Sui 的代幣模型與其他鏈的有所不同,其設計允許代幣物件可以被其他物件包含和持有,還可以進行拆分,由此衍生出了幾種代幣消耗模式:

  • 直接將代幣物件轉移給另一個物件;
  • 將代幣對象進行結構調整後產生一個新的對象,再轉移給目標對象;
  • 將代幣物件拆分,並將拆分出來的部分轉移給新物件。

因此,在代幣消耗的情況下,開發者需要檢查以下幾點:

  • 消耗的金額是否正確;
  • 物件是否已經轉移;
  • 如果有拆分,拆分的金額對不對。

5. 預言機價格操縱攻擊:如果 Sui 上的合約使用預言機來取得價格,那麼也需要注意價格被操縱的可能性。開發者可以透過引入多個資料來源和共識機制,以防範單一資料來源被操縱的風險。此外,也可以使用時間加權平均價格來防範預言機操縱風險。

6. 治理攻擊:在 Sui 上的合約中,如果治理代幣的投票權設計不合理,也存在遭遇治理攻擊的風險,這方面可以參考一些成熟的去中心化組織的社區治理邏輯。

7. 套利攻擊:如果邏輯設計不合理,Sui 上的 DeFi 合約也有套利攻擊的風險。開發者在開發的時候應仔細檢視合約中的邏輯,避免被攻擊者利用。

8. 假儲值攻擊:交易所或開發者在處理 Sui 代幣充值時,也需要注意檢查交易的狀態是否成功,代幣的 Package ID 是否正確,防範假充值攻擊。

總結

在本文中,我们简单探讨了 Sui 的设计特点,包括其账号模型、代币管理、交易机制以及合约安全性。利用 Move 编程语言,Sui 在确保高性能与低延迟的同时,还引入了创新的数据模型和对象存储方法,显著提升了安全性和灵活性。相比其他区块链平台,Move 语言在防止常见的智能合约漏洞(如溢出、重入攻击等)方面表现出色,这使得 Sui 在技术层面上更加稳健和可靠。然而,开发者仍需关注业务逻辑层面的安全性,特别是在权限管理、对象类型的使用以及代币消耗方面,谨防由于代码中的错误或不当设计而导致资产损失。

參考連結:

https://docs.sui.io/

https://docs.sui.io/standards/coin

https://move-book.com/

免責聲明:作為區塊鏈資訊平台,本站所發布文章僅代表作者及來賓個人觀點,與 Web3Caff 立場無關。文章內的資訊僅供參考,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。