本文通过讲解 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 立场无关。文章内的信息仅供参考,均不构成任何投资建议及要约,并请您遵守所在国家或地区的相关法律法规。