数据存储模块
AccountStorage合约中有4个多层mapping,用来存储数据。
数据
定义
含义
备注
一组公钥
mapping (address => mapping(uint256 => KeyItem)) keyData;
struct KeyItem { address pubKey; uint256 status; }
MYKEY账户地址=>序号index=>公钥结构体(包含公钥和状态)
第0位是admin key,第1位往后是operation key。
默认状态为0;状态为1是冻结状态。
紧急联系人
mapping (address => mapping(uint256 => BackupAccount)) backupData;
struct BackupAccount { address backup; uint256 effectiveDate; uint256 expiryDate; }
MYKEY账户地址=>序号index=>紧急联系人结构体(包含紧急联系人账户地址,生效时间,失效时间)
index为0~5,最多6个紧急联系人。
添加紧急联系人(addBackup)和删除紧急联系人(removeBackup)都有21天的延时,因此
addBackup操作会设置生效时间;
removeBackup操作会设置失效时间;
延时动作
mapping (address => mapping(bytes4 => DelayItem)) delayData;
struct DelayItem { bytes32 hash; uint256 dueTime; }
MYKEY账户地址=>动作ID=>延时结构体(包含动作哈希,到期时间)
动作ID是动作方法的唯一标志,与动作方法一一对应,长度4字节。
如bytes4(keccak256("changeAdminKey(address,address)"))
多签提案
mapping (address => mapping(address => mapping(bytes4 => Proposal))) proposalData;
struct Proposal { bytes32 hash; address[] approval; }
client:多签提案当事人;
backup:当事人的紧急联系人;
proposer:多签提案发起人;
client账户地址=>proposer账户地址=>动作ID=>提案结构体(包含动作哈希,已赞成的紧急联系人的数组)
动作哈希是提案通过后将要调用的函数及其参数的哈希,如keccak256(abi.encodePacked('changeAdminKey', account, pkNew))。
提案分两种:
  1. 1.
    proposeByBoth:client和某一backup共同发起,需要双方签名,此时proposer为client本人;
  2. 2.
    proposeAsBackup:某一backup单独发起(当client丢失admin key时),此时proposer为backup;
Copy link