Sui.

首页

欢迎来到Sui社区论坛

Sui.X.Peera.

赚取你的 1000 Sui 份额

获取声誉积分,并因帮助 Sui 社区成长而获得奖励。

赏金帖

  • 赏金+10

    Peera Admin.
    May 29, 2025
    专家问答

    当 Move 结构有命名字段时,为什么 BCS 需要精确的字段顺序才能进行反序列化?

    当 Move 结构有命名字段时,为什么 BCS 需要精确的字段顺序才能进行反序列化? 我一直在深入研究 Move 中的 BCS 编码/解码,特别是跨链通信和链下数据处理. 在浏览 Sui Move 文档中的示例时,我遇到了一些似乎违反直觉的行为,我正在尝试理解底层的设计决策. 根据BCS规范,“BCS中没有结构(因为没有类型);该结构只是定义了字段序列化的顺序. ”这意味着在反序列化时,我们必须按照与peel_*结构字段定义完全相同的顺序使用函数. 我的具体问题: 设计理由:当 Move 结构具有命名字段时,为什么 BCS 需要精确的字段顺序匹配?像 JSON 或其他自描述格式一样,将字段名称与值一起序列化不是更强大吗? 泛型类型交互:文档提到 “包含泛型类型字段的类型最多可以解析到第一个泛型类型字段. ”考虑一下这个结构: struct ComplexObject has drop, copy { id: ID, owner: address, metadata: Metadata, generic_data: T, more_metadata: String, another_generic: U } 部分反序列化在这里到底是如何工作的?我可以反序列化到more_metadata并忽略两个泛型字段,还是第一个泛型字段(generic_data)完全阻止了进一步的反序列化? 跨语言一致性:使用 @mysten /bcs JavaScript 库序列化将由 Move 合约使用的数据时,在以下情况下会发生什么: -我不小心重新排序了 JavaScript 对象中的字段? -Move 结构定义会在合约升级中更改字段顺序? -我有带有自己的泛型参数的嵌套结构吗? 实际启示:在生产系统中,团队如何处理 BCS 架构演变?您是否对BCS架构进行了版本控制,还是期望结构字段顺序在部署后不可变?

    • Sui
    • Move
    5
    1
  • 赏金+10

    Peera Admin.
    Mar 05, 2025
    专家问答

    Sui Move 模块出版物中的 “多源验证错误” ——自动错误解决

    使用 Sui Move 的开发人员在尝试发布或升级模块时经常遇到与 “发现多源验证错误” 相关的问题. 这些错误是由于本地依赖项与其链上依赖项之间的不匹配而发生的,从而导致发布失败和部署挑战. 以下是开发人员面临的错误的综合示例: Failed to publish the Move module(s), reason: [warning] Multiple source verification errors found: Local dependency did not match its on-chain version at 0000000000000000000000000000000000000000000000000000000000000002::Sui::vec_set Local dependency did not match its on-chain version at 0000000000000000000000000000000000000000000000000000000000000002::Sui::vec_map Local dependency did not match its on-chain version at 0000000000000000000000000000000000000000000000000000000000000001::MoveStdlib::bit_vector Local dependency did not match its on-chain version at 0000000000000000000000000000000000000000000000000000000000000001::MoveStdlib::ascii Local dependency did not match its on-chain version at 0000000000000000000000000000000000000000000000000000000000000002::Sui::hex Local dependency did not match its on-chain version at 0000000000000000000000000000000000000000000000000000000000000002::Sui::zklogin_verified_id Local dependency did not match its on-chain version at 0000000000000000000000000000000000000000000000000000000000000002::Sui::prover Local dependency did not match its on-chain version at 0000000000000000000000000000000000000000000000000000000000000002::Sui::coin Local dependency did not match its on-chain version at 0000000000000000000000000000000000000000000000000000000000000002::Sui::dynamic_field Local dependency did not match its on-chain version at 0000000000000000000000000000000000000000000000000000000000000002::Sui::transfer On-chain version of dependency Sui::zklogin_verified_id was not found. On-chain version of dependency Sui::zklogin_verified_issuer was not found. Local dependency did not match its on-chain version at 0000000000000000000000000000000000000000000000000000000000000002::Sui::tx_context Local dependency did not match its on-chain version at 0000000000000000000000000000000000000000000000000000000000000002::Sui::transfer_policy Local dependency did not match its on-chain version at 0000000000000000000000000000000000000000000000000000000000000002::Sui::kiosk 这个问题通常是由于: 本地开发环境(例如 Sui CLI)和链上状态之间的版本不匹配. 网络间软件包配置的差异(例如,主网与测试网). 3.链上环境中缺少或过时的依赖关系. 关键问题 -在发布过程中,我们如何自动检测和解决这些依赖关系不匹配的问题? -可以开发哪些工具或脚本来确保本地依赖关系始终与链上依赖项保持一致? -有没有办法通过将依赖关系检查集成到现有的 CI/CD 管道或增强 Sui SDK 来简化这个过程? 你的任务是提出一个解决这些挑战的解决方案,确保Sui Move开发人员的部署更加顺畅和可靠. 请务必在下面发布您的解决方案.

    • Sui
    • SDKs and Developer Tools
    4
    1
    最佳答案
奖励活动五月

