Hint
对于有些 Authorizer,进行权限检查的逻辑比较复杂,gas 消耗较高。Authorizer 开发者允许用户在交易中添加一些提示性的附加数据来加速检查过程,节约 gas。这些附加数据即为 Hint
。
发起交易时可使用 CallData
结构体中的 hint
字段来传入这个 Hint
。
以 ArgusRootAuthorizer
为例。在 ArgusRootAuthorizer
中,Delegate
可以对应多个 Role
,每个 Role
可以对应多个 Authorizer
,只要其中有一个 Authorizer
检查通过,则整个交易就可以放行。
因此检查此交易时不需要遍历所有 Authorizer
,因为大部分 Authorizer
检查都不能通过,只需要找到最终的可以使检查通过的 Authorizer
即可。因此在这种情况下, Role
和 Authorizer
就可以作为一种 Hint
。
使用 Hint
进行交易的流程如下:
可通过以
eth_call
的形式发起一次未设置hint
的execTransaction()
交易,返回的TransactionResult
的hint
即为本次交易的Hint
。在
CallData
中设置hint
发起交易。在
ArgusRootAuthorizer
解码hint
,得到Role
和Authorizer
。通过
Role Manager
检查hint
中的Role
和交易中的Delegate
是否是匹配的。在
ArgusRootAuthorizer
检查Authorizer
是否注册在这个Role
中。4-5 任意检查失败,说明
hint
是无效的,直接拒绝交易。否则说明hint
是真实的,使用hint
中指定的Authorizer
进行检查,如果通过,则放行交易。
目前 ArgusRootAuthorizer
在不设置 hint
的情况下仍可正常进行检查,只是 gas 消耗更高。
另外对于同时存在 preExecCheck
和 postExecCheck
的 Authorizer
,ArgusRootAuthorizer
默认会传入相同的 hint
。
Last updated