Aptos

2025年09月04日更新 4 人订阅
原价: ¥ 2.2 限时优惠
专栏简介 Aptos 开发实战:从环境搭建到第一个 Hello World Aptos 开发指南:在 JetBrains 编辑器中配置运行、编译、测试与发布部署,实现更高效开发 Aptos 区块链智能合约入门:使用 Move 实现消息存储与检索 Aptos Move 语言中的变量管理与内存所有权机制详解 Aptos Move 编程语言中的四大基础类型解析:UINT、STRING、BOOL 与 ADDRESS 深入解读 APTOS-MOVE 中的 Vector 向量核心特性与操作 深入理解APTOS-MOVE中的函数修饰符:核心概念与应用 深入解读 Aptos Move 的 Struct 特性与四大能力 Aptos Move 控制流解析:IF、WHILE与LOOP的深入解读 Aptos Move 模块的特性与实操指南:模块引用与作用域管理 Aptos Move 模块的发布与交互:完整指南 深入理解 Aptos Move 中的 Object 创建与管理 深入探索 Aptos Move:Object 配置与实操指南 使用 Aptos Move 实现随机数生成:从 AIP-41 到实战操作 Aptos Move 实践指南:构建并部署同质化代币水龙头 (FA Faucet) Aptos Move NFT 项目实操指南:从开发到部署全流程解析 Aptos Move 开发入门:从环境搭建到合约部署全流程实录 Aptos Move 入门:从零到一的合约开发与测试实战 Move 语言核心:布尔逻辑与地址类型的实战精解 深入 Aptos Move:从public到friend,函数可见性详解 Aptos Move 编程:for、while 与 loop 循环的实战详解 Aptos Move 安全编程:abort 与 assert! 错误处理实战 Aptos Move 实战:基础运算与比较逻辑的实现与测试 Aptos Move 性能优化:位运算与移位操作实战 Aptos Move 实战:as 关键字与整数类型转换技巧 Aptos Move DeFi 实战:从零构建流动性池兑换逻辑 Aptos Move 实战:用 signer 实现合约所有权与访问控制 Aptos Move 核心安全:& 与 &mut 引用机制详解

Aptos Move 实战:用 signer 实现合约所有权与访问控制

AptosMove实战:用signer实现合约所有权与访问控制在智能合约的世界里,最基础也是最核心的安全问题莫过于:“谁有权执行此操作?”。无论是转账、修改状态还是管理合约,我们都必须先验证调用者的身份。AptosMove为此提供了一个强大而独特的类型——signer。signer

Aptos Move 实战:用 signer 实现合约所有权与访问控制

在智能合约的世界里,最基础也是最核心的安全问题莫过于:“谁有权执行此操作?”。无论是转账、修改状态还是管理合约,我们都必须先验证调用者的身份。Aptos Move 为此提供了一个强大而独特的类型——signer

signer 不仅仅是一个地址,它是交易发送者身份的密码学证明,是链上权威的唯一代表。这篇实战教程将为你彻底揭开 signer 的面纱。我们将通过编写一个最常见的“仅限所有者 (owner-only)”函数,手把手教你如何利用 signer 构建坚不可摧的访问控制防线,并向你展示如何使用 Move 测试框架的强大功能,来确保这道防线真正固若金汤。

实操

Aptos Move Signer

module net2dev_addr::SignerDemo {
    use std::signer;
    use std::debug::print;
    use std::string::utf8;

    /// Error code for not being the owner
    const NOT_OWNER: u64 = 0;
    const OWNER: address = @net2dev_addr;

    fun check_owner(account: signer) {
        let address_val = signer::borrow_address(&account);
        assert!(address_val == &OWNER, NOT_OWNER);
        assert!(signer::address_of(&account) == OWNER, NOT_OWNER);
        print(&utf8(b"Owner Confirmed"));
        print(&signer::address_of(&account));
        print(address_val);
    }

    #[test(account = @net2dev_addr)]
    fun test_check_owner(account: signer) {
        check_owner(account);
    }
}

这段 Aptos Move 代码通过一个名为 SignerDemo 的模块,清晰地演示了如何使用核心的 signer 类型来实现访问控制。模块中的 check_owner 函数接收一个 signer 参数(代表交易的签名者),并通过 assert! 断言来严格验证该签名者的地址是否与预先定义的 OWNER 地址常量相匹配。这种模式确保了只有合约的“所有者”才能成功执行该函数,任何其他地址的调用都会导致交易中止并报错。附带的单元测试则巧妙地利用了 #[test(account = @net2dev_addr)] 属性,模拟了一笔由指定所有者地址签名的交易,从而验证了在授权用户调用时,这个所有权检查逻辑能够正确通过。

测试

➜ aptos move test
INCLUDING DEPENDENCY AptosFramework
INCLUDING DEPENDENCY AptosStdlib
INCLUDING DEPENDENCY MoveStdlib
BUILDING my-dapp
Running Move unit tests
[debug] "Owner Confirmed"
[debug] @0x48daaa7d16f1a59929ece03157b8f3e4625bc0a201988ac6fea9b38f50db5ef3
[debug] @0x48daaa7d16f1a59929ece03157b8f3e4625bc0a201988ac6fea9b38f50db5ef3
[ PASS    ] 0x48daaa7d16f1a59929ece03157b8f3e4625bc0a201988ac6fea9b38f50db5ef3::SignerDemo::test_check_owner
Test result: OK. Total tests: 1; passed: 1; failed: 0
{
  "Result": "Success"
}

这个测试结果表明,你的 my-dapp 项目已成功通过其单元测试。在成功编译项目后,测试框架执行了 SignerDemo 模块中定义的 test_check_owner 测试函数。日志中的 [debug] 输出,包括 "Owner Confirmed" 消息和打印出的账户地址,清晰地表明代码中的所有权检查逻辑已被成功触发。最终的 [ PASS ] 状态确认了该测试用例顺利完成,意味着其内部的 assert! 断言全部为真,证明了由测试框架模拟的调用者地址与预设的 OWNER 地址完全匹配,从而成功验证了你的访问控制机制在授权用户调用时能够正确工作。

总结

恭喜你!通过本篇实操,你已经掌握了 Aptos Move 中最核心的安全原语之一 signer 的用法。我们学习了 signer 代表着用户的链上授权,以及如何通过 signer::address_of 结合 assert! 来实现健壮、可靠的访问控制逻辑。

但本次学习最有价值的收获,是掌握了 #[test(account = @...)] 这个强大的测试属性。它让我们能够轻松地模拟来自特定账户(如合约所有者)的调用,从而对至关重要的安全模块进行严格、全面的验证。

现在,你已经具备了为你的 Move 合约设定清晰权限的能力,为构建更复杂、更安全的多用户应用打下了坚实的基础。

参考

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论