新文章

  • article banner.
    0xduckmove.
    May 31, 2025
    文章
    将钱包变成可编程、可组合的智能代理.

    Account.tech 是 Sui 区块链上的一个开源框架,它引入了高度流畅的智能账户 灵活、安全和可自定义的账户对象,可以通过基于意图的模块化架构执行链上操作. 可以把它想象成可编程钱包,它原生支持多重签名、DAO 逻辑、定时执行、动态访问控制等. 为什么要使用智能账户? 传统账户只是被动容器. 他们持有资产并签署交易. 智能账户是活跃的可编程实体,可以定义所有权逻辑、自动化工作流程并根据规则管理资产. 在Account.tech中,这些规则存在于链上,可通过Move模块进行自定义,并通过Intent强制执行. 关键概念 智能账户结构 public struct Account has key, store { id: UID, metadata: Metadata, deps: Deps, intents: Intents, config: Config, } 智能账户是一个共享对象,包含: -元数据:描述性信息 -Deps — 使用的依赖包 -意图 — 待处理或正在处理的执行操作请求 -配置 — 自定义规则集(例如,多重签名、基于角色、DAO 逻辑) 每个账户都有唯一的配置模块,用于决定如何解析 Intent. 基于意图的执行 Intent 是执行一项或多项链上操作的结构化请求. 它分为三个阶段: [ ] 请求用户通过操作创建意图 [ ] 分辨率 — 配置模块检查条件是否满足 [ ] 执行 — 任何人都可以在 Intent 有效时执行 示例:转移资金的多重签名意图只有在足够多的成员批准后才会执行. 3.操作 = 模块化执行单元 每个动作都是一个独立的 Move 结构,例如: struct WithdrawAction { object_id: ID } struct TransferAction { recipient: address } 你可以在一个意图中组合多个动作. 例如: Withdraw → Transfer → Withdraw → Transfer 这支持高级工作流程,例如原子交换、批量传输、基于时间的保管库发布等. 配置:可自定义的所有权逻辑 配置类型定义了如何解析意图. 你可以插入逻辑,例如: ✅ 使用加权选票进行多重签名 🔐 基于角色的访问控制 🗳 DAO 投票逻辑 ⏳ 时间延迟或重复任务 💾 恢复流程 每个意图都跟踪一个结果,该结果代表决议状态(例如,收集的选票、获得的批准等). 了解更多 🔗 文档:https://account-tech.gitbook.io/docs 🧑‍💻 GitHub:https://github.com/account-tech

    1
  • article banner.
    0xduckmove.
    May 30, 2025
    文章
    Sui 中的 BCS 编码它是什么以及它为何重要

    如果你是在 Sui 的基础上进行构建或者修改 Move,你可能已经听说过 BCS 这个词流传开来. 这是最初为Diem区块链设计的二进制规范序列化格式化机器的缩写,现在是Sui、Aptos、Starcoin和0L等基于MOVE的生态系统的基石. 所以,是的,如果你真的想在这个空间里建房,你最好对它感到舒服. 什么是 BCS? 二进制规范序列化 (BCS) 是一种用于将结构化数据序列化(编码)和反序列化(解码)为字节的格式. 你会看到它在以下情况下使用: -在签名之前对交易进行编码. -从区块链发出或解析事件. -通过 JavaScript 在链下与 Move 智能合约进行交互. 但是 BCS 不包括字节中的类型信息. 这意味着在解码时必须提前了解结构,这与 JSON 或协议缓冲区等格式不同,后者更具自我描述性. BCS 的主要功能 没有类型元数据 序列化输出不包含有关字段类型的提示. 解码时你必须知道自己在处理什么. 依赖订单的序列化 结构按照其字段的确切顺序进行编码. 更改顺序,你的反序列化就会中断. 这就是为什么 Move 中的 peel_* 函数必须与结构的布局 1:1 匹配的原因. 泛型类型 在像这样的结构中: struct BCSObject has drop, copy { id: ID, owner: address, meta: Metadata, generic: T } 你只能可靠地反序列化到元字段. 泛型类型会干扰 BCS 解析,因此,如果您想安全解码数据,请务必将它们放在最后. 在 JavaScript 中使用区块链 多亏了 @mysten /bcs 库,你可以像专业人士一样在 JS 中使用 BCS. npm i @mysten/bcs 还有一个基本的例子: import { BCS, getSuiMoveConfig } from "@mysten/bcs"; const bcs = new BCS(getSuiMoveConfig()); const ser = bcs.ser(BCS.U16, 10); console.log(ser.toBytes()); // [0x0a, 0x00] const des = bcs.de(BCS.U16, ser.toBytes()); console.log(des); // 10 你也可以序列化向量和字符串: bcs.ser("vector", [1, 2, 3, 4]); // 04 01 02 03 04 bcs.ser(BCS.STRING, "test string"); // 0b7465737420737472696e67 注册自定义类型 假设你有以下 Move 结构: struct Metadata has drop, copy { name: std::ascii::String } struct BCSObject has drop, copy { id: ID, owner: address, meta: Metadata } 你可以像这样在 JS 中注册它们: bcs.registerStructType("Metadata", { name: BCS.STRING, }); bcs.registerStructType("BCSObject", { id: BCS.ADDRESS, owner: BCS.ADDRESS, meta: "Metadata", }); 序列化和反序列化示例 JavaScript 序列 const bytes = bcs .ser("BCSObject", { id: "0x0000000000000000000000000000000000000005", owner: "0x000000000000000000000000000000000000000a", meta: { name: "aaa" } }) .toString("hex"); console.log("Hex:", bytes); 输出可能是: 0x0000000000000000000000000000000000000005000000000000000000000000000000000000000a03616161 现在可以将其传递到 Move 合约中,甚至可以在 Sui CLI 中手动测试. BCS 可能看起来低级且字节密集,但是一旦你了解了它是如何编码数据的,你就会更深入地了解Move智能合约的真正运作方式——以及如何安全地桥接链上的 ↔ 链下系统. 而且,如果你在 Sui Explorer 上调试 BCS 字节(如下所示): BCS 编码 二进制权威序列化(BCS)是在Diem区块链的背景下开发的一种序列化格式,现在广泛用于大多数基于Move的区块链(Sui、Starcoin、Aptos、0L). BCS 不仅用于 Move VM,还用于交易和事件编码,例如在签名之前序列化交易或解析事件数据. 如果您想更深入地了解 Move 的工作原理并成为 Move 专家,了解 BCS 的工作原理至关重要. 让我们潜入吧. BCS 规格和特性 在我们完成本课的其余部分时,最好记住BCS编码的一些高级属性: BCS 是一种数据序列化格式,其中生成的输出字节不包含任何类型信息;因此,接收编码字节的一方需要知道如何反序列化数据 BCS 中没有结构(因为没有类型);该结构仅定义了字段序列化的顺序 包装器类型会被忽略,因此 outerType 和 unnestedType 将具有相同的 BCS 表示形式: struct outerType { 所有者:innerType } struct innerType { 地址:地址 } struct unnestedType { 地址:地址 } 包含泛型类型字段的类型最多可以解析到第一个泛型类型字段. 因此,如果它是自定义类型,则最好将泛型类型字段放在最后一个或多个字段. struct bcsObject 已删除,复制 { ID:身份证, 所有者:地址, 元数据:元数据, 通用:T } 在这个例子中,我们可以反序列化直到元字段的所有内容. 像无符号整数这样的原始类型以 Little Endian 格式编码 向量序列化为 ULEB128 长度(最大长度可达 u32),然后是向量的内容. 完整的 BCS 规范可以在 BCS 存储库中找到. 使用 @mysten /bcs JavaScript 库 安装 你需要为这部分安装的库是 @mysten /bcs 库. 你可以通过在节点项目的根目录中键入来安装它: npm i @mysten /bcs 基本示例 让我们先使用 JavaScript 库来序列化和反序列化一些简单的数据类型: 从 “@mysten /bcs” 导入 {BCS,getsuiMoveConfig}; //使用默认 Sui Move 配置初始化序列化器 const bcs = 新 BCS (getsuiMoveConfig ()); //定义一些测试数据类型 常量整数 = 10; const 数组 = [1, 2, 3, 4]; const 字符串 = “测试字符串” //使用 bcs.ser () 来序列化数据 const ser_integer = bcs.ser(BCS.U16,整数); const ser_array = bcs.ser(“向量”,数组); const ser_string = bcs.ser(BCS.STRING,字符串); //使用 bcs.de () 反序列化数据 const de_integer = bcs.de (BCS.U16, ser_Integer.toBytes ()); const de_array = bcs.de(“向量”,ser_Array.toBytes ()); const de_string = bcs.de (BCS.STRING, ser_string.toBytes ()); 我们可以使用上述语法,即新的 BCS(getsuiMoveConfig ()),使用 Sui Move 的内置默认设置初始化序列化器实例. 有内置枚举可用于 Sui Move 类型,例如 BCS.U16、BCS.STRING 等. 对于泛型类型,可以使用与 Sui Move 相同的语法来定义,例如上面示例中的矢量. 让我们仔细看看序列化和反序列化的字段: int 是小端十六进制 0a00 10 向量的第一个元素表示总长度, 那么它就是向量中的任何元素 0401020304 1,2,3,4 字符串只是 u8 的向量,第一个元素等于字符串的长度 0b7465737420737472696e67 测试字符串 类型注册 我们可以使用以下语法注册我们将要使用的自定义类型: 从 “@mysten /bcs” 导入 {BCS,getsuiMoveConfig}; const bcs = 新 BCS (getsuiMoveConfig ()); //注册元数据类型 bcs.registerStructType (“元数据”,{ 名称:BCS.STRING, }); //我们打算读取的主对象也一样 bcs.registerStructType (“bcsObject”, { //BCS.ADDRESS 用于 ID 类型和地址类型 ID:BCS.地址, 所有者:BCS.ADDRESS, meta: “元数据”, }); 在 Sui 智能合约中使用 bcs 让我们继续使用上面的结构示例. 结构定义 我们从 Sui Move 合约中相应的结构定义开始. { //.. struct 元数据已删除,复制 { 名称:std:: ascii:: String } struct bcsObject 已删除,复制 { ID:身份证, 所有者:地址, meta:元数据 } //.. } 反序列化 现在,让我们编写一个函数来反序列化 Sui 合约中的对象. 公共娱乐 object_from_bytes(bcs_bytes:矢量):bcsObject { //初始化 bcs 字节实例 让 bcs = bcs:: new (bcs_bytes); //使用peel_*函数从序列化字节中提取值. //顺序必须与我们在序列化中使用的顺序相同! let (id、所有者、元数据) = ( bcs:: peel_address (&mut bcs)、bcs:: peel_address (&mut bcs)、bcs:: peel_vec_u8 (&mut bcs) ); //使用序列化结果打包 BcsObject 结构 bcsObject {id: object:: id_from_address (id),所有者,元数据:元数据 {名称:std:: ascii:: string (meta)}} Sui Frame bcs 模块中各种 peel_* 方法用于从 BCS 序列化字节中 “剥离” 每个单独的字段. 请注意,我们剥离字段的顺序必须与结构定义中字段的顺序完全相同. 测验:为什么对同一 bcs 对象进行前两次 peel_address 调用的结果不一样? 另请注意我们如何使用辅助函数将类型从地址转换为 id,以及如何将向量转换为 std:: ascii:: string. 测验:如果 BSCObject 使用 UID 类型而不是 ID 类型会发生什么? 完整的 Ser/De 示例 在 example_projects 文件夹中查找完整的 JavaScript 和 Sui Move 示例代码. 首先,我们使用 JavaScript 程序序列化一个测试对象: //我们构造一个用于序列化的测试对象,注意我们可以将输出格式指定为十六进制 让 _bytes = bcs .ser(“bcsObject”,{ id:“0x000000000000000000000000000000000000000005”, 所有者:“0x000000000000000000000000000000000000a”, 元数据:{名称:“aaa”} }) .toString(“十六进制”); 这次我们希望 BCS 写入器的输出采用十六进制格式,可以像上面一样指定. 使用 0x 前缀将序列化结果十六进制字符串粘贴并导出到环境变量中: export object_hexstring=0x00000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000000000 现在我们可以运行关联的 Move 单元测试来检查正确性: sui move 测试 你应该在控制台中看到这个: 正在构建 bcs_move 运行 Move 单元测试 [PASS] 0x0:: bcs_object:: test_deserialization 测试结果:OK. 测试总数:1;通过次数:1;失败:0 或者我们可以发布模块(并导出 PACKAGE_ID)并使用上面的 BCS 序列化十六进制字符串调用 emit_object 方法: sui 客户端调用--function emit_object--module bcs_object--package_ID--args $OBJECT_HEXSTRING 然后,我们可以在 Sui Explorer 上查看交易的 “事件” 选项卡,看看我们发出了正确的反序列化的 BcsObject:

    1
  • article banner.
    Vens.sui.
    May 29, 2025
    文章
    Cetus 协议黑客攻击-Sui 上最大的 DeFi 漏洞

    2025 年 5 月,近代历史上最重大的安全漏洞之一震惊了 DeFi 世界. Cetus 协议是Sui区块链上领先的去中心化交易所(DEX)和流动性协议,成为复杂黑客攻击的受害者,该黑客攻击导致损失超过2亿美元. 这一事件不仅给DeFi社区带来了冲击,还引发了人们对智能合约的安全性以及基于Sui等新兴区块链的协议的稳健性的严重担忧. Cetus 协议已确立了自己作为Sui网络上首屈一指的DEX的地位,为用户提供了交换代币和提供流动性的平台. 作为Sui生态系统中的关键基础设施组件,Cetus在促进去中心化交易和增加网络的整体流动性方面发挥了关键作用. 它的突出地位使其成为试图利用其代码库中漏洞的恶意行为者的有吸引力的目标. Cetus Hack 展开 该漏洞发生在2025年5月22日,当时攻击者发现并利用了Cetus智能合约逻辑中的一个关键缺陷. 具体而言,该漏洞源于一个微妙的算术溢出漏洞,该漏洞允许黑客操纵协议的内部记账机制. 通过部署虚假代币和操纵流动资金池中的价格曲线,攻击者能够在不触发即时检测系统的情况下耗尽大量资金. 太平洋时间凌晨 3:52 左右(世界标准时间 11:52),区块链监控器开始检测Cetus上多个流动性池中的异常交易. 几小时之内,损失的程度就显而易见了——价值超过2.6亿美元的资产从协议中抽走了. 被盗资金很快被交换并桥接到其他区块链,这使追回工作复杂化. 对市场和 Sui 生态系统的影响 黑客攻击的后果迅速而严重. 由于开发人员争先恐后地评估情况并减轻进一步的损失,Cetus的交易立即停止. 同时,与该平台相关的原生代币的价值暴跌,其中一些代币在短短几个小时内跌幅度高达80%. 投资者和用户面临巨额损失,对Sui生态系统的信心动摇了. 一个特别令人震惊的事态发展发生在Sui网络尝试采取有争议的对策时:投票冻结攻击者装有1.6亿美元被盗资金的钱包. 尽管此举表明了资产追回的积极方法,但它也引发了关于去中心化原则以及此类行动是否破坏了对区块链交易不可改变性的信任的辩论. 在势头下,美元SUI下跌了5%,CETUS下跌了+ 40%,这种上涨既不可思议又可怕. Cetus 协议漏洞的技术细节 根据网络安全公司Halborn提供的分析,该漏洞的根本原因在于Cetus在代币交换期间如何验证某些算术运算. 在处理大量数据方面的疏忽导致了溢出情况,攻击者巧妙地操纵了这种情况,在流动资金池中造成了人为的不平衡. 然后,利用这些失衡从系统中提取实际资产,而没有向流动性提供者提供适当补偿. 这种漏洞特别隐蔽,因为它并不总是在正常运行条件下表现出来;相反,它需要涉及非常大的数值或异常交易序列的特定边缘情况才能触发. 众所周知,此类漏洞在标准审计和测试阶段很难被发现,这使它们成为资源充足的对手利用的首选. 来自 Cetus 和 Sui 基金会(又名 Mysten Labs)的应对和恢复工作 据报道,在袭击期间,约有1.6亿美元被冻结,并将归还给Cetus矿池. 这就是为什么所有Sui基金会都发起了投票以解冻该代币的原因. 袭击发生后,Cetus团队发表公开声明,承认了这一违规行为,并概述了解决的步骤. 他们与Elliptic和Chainalysis等区块链分析公司密切合作,追踪被盗资金的流动并确定潜在的追回途径. 此外,围绕实施紧急升级以修补现有漏洞并增强未来抵御类似攻击的能力,展开了讨论. 社区成员对这些事态发展表示了不同的反应. 尽管许多人赞扬了Cetus领导层在黑客攻击后表现出的透明度,但其他人则批评对此类情景的准备不足,并质疑发射前是否已经实施了足够的保障措施.

    1
  • article banner.
    HaGiang.
    May 25, 2025
    文章
    我的第一篇文章 zKat:公共区块链的隐私保护身份验证

    因为透明度不应该意味着放弃你的秘密. 在当今大多数公共区块链上,每笔交易和用户身份都是公开可见的. 虽然透明度是区块链的最大优势之一,但它是以隐私为代价的,尤其是在身份验证方面. zKat 是零知识身份验证器的缩写,是一种新颖的密码学原语,它为区块链世界带来了保护隐私的身份验证. 使用zKat,用户可以证明自己有权进行交易,而无需透露该授权背后的规则或政策. ##传统方法的问题 以前在身份验证中尝试保护隐私,例如使用阈值签名,只能隐藏有限的信息. 例如,他们可能会掩盖哪些用户签署了交易,但不会掩盖其他内容. 他们还为更复杂的身份验证策略**(例如角色、身份或规则的组合)而苦苦挣扎. zKat 通过以下方式改变了游戏规则: -支持任意复杂的政策 -允许灵活的结构,例如多方案签名组合 -对公众隐瞒**整个政策 ##zKat 的工作原理 为了构建 zKat,作者设计了一个编译器,它将广泛使用的Groth16zk-SNARK系统转换为一种新型的非交互式零知识(NIZK)证明——一种支持模棱两可的验证密钥的证明. 那是什么意思? 这意味着验证者无法分辨正在使用哪种政策,但证据仍然使他们相信该政策是有效的. 这是论文中引入的全新加密特性,也是zKat如何确保政策隐私的基础. 但是作者并没有止步于 zKat. 他们更进一步,推出了zkat,该版本支持隐身更新. 简而言之: 策略颁发者可以更新身份验证策略 没有透露任何新内容 这在现实世界的区块链系统中非常强大——比如DAO更新投票规则或机构轮换密钥. 他们还探索使用递归 zk-proofs来使 zkat+ 具有可扩展性并适合区块链集成. 研究人员在基于阈值的身份验证的原型中实现了zKat. 他们的评估显示: -性能与传统阈值签名相当 -zKat 支持复杂得多的政策 -所有这些,只需要最低的开销

    1
  • article banner.
    0xduckmove.
    May 19, 2025
    文章
    IKA 是什么?“不只是炒作 👀”

    (p/s:那些 “web3 更新” 中没有一个能让你大吃一惊然后称之为 alpha 😮‍💨) 阅读完整文章:https://x.com/InternSui81687/status/1897309368644985108 你曾经在连锁店之间转移资产并感觉自己像印第安纳·琼斯一样躲避陷阱吗?是啊. 那是因为现在的互操作性 = 危险的桥梁 + 核心故障点. 伊卡说:“不,我们已经完成了. ” 他们正在构建一个无需信任、快速自动对焦且不会将钥匙交给任何人的系统. 它基于 Sui 构建,使用阈值加密和 2PC-MPC 在 [这里的视频](https://ipfs-cdn.peeranha.io/QmWBduxmwvTYMwvMd88J6Zwbn5fr4PbTXx3UXPtxUeArmA)中,大卫·拉什(Ika的联合创始人)直言不讳地说出了每个人的想法:互操作性被打破了 AF. 而且,他们没有像大多数团队那样写另一篇 “我们需要解决方案” 的博客,而是花了两年时间邀请安全专家、人工智能书呆子和学者来真正建立一个解决方案. 他们想出了什么?一个使用2PC MPC和阈值加密的系统——花言巧语基本上意味着:你的密钥是你的,你的资产不会像2017年的圣诞礼物那样被重新包装,而且一切进展得都像地狱一样快. 比如,Ika 不只是保护你的东西. 它以亚秒级的延迟完成交易,并且仍然保持去中心化. 同时,桥梁在这里需要8分钟,而你的灵魂只是为了确认互换. 他们在 Sui 的基础上建造了这个. 如果你到现在为止一直睡在 Sui 上,那次午睡就结束了. Sui 的以对象为中心的模型、极快的终结性和 Mysticeti Consensus(是的,这是一回事,不是虚构的)非常适合 Ika 想要做的事情. 大卫甚至表示,Sui的开发经验使其成为一个显而易见的选择——这在加密领域是罕见的好评,因为每种开发工具都像一本古老的卷轴. 但是真正吸引我的是他们对用户体验的看法. 最好的加密货币?那种很无聊. 还不错,但以 “它能正常工作” 的方式来看. Ika 正在为一个你甚至不知道自己在做跨链事情的未来开枪. 没有弹出窗口,没有桥梁,没有假代币. 只需打开钱包,本地借出您的比特币,进行跨链交换,然后保持活力. 这就是我们一直在要求的,但不知何故忘记要求了. 而且不要以为这只适用于德根兄弟. Ika使DAO、独立团队和企业能够推出自己的托管解决方案——比如 “Fireblocks 入门包”,但使用类固醇,而且实际上是可以访问的. 您不再需要50万美元的设置来构建安全基础设施. 只有 Sui、Ika 和一点勇气. 哦,我们不要在比特币上睡觉. BTC多年来一直处于观望状态,就像那个拒绝加入游戏的家伙一样. 但是 Ika 正在让它可玩. DeFi 无需打包,无需移动——只需将其锁定为原生抵押品即可. 机构一定会喜欢它,因为它可以让他们保持合规和高效. 没有税收资金,没有监护陷阱. 只是资本畅通无阻地流动. 因此,如果有人问你,“加密的下一步是什么?”不要给他们发一篇写着 “互操作性是未来” 的推文话题

    1
  • article banner.
    RogueRig.
    May 13, 2025
    文章
    IKA 是什么?为什么要大肆宣传?

    @ikadotxyz 是 Sui 区块链上的超快并行 MPC 网络,因其革新 Web3 安全性和互操作性的潜力而引起了广泛关注. 最近在X上发布的文章凸显了看涨情绪,据报道,尽管有10亿枚代币供应,但IKA在Whales等盘前平台上的交易价格在4.90美元至10美元之间. 这表明,如果势头保持不变,市值可能达到数十亿美元,这得益于Sui基金会的2100万美元战略投资和创纪录的140万美元SUI NFT艺术活动. Ika 的亚秒级延迟和跨数百个签名者节点的扩展能力使其改变了 DeFi、去中心化托管和跨链应用程序的游戏规则. 预计即将在Sui上推出的IKA代币将解锁新的实用程序,推动进一步采用. X 用户对 IKA 在 @GiveRep 忠诚度计划中的作用大肆宣传,有人称其为 Sui 最大的空投机会之一. 也就是说,盘前价格可能波动且具有投机性,因此不能保证4.90美元至10美元的区间在发布后会保持不变. 务必深入研究该项目的基本面——查看Ika的官方渠道以获得更深入的见解,并在参与之前权衡风险. Sui 生态系统正在升温,但加密领域没有什么可以肯定的选择

    1
  • article banner.
    Rogue.
    May 13, 2025
    文章
    SUI 节点设置-详细指南

    要设置 Sui 节点,你需要安装 Sui 二进制文件,克隆 Sui 存储库并配置节点. 你可以从源代码构建,也可以使用 Docker. 节点运行后,您可以监控其状态和同步进度. 详细步骤: 安装 Sui 二进制文件: 按照 Sui 文档中的说明安装 Sui 二进制文件. 如果你使用的是 Docker,请按照 Sui 全节点 Docker 自述文件中的说明进行操作. 如果您是从源代码构建,则需要克隆 Sui 存储库并对其进行编译. 配置节点: 全节点:根据Sui文档,你可以使用Docker或通过从源代码构建来配置Sui全节点. 验证器节点:按照 Sui 验证器节点配置中的说明配置验证器节点. 这包括安装和配置 Sui、密钥管理和存储配置. 全节点配置: 关闭所有正在运行的全节点. 删除数据库和 genesis.blob 文件. 从最新版本中获取源代码. 重置您的分支. 下载最新的 genesis blob. 如果需要,请更新你的 fullnode.yaml 配置文件. 重启你的 Sui Full 节点. 3.运行节点: 使用适用于您的配置方法的相应命令(例如 sui-node 或 Docker 命令)启动 Sui 节点. 监控节点: 监控节点的状态、同步进度和日志,以确保其正常运行. 使用日志、跟踪和指标等工具来监控节点. 默认指标端口为 9184,但你可以在 fullnode.yaml 文件中对其进行更改. 其他步骤: 委员会注册:如果您正在运行验证器节点,则需要向委员会注册. 液体质押:如果你正在运行一个节点,你也可以参与液体质押. 同步你的分支:如果你要为 Sui 项目做贡献,你需要将你的分支与主存储库同步. 通过执行这些步骤,您可以成功设置和运行 Sui 节点.

    1
  • article banner.
    HaGiang.
    May 12, 2025
    文章
    “解码 Sui 三部曲:为 Web3 基础设施铺平未来

    在探索Web3世界的过程中,除了共同追求更快的交易速度和更低的费用外,更深层次的结构性挑战越来越多地浮出水面. 如何经济地存储海量数据?如何在分散的环境中安全地保护敏感信息?复杂的计算能否在链下高效执行,同时还能在链上验证和信任其结果? 许多项目试图通过组合各种第三方服务来解决这些问题. 但是,这种路径通常会带来集成的复杂性、潜在的信任摩擦和分散的用户体验. 面对这些基础设施层面的挑战,Sui区块链及其核心开发团队Mysten Labs提出了一种更加集成的解决方案. 他们没有依赖拼凑而成的外部工具,而是设计了一个具有独特架构的区块链——包括其以对象为中心的模型和Move编程语言,同时构建了三个紧密连接的原生基础设施组件:Walrus、Seal和Nautilus. 本文旨在解读这三个组件背后的设计概念,探讨它们的工作原理,它们之间的关系以及它们可能为 Web3 应用程序带来哪些实际变化. Sui 的独特架构 要了解这三种工具是如何在 Sui 上运行的,我们必须首先看看 Sui 平台本身的一些关键特征. Sui 的核心创新之一是其面向对象的模型,从根本上改变了传统的基于账户的架构. Sui 将代币、NFT 甚至复杂的数据结构视为独立的 “对象”. 想象一下,将每项资产作为一个单独的箱子进行管理,而不是将所有内容记录到一个账本中. 这种设计允许并行处理无关的操作(例如处理两个无关的 NFT),从而提高吞吐量. 这种对象粒度与 Walrus 和 Seal 形成了自然的协同作用:Walrus 将存储的数据视为对象,而 Seal 可以将权限规则直接附加到单个对象. 此外,Sui 使用专为管理数字资产而设计的 Move 编程语言. Move强调安全性,旨在减少语言层面上许多常见的智能合约漏洞. 这种坚实的基础使其非常适合构建强大的基础设施组件. 通过将链设计和基础设施开发整合到一个屋檐下(Mysten Labs),Sui旨在提供更加无缝、协同效应的开发者体验. Walrus:经济、可编程的去中心化存储 众所周知,直接在链上存储大型文件(图像、视频、AI 模型,统称为 blob)非常昂贵. 现有的去中心化存储解决方案都有权衡取舍,但Walrus寻求在成本效益和智能合约交互性之间取得新的平衡,直接解决大规模链上数据的成本壁垒. Walrus 的核心是擦除编码,这是一种巧妙的技术,可以 “分片” 文件并添加 “恢复线索”,这样即使部分丢失也可以重建文件. 海象称这些额外的碎片为 “红色东西”. 可以这样想:如果你有两个数字,比如说 3 和 5,并且你存储了两个数字以及它们的总和 (8),那么输掉 3 并不是灾难性的,你可以使用 8-5 = 3 来恢复它. 额外的恢复片段起着类似的作用,在数学上与原始片段息息相关. 分段和编码后,Walrus 将这些分片分布在多个节点上. 即使某些分片丢失,只要检索到阈值数量的碎片,系统也可以重建原始文件,与完整文件复制相比,可以节省大量空间. 这种方法可以显著降低存储成本,并可能使分散式存储定价更接近集中式云提供商的定价. 更有趣的是,Walrus 利用了 Sui 的对象模型:每个存储的文件都变成了可编程的链上对象. 开发人员可以使用 Move 来编写管理这些存储对象的智能合约——设置访问规则、自动更新元数据等. 存储不再只是被动的,它变成了本机可编程的资源. 还有一个代币实用层:在Sui上与Walrus数据进行交互需要SUI代币来记录元数据(例如文件名、大小、存储位置),并可能锁定代币以支付存储费用. 如果Walrus的采用率提高,对SUI的需求可能会增加,从而收紧供应. Seal:去中心化保管库和门禁看门人 许多 Web3 应用程序都处理敏感数据:用户 ID、财务详情、付费内容. 在去中心化环境中,如何安全地存储机密并控制对它们的访问? Seal是一种去中心化机密管理(DSM)解决方案,旨在回答这个问题. 它的核心技术之一是阈值加密. 想象一下一个需要两把钥匙才能打开的金库,每把钥匙都由不同的人持有. 同样,阈值加密将解密密钥分成多个部分并将其分发给独立的密钥服务器. 只有当预定义的协作数量(阈值)时,数据才能被解密——没有一台服务器可以单独解密,这样可以分散信任并提高容错能力. Seal 的另一个巧妙功能是访问控制逻辑以链上的 Move 智能合约的形式编写. 开发人员可以定义明确的规则:例如,只有持有某个 NFT 或已支付费用的用户才能访问某些数据. 这种透明度和可验证性使Seal与传统的集中式访问系统区分开来. 当用户或应用程序想要解密密钥时,它会向密钥服务器发送请求. 这些服务器检查链上规则. 只有在满足条件的情况下,他们才会释放其密钥片段. 实际的解密是在客户端设备上进行的,因此密钥服务器永远不会触摸原始数据. Seal 可以保护存储在任何地方的数据,包括在 Walrus、其他去中心化网络甚至集中式云中. 这使其成为安全消息、私人用户数据、付费内容门控、机密投票等的理想之选. Nautilus:让链下计算在链上可验证 区块链不擅长复杂或资源密集型任务. 在链上进行这些操作既缓慢又昂贵,而且会损害隐私. 第 2 层或预言机等解决方案会有所帮助,但是 Nautilus 探索了一条不同的道路:实现可信的链下计算. Nautilus 使用一种名为可信执行环境 (TEE) 的基于硬件的解决方案. 可以将 TEE 视为 CPU 内部一个安全、隔离的区域. 该区域内的代码和数据不受系统其他部分(包括操作系统本身)的干扰. 基本工作流程如下: 开发人员将计算任务(例如财务模型、AI 推断、游戏逻辑)部署到他们控制的 TEE 上. 任务完成后,TEE 会生成加密证明——一种防篡改的 “收据”,可以证明: -任务在 TEE 中运行 -代码没有被篡改 -该过程成功完成. 3.该证明和结果将提交给Sui上的Move智能合约. 合同验证认证(例如,签名有效性和代码的哈希值). 只有通过验证,合约才会接受结果并继续进行链上操作. Nautilus 在不暴露敏感细节的情况下,将高性能的链下计算与链上可验证性和信任相结合. 鹦鹉螺在行动:蓝鳍金枪鱼案 一个具体的例子是去中心化的永续交易平台Bluefin. 大多数高性能交易平台都面临着两难境地:将订单簿完全保存在链上可以提高透明度,但速度缓慢且昂贵;将其下链可以提高速度,但会带来信任问题. 蓝鳍金枪鱼使用鹦鹉螺来弥合这一差距: • 订单匹配在 TEE 内运行,确保安全、隔离的处理. • Nautilus 提供了密码学证据,证明匹配逻辑运行正确. • 证明和结果在链上提交,智能合约在执行结算之前对其进行验证. 这种方法使Bluefin能够提供快速的链下匹配和链上信任保障,使其适用于衍生品交易等性能密集型DeFi. 当然,这确实将一些信任从纯粹的区块链共识转移到了TEE硬件和实施.

    1
  • article banner.
    HaGiang.
    May 01, 2025
    文章
    在 Sui 的售货亭里面:如何建立安全的 NFT 市场

    什么是 Sui's Kiosk? Kiosk 是 Sui 区块链上的原生智能合约模块,旨在标准化和简化 NFT 的存储、管理和交易方式. 它充当可编程的 NFT 店面,非常适合那些希望避免为每个 NFT 相关项目重新设计方向盘的开发者. 无论您是在建立市场、游戏资产交易所还是数字收藏品画廊,Kiosk 都能为您提供安全、可自定义的构建模块. 🛠️ 自助终端的主要功能 -📦 NFT 存储和显示:用户可以将 NFT 存入 Kiosk 智能合约中以存储、炫耀或交易它们 -🔐 安全所有权转移:所有买入/卖出流程均已标准化且可验证——再见阴暗的互换 👋 -🎛️ 细粒度权限:Kiosk 允许开发人员准确定义谁可以用每个 NFT 做什么. -📈 开发者可扩展性:插件拍卖、批量上市、捆绑包等. 🤔 为什么要使用 Kiosk 进行构建? 想象一下你正在启动一个 NFT 应用程序. 你可能需要一种方法让用户安全地存储资产. 一种上市和购买资产的方法. Kiosk 可以为您处理所有这些. 您可以使用 Kiosk 久经考验的 API,而不是从头开始编写所有这些流程(冒着错误 🐛 或漏洞的风险). 🧪 示例应用程序:使用 Kiosk 进行构建 让我们来看一个真实的例子. 您将创建一个基本的 NFT 模块,然后使用 Kiosk 模块对其进行存款、上架并允许其他人购买. 分步代码分解 module 0xNFT::simple_nft { use sui::object::{UID}; use sui::tx_context::TxContext; struct SimpleNFT has key { id: UID, name: String, description: String, url: String, } public entry fun mint( name: String, description: String, url: String, ctx: &mut TxContext ): SimpleNFT { SimpleNFT { id: UID::new(ctx), name, description, url, } } } 命令(Sui CLI) Compile your package sui move build Deploy to network sui client publish --gas-budget 10000 Mint NFT sui client call --function mint --module simple_nft \ --args "My NFT" "Desc" "https://example.com/img.png" --gas-budget 1000 Initialize Kiosk sui client call --function init_kiosk --module kiosk_example --gas-budget 1000 Deposit NFT to Kiosk sui client call --function deposit_nft --module kiosk_example \ --args --gas-budget 1000 List for sale sui client call --function list_nft_for_sale --module kiosk_example \ --args 100 --gas-budget 1000 Purchase NFT sui client call --function purchase_nft --module kiosk_example \ --args --gas-budget 1000 对于 NFT 开发者来说,Kiosk 是 Sui 生态系统中最强大的原语之一. 它可以抽象出重复的逻辑,为您的应用程序堆栈注入安全性和模块化. 只需几行代码,您就可以建立完整的 NFT 市场流程,这些流程已做好生产准备并经过实战考验.

    2
  • article banner.
    MiniBob.
    Apr 30, 2025
    文章
    Move 编程语言-背后的故事

    在不断变化的区块链技术格局中,智能合约编程语言已成为去中心化应用程序(DApps)的支柱. 其中,Move已成为一项突破性的创新,它提供了独特的功能,使其与Solidity或Vyper等传统语言区分开来. Move在设计时考虑了安全性和可扩展性,旨在解决早期区块链生态系统中固有的许多漏洞和效率低下问题. 本文深入探讨了 Move 编程语言的起源、特征和影响,探讨了其从一开始到成为构建强大的去中心化系统的最有前途的工具之一的历程. Move 的起源:区块链挑战的解决方案 Move编程语言最初是由Meta(前身为Facebook)作为其雄心勃勃的Diem项目(最初名为Libra)的一部分推出的. Diem 旨在创建由区块链技术提供支持的全球数字货币和金融基础设施. 但是,该团队很快意识到现有的智能合约语言不足以实现他们的愿景. 传统语言通常缺乏防止常见漏洞的机制,例如重入式攻击、整数溢出和未经授权的资产重复. 这些问题已经对其他生态系统造成了重大损害,最值得注意的是臭名昭著的以太坊DAO黑客攻击. 为了克服这些挑战,Meta 的工程团队开发了 Move,这是一种专门为资源导向型编程设计的新语言. 与传统编程语言不同,Move将数字资产视为一流的资源,确保它们不会被复制、无意中删除或滥用. 这种方法受到线性逻辑的启发,线性逻辑是一种执行严格的资源所有权规则的数学框架. 通过将这些原则嵌入到语言的核心中,Move引入了开发人员与区块链上数字资产交互方式的模式转变. 尽管由于监管审查,Diem项目最终被搁置,但Move在Aptos和Sui等独立区块链项目中找到了新的活力. 这些平台采用Move作为其主要的智能合约语言,意识到其有可能彻底改变分散式应用程序的构建和安全方式. Move 的主要特征:为何它脱颖而出 1. 面向资源的编程 Move的决定性特征之一是它专注于以资源为导向的编程. 在Move中,代币、NFT甚至自定义对象等数字资产被视为遵循严格所有权规则的资源. 资源一旦创建,除非其模块明确允许,否则无法复制或销毁. 这可确保涉及资产的关键操作(例如转移或状态更新)安全可靠地执行. 例如,以一个用 Move 编写的简单代币转移函数为例: 模块示例:: token { 使用 sui:: object:: {Self, UID}; 使用 sui:: transfer; struct 代币有密钥,存储 { ID:UID, 值:u64, } public fun mint(ctx: &mut txContext,值:u64):代币 { 代币 { id: 对象:: 新建 (ctx), 价值, } } public fun transfer_token(代币:代币,收件人:地址){ 转移:: public_transfer(令牌,收件人); } } 在这里,该Token 结构表示只能使用 public_transfer 函数传输的资源. 任何尝试在此函数之外复制或操作令牌的行为都将导致编译错误. 这种设计消除了其他语言中常见的一整类错误和漏洞. 2. 模块化和封装 Move 促进模块化设计,允许开发人员将功能封装在独立模块中. 每个模块都定义了自己的类型、功能和访问控制,确保了智能合约的不同组件之间的明确分离. 例如,开发人员可能会为代币创建、交易对和治理逻辑创建单独的模块. 这种模块化增强了代码的可读性、可维护性和可重用性. 3. 形式验证支持 Move的另一个突出特点是它支持形式验证,该过程用于从数学上证明程序的正确性. 形式化验证有助于识别传统测试方法可能无法发现的细微错误和边缘案例. 虽然并非所有基于 MOVE 的项目都需要形式验证,但该语言的结构使得在需要时更容易应用这种技术. 4. 以对象为中心的设计(特定于 Sui 的增强) 在Sui区块链上,通过以对象为中心的模型进一步增强了Move. Sui Move 中的每个资源都有全局唯一标识符 (UID),可以直接引用对象并与之交互. 这种设计简化了复杂的工作流程,例如管理 NFT 或跟踪用户特定数据,同时保持了高性能和可扩展性. Move 的真实应用 自从被Aptos和Sui采用以来,Move一直被用来构建各种去中心化应用程序. 一些值得注意的例子包括: 1. 去中心化金融 (DeFi) 协议 Move对安全性的高度重视使其成为DeFi应用程序的理想之选,其中价值数十亿美元的资产处于危险之中. 像Cetus(建立在SUI上的去中心化交易所(DEX))这样的项目利用Move的资源导向编程来实现高级交易功能,同时最大限度地降低与资产操纵相关的风险. 2. 不可替代代币 (NFT) Move 定义和管理独特数字资产的能力使NFT市场受益匪浅. 开发人员可以创建复杂的 NFT 标准,对所有权、特许权使用费和元数据进行精细控制. 此外,Sui 的以对象为中心的增强功能允许动态 NFT 的无缝集成,动态 NFT 可以根据预定义的条件进行演变. 3. 游戏和元界平台 区块链游戏需要高效处理游戏内资产、玩家互动和实时更新. Move 的模块化架构和低延迟执行使其非常适合打造身临其境的游戏体验. 像Web3游戏生态系统Blockus这样的平台利用Move为其去中心化游戏和经济提供动力. 比较 Move 与其他智能合约语言 尽管Move与其他智能合约语言有一些相似之处,但其独特的功能使其具有竞争优势: -Solidity:作为以太坊的主要语言,Solidity被广泛采用,但存在诸如易受重入攻击之类的遗留问题. Move通过其以资源为导向的模型和更严格的类型安全来解决这些弱点. -Rust(在 Solana 中使用):Rust 具有出色的性能和内存安全性,但缺乏 Move 对资源管理和形式验证的原生支持. 此外,与 Move 更直观的语法相比,Rust 陡峭的学习曲线可能会让新手望而却步. -清晰度(在堆栈中使用):Clarity强调透明度和可预测性,但在与比特币生态系统相关的有限范围内运作. 另一方面,Move支持跨多个区块链的更广泛用例. Move 的未来:采用与演变 随着区块链技术的不断成熟,对安全和可扩展的智能合约语言的需求只会增长. 得益于其创新的设计和不断增长的社区支持,Move有望在塑造下一代去中心化应用程序方面发挥关键作用. Aptos和Sui等项目正在积极投资开发者教育、工具和基础设施,以加速Move的采用. 诸如Move eLearning平台之类的计划为有抱负的开发人员提供全面的教程和资源,从而降低了进入门槛. 此外,与学术机构和行业领导者的合作正在推动对形式验证和跨链互操作性等高级主题的研究. 展望未来,我们可以预计 Move 将扩展到其当前用例之外,为从企业级供应链解决方案到去中心化社交网络的所有领域提供支持. 它的适应性和稳健性确保了它在日益多样化和相互关联的区块链生态系统中保持重要性.

    3

