数据存储模块

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. proposeByBoth:client和某一backup共同发起,需要双方签名,此时proposer为client本人;

  2. proposeAsBackup:某一backup单独发起(当client丢失admin key时),此时proposer为backup;