safe钱包的原理和流程
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 账户本身是一个基础的多签名钱包(需要多个所有者签名才能执行交易),而模块则是“插件”,可以扩展其能力。模块与核心合约的逻辑分离,确保核心账户的安全性不受影响,同时提供灵活性。 ...