帖子

304
  • article banner.
    0xduckmove.
    May 31, 2025
    文章

    将钱包变成可编程、可组合的智能代理.

    Account.tech 是 Sui 区块链上的一个开源框架,它引入了高度流畅的智能账户 灵活、安全和可自定义的账户对象,可以通过基于意图的模块化架构执行链上操作. 可以把它想象成可编程钱包,它原生支持多重签名、DAO 逻辑、定时执行、动态访问控制等. 为什么要使用智能账户? 传统账户只是被动容器. 他们持有资产并签署交易. 智能账户是活跃的可编程实体,可以定义所有权逻辑、自动化工作流程并根据规则管理资产. 在Account.tech中,这些规则存在于链上,可通过Move模块进行自定义,并通过Intent强制执行. 关键概念 智能账户结构 public struct Account has key, store { id: UID, metadata: Metadata, deps: Deps, intents: Intents, config: Config, } 智能账户是一个共享对象,包含: -元数据:描述性信息 -Deps — 使用的依赖包 -意图 — 待处理或正在处理的执行操作请求 -配置 — 自定义规则集(例如,多重签名、基于角色、DAO 逻辑) 每个账户都有唯一的配置模块,用于决定如何解析 Intent. 基于意图的执行 Intent 是执行一项或多项链上操作的结构化请求. 它分为三个阶段: [ ] 请求用户通过操作创建意图 [ ] 分辨率 — 配置模块检查条件是否满足 [ ] 执行 — 任何人都可以在 Intent 有效时执行 示例:转移资金的多重签名意图只有在足够多的成员批准后才会执行. 3.操作 = 模块化执行单元 每个动作都是一个独立的 Move 结构,例如: struct WithdrawAction { object_id: ID } struct TransferAction { recipient: address } 你可以在一个意图中组合多个动作. 例如: Withdraw → Transfer → Withdraw → Transfer 这支持高级工作流程,例如原子交换、批量传输、基于时间的保管库发布等. 配置:可自定义的所有权逻辑 配置类型定义了如何解析意图. 你可以插入逻辑,例如: ✅ 使用加权选票进行多重签名 🔐 基于角色的访问控制 🗳 DAO 投票逻辑 ⏳ 时间延迟或重复任务 💾 恢复流程 每个意图都跟踪一个结果,该结果代表决议状态(例如,收集的选票、获得的批准等). 了解更多 🔗 文档:https://account-tech.gitbook.io/docs 🧑‍💻 GitHub:https://github.com/account-tech

    • Sui
    1
  • Owen.
    May 31, 2025
    专家问答

    在 Sui Move 的 coin:: Coin 中使用自定义结构作为类型参数时出现类型检查错误?

    问题: 我在 Sui Move 代码中遇到了一个我不明白的类型检查错误. 这是我的代码的简化版本: module my_module::mymodule { use sui::coin; use sui::wallets; struct MyCoin has drop {} public fun create_coin(): coin::Coin { coin::mint(1000) } } 当我尝试编译时,出现以下错误: Invalid type parameter instantiation. Expected type 'phantom type T' but found 'MyCoin' 我做错了什么?为什么我不能用MyCoin作类型参数coin::Coin,我该如何解决这个类型检查问题?

    • Sui
    • Architecture
    0
    1
  • article banner.
    0xduckmove.
    May 30, 2025
    文章

    Sui 中的 BCS 编码它是什么以及它为何重要

    如果你是在 Sui 的基础上进行构建或者修改 Move,你可能已经听说过 BCS 这个词流传开来. 这是最初为Diem区块链设计的二进制规范序列化格式化机器的缩写,现在是Sui、Aptos、Starcoin和0L等基于MOVE的生态系统的基石. 所以,是的,如果你真的想在这个空间里建房,你最好对它感到舒服. 什么是 BCS? 二进制规范序列化 (BCS) 是一种用于将结构化数据序列化(编码)和反序列化(解码)为字节的格式. 你会看到它在以下情况下使用: -在签名之前对交易进行编码. -从区块链发出或解析事件. -通过 JavaScript 在链下与 Move 智能合约进行交互. 但是 BCS 不包括字节中的类型信息. 这意味着在解码时必须提前了解结构,这与 JSON 或协议缓冲区等格式不同,后者更具自我描述性. BCS 的主要功能 没有类型元数据 序列化输出不包含有关字段类型的提示. 解码时你必须知道自己在处理什么. 依赖订单的序列化 结构按照其字段的确切顺序进行编码. 更改顺序,你的反序列化就会中断. 这就是为什么 Move 中的 peel_* 函数必须与结构的布局 1:1 匹配的原因. 泛型类型 在像这样的结构中: struct BCSObject has drop, copy { id: ID, owner: address, meta: Metadata, generic: T } 你只能可靠地反序列化到元字段. 泛型类型会干扰 BCS 解析,因此,如果您想安全解码数据,请务必将它们放在最后. 在 JavaScript 中使用区块链 多亏了 @mysten /bcs 库,你可以像专业人士一样在 JS 中使用 BCS. npm i @mysten/bcs 还有一个基本的例子: import { BCS, getSuiMoveConfig } from "@mysten/bcs"; const bcs = new BCS(getSuiMoveConfig()); const ser = bcs.ser(BCS.U16, 10); console.log(ser.toBytes()); // [0x0a, 0x00] const des = bcs.de(BCS.U16, ser.toBytes()); console.log(des); // 10 你也可以序列化向量和字符串: bcs.ser("vector", [1, 2, 3, 4]); // 04 01 02 03 04 bcs.ser(BCS.STRING, "test string"); // 0b7465737420737472696e67 注册自定义类型 假设你有以下 Move 结构: struct Metadata has drop, copy { name: std::ascii::String } struct BCSObject has drop, copy { id: ID, owner: address, meta: Metadata } 你可以像这样在 JS 中注册它们: bcs.registerStructType("Metadata", { name: BCS.STRING, }); bcs.registerStructType("BCSObject", { id: BCS.ADDRESS, owner: BCS.ADDRESS, meta: "Metadata", }); 序列化和反序列化示例 JavaScript 序列 const bytes = bcs .ser("BCSObject", { id: "0x0000000000000000000000000000000000000005", owner: "0x000000000000000000000000000000000000000a", meta: { name: "aaa" } }) .toString("hex"); console.log("Hex:", bytes); 输出可能是: 0x0000000000000000000000000000000000000005000000000000000000000000000000000000000a03616161 现在可以将其传递到 Move 合约中,甚至可以在 Sui CLI 中手动测试. BCS 可能看起来低级且字节密集,但是一旦你了解了它是如何编码数据的,你就会更深入地了解Move智能合约的真正运作方式——以及如何安全地桥接链上的 ↔ 链下系统. 而且,如果你在 Sui Explorer 上调试 BCS 字节(如下所示): BCS 编码 二进制权威序列化(BCS)是在Diem区块链的背景下开发的一种序列化格式,现在广泛用于大多数基于Move的区块链(Sui、Starcoin、Aptos、0L). BCS 不仅用于 Move VM,还用于交易和事件编码,例如在签名之前序列化交易或解析事件数据. 如果您想更深入地了解 Move 的工作原理并成为 Move 专家,了解 BCS 的工作原理至关重要. 让我们潜入吧. BCS 规格和特性 在我们完成本课的其余部分时,最好记住BCS编码的一些高级属性: BCS 是一种数据序列化格式,其中生成的输出字节不包含任何类型信息;因此,接收编码字节的一方需要知道如何反序列化数据 BCS 中没有结构(因为没有类型);该结构仅定义了字段序列化的顺序 包装器类型会被忽略,因此 outerType 和 unnestedType 将具有相同的 BCS 表示形式: struct outerType { 所有者:innerType } struct innerType { 地址:地址 } struct unnestedType { 地址:地址 } 包含泛型类型字段的类型最多可以解析到第一个泛型类型字段. 因此,如果它是自定义类型,则最好将泛型类型字段放在最后一个或多个字段. struct bcsObject 已删除,复制 { ID:身份证, 所有者:地址, 元数据:元数据, 通用:T } 在这个例子中,我们可以反序列化直到元字段的所有内容. 像无符号整数这样的原始类型以 Little Endian 格式编码 向量序列化为 ULEB128 长度(最大长度可达 u32),然后是向量的内容. 完整的 BCS 规范可以在 BCS 存储库中找到. 使用 @mysten /bcs JavaScript 库 安装 你需要为这部分安装的库是 @mysten /bcs 库. 你可以通过在节点项目的根目录中键入来安装它: npm i @mysten /bcs 基本示例 让我们先使用 JavaScript 库来序列化和反序列化一些简单的数据类型: 从 “@mysten /bcs” 导入 {BCS,getsuiMoveConfig}; //使用默认 Sui Move 配置初始化序列化器 const bcs = 新 BCS (getsuiMoveConfig ()); //定义一些测试数据类型 常量整数 = 10; const 数组 = [1, 2, 3, 4]; const 字符串 = “测试字符串” //使用 bcs.ser () 来序列化数据 const ser_integer = bcs.ser(BCS.U16,整数); const ser_array = bcs.ser(“向量”,数组); const ser_string = bcs.ser(BCS.STRING,字符串); //使用 bcs.de () 反序列化数据 const de_integer = bcs.de (BCS.U16, ser_Integer.toBytes ()); const de_array = bcs.de(“向量”,ser_Array.toBytes ()); const de_string = bcs.de (BCS.STRING, ser_string.toBytes ()); 我们可以使用上述语法,即新的 BCS(getsuiMoveConfig ()),使用 Sui Move 的内置默认设置初始化序列化器实例. 有内置枚举可用于 Sui Move 类型,例如 BCS.U16、BCS.STRING 等. 对于泛型类型,可以使用与 Sui Move 相同的语法来定义,例如上面示例中的矢量. 让我们仔细看看序列化和反序列化的字段: int 是小端十六进制 0a00 10 向量的第一个元素表示总长度, 那么它就是向量中的任何元素 0401020304 1,2,3,4 字符串只是 u8 的向量,第一个元素等于字符串的长度 0b7465737420737472696e67 测试字符串 类型注册 我们可以使用以下语法注册我们将要使用的自定义类型: 从 “@mysten /bcs” 导入 {BCS,getsuiMoveConfig}; const bcs = 新 BCS (getsuiMoveConfig ()); //注册元数据类型 bcs.registerStructType (“元数据”,{ 名称:BCS.STRING, }); //我们打算读取的主对象也一样 bcs.registerStructType (“bcsObject”, { //BCS.ADDRESS 用于 ID 类型和地址类型 ID:BCS.地址, 所有者:BCS.ADDRESS, meta: “元数据”, }); 在 Sui 智能合约中使用 bcs 让我们继续使用上面的结构示例. 结构定义 我们从 Sui Move 合约中相应的结构定义开始. { //.. struct 元数据已删除,复制 { 名称:std:: ascii:: String } struct bcsObject 已删除,复制 { ID:身份证, 所有者:地址, meta:元数据 } //.. } 反序列化 现在,让我们编写一个函数来反序列化 Sui 合约中的对象. 公共娱乐 object_from_bytes(bcs_bytes:矢量):bcsObject { //初始化 bcs 字节实例 让 bcs = bcs:: new (bcs_bytes); //使用peel_*函数从序列化字节中提取值. //顺序必须与我们在序列化中使用的顺序相同! let (id、所有者、元数据) = ( bcs:: peel_address (&mut bcs)、bcs:: peel_address (&mut bcs)、bcs:: peel_vec_u8 (&mut bcs) ); //使用序列化结果打包 BcsObject 结构 bcsObject {id: object:: id_from_address (id),所有者,元数据:元数据 {名称:std:: ascii:: string (meta)}} Sui Frame bcs 模块中各种 peel_* 方法用于从 BCS 序列化字节中 “剥离” 每个单独的字段. 请注意,我们剥离字段的顺序必须与结构定义中字段的顺序完全相同. 测验:为什么对同一 bcs 对象进行前两次 peel_address 调用的结果不一样? 另请注意我们如何使用辅助函数将类型从地址转换为 id,以及如何将向量转换为 std:: ascii:: string. 测验:如果 BSCObject 使用 UID 类型而不是 ID 类型会发生什么? 完整的 Ser/De 示例 在 example_projects 文件夹中查找完整的 JavaScript 和 Sui Move 示例代码. 首先,我们使用 JavaScript 程序序列化一个测试对象: //我们构造一个用于序列化的测试对象,注意我们可以将输出格式指定为十六进制 让 _bytes = bcs .ser(“bcsObject”,{ id:“0x000000000000000000000000000000000000000005”, 所有者:“0x000000000000000000000000000000000000a”, 元数据:{名称:“aaa”} }) .toString(“十六进制”); 这次我们希望 BCS 写入器的输出采用十六进制格式,可以像上面一样指定. 使用 0x 前缀将序列化结果十六进制字符串粘贴并导出到环境变量中: export object_hexstring=0x00000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000000000 现在我们可以运行关联的 Move 单元测试来检查正确性: sui move 测试 你应该在控制台中看到这个: 正在构建 bcs_move 运行 Move 单元测试 [PASS] 0x0:: bcs_object:: test_deserialization 测试结果:OK. 测试总数:1;通过次数:1;失败:0 或者我们可以发布模块(并导出 PACKAGE_ID)并使用上面的 BCS 序列化十六进制字符串调用 emit_object 方法: sui 客户端调用--function emit_object--module bcs_object--package_ID--args $OBJECT_HEXSTRING 然后,我们可以在 Sui Explorer 上查看交易的 “事件” 选项卡,看看我们发出了正确的反序列化的 BcsObject:

    • Sui
    • SDKs and Developer Tools
    1
  • DRAMA.
    May 30, 2025
    讨论

    如何在没有撤销功能的情况下管理SUI钱包上的DApp访问权限?

    我一直在使用SUI钱包,我注意到没有办法像EVM链那样撤销对dApp的访问权限. 如果Chrome扩展程序上没有明确的撤销系统,如何阻止dApps永久访问我的钱包?

    • Sui
    0
    2
  • 赏金+10

    Peera Admin.
    May 29, 2025
    专家问答

    当 Move 结构有命名字段时,为什么 BCS 需要精确的字段顺序才能进行反序列化?

    当 Move 结构有命名字段时,为什么 BCS 需要精确的字段顺序才能进行反序列化? 我一直在深入研究 Move 中的 BCS 编码/解码,特别是跨链通信和链下数据处理. 在浏览 Sui Move 文档中的示例时,我遇到了一些似乎违反直觉的行为,我正在尝试理解底层的设计决策. 根据BCS规范,“BCS中没有结构(因为没有类型);该结构只是定义了字段序列化的顺序. ”这意味着在反序列化时,我们必须按照与peel_*结构字段定义完全相同的顺序使用函数. 我的具体问题: 设计理由:当 Move 结构具有命名字段时,为什么 BCS 需要精确的字段顺序匹配?像 JSON 或其他自描述格式一样,将字段名称与值一起序列化不是更强大吗? 泛型类型交互:文档提到 “包含泛型类型字段的类型最多可以解析到第一个泛型类型字段. ”考虑一下这个结构: struct ComplexObject has drop, copy { id: ID, owner: address, metadata: Metadata, generic_data: T, more_metadata: String, another_generic: U } 部分反序列化在这里到底是如何工作的?我可以反序列化到more_metadata并忽略两个泛型字段,还是第一个泛型字段(generic_data)完全阻止了进一步的反序列化? 跨语言一致性:使用 @mysten /bcs JavaScript 库序列化将由 Move 合约使用的数据时,在以下情况下会发生什么: -我不小心重新排序了 JavaScript 对象中的字段? -Move 结构定义会在合约升级中更改字段顺序? -我有带有自己的泛型参数的嵌套结构吗? 实际启示:在生产系统中,团队如何处理 BCS 架构演变?您是否对BCS架构进行了版本控制,还是期望结构字段顺序在部署后不可变?

    • Sui
    • Move
    5
    1
  • Mister_CocaCola.
    May 29, 2025
    讨论

    如何找到硬币类型的国库上限对象ID?

    我想知道如何才能获得硬币国库上限的对象ID,仅给出硬币类型名称. 目前,我正在获取元数据对象并检查其先前的交易以找到国库上限对象,但是这种方法似乎效率低下. 我正在寻找一种更简单、更有效的方法来使用硬币类型名称来确定硬币铸币厂是否被冻结. 有什么建议吗?

    • Sui
    0
    4
  • Theoremus.
    May 29, 2025
    讨论

    如何轻松复制不可复制的钱包地址?

    我一直在努力复制我的钱包地址,因为它无法直接复制. 我不确定我缺少的是快速的方法还是隐藏的功能. 谁能指导我怎么做?

    • Sui
    0
    2
  • article banner.
    Vens.sui.
    May 29, 2025
    文章

    Cetus 协议黑客攻击-Sui 上最大的 DeFi 漏洞

    2025 年 5 月,近代历史上最重大的安全漏洞之一震惊了 DeFi 世界. Cetus 协议是Sui区块链上领先的去中心化交易所(DEX)和流动性协议,成为复杂黑客攻击的受害者,该黑客攻击导致损失超过2亿美元. 这一事件不仅给DeFi社区带来了冲击,还引发了人们对智能合约的安全性以及基于Sui等新兴区块链的协议的稳健性的严重担忧. Cetus 协议已确立了自己作为Sui网络上首屈一指的DEX的地位,为用户提供了交换代币和提供流动性的平台. 作为Sui生态系统中的关键基础设施组件,Cetus在促进去中心化交易和增加网络的整体流动性方面发挥了关键作用. 它的突出地位使其成为试图利用其代码库中漏洞的恶意行为者的有吸引力的目标. Cetus Hack 展开 该漏洞发生在2025年5月22日,当时攻击者发现并利用了Cetus智能合约逻辑中的一个关键缺陷. 具体而言,该漏洞源于一个微妙的算术溢出漏洞,该漏洞允许黑客操纵协议的内部记账机制. 通过部署虚假代币和操纵流动资金池中的价格曲线,攻击者能够在不触发即时检测系统的情况下耗尽大量资金. 太平洋时间凌晨 3:52 左右(世界标准时间 11:52),区块链监控器开始检测Cetus上多个流动性池中的异常交易. 几小时之内,损失的程度就显而易见了——价值超过2.6亿美元的资产从协议中抽走了. 被盗资金很快被交换并桥接到其他区块链,这使追回工作复杂化. 对市场和 Sui 生态系统的影响 黑客攻击的后果迅速而严重. 由于开发人员争先恐后地评估情况并减轻进一步的损失,Cetus的交易立即停止. 同时,与该平台相关的原生代币的价值暴跌,其中一些代币在短短几个小时内跌幅度高达80%. 投资者和用户面临巨额损失,对Sui生态系统的信心动摇了. 一个特别令人震惊的事态发展发生在Sui网络尝试采取有争议的对策时:投票冻结攻击者装有1.6亿美元被盗资金的钱包. 尽管此举表明了资产追回的积极方法,但它也引发了关于去中心化原则以及此类行动是否破坏了对区块链交易不可改变性的信任的辩论. 在势头下,美元SUI下跌了5%,CETUS下跌了+ 40%,这种上涨既不可思议又可怕. Cetus 协议漏洞的技术细节 根据网络安全公司Halborn提供的分析,该漏洞的根本原因在于Cetus在代币交换期间如何验证某些算术运算. 在处理大量数据方面的疏忽导致了溢出情况,攻击者巧妙地操纵了这种情况,在流动资金池中造成了人为的不平衡. 然后,利用这些失衡从系统中提取实际资产,而没有向流动性提供者提供适当补偿. 这种漏洞特别隐蔽,因为它并不总是在正常运行条件下表现出来;相反,它需要涉及非常大的数值或异常交易序列的特定边缘情况才能触发. 众所周知,此类漏洞在标准审计和测试阶段很难被发现,这使它们成为资源充足的对手利用的首选. 来自 Cetus 和 Sui 基金会(又名 Mysten Labs)的应对和恢复工作 据报道,在袭击期间,约有1.6亿美元被冻结,并将归还给Cetus矿池. 这就是为什么所有Sui基金会都发起了投票以解冻该代币的原因. 袭击发生后,Cetus团队发表公开声明,承认了这一违规行为,并概述了解决的步骤. 他们与Elliptic和Chainalysis等区块链分析公司密切合作,追踪被盗资金的流动并确定潜在的追回途径. 此外,围绕实施紧急升级以修补现有漏洞并增强未来抵御类似攻击的能力,展开了讨论. 社区成员对这些事态发展表示了不同的反应. 尽管许多人赞扬了Cetus领导层在黑客攻击后表现出的透明度,但其他人则批评对此类情景的准备不足,并质疑发射前是否已经实施了足够的保障措施.

    • Sui
    • Security Protocols
    1
  • deriss.
    May 28, 2025
    专家问答

    如果限额临近,我的交易会完成吗?

    我收到了一条通知,说 “全球交易限额即将到来”. 如果我现在发起交易,还能在 24 小时内处理吗?

    • Move
    0
    3
  • cod.
    cod31
    May 27, 2025
    讨论

    在 Cetus 和 Turbo Finance 上兑换 Sui 钱包时遇到问题

    我想用 Cetus 和 Turbo Finance 来交换我的 Sui 钱包,但它不起作用. 我有大约 0.002 个 SUI 作为汽油. 我应该采取什么步骤来解决这个问题?

    • Transaction Processing
    0
    3

Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.

304帖子448答案
热门标签
  • Sui
  • Architecture
  • SDKs and Developer Tools
  • Move
  • Security Protocols
  • NFT Ecosystem
  • Transaction Processing
我们使用 cookie 确保您在我们的网站上获得最佳体验。
更多信息