Move所有权(Ownership),能力(Capability)指南

Overmind
Overmind_xyz
Published in
5 min readJul 5, 2023

翻译者: @mononok31

在处理数字资产时,所有权是安全和治理的核心。Solidity 的所有权之旅始于在代码中必要时检查 msg.sender,然后在2018年正式标准化为 EIP-173,随后演变为 Roles.sol、Whitelist.sol 和一系列用于日益复杂的用例的自定义访问控制合约。相比之下,所有权的概念更多地嵌入了 Move 本身的编程语言中。Move 本地实现了类型能力(Type Abilities),并使用能力(Capabilities)作为安全模型。最常用的是 account.move 中的签名能力(SignerCapability),然后是 coin.move 的铸造、销毁 (Mint/Burn) 能力。毫无疑问,Move 也将会经历自己的所有权漫游之行。

回顾这个系列文章中的第一部分,NFTango.move 创建了一个 NFTangoStore 资源resource)来存储游戏状态,并在同一合约中包含游戏逻辑。而 NFTangoManager.sol 创建了一个 NFTango.sol 合约contract)来存储游戏状态,并将游戏逻辑放在其中。

如果我们比较 NFTangoStore 资源结构的所有权,我们可以看到,在 Move 中,游戏创建者拥有游戏状态(即 NFTangoStore 资源),而在 Solidity 中,管理者(Manager)合约必须维护一个额外的全局映射,用以将游戏创建者地址与游戏个例关联起来。同样,如果我们比较被押注的 NFT 的所有权,Move 有一个单独的资源账户来托管 NFT,而 Solidity 简单地将所有 NFT 都托管在一个中央的管理者( Manager) 合约中。

能力(Capabilities)与 批准(Approvals)

尽管要做到NFTango.sol 拥有 NFT而逻辑则由 Manager 控制并非不可能,但这需要调用大量的批准,因此需要多次检查授权。即使将 NFT 保存在 管理者(Manager) 合约中,仍需要玩家和对手的批准将其 NFT 转移到合约本身。Move 在account.move 中有个巧妙的概念叫作签名能力(Signer Capability)。它允许资源存储能力,以代表资源账户签署交易。这种将权力从合约账户转移到资源账户的操作再次展示 Solidity是围绕合约(给予批准)而 Move 围绕资源运转(控制账户的签名能力)的另一个例子。

能力可以被看作是资源的一部分,基本上是 Move 中安全模型的实现。其本地实现意味着不需要像 Ownable.sol 或 Roles.sol 这样的额外合约来进行访问控制。

更深入地挖掘,能力在 Move 中被广泛使用。请看 coin.move 中的 铸造能力(MintCapability) 和 销毁能力(BurnCapability) — — 这些通常通过 Roles 检查在 Solidity 中以ERC20 扩展的方式实现,只需查看 OpenZeppelin 的 ERC20Mintable 合约中与 Minter Role 相关的所有函数即可。在 Move 中,开发人员可以将自定义的能力设为模块,并严格控制其分发和安全性。可以查看仍属于实验阶段的的 Capability.move 模块,该模块具备某些协议来限制能力的有效性至一个交易。对于那些关注我们的编程任务的人,请留意基于能力的任务!

Move 的类型能力和安全性

在 Move 中,我们将 NFTangoStore 资源轻松地移动到游戏创建者的地址,并且任何人都可以通过提供创建者的地址在全局存储中使用 borrow_global 调用检查它。在 Solidity 中,拥有合约是一件严肃的事情,根据 Ownable.sol,因为我们可以通过成为所有者(owner)来轻易地控制合约中的某些函数。然而,Move 通过类型能力是具有隐式的资源安全性。

一共有四种能力 — — 存储(Store)、钥匙(Key)、复制(Copy)、删除(Drop)。尽管可以轻松查阅 Move 书中每种能力的作用,但还是很难判断执行时为资源提供了什么安全性。以 NFTangoStore 为例 — — 它只有“钥匙”资源。缺少复制、删除和存储意味着什么?

复制(Copy)允许将 NFTangoStore 值在内存中复制到多个位置。我们不希望出现这种行为,因为不应该出现可以复制有玩家和 NFT 的游戏的情况。更具体地说,每个人都可以引用或指向相同的 NFTango 资源,但一旦尝试取消引用或读取存储在 Store 中的值,这些值将移动到新指针而不是被复制。

删除(Drop)同样允许物体被销毁。在这个游戏中,我们不会在游戏结束后销毁任何游戏个例,而只是将其标记为已认领。这样,我们有一个游戏的存档,可能是为了以后进行审计。没有删除,游戏个例一旦创建则不会被意外的覆盖。

存储(store)允许将资源存储到全局存储中。有时,物体不应长期存储。例如,某些能力可能仅在一个交易的生命周期内是必要的,不应移动到任何地方,因此不需要存储。然而,如果我们查看account.move 中的签名能力( SignerCapability),它确实具有存储功能,允许我们在 NFTangoStore 资源中存储对资源账户的引用。提示,拥有钥匙(key)意味着拥有存储。所以从技术上来说,我们的 NFTangoStore 结构具有钥匙和存储能力。这能从贯彻在模块中大量的 borrow_global 和 move_to 调用可见。

结论

总之,资源在移动时受到能力的保护。安全性围绕于移动资源意味着对所有权的关注减少了,但是本地内置的能力在访问控制方面更容易使用 — — 通常在 gas 单位方面更便宜。

--

--

Overmind
Overmind_xyz

The first web3 solve-to-earn platform where developers compete on coding puzzles to earn prizes and on-chain credentials. Live on #Aptos.