如何在部署模块后向帐户授予权限?
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:
没有任何关联的守卫是没有意义的。
我在测试网上部署了我的合约,我正在尝试调用 (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:
没有任何关联的守卫是没有意义的。