safe钱包介绍
所谓的safe钱包其实就是一个合约地址,这里合约可以用来和外部的合约或者EOAs进行交互。和EOAs不用的是合约地址并没有一个类似私钥的东西。在safe钱包创建的时候,创建者可以为这个合约钱包设置一个owner列表和一个临界值(threshold)。怎么理解这个临界值呢? 假设我们的owner列表是由3个外部的地址组成的。我们的临界值设置为2。那么只要3个owner中的2个签名了当前的这笔交易,就可以一笔交易成功的执行。 通常情况下我们会把多签的权限分配给不同的外部用户,来分散中心化带来的一些问题。
签名的组成
签名类型有哪些 ?
- ECDSA 签名 这是最常见的签名格式,使用标准的 secp256k1 曲线(和以太坊 EOA 一样),格式如下:
{r (32 bytes)} {s (32 bytes)} {v (1 byte)}
总长度 65 字节(r + s + v),由 Safe 拥有者(EOA 钱包,如 MetaMask)签署,交易消息通过 EIP-712 方式进行哈希,再由私钥签名。
2.合约签名(Contract Signature) 某些合约(如模块或外部签名服务)可以代替 EOA 进行签名。Safe 允许使用 合约签名(合约钱包或外部模块),格式如下:
{签名数据} {签名者地址}
3.EthSign 签名 Safe 也支持 EthSign 类型的签名(类似 eth_sign),这种签名通常会在哈希前面加上 \x19Ethereum Signed Message:\n,以防止重放攻击。其格式仍然是标准的 65 字节签名。其中最后一位byte代表签名的类型。在safe解析签名的时候根据末尾的类型进行解析。
{r (32 bytes)} {s (32 bytes)} {v (1 byte)}
为了能够执行一笔交易,在调用safe钱包执行execTransaction函数的时候需要传递如下的参数:
- to
- value
- data
- operation:call/delegatecall
- safeTxGas
- baseGas
- gasPrice
- gasToken
- refundReceiver
- signatures
其中的signatures参数中包含了所有签名用户的的签名数据。在执行当前交易的时候,合约会循环验证每一条签名数据直到达到阀值。
模块(module)
在 Safe{Wallet} 中,“module”(模块)是指可以附加到 Safe 智能账户的独立智能合约,用于增强或自定义账户的功能。这些模块与 Safe 的核心多签名机制并行工作,允许用户根据需求添加自动化操作、自定义交易逻辑或其他高级功能。 Safe 账户本身是一个基础的多签名钱包(需要多个所有者签名才能执行交易),而模块则是“插件”,可以扩展其能力。模块与核心合约的逻辑分离,确保核心账户的安全性不受影响,同时提供灵活性。
模块的主要功能:
- 自动化交易
- 增强安全性
- 社交恢复
- 复杂操作支持
通过调用 Safe 合约中的 enableModule() 函数添加模块。需要现有所有者达到签名阈值(例如 2/3)来批准启用。启动成功了放入到safe当前维护的模块列表。用户(可以是外部账户或合约)通过调用模块的功能发起请求,块验证请求是否合法(符合其规则),然后调用 Safe 的 execTransactionFromModule() 函数执行交易。
guard
“Guard” 是一个附加到 Safe 智能账户的特殊智能合约,作用是在每次交易执行前后进行检查和干预,以确保交易符合预定义的规则或条件。简单来说,Guard 是 Safe 账户的“交易过滤器”或“安全阀门”,可以阻止不符合条件的操作。 在交易执行前(pre-check)和执行后(post-check)运行逻辑,提供额外的保护层。
与模块的区别:
- 模块:主动发起交易或扩展功能
- Guard: 被动检查交易,不发起交易,只验证或阻止。
通过 Safe 合约的 setGuard(address guard) 函数设置一个 Guard。需要多签所有者的批准(达到签名阈值,例如 2/3)。
Guard 的设计旨在提供额外的安全性和控制,以下是一些常见应用场景:
- 限制交易目标
- 金额限制
- 时间锁
- 条件检查
- 防止未授权操作