有可能和硬币一起使用(合成能力)吗.传输能力



我的合同包含一个函数,如果满足某些条件,该函数将使用coin.transfer转移资金。它由一种能力保护(我们称之为TRANSFER_WRAPPER(。但是,当用户调用此函数时,他们必须将签名的范围扩展到TRANSFER_WRAPPERcoin.TRANSFER功能。

相反,我希望在TRANSFER_WRAPPER中使用compose功能,这样他们只需要将签名范围限定到包装器。例如:

(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-v4fungible-xchain-v1fungible-v2契约放在同级root目录中来重现错误。

然后,将这个片段的内容粘贴到test.repl文件中,并使用pact 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)

否,您不能组成另一个模块的功能,您的用户必须通过设计明确界定coin.TRANSFER的范围。

这确保了用户对其账户借记的权限永远不会被委托,用户对转账资金拥有明确可见的控制权。

如果这不是真的,就会发生渎职行为。例如,您的包装器功能可能会错误地表示要转移的金额,和/或您的代码可能会转移两次,或转移到不同的帐户,等等。

这也是Pact如何避免EVM合同中出现的危险的有状态授权。使用TRANSFER功能,用户明确允许任何代码执行转账,但仅针对该交易,并且仅针对指示的总金额。因此,它实际上对dapp非常有帮助,因为它避免了遗留授权中的错误。

最新更新