会话密钥
会话密钥是什么?
Rooch 的会话密钥(Session Key)是一个方便用户跟链交互的一种临时密钥。
会话密钥有什么用?
当和 Rooch 的应用交互时,每个应用会生成一个会话密钥。它有过期时间,如果长时间没有交互操作,就会失效。
会话密钥的作用是为了简化钱包跟 DApp 的交互过程,第一次交互时生成了会话密钥,后续操作只要会话密钥没有过期,那么 DApp 就不需要再次调用钱包进行签名了。
优势
Rooch 的会话密钥提供以下几个优势:
- 缩短链游交互的签名繁杂步骤,以 2048 小游戏为例,每执行一步都需要发送一次交易上链,用户端会频繁调用钱包来签名,这个过程会相当耗时。有些钱包可能会使用委托代理,即预付一部分 Gas,当执行到预算 Gas 耗尽时,再一次性签名交易上链,这种托管的形式存在资金风险和游戏作弊的情况。使用会话密钥时,只需要开始游戏时签名一次交易,后续的游戏执行中,只要会话密钥没有过期,每进行一步,Rooch 系统都会自动签名交易上链。
- 提供更好的权限管理,对于不同的账户地址,能够使用哪些函数,在第一次签名时就能够确定。
- 用户更友好,为最终用户使用 Web3 提供 Web2 一样的流畅体验。
定义
Rooch 的 Session key 包含了认证密钥、作用范围、创建时间、最后活动时间、最大不活动时间这五个属性,其中认证密钥可看作会话密钥的 ID。
认证密钥是私钥对应的公钥哈希,每次使用私钥签名交易时会自动生成。
struct SessionKey has store,copy,drop {
/// App name
app_name: std::string::String,
/// app website url
app_url: std::string::String,
/// The session key's authentication key, it also is the session key's id
authentication_key: vector<u8>,
/// The session key's scopes
scopes: vector<SessionScope>,
/// The session key's create time, current timestamp in seconds
create_time: u64,
/// The session key's last active time, in seconds
last_active_time: u64,
/// The session key's max inactive time period, in seconds
/// If the session key is not active in this time period, it will be expired
/// If the max_inactive_interval is 0, the session key will never be expired
max_inactive_interval: u64,
}
相关操作
创建会话密钥
会话密钥的创建只需要具备 Signer、认证密钥、作用范围、最大不活动时间。
- 作用范围由地址、模块名、函数名唯一标识。
- 会话密钥无法由其他的会话密钥来创建,只能由 Signer 重新签名才能创建新的会话密钥。
使用 create_session_key_entry
函数可以创建单个会话密钥。
也可以使用 create_session_key_with_multi_scope_entry
创建作用范围更广的会话密钥,此时作用范围中的地址、模块名、函数使用 vector 封装即可。
我们在使用会话密钥时,模块名和函数名可以使用 *
来匹配任意函数,但是要谨慎使用,避免分配过大的权限导致资产的损失。
获取会话密钥
知道账户地址和认证密钥的前提下,我们可以使用 get_seesion_key
这个函数来获取当前账户的会话密钥。
过期时间
会话密钥如果设置的最大活动时间不为零,并且最后使用会话密钥的时间加上设定的最大不活动时间小于当前时间,则表示会话密钥已过期。
会话密钥范围
会话密钥只能在函数调用时起作用,不能使用会话密钥来执行脚本或者发布模块。
每次执行函数调用时,in_session_scope
函数会检查当前会话密钥是否拥有调用当前函数的能力。
更新会话密钥的过期时间
当会话密钥长时间不使用时,就会自动过期,每次使用会话密钥后系统会自动刷新最后活动时间。
参考链接
- Rooch 中关于会话密钥的代码实现 (opens in a new tab)