BaseACL
继承 BaseAuthorizer
进行交易的访问控制时,需要自行对交易的 data
进行 abi.decode
解码。为了方便处理这种情况, Cobo Safe
框架中继承 BaseAuthorizer
实现了 BaseACL
。BaseACL
使用了一些定义同名函数的编码技巧,可以使开发者免除编写繁琐的 ABI 解码代码的烦恼。
大多数访问控制检查都是在交易前进行的,因此 BaseACL
也仅实现了 preExecCheck
方法,在这里可以对合约调用时的目标合约地址、函数、参数进行定制化的访问控制。
下面是基于 BaseACL
实现定制化 Authorizer
的流程:
设置
NAME
,VERSION
等变量。实现
contracts()
函数,该函数应返回Authorizer
所控制的目标合约列表。只有交易的目标地址在这个列表中,Authorizer
检查才会继续进行,否则会直接拒绝。Caller 为本合约的调用者,非交易发起人,错误配置 Caller 将导致权限检查出错。根据 Cobo Argus 当前智能合约架构,Caller 需要设置为 rootAuthorizer。
实现具体的合约访问控制检查函数。
检查函数应与被控制函数定义完全一致,但不应包含返回值,不为
payable
,且应被转化成external view
定义,即函数内部不允许有修改合约状态的操作。检查函数被调用时,其各个参数将与合约调用交易发生时的各个参数值一样,因此可以直接对该参数值进行检查。可直接使用
Solidity
的require()
语句进行检查,如果检查不通过,则Authorizer
会拒绝交易执行。当
Authorizer
需要控制多个目标合约时,在合约控制函数内应使用名为onlyContract
的modifier
来检查交易的合约地址,避免Delegate
调用到其他的合约的同名方法。
如下是继承 BaseACL
实现定制化的 Authorizer
的例子。这个 Authorizer
允许 Delegate
完成 Pancake 协议的 farm 操作,具体权限包括:
允许调用 LP Token 的
approve()
方法,但目标限制为MasterChef
合约。允许调用 MasterChef 合约的
deposit()
方法,且pid
参数限制值为3
允许调用 MasterChef 合约的
withdraw()
方法,且pid
参数限制值为3
Last updated