逻辑模块

四个初始逻辑模块是: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双方签名:

  1. 添加紧急联系人(需要征得同意,所以紧急联系人也要签名);

2. 由client和backup共同发起提案(此类提案通过后,动作立即执行,无延时);

与EOS合约的主要不同点:

  1. 延时交易: 只存储延时的动作哈希(EOS上存储了完整的动作数据)和对应的到期时间,MYKEY后端会monitor到期状态,自动trigger。

  2. 签名raw message 遵循EIP191,签名的raw message拼接方式为:0x1900 + 逻辑合约地址 + 动作数据(包含函数名ID和参数) + nonce。 其中,动作数据的前四个字节是动作ID(Method ID),其后依此是各个参数,我们规定,第一个参数必须是签名者(signer account address),否则验签会失败。 例如,下面是transferEth这个动作的数据,黑色部分是动作ID,红色部分为参数from(签名者),蓝色部分为参数to,绿色部分为参数amount。

    0xd765925d000000000000000000000000996b09ecabdb73219fd3e156985bc98acc552b6900000000000000000000000005f9a32dc3155d95a28fa3934edb843d7e2ef48a00000000000000000000000000000000000000000000000000038d7ea4c68000

  3. nonce的设计: 每一个Logic模块都会维护一个keyNonce map,key/value分别是已通过验签的公钥和nonce。 nonce是当前时间戳(单位是微秒,即1/1000000秒),是一个uint256,调用Logic模块入口函数时以参数的形式传入。 验签时,要求nonce大于keyNonce中存储的旧nonce,且nonce不大于当前时间戳加24小时。 验签通过后,nonce会存入keyNonce,覆盖旧nonce。