Sui.

趋势

发现最热门的帖子。

帖子

679
过滤:所有社区
  • Vens.sui.Peera.
    SuiApr 29, 2025
    专家问答

    Sui 生态系统中的 AMM 机器人

    Sui 生态系统中 AMM 机器人的主要特征和功能是什么?他们如何改进传统的交易机制,以及它们为在Sui网络上使用DeFi协议的用户提供了哪些优势? 例如,我需要建造一个还是可以使用 Turbos Finance

    • Sui
    8
    2
    最佳答案
  • article banner.
    0xduckmove.Peera.
    SuiApr 08, 2025
    文章

    👀 SEAL-我认为 Web3 数据隐私即将改变

    👀 SEAL 已在 Sui 测试网上线 — 我认为 Web3 数据隐私即将改变 在 Web3 中,经常会听到诸如“用户拥有自己的数据”或“通过设计去中心化”之类的短语. 但是,仔细观察,许多应用程序仍然依赖集中式基础设施来处理敏感数据——使用 AWS 或 Google Cloud 等服务进行密钥管理. 这就引入了一个矛盾:表面上的去中心化,底层的集中化. 但是,如果有一种方法可以在不放弃权力下放的情况下安全地管理机密呢?介绍 SEAL — 去中心化机密管理 (DSM),现已在 Sui 测试网上线. SEAL 旨在修复 Web3 最大的虚伪之处之一:在秘密使用 AWS 的同时大声疾呼去中心化 你可能会问我:海豹突击队是什么? SEAL 是一种协议,可让您安全、分散地管理敏感数据——专为 Web3 世界构建. 可以将其视为插入 dApp 的隐私优先访问控制层. 您可以将 SEAL 视为一种可编程的数据锁. 你不只是手动锁定和解锁,而是使用Move on Sui将策略直接写入智能合约. 假设你正在构建一个 DApp,其中: -只有 NFT 持有者才能解锁高级教程 -或者,在泄露敏感文件之前,DAO 可能必须进行投票 -或者你想对元数据进行时间锁定并且只能在特定日期之后访问 海豹突击队使所有这些成为可能. 访问控制在链上 运行,完全自动化,无需管理员进行管理. 只是逻辑,直接融入区块链. 海豹突击队使所有这些成为可能. 访问控制在链上 运行,完全自动化,无需管理员进行管理. 只是逻辑,直接融入区块链. 另一个有趣的文章是SEAL如何处理加密. 它使用所谓的阈值加密,这意味着:没有一个节点可以解密数据. 需要一组服务器才能协同工作——有点像多重签名,但用于解锁机密. 这样可以分配信任,避免常见的单点故障问题. 为了保证信息的真正私密性,SEAL 会加密和解密客户端的所有内容. 任何后端都看不到您的数据. 从字面上看,它会留在你的手中,放在你的设备上. 而且 SEAL 不在乎你在哪里存储数据. 无论是 IPFS、Arweave、Walrus 还是其他平台,SEAL 都不会试图控制这部分. 它只关注谁可以看到什么,而不是东西的存储位置. 所以是的,它不仅仅是一个库或 API,它是 dApp 的链上优先、访问控制、默认隐私层. SEAL 填补了一个非常关键的空白. 让我们再分解一下. 如果你正在构建一个处理任何形式的敏感数据(封闭内容、用户文档、加密消息,甚至是锁定时间的 NFT 元数据)的 dApp,你也会遇到同样的问题: ➡️ 如何在不依赖集中服务的情况下安全地管理访问权限? 如果没有像海豹突击队这样的队伍,大多数队伍都会: 使用 AWS KMS 或 Firebase 等集中式工具,这显然与去中心化背道而驰 或者尝试自己修补半生不熟的加密逻辑,这些逻辑通常会变得脆弱且难以审计 https://x.com/EmanAbio/status/1908240279720841425?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1908240279720841425%7Ctwgr%5E697f93dc65359d0c8c7d64ddede66c0c4adeadf1%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fwww.notion.so%2Fharryph%2FSEAL-Launches-on-Sui-Testnet-1cc4f8e09bb380969c0dcc627b96cc22 这两个比例都不好. 尤其是在你尝试跨多个链或社区构建无需信任的应用程序时. *SEAL 使整个过程模块化和可编程. * 您可以在Move智能合约中定义访问规则,SEAL会处理其余的——密钥生成、解密批准和访问强制执行——所有这些都无需任何人手动颁发密钥或进行后端检查. 更好的是,这些规则是可审计和不可改变的——一旦上链,它们就会遵循合同,而不是人工管理员. 因此,与其问 “谁应该管理对这些数据的访问权限?”你只要问: “应该用什么逻辑来定义访问权限?” >... 然后让链条来处理. 简洁且可扩展. 这就是SEAL不仅仅涉及 “安全工具” 的原因——它是*任何关心隐私、合规性或动态访问逻辑的DApp的基础层. * 这是一个很小的转变——但它改变了我们对 Web3 中数据的看法. *与其在部署后进行加密,或依赖外部服务,不如从内置隐私开始——访问权限完全由智能合约逻辑处理. * 而这正是 Web3 现在需要的. SEAL 实际上是如何运作的? 我们已经介绍了什么是 SEAL以及为什么 Web3 需要它,让我们来看看它在幕后是如何构建的. 这部分是技术性更强的地方,但还是不错的. 一旦你看到所有部分是如何组合在一起的,建筑就会变得很优雅. 总体而言,SEAL的工作原理是使用一种名为基于身份的加密(IBE)的技术,将链上访问逻辑与链下密钥管理相结合. 这允许开发人员将数据加密为身份,然后依靠智能合约来定义允许谁对其进行解密. 步骤 1:智能合约中的访问规则(在 Sui 上) 一切都从智能合约开始. 当你使用 SEAL 时,你需要在你的 Move 合约中定义一个名为 seal_approve 的函数,你可以在这里写下解密条件. 例如,以下是用 Move 编写的简单时间锁定规则: entry fun seal_approve(id: vector, c: &clock::Clock) { let mut prepared: BCS = bcs::new(id); let t = prepared.peel_u64(); let leftovers = prepared.into_remainder_bytes(); assert!((leftovers.length() == 0) && (c.timestamp_ms() >= t), ENoAccess); } 一旦部署,该合约将充当看门人. 每当有人想要解密数据时,他们的请求都会被根据这个逻辑进行检查. 如果通过,密钥将被释放. 如果没有,他们就会被封锁. 没有人需要干预. ##步骤 2:基于身份的加密 (IBE) 这就是魔法发生的地方. SEAL 没有加密特定钱包地址(如 PGP 或 RSA)的数据,而是使用身份字符串——这意味着你可以加密成类似的内容: -0x 钱包地址 -dao_voted: proposal_xyz -pkgid_2025_05_01(基于时间戳的规则) -甚至是 game_user_nft_holder 当数据加密后,它看起来像这样: Encrypt(mpk, identity, message) -mpk = 主公钥(众所周知) -身份 = 逻辑定义的收件人 -消息 = 实际数据 之后,如果有人想解密,密钥服务器会检查他们是否符合政策(通过链上的 seal_approve 调用). 如果获得批准,它将返回该身份的派生私钥. Derive(msk, identity) → sk Decrypt(sk, encrypted_data) 然后,用户可以在本地解密内容. 因此,无需提前知道谁将解密即可完成加密. 您只需定义条件,SEAL 稍后再计算其余部分. 它是动态的. ##第 3 步:密钥服务器 — 脱链,但未集中化 你可能想知道:谁在拿着这些万能钥匙? 这就是 SEAL 的密钥服务器的用武之地. 可以把它看作是一个后端: -持有主密钥 (msk) -关注链上合约(比如你的 seal_approve 逻辑) -仅在满足条件时才发出派生密钥 但是——这是关键——海豹突击队不只依赖一台密钥服务器. 你可以在阈值模式下运行它,在发放解密密钥之前,需要多个独立服务器达成一致. 例如:五分之三的密钥服务器必须批准请求. 这避免了中心故障点,也允许在密钥管理层进行权力下放. 更好的是,将来SEAL将支持MPC(多方计算)和基于飞地的设置(例如TEE),因此您可以在不影响可用性的情况下获得更强的保障. ##步骤 4:客户端解密 将密钥返回给用户后,实际的解密将在用户的设备上进行**. 这意味着: -服务器永远看不到你的数据 -后端从不存储解密的内容 -只有用户可以访问最后的消息 这是一个可靠的隐私模型. 即使有人破坏了存储层(IPFS、Arweave 等),如果不传递访问逻辑,他们仍然无法读取数据. 以下是快速思维模型: 这种结构使您可以轻松构建访问规则不是硬编码的去中心化应用程序,它们是动态的、可审计的,并且完全集成到您的链逻辑中. ##SEAL 背后的团队 SEAL 由区块链安全社区的知名人物Samczsun领导. 他曾是Paradigm的研究合伙人,曾审计过多个生态系统并将其从重大漏洞中拯救出来. 现在,他全职致力于将 SEAL 建成 Web3 隐私基础设施的核心部分. 凭借他的背景和信誉,SEAL 不仅仅是另一个实验工具,它是一次严肃的尝试,旨在使去中心化数据隐私既实用又可扩展. 随着 SEAL 在 Sui 测试网上线,它为 Web3 应用程序如何管理机密带来了新的标准. 通过结合链上访问控制、阈值加密和客户端隐私,SEAL 为去中心化数据处理提供了更值得信赖的基础. 无论你是在构建 dApp、DAO 还是去中心化游戏,SEAL 都提供了一个强大的工具包,可以在不影响去中心化的前提下执行访问控制和保护用户数据. 如果 Web3 要向前发展,像 SEAL 这样的安全基础设施不是可选的——这是必不可少的

    • Sui
    • Architecture
    • SDKs and Developer Tools
    8
  • MarlKey.Peera.
    SuiApr 30, 2025
    专家问答

    是通过 EOA 发布 Move 包的唯一方法吗?

    我认为在Sui链上没有办法,因为链上没有发布软件包的模块.

    • Sui
    • SDKs and Developer Tools
    • Move
    7
    3
    最佳答案
  • article banner.
    Arnold.Peera.
    SuiJun 30, 2025
    文章

    Sui 如何防止智能合约黑客攻击?

    智能合约黑客一直困扰着区块链行业,仅在2023年,由于以太坊等平台的漏洞,就损失了超过30亿美元. Sui Network以安全为设计重点,引入了多项关键创新,以最大限度地降低这些风险. 本文探讨了: 🔒 Sui 的内置安全功能 💡 Move 语言如何防止常见漏洞 🛡️ 与以太坊的漏洞比较 🚀 为什么 Sui 能成为最安全的智能合约平台 1. Move 编程语言:安全第一的方法 Sui使用Move,这是一种最初为Facebook的Diem区块链开发的语言,专为安全资产管理而设计. Move 的主要安全优势: -禁止未经检查的外部呼叫-防止重入攻击(例如对以太坊的6000万美元DAO黑客攻击). -严格的打字和所有权规则-消除了由于编码错误而造成的意外资金损失. -形式验证支持-允许对合同正确性进行数学证明. 示例:在以太坊中,一个简单的错字可能会耗尽资金. 在 Move 中,编译器在部署之前拒绝不安全的代码. 2. 以对象为中心的模型:隔离漏洞 与以太坊的共享状态模型(其中一个错误会影响许多合约)不同,Sui 的基于对象的存储限制了漏洞的传播: 每种资产(硬币、NFT 等)都是具有严格所有权规则的独特对象. 合同不能任意修改无关的数据. 影响:与以太坊的可组合性风险(例如3.25亿美元的虫洞桥黑客攻击)不同,即使合同受到损害,损失也会得到控制. 3. 没有 “毒气泄漏” 攻击 在以太坊上,攻击者可以通过高额交易向合约发送垃圾邮件来封锁合法用户(例如,拒绝服务攻击). Sui 的解决方案: 固定低成本交易(无汽油拍卖). 并行执行可防止全网拥塞. 4. 链上安全监控 Sui 的验证者会积极监控可疑活动: 交易预检 — 拒绝明显的恶意请求. 实时分析 — 举报异常行为(例如,突然的大额提款). 5. 真实世界安全记录(迄今为止) 自主网启动(2023 年)以来,Sui 的重大黑客攻击次数为零. 以太坊平均每月有2-3次主要的DeFi漏洞. 案例研究:基于SUI的去中心化交易所(Cetus)在没有发生安全事件的情况下处理了超过10亿美元的交易,这与经常遭受漏洞的以太坊去中心化交易不同. 6. 面向未来:形式验证和审计 Sui 鼓励: 形式验证 — 用数学方法证明合同没有错误. 多重审计要求 — 重大项目必须通过 3 次以上的审计. 结论:Sui 是最安全的智能合约平台吗? 虽然没有一个系统能百分之百地防黑客攻击,但Sui的Move语言 + 对象模型 + 并行执行使其脆弱程度远不如当今的以太坊. 底线: -对于开发人员-Move降低了人为错误的风险. -对于用户-因漏洞而损失资金的可能性降低. -对于机构而言-企业级安全性可以建立信任. **下一步是什么? 以太坊会采用类似 Move 的功能吗? 随着采用率的增长,Sui 能否保持其干净的安全记录?** 在下面分享你的想法

    • Sui
    6
  • article banner.
    harry phan.Peera.
    SuiApr 24, 2025
    文章

    使用 public_receive 进行跨模块儿童管理

    这是 “Sui Move 中的亲子对象” 系列的第 3 部分. 有时,您的父类型和子类型是在不同的模块甚至不同的包中定义的. 例如,您可能有一个可以存储任何类型的 Parcel 对象的通用仓库对象. 仓库模块想要提取一个包裹子节点,但是包裹类型是在其他地方定义的. 在这种情况下,我们使用 transfer:: public_receive,它是 receive 的跨模块表兄弟. ###接收 vs public_receive 正如我们所见,transfer:: receive 只能在定义 T(或朋友)的模块中调用,因为它不需要 T: store. Move 字节码验证器实际上确保在任何要接收的调用中,T 类型来自当前模块. 这是对仅限钥匙的对象的安全限制. transfer:: public_receive 是一个变体,它需要 T: key + store,但允许在 T 的模块之外接收. 换句话说,如果对象类型具有存储能力(这意味着它可以自由存在于全局存储中),则任何模块(给定父模块的 &mut UID)都可以使用 public_receive 接收它. 这非常适合父模块与子模块不同的情况. 为什么需要商店?因为存储标志着该对象可以安全地保存并在其定义模块之外传递. 仅限密钥的对象可能具有原始模块希望在传输/接收时强制执行的自定义不变量;通过排除public_receive中的那些不变量,Sui会强制开发人员在模块内处理它们(正如我们将在灵魂绑定对象中看到的那样). 如果一个对象有存储,则更宽松,而且 Sui 允许使用通用的传输/接收逻辑在外部对其进行管理. ###示例:分离父模块和子模块 让我们用一个简单的场景来说明一下:一个存储 Parcel 对象的仓库. 包裹类型在自己的模块中定义,仓库在另一个模块中定义. 我们将展示仓库如何使用 public_receive 接收子包裹. module demo::parcel { // Child module use sui::object::{Self, UID}; use sui::tx_context::{Self, TxContext}; /// A parcel object that can be stored in a Warehouse. /// It has both key and store, so it can be transferred across modules. struct Parcel has key, store { id: UID, contents: vector } public entry fun create_parcel(contents: vector, ctx: &mut TxContext): Parcel { Parcel { id: object::new(ctx), contents } } } module demo::warehouse { // Parent module use sui::transfer::{Self, Receiving, public_receive}; use demo::parcel::{Self, Parcel}; use sui::object::{UID}; use sui::tx_context::{Self, TxContext}; struct Warehouse has key { id: UID, location: address } public entry fun create_warehouse(location: address, ctx: &mut TxContext): Warehouse { Warehouse { id: object::new(ctx), location } } /// Receive a Parcel that was sent to this Warehouse. /// Returns the Parcel to the caller (transferred to caller's address). public entry fun withdraw_parcel( warehouse: &mut Warehouse, parcel_ticket: Receiving, ctx: &mut TxContext ): Parcel { // Using public_receive because Parcel is defined in another module and has store let parcel = public_receive(&mut warehouse.id, parcel_ticket) oai_citation_attribution:27‡docs.sui.io oai_citation_attribution:28‡github.com; // Transfer the parcel to the transaction sender (so the caller gets ownership) transfer::transfer(parcel, tx_context::sender(ctx)); // We return nothing because we've transferred the Parcel out to the caller. } } 让我们分解一下 redath_parcel 中发生了什么: -我们打电话给 public_receive (&mut warehouse.id, parcel_ticket)由于 Parcel 具有存储能力,因此即使我们不在包裹模块中,也允许此调用. 在幕后,它会执行与接收相同的检查和提取,但允许跨模块进行检查,因为存储表明这样做是安全的. https://github.com/MystenLabs/sui/blob/main/crates/sui-framework/packages/sui-framework/sources/transfer.move#:~:text=public%20fun%20public_receive,T%3E%29%3A%20T -然后,我们会立即将收到的包裹转到来电者的地址(tx_context:: sender(ctx)). 此步骤可确保包裹离开仓库并交给发起提款的用户. 我们也可以直接从函数中返回 Parcel,然后 Sui 会将其视为由调用者地址拥有的输出(因为它是输入函数的输出). 进行显式传输更为冗长,但可以清楚地说明发生了什么(并允许我们在释放对象之前进行任何检查). 为什么要在包裹中加入店铺?如果 Parcel 缺乏存储能力(即只有密钥),则 demo:: warehouse 中的 public_receive 调用将无法编译 — Sui 强制要求 T 为 public_receive 存储. 在这种情况下,我们将被迫在包裹模块本身中使用接收功能(或使用某种朋友关系)来取回包裹,这会使跨模块的设计变得复杂. 通过在 Parcel 中添加存储,我们实际上是在说 “这个对象可以自由移动和被外部模块接收”,这正是我们想要的通用容器模式. 函数调用模式:要在交易中使用它们,流程为: 存款(转移到对象):致电转移:: public_transfer(parcel_obj,@warehouse_id)将包裹发送到仓库. 这会将包裹的所有者标记为仓库. (我们在这里使用 public_transfer 是因为它在 Parcel 模块之外,而且 Parcel 有存储. 在包裹模块内,普通的传输也可以. ) 提款(收回):稍后,致电撤回包裹(warehouse_obj,接收(包裹编号,...)). SDK 可以通过引用包裹的 ID 和最新版本来获取接收信息. 该函数将调用 public_receive 然后将包裹转移给你. 在拨打 redth_parcel 电话后,包裹的所有者回到了一个地址(你的),所以它又是一个普通的地址拥有的物品. 仓库不再拥有它. 跨模块注意事项:请注意,仓库模块需要了解包裹类型(我们使用 demo:: parcel:: Parcel). 这是因为我们将接收明确键入为接收. 如果你想要一个可以接收任何类型对象的真正通用容器,你必须使用泛型或其他方法(可能是带有类型擦除的动态字段). 但是对于大多数用例,你会知道你期望的是什么类型的孩子. 为什么 public_receive 而不只是调用 receive?如果我们尝试在仓库模块中转移:: 接收(&mut warehouse.id,parcel_ticket),则移动验证器会拒绝,因为在 demo:: warehouse 中没有定义包裹. Sui 提供了 public_receive 作为通过额外能力检查(需要存储)来实现此目的的好方法. 同样,Sui 也有传输与 public_transfer、freeze_object 与 public_freeze_object 等,遵循相同的模式:public_ 版本在定义模块之外使用,需要存储. 别忘了家长的许可:即使有 public_receive,你仍然需要那个 &mut warehouse.id. 我们之所以得到它,是因为撤回包裹在 Warehouse 的模块中并接受 &mut Warehouse. 因此,只有可以这样称呼的人(仓库的所有者)才能提取包裹. 如果仓库模块没有公开提供这样的函数,那么也没有人可以在外部对其子模块调用 public_receive. 因此,跨模块不会绕过父级的控制;它只允许父级的代码处理其未定义类型的子类型. 关于存储能力的说明:提供对象存储可以使其更加灵活,但限制稍微减少一点——任何具有父引用的模块都可以使用 public_receive 将其拉出. 如果你想限制对象的检索方式(例如,强制执行自定义逻辑或防止轻松提取),你可以故意将其设为仅限密钥. 我们将用灵魂束缚的物体来看这个例子. 在这种情况下,你可以实现自定义接收函数,而不是依赖 public_receive. 总结一下这部分:public_receive 是你管理其他模块中定义的子对象的好友,只要这些对象具有存储能力即可. 它允许您构建跨模块系统(例如我们的仓库/包裹),同时仍然尊重所有权和访问控制. 只要记得在子类型上添加存储,并在从模块外部将它们发送给父类型时使用 public_transfer 即可.

    • Sui
    • Architecture
    6
  • Evgeniy CRYPTOCOIN.Peera.
    SuiJun 30, 2025
    专家问答

    Why can’t I connect my wallet to a Sui dApp?

    I’m trying to use a Sui dApp (like Tradeport, SuiSwap, or a custom platform), but my wallet won’t connect properly. Sometimes, I get no error at all—just nothing happens when I click "Connect Wallet." Other times, I see errors like: "Wallet not detected" (even though I have Sui Wallet or another wallet installed) "Connection failed: Invalid account" "Transaction rejected" before I even approve anything What I’ve tried: Refreshing the page Switching browsers (Chrome, Firefox, Brave) Checking wallet extension permissions Trying different networks (Devnet, Testnet, Mainnet) Reinstalling the wallet extension Questions: Why does this happen, and how can I fix it? Are there common mistakes users make when connecting wallets to Sui dApps? If my wallet was working before but suddenly stopped, what could be the cause?

    • Sui
    • Transaction Processing
    6
    1
    最佳答案
  • article banner.
    MiniBob.Peera.
    SuiApr 30, 2025
    文章

    如何在 Sui Move 上构建复杂的 DApp?

    课程 #2:深度学习移动编程 — 在 Sui 上构建复杂的 DApp 现在你已经掌握了Move编程的基础知识并部署了你的第一个智能合约,是时候将你的技能提升到一个新的水平了. 在本文中,我们将探讨如何在 Sui 区块链上使用 Move 构建更复杂的去中心化应用程序 (dApps). 步骤 1:掌握高级 Sui Move 概念 在深入研究编程之前,让我们回顾一下 Move 的一些高级功能,这些功能使其特别适合构建安全和可扩展的 dApp: ####1. 以资源为导向的编程 Move将数字资产视为资源,确保它们不会被复制、无意中删除或滥用 (https://docs.sui.io/learn/resource-oriented-programming). 这是通过严格的所有权规则和类型安全来实现的. 例如: module examples::token { use sui::object::{Self, UID}; use sui::transfer; struct Token has key, store { id: UID, value: u64, } public fun mint(ctx: &mut TxContext, value: u64): Token { Token { id: object::new(ctx), value, } } public fun transfer_token(token: Token, recipient: address) { transfer::public_transfer(token, recipient); } } 在此示例中,Token资源是安全创建和传输的. 默认情况下,Move 中的资源是不可变的,除非明确标记为可变,这增加了额外的安全层. ####2. 模块和封装 Move 中的模块充当独立的功能单元,可实现更好的组织和可重用性. 例如,您可以将代币创建逻辑与将逻辑转移到不同的模块中分开 (https://examples.sui.io/modules). 这种模块化确保了更简洁的代码和更易于维护. ####3. 以对象为中心的设计 UIDSui Move 引入了以对象为中心的模型,其中每种资源都有一个全球唯一标识符 (). 这允许直接引用对象并与之交互,从而更容易管理复杂的状态转换 (https://docs.sui.io/objects). 第 2 步:编写模块化智能合约 让我们创建一个更高级的智能合约来演示这些概念. 我们将建立一个简单的 NFT 市场,用户可以在其中铸造和交易 NFT. ####定义 NFT 资源 首先在 Move 模块中定义 NFT 资源: module examples::nft_marketplace { use sui::object::{Self, UID}; use sui::transfer; struct NFT has key, store { id: UID, name: String, price: u64, } public fun mint_nft(ctx: &mut TxContext, name: String, price: u64): NFT { NFT { id: object::new(ctx), name, price, } } public fun list_for_sale(nft: NFT, price: u64, ctx: &mut TxContext) { nft.price = price; transfer::public_transfer(nft, tx_context::sender(ctx)); } } 在这里,NFT资源包括name和之类的属性price. 该mint_nft函数创建了一个新的 NFT,同时list_for_sale允许用户列出他们的 NFT 进行出售. ####编译和部署 使用 Sui CLI 编译和部署合约. 编写部署脚本来自动执行此过程: sui move build sui client publish --gas-budget 10000 这会将你的模块打包并部署到 Sui 开发网络 (https://docs.sui.io/cli). 第 3 步:为你的市场构建 React 前端 部署智能合约后,让我们将其连接到 React 前端. ####设置项目 如果你还没有初始化 React 项目: npx create-react-app nft-marketplace cd nft-marketplace npm install @mysten/sui.js ####与 Sui 钱包集成 使用该@mysten/sui.js库与 Sui 区块链进行交互: import { JsonRpcProvider, SuiClient } from '@mysten/sui.js'; const provider = new SuiClient({ url: 'https://fullnode.devnet.sui.io' }); async function fetchNFTs(ownerAddress) { const objects = await provider.getObjectsOwnedByAddress(ownerAddress); console.log('User NFTs:', objects); } ####显示 NFT 数据 在你的 React 应用程序中获取并显示 NFT 数据: function NFTList({ ownerAddress }) { const [nfts, setNFTs] = useState([]); useEffect(() => { async function loadNFTs() { const response = await provider.getObjectsOwnedByAddress(ownerAddress); setNFTs(response.data); } loadNFTs(); }, [ownerAddress]); return ( {nfts.map((nft) => ( {nft.name} Price: {nft.price} SUI ))} ); } 步骤 4:增强安全性和性能 ####1. 安全交易 确保所有交易在链上和链下都经过验证. 使用类似@mysten/sui.js的库来验证交易收据: async function verifyTransaction(txDigest) { const result = await provider.getTransaction({ digest: txDigest }); console.log('Transaction Verified:', result); } ####2. 优化汽油费 与Shami Gas Station等服务合作,提供无气交易,改善用户体验. 或者,批量交易以降低成本 (https://docs.sui.io/gas-optimization). ####3. 利用 Sui 的可扩展性 Sui 的架构支持高吞吐量和低延迟,使其成为大量使用的 dApp 的理想之选. 在模拟负载条件下测试应用程序,确保性能保持一致 (https://performance.sui.io). 步骤 5:测试和调试 测试对于避免漏洞至关重要. 使用Sui Explorer之类的工具来监控交易和调试问题. 此外,为你的 Move 模块编写单元测试: #[test] fun test_mint_nft() { use sui::test_scenario; let ctx = &mut test_scenario::ctx(); let nft = examples::nft_marketplace::mint_nft(ctx, "Test NFT", 100); assert!(nft.price == 100, 0); } 使用 Sui CLI 运行测试: sui move test 第 6 步:与社区互动 构建 dApp 不仅仅是编码,还关乎协作. 在GitHub、Discord 或* Twitter*等平台上分享你的进度. 参加 Sui 基金会主办的黑客马拉松和开发者挑战赛,提高技能并获得 曝光率. 结论 通过掌握先进的 Move 概念、编写模块化智能合约和构建直观的前端,你即将成为 Sui 区块链上熟练的 DApp 开发人员. 记得优先考虑安全性、优化性能并与社区互动,以最大限度地发挥影响力. 敬请关注课程 #3,我们将探索在 Sui 上扩展 DApp 的真实用例和高级技术! 如果您想进一步澄清或获得更多资源,请随时提问!

    • Sui
    • Architecture
    • Move
    6
  • article banner.
    MiniBob.Peera.
    SuiApr 29, 2025
    文章

    Move Learning 入门-课程 #1

    无论你是初学者还是经验丰富的开发者,这份分步指南都将帮助你了解如何使用面向资源的编程语言 Move 在 Sui 区块链上构建 dApp. ###第 1 步:了解 Move 及其主要特征 在深入研究编程之前,让我们简要讨论一下Move是什么以及它为何独一无二. Move是一种编程语言,专为编写安全高效的智能合约而设计. 它引入了以资源为导向的编程**,将数字资产视为一流的资源,确保它们不会被无意中复制或删除. -与其他语言不同,Move通过静态打字和强大的资源管理等功能最大限度地减少漏洞. 如果你是Move的新手,我们建议你观看 Sui 基金会的Sui Move简介视频by Shayan). 这将提供有关Sui网络和Move在其中的作用的基础知识. ###步骤 2:设置开发环境 要开始使用,你需要安装必要的工具和二进制文件. 请按照以下步骤操作: 安装 Sui 二进制文件 首先安装Sui 二进制文件,以确保您的开发环境准备就绪. Sui CLI(命令行界面)将允许您与 Sui 区块链进行交互. 你可以在 Sui Docs 中找到详细说明. 选择您的平台 根据你使用的是 Windows、macOS 还是 Linux,请按照视频系列或 Sui 官方文档中提供的相应设置说明进行操作. 3.设置 VPS(可选) 如果你的笔记本电脑不够强大,可以考虑设置虚拟专用服务器 (VPS) 来处理计算负载. ###第 3 步:编写你的第一步智能合约 现在您的环境已经准备就绪,让我们编写一个简单的Move智能合约. 在本教程中,我可以重新评论使用Sweet Place示例,该示例的灵感来自Flash Place. 定义资源 首先在 Move 模块中定义资源. 例如: module examples::sweet_place { use sui::object::{Self, UID}; use sui::transfer; struct SweetPlace has key { id: UID, name: String, } public fun create_sweet_place(ctx: &mut TxContext, name: String) { let sweet_place = SweetPlace { id: object::new(ctx), name, }; transfer::public_transfer(sweet_place, tx_context::sender(ctx)); } } 编译和部署 使用 Sui CLI 编译和部署合约. 编写部署脚本来自动化此过程,确保以后与前端顺利集成. ###第 4 步:构建 React 前端 部署智能合约后,是时候将其连接到React前端了. 这一步假设你之前有一些使用 React 的经验. 如果没有,可以看看 freeCodeCamp.org 的初学者 React 课程. 设置项目 使用create-react-app或你选择的任何框架初始化 React 项目. 与 Sui 钱包集成 像使用库一样@mysten/sui.js与 Sui 区块链进行交互. 例如: import { JsonRpcProvider } from '@mysten/sui.js'; const provider = new JsonRpcProvider('https://fullnode.devnet.sui.io'); 3.从您的合同中获取数据 从已部署的 Move 合约中查询数据并将其显示在 React 应用程序中. 使用索引器来高效地跟踪交易和状态变化. ###步骤 5:增强用户体验 (UX) 本教程的突出特点之一是它专注于创建无缝的用户体验. 以下是增强用户体验的方法: 整合无气交易 与Shami 加油站等服务合作,为您的用户启用无气交易. 这为不熟悉加密货币费用的新手消除了障碍. 优化性能 利用 Sui 的高吞吐量和低延迟,确保您的 dApp 即使在重负载下也能平稳运行. ###步骤 6:测试和调试 测试对于确保您的应用程序按预期运行至关重要. 使用诸如Sui Explorer之类的工具来验证交易和调试问题 [[网络搜索]]. 此外,请重新访问MOVE 电子学习平台,深入了解测试和评估的最佳实践. ###第 7 步:与社区互动 最后,别忘了加入Sui社区!分享您的进度,提出问题并与他人协作. 正如视频记录中所强调的那样,与其他开发人员建立联系可以带来令人兴奋的机会.

    • Sui
    • Architecture
    • SDKs and Developer Tools
    • Move
    6
  • Evgeniy CRYPTOCOIN.Peera.
    SuiJun 26, 2025
    专家问答

    How to Properly Use the Sui SDK for Frontend Integration?

    I'm building a frontend (React/Next.js) for a Sui dApp and need to interact with the blockchain—fetching objects, sending transactions, and listening to events. I’ve tried using the @mysten/sui.js SDK, but I’m running into issues: Wallet Connection: Sometimes, the wallet doesn’t return the user’s address after connecting. Transaction Handling: Transactions fail silently or return vague errors. RPC Limits: I get rate-limited or timeouts when fetching large datasets. Real-Time Updates: How can I listen for on-chain events (e.g., NFT mints, balance changes)? What I’ve tried: ✔ Basic SuiClient setup with mainnet and testnet RPCs. ✔ Using useWallet() from @mysten/dapp-kit for wallet integration. ✔ Manual transaction signing with signAndExecuteTransactionBlock. Questions: What’s the recommended way to initialize the Sui SDK in a frontend app? How do I handle errors gracefully (e.g., RPC failures, wallet rejections)? Are there best practices for optimizing queries (batching, caching, etc.)? How can I subscribe to real-time updates (e.g., new transactions, object changes)?

    • Sui
    • SDKs and Developer Tools
    6
    2
    最佳答案
  • MiniBob.Peera.
    SuiApr 28, 2025
    专家问答

    Sui Move 模块如何增强智能合约的安全性?

    Sui Move的模块系统如何使开发人员能够定义、组织和安全地与自定义链上对象进行交互,以及与传统智能合约语言相比,Sui生态系统中模块识别和对象存储的独特功能是什么?

    • Sui
    • Architecture
    • Security Protocols
    • Move
    6
    1
    最佳答案