如何在部署模块后向帐户授予权限?

How do I grant a capability to an account after a module has been deployed?

我在测试网上部署了我的合约,我正在尝试调用 (mint-nft),它没有参数,但它确实有一个 require-capability ACCOUNT_GUARD。我收到如下错误:

Error from (api.testnet.chainweb.com): : Failure: require-capability: not granted: 
(free.slightly-less-shitty-nft-project.ACCOUNT_GUARD "k:ab7cef70e1d91a138b8f65d26d6917ffcb852b84525b7dc2193843e8dfebf799")

ACCOUNT_GUARD 能力定义:(取自 kitty-kad 合同)

(defcap ACCOUNT_GUARD(account:string) ; Used for admin functions
    @doc "Verifies account meets format and belongs to caller"
    (enforce (= "k:" (take 2 account)) "For security, only support k: accounts")
    (enforce-guard   
        (at "guard" (coin.details account))
    )
  ) 

一个简化的mint-nft定义如下:

   (defun mint-nft()
    @doc "Allows any k: address to mint an nft"
    (require-capability (ACCOUNT_GUARD (at "sender" (chain-data))))
      (insert nft-main-table id {
          "id":id,
          "generation":0,
          "owner-address":(at "sender" (chain-data))
       })
  ) 

根据我的理解,ACCOUNT_GUARD 只是检查调用合约的帐户是否是有效的 k: 地址,以及调用它的帐户是否为该帐户的所有者。

在这种情况下,为什么 ACCOUNT_GUARD 不会被授予 (mint-nft) 的调用者?

如何向任何调用 (mint-nft) 的用户授予 ACCOUNT_GUARD 能力?

必须获得才能require-capability成功。有关此内容的讨论,请参阅 https://pact-language.readthedocs.io/en/stable/pact-reference.html#expressing-capabilities-in-code-defcap

能力是通过 with-capability 获取的,这样 with-capability 表达式正文中的代码在范围内具有授予的能力。那时你可以调用 mint-nft,如果那是你所做的“受保护函数”希望用户在顶层调用。

但是,如果 mint-nft 是预期的 top-level 调用,则使用 with-capability 而不是 require-capability,并在正文中包含 insert 调用。 (即使 require-capability 顺便说一句,您的缩进已经看起来像这样了)。

最后,您不应该根据 sender 做任何事情 -- 这只是加油站付款人,在 Kadena 加油站或任何人都可以支付加油费。相反,您应该使用关联的守卫管理用户 table,并在创建用户时验证主体。 k:没有任何关联的守卫是没有意义的。