Safe多签智能合约如何生成签名?EOA签名机制解析
Safe合约中基于EIP-1271的EOA签名验证机制解析
EIP-1271的核心是让合约账户通过实现isValidSignature(bytes32 hash, bytes memory signature)方法返回魔术值0x1626ba7e完成签名验证,但Safe作为多签合约需要同时兼容EOA(外部拥有账户)签名,其机制核心是通过签名中的v值区分签名类型,分支处理EOA的ECDSA签名验证与合约账户的EIP-1271验证,具体流程如下:
1. 签名格式的区分规则
Safe对签名的v值做了特殊定义:
- 若
v为27或28:代表这是一个EOA的标准ECDSA签名 - 若
v为0或1:代表这是一个合约账户的EIP-1271签名
2. EOA签名的验证流程
当Safe收到包含EOA签名的多签请求时,会执行以下步骤:
- 从拼接的签名数据中提取当前签名的
r、s、v字段 - 因为
v为27/28,触发EOA验证分支:调用ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s)函数,传入待验证交易的哈希值与签名字段,恢复出对应的EOA地址 - 检查恢复出的地址是否在Safe的授权签名者列表中,且该签名者的权重满足当前交易所需的多签阈值
- 若上述条件满足,则该EOA签名被判定为有效
3. 与EIP-1271的兼容逻辑
对于合约类型的签名者,Safe会触发EIP-1271验证分支:
- 从签名中提取目标合约地址与对应的签名数据
- 调用该合约的
isValidSignature方法,验证签名有效性 - 若返回值为EIP-1271规定的魔术值
0x1626ba7e,则判定该合约签名有效
这种分支处理方式,让Safe既符合EIP-1271的合约签名验证标准,又兼容了普通用户EOA的常规ECDSA签名习惯,无需让EOA额外实现合约逻辑即可作为多签参与者。
内容的提问来源于stack exchange,提问作者Wmm
相关产品推荐
相关产品推荐

