能否用compose-capability组合coin.TRANSFER能力?执行遇错求助
问题描述
我编写的合约包含一个函数,满足特定条件时会通过coin.transfer转移资金,该函数受名为TRANSFER_WRAPPER的能力保护。但当前用户调用此函数时,必须同时为TRANSFER_WRAPPER和coin.TRANSFER两个能力签名。
我希望在TRANSFER_WRAPPER中使用compose-capability,让用户只需为wrapper签名即可。我写了如下示例代码:
(module test "sender-keyset" (defcap TRANSFER_WRAPPER (receiver:string amount:decimal) (compose-capability (coin.TRANSFER "sender" receiver amount)) ) (defun transfer-wrapper (receiver:string amount:decimal) (with-capability (TRANSFER_WRAPPER receiver amount) (coin.transfer "sender" receiver amount) ) ) )
但运行这段代码时,触发了coin-v4合约的意外错误:
./root/coin-v4.pact:50:4: Enforce non-upgradeability at ./root/coin-v4.pact:50:4: (enforce false "Enforce non-upgradeability") at ./root/coin-v4.pact:49:2: (GOVERNANCE) at ./test.pact:3:4: (compose-capability (coin.TRANSFER "sender" "receiver" 20.0)) at ./test.pact:7:21: (TRANSFER_WRAPPER "sender" "receiver" 20.0) at ./test.pact:7:4: (with-capability (test.TRANSFER_WRAPPER "sender" "receiver" 20.0) [(coin.transfer "sender" "receiver" 20.0)])
复现步骤
- 将上述Pact代码保存为
test.pact文件 - 将
coin-v4、fungible-xchain-v1、fungible-v2合约放入同级的root目录 - 创建
test.repl文件并粘贴以下内容:
(env-data { "sender-keyset": { "keys": [ "sender-key" ], "pred": "keys-all" } }) (env-sigs [{ "key": "sender-key", "caps": [] }]) (begin-tx) ; The test depends on the 'coin-v4' contract, which in turn depends on these. (load "./root/fungible-v2.pact") (load "./root/fungible-xchain-v1.pact") (load "./root/coin-v4.pact") (define-keyset "sender-keyset" (read-keyset "sender-keyset")) (load "./test.pact") (commit-tx) (env-sigs [{ "key": "sender-key", "caps": [(test.TRANSFER_WRAPPER "sender" "receiver" 100.0)] }]) (test.transfer-wrapper "sender" "receiver" 20.0)
- 执行命令
pact test.repl即可复现错误
内容的提问来源于stack exchange,提问作者trh
相关产品推荐
相关产品推荐

