简述下Extension和Dapp身份认证过程。

Dapp获取EOS帐号身份大致流程如下

开始分析流程

参考Scatter获取身份的流程(Scatter 身份获取部分代码),Dapp对于身份的验证规则如下

如果Dapp配置了所需网络的chain Id,则计算返回为("${this.blockchain}:"+"chain:${this.chainId}").toLowerCase()
如果没有配置chain Id,则计算返回 ("${this.blockchain}:"+"${this.host}:${this.port}").toLowerCase()

Dapp匹配身份有两种方式

  • chain id
  • 所需网络的地址和端口。

对于只有所需网络的地址和端口的,先根据地址和端口通过RPC获取对应的chain idgetinfo
然后Extension统一根据chain id查询对应的账户信息中选中的账号信息,以及从对应chain id网络信息中找到选中的网络信息。
然后将账户信息和网络信息创建成一个身份返回给Dapp.

补充

  • 针对于网络信息,所在的chain id,并不可靠,所在的地址有可能会切换链,所以要先有验证的逻辑(根据地址查询chain idgetinfo,判断是否相同)。
  • 针对于账户信息,所存的权限,也不可靠,因为非owner可能被owner修改或者删除掉,所以非owner权限要实现验证逻辑。(通过账户所在chain id,从网络信息中找对应的网络地址,通过getaccount,返回中查看permissions对应权限是否存在,并且公钥是否与私钥生成的公钥一致)