逻辑模块
四个初始逻辑模块是:AccountLogic, DualsigsLogic, TransferLogic, DappLogic。
后续LogicManager合约可以添加逻辑模块,也可以关闭原有的模块,但添加和关闭都有延时,不是立即生效。
逻辑模块都继承自BaseLogic。一些公用的函数(比如验签逻辑)都在BaseLogic中。
Logic模块 | 统一入口 | 包含动作(方法的第一个参数必须是签名者) |
AccountLogic | function enter(bytes calldata data, bytes calldata signature, uint256 nonce) external {} 参数:动作数据,签名账户,签名,nonce | 修改admin key,添加operation key, 批量修改所有operation key,冻结/解冻账户,删除紧急联系人,取消延时动作, 以紧急联系人(backup)的身份发起提案/赞成提案,以当事人(client)的身份取消提案 |
TransferLogic | 发送ETH,ERC20,NFT等代币 | |
DappLogic | 调用其他合约 | |
DualsigsLogic | function enter(bytes calldata data, bytes calldata clientSig, bytes calldata backupSig, uint256 clientNonce, uint256 backupNonce) external {}参数:动作数据,client签名,backup签名,client nonce,backup nonce | 需要双签名的动作,即client和backup双方签名:
2. 由client和backup共同发起提案(此类提案通过后,动作立即执行,无延时); |
与EOS合约的主要不同点:
延时交易: 只存储延时的动作哈希(EOS上存储了完整的动作数据)和对应的到期时间,MYKEY后端会monitor到期状态,自动trigger。
签名raw message 遵循EIP191,签名的raw message拼接方式为:0x1900 + 逻辑合约地址 + 动作数据(包含函数名ID和参数) + nonce。 其中,动作数据的前四个字节是动作ID(Method ID),其后依此是各个参数,我们规定,第一个参数必须是签名者(signer account address),否则验签会失败。 例如,下面是transferEth这个动作的数据,黑色部分是动作ID,红色部分为参数from(签名者),蓝色部分为参数to,绿色部分为参数amount。
0xd765925d000000000000000000000000996b09ecabdb73219fd3e156985bc98acc552b6900000000000000000000000005f9a32dc3155d95a28fa3934edb843d7e2ef48a00000000000000000000000000000000000000000000000000038d7ea4c68000
nonce的设计: 每一个Logic模块都会维护一个keyNonce map,key/value分别是已通过验签的公钥和nonce。 nonce是当前时间戳(单位是微秒,即1/1000000秒),是一个uint256,调用Logic模块入口函数时以参数的形式传入。 验签时,要求nonce大于keyNonce中存储的旧nonce,且nonce不大于当前时间戳加24小时。 验签通过后,nonce会存入keyNonce,覆盖旧nonce。
Last updated