aelf虚拟地址和合约权限控制

虚拟地址

aelf系统中,地址分为三类:

  • 用户地址:生成过程为私钥 -> 公钥 -> 地址,也就是用户地址背后是有私钥的

  • 合约地址:生成过程见Genesis合约 文档中合约地址计算部分。

  • 虚拟地址:aelf合约可以通过一个哈希值捏造出一个地址,并使用该地址发送Inline交易。

由于虚拟地址的应用场景是Inline交易,因此这个交易无需校验签名。而且由于虚拟地址背后没有私钥,Inline交易的发送逻辑又是硬编码在合约中的,因此用作权限控制会更为安全。

权限控制

权限控制涉及一个AuthorityInfo数据结构(比较有排面,有一个专属的proto文件authority_info.proto):

message AuthorityInfo {
    // The contract address of the controller.
    aelf.Address contract_address = 1;
    // The address of the owner of the contract.
    aelf.Address owner_address = 2;
}
  • contract_address:生成这个虚拟地址的合约的地址(就是三类地址中的合约地址);

  • owner_address:合约借助一个哈希值生成的虚拟地址。

有这两个信息的话,就能够完成定位:Inline交易可以从哪个合约的哪些代码中发出来(观察Context.SendVirtualInline调用就好了)。如果定位到的位置满足权限检查的要求,那就可以通过判断Context.Sender == AuthorityInfo.OwnerAddress完成权限检查。(其实理论上讲,owner_address这一个字段就足够了,因为不同合约很难生成同样的虚拟地址。)

Last updated