ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Foundry cast safe 命令完全指南:用 CLI 全流程部署与运营 Safe 多签账户

Foundry cast safe 命令完全指南:用 CLI 全流程部署与运营 Safe 多签账户 Foundry cast safe 命令完全指南用 CLI 全流程部署与运营 Safe 多签账户【免费下载链接】foundryFoundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.项目地址: https://gitcode.com/GitHub_Trending/fo/foundrycast safe是 Foundry 的 cast 命令套件中面向 Safe原 Gnosis Safe多签账户的完整操作子命令覆盖 Safe 账户部署、交易服务委托管理、多签提案、签名、签名无关的模拟signature-independent simulation与链上执行全流程。本文以仓库 .changelog/cast-safe-transactions.md 记录的变更内容为骨架结合 crates/cast/src/cmd/safe 下的全部源码实现系统讲解每个子命令的用法、参数含义与底层原理读完即可用 cast 命令行独立完成一个 Safe 多签账户从创建到执行交易的全生命周期管理。一、cast safe 子命令全景cast safe是 cast 下的一级命令组在 crates/cast/src/cmd/safe/mod.rs 中定义为SafeSubcommand枚举共包含 8 个子命令子命令作用实现文件cast safe create部署一个 Safe 账户多签钱包deploy.rscast safe add-delegate为 Safe 所有者注册交易服务委托delegates.rscast safe list-delegates列出 Safe 已注册的委托delegates.rscast safe remove-delegate移除 Safe 所有者的委托delegates.rscast safe propose创建、签名并提交 Safe 交易提案proposal.rscast safe sign为已提案的 Safe 交易签名并提交确认proposal.rscast safe simulate无需所有者签名即可模拟 Safe 交易simulate.rscast safe execute链上执行已确认的 Safe 交易execute.rs此外 mod.rs 还定义了SafeOperation枚举Call 0/DelegateCall 1以及构建 RPC provider 的公共辅助函数rpc_provider。二、cast safe create部署 Safe 账户cast safe create用于部署一个 Safe 多签账户支持指定多个所有者与签名阈值。官方示例见 mod.rs 中的文档注释# 单所有者、阈值 1使用 ledger 签名 cast safe create $OWNER --threshold 1 --rpc-url $RPC --ledger # 三个所有者、阈值 2使用 named account 签名 cast safe create $OWNER_1 $OWNER_2 $OWNER_3 --threshold 2 --rpc-url $RPC --account deployer2.1 核心参数说明根据 deploy.rs 中CreateArgs的定义完整参数如下参数必填默认值说明owners是1 个以上—拥有 Safe 的地址列表位置参数--threshold否全部所有者数量所需签名数必须大于 0 且不超过所有者数量--salt-nonce否链特定的默认 nonceCREATE2 盐值 nonce默认与 Safe Protocol Kit 的链特定 nonce 一致--singleton否规范的 v1.4.1 部署地址Safe singleton 合约地址与--l1互斥--l1否false使用 L1 Safe singleton 而非 SafeL2--factory否SAFE_PROXY_FACTORY_V1_4_1SafeProxyFactory 地址--fallback-handler否COMPATIBILITY_FALLBACK_HANDLER_V1_4_1CompatibilityFallbackHandler 地址传零地址可禁用它--confirmations否1等待的确认数--timeout否配置值部署确认超时秒可通过环境变量ETH_TIMEOUT设置--poll-interval否配置值轮询部署回执的间隔秒可通过环境变量ETH_POLL_INTERVAL设置2.2 底层部署流程从源码看部署流程分为四个步骤deploy.rs校验所有者配置调用validate_owners依次检查所有者列表非空、阈值大于 0 且不超过所有者数量、所有者不能为零地址或哨兵地址SENTINEL_OWNER、不能有重复所有者。选择 singleton 并校验合约存在若未显式指定--singleton则在主网chain_id 1或指定--l1时使用 L1 Safe singleton否则使用 SafeL2。随后通过ensure_contract检查 singleton、factory、fallback handler 地址上确实存在代码否则报错提示通过对应 flag 指定该网络的部署地址。编码并发送部署交易构造ISafe::setup的 initializer calldataowners、threshold、fallbackHandler 等再通过ISafeProxyFactory::createProxyWithNonce编码部署调用并发送。解析 ProxyCreation 事件输出地址从回执日志中过滤出 factory 发出的ProxyCreation事件打印新 Safe 地址。若回执未发出该事件则报错。一个值得注意的细节是默认 salt nonce 的计算default_salt_nonce(chain_id)使用keccak256({PREDETERMINED_SALT_NONCE}{chain_id})计算。该逻辑有专门的单元测试matches_protocol_kit_default_salt_nonce验证其与 Safe Protocol Kit 的一致性测试断言 chain_id 1 的默认 nonce 为0x69b3...a1f6。2.3 交易发送与 Tempo 网络支持部署交易的发送统一由 transaction.rs 中的SafeSendOpts完成。该结构体打包了 RPC、钱包与交易参数其send方法会根据是否 Tempo 网络选择TempoNetwork或Ethereum网络发送。cast safe create与cast safe execute共用这套发送逻辑并做了以下限制当前版本外层交易 value 必须为零不支持 blob 交易与 EIP-7702 授权Tempo sponsorship赞助、Tempo Accounts 会话尚不支持会明确报错提示。这正对应变更日志中提到的Tempo fee-token transaction options在 Tempo 网络上发送时支持其特有的费用代币交易选项。三、委托管理add-delegate / list-delegates / remove-delegateSafe Transaction Service 支持委托delegate机制所有者可以委托其他地址代为提交交易提案而无需转移所有权。三个子命令分别对应注册、查询、移除委托。3.1 添加委托cast safe add-delegate $SAFE $DELEGATE --label my-bot --rpc-url $RPC --account signer参数包括safeSafe 地址、delegate允许提案的地址和必填的--label人类可读标签源码中校验其非空。实现上delegates.rs通过sign_delegate对 EIP-712 类型化数据签名后向 Transaction Service 的v2/delegates/端点发送 POST 请求请求体包含 delegate、label、safe、delegator 与签名。3.2 列出委托cast safe list-delegates $SAFE --rpc-url $RPC实现上通过v2/delegates/?safe...端点 GET 查询并自动处理分页循环跟随next字段且会校验下一页 URL 必须仍指向同一 Transaction Service 端点防止分页跳转到外部地址最终以 JSON 数组打印全部委托。3.3 移除委托cast safe remove-delegate $SAFE $DELEGATE --rpc-url $RPC --account signer对应v2/delegates/{delegate}/的 DELETE 请求同样需要签名授权。3.4 委托签名原理委托相关的签名逻辑在 signing.rs 中签名内容为 EIP-712 类型化数据primaryType为Delegate字段为delegateAddress与totp域名为Safe Transaction Serviceversion 1.0chainId 为当前链。totp是时间窗口 TOTPnow / 3600即按小时取整起到防重放的时间约束作用。Trezor 钱包走safe_eth_sign路径对 EIP-712 哈希做 eth_sign其他钱包直接sign_dynamic_typed_data。四、提案与签名propose / sign4.1 创建并提交提案cast safe propose会在签名后向 Transaction Service 提交一条待确认的多签交易cast safe propose $SAFE $TO transfer(address,uint256) $RECIPIENT $AMOUNT --rpc-url $RPC --account owner1参数说明proposal.rs 中ProposeArgs参数说明safe/toSafe 地址与交易目标地址位置参数sig/args函数签名与参数不提供时 calldata 为空--data原始 calldata与sig/args互斥clap 强制冲突--valueSafe 转出的原生代币数量默认 0支持以太单位解析--operationcall默认或delegatecall--safe-tx-gas/--base-gas/--gas-priceSafe 交易 gas 相关字段默认 0--gas-token/--refund-receivergas 偿还代币与收款地址默认零地址--nonce交易 nonce默认取 Transaction Service 下一个排队 nonce--originSafe 客户端展示的可选来源信息nonce 的默认获取逻辑值得说明先从链上读取 Safe 的当前 nonce再调用next_nonce查询 Transaction Service 的v1/safes/{safe}/multisig-transactions/?executedfalseordering-noncelimit1取两者较大者服务端 nonce 加一。这保证了排队中的交易不会与链上 nonce 冲突。4.2 为提案签名确认cast safe sign $SAFE $SAFE_TX_HASH --rpc-url $RPC --account owner2cast safe sign先从 Transaction Servicev1/multisig-transactions/{safe_tx_hash}/拉取交易详情然后做哈希校验verify_hash会确认服务端返回的 Safe 地址与命令行一致、operation 合法并通过链上getTransactionHash重算交易哈希确保与服务端返回的safeTxHash一致防止服务端数据被篡改。校验通过后打印交易摘要Safe、To、Value、Operation、Nonce、Data 等字段对哈希签名再 POST 到v1/multisig-transactions/{hash}/confirmations/提交确认。五、签名无关的模拟cast safe simulatecast safe simulate是变更日志中强调的signature-independent simulation——不需要任何所有者签名即可验证一条 Safe 交易能否成功执行cast safe simulate $SAFE $SAFE_TX_HASH --from $EXECUTOR --rpc-url $RPC5.1 原理与限制模拟基于 Safe 的simulateAndRevert与SimulateTxAccessor合约实现simulate.rs从 Transaction Service 拉取交易并校验哈希拒绝报销型交易若gasPrice 0则报错因为SimulateTxAccessor不强制执行safeTxGas源码注释明确说明该限制检查 SimulateTxAccessor 合约存在默认SIMULATE_TX_ACCESSOR_V1_4_1可用--accessor覆盖构造simulateAndRevert(targetContract, calldataPayload)调用其中 calldata 是 accessor 的simulate(to, value, data, operation)期望该调用必然 revert从 revert data 中解码(gasUsed, success, returnData)三元组若内部模拟失败success false报错并输出消耗的 gas 与返回数据成功则以 JSON 输出safeTxHash、success、gasUsed、returnData。--from参数指定模拟的tx.origin可通过环境变量ETH_FROM设置。该模拟不校验Safe nonce、所有者签名、阈值或 guard 钩子只关心内部 CALL/DELEGATECALL 在 Safe 上下文中能否成功适合提案执行前的快速预检。六、链上执行cast safe executecast safe execute $SAFE $SAFE_TX_HASH --rpc-url $RPC --account executorcast safe execute将已收集足够确认的交易真正上链execute.rs执行前做如下检查交易未被执行过服务端标记is_executed为 false 且无transaction_hash重算哈希与服务端一致交易 nonce 必须等于链上当前 nonce否则拒绝执行防止跳过排队交易。随后从服务端拉取全部确认签名调用packed_signatures组装成 Safe 要求的签名打包格式构造execTransaction调用并发送。签名打包逻辑在 service.rs 中支持三类签名EOA 签名v 27固定 65 字节按所有者地址升序排列静态段合约签名v 0携带动态数据需校验长度字段与偏移量偏移必须等于 65P-256 签名v 2固定 65 128 字节同样校验偏移明确拒绝approved-hashv 1签名类型。执行后从回执日志中查找 Safe 发出的ExecutionSuccess/ExecutionFailure事件取最后一个匹配safeTxHash的事件若内部交易失败则报错。该逻辑同样有单元测试uses_last_matching_safe_execution_event覆盖。七、Safe Transaction Service 自动发现所有需要与 Safe Transaction Service 交互的子命令都依赖 service.rs 中的SafeServiceOpts参数环境变量说明--service-urlSAFE_TRANSACTION_SERVICE_URLTransaction Service URL省略时根据 RPC 链 ID 推断/api后缀可写可不写源码会自动补齐--api-keySAFE_API_KEYTransaction Service API key通过 Bearer 认证发送当省略--service-url时default_service_url会基于 chain_id 映射出官方服务地址https://api.safe.global/tx-service/{short_name}内置映射覆盖了以太坊eth、Arbitrumarb1、Basebase、Optimismoeth、Polygonpol、BNBbnb、Gnosisgno、zkSynczksync、Linealinea、Scrollscr、Mantlemantle、Avalancheavax、Celocelo、Sepoliasep、**Tempochain 4217short name tempo与 Tempo-Moderatochain 42431**等 30 余条链。未内置的链 ID 会提示no known Safe Transaction Service for chain ID X; pass --service-url。值得注意的是list-delegates在显式提供--service-url时无需 RPC 连接chain_id 传 0因为服务端点已确定其余命令仍需 RPC。该模块对 URL 规范化、非空/数字字符串反序列化、分页防循环等均有单元测试覆盖见 service.rs。八、从一个提案到执行的完整工作流综合以上各节一个典型的多签交易生命周期如下# 1. 部署 Safe多所有者、阈值 2 cast safe create $OWNER_1 $OWNER_2 $OWNER_3 --threshold 2 --rpc-url $RPC --account deployer # 2. 可选注册委托便于自动化工具代为提案 cast safe add-delegate $SAFE $BOT_ADDR --label ops-bot --rpc-url $RPC --account $OWNER_1 # 3. 所有者 1 创建并签名提案 cast safe propose $SAFE $TO transfer(address,uint256) $RECIPIENT $AMOUNT --rpc-url $RPC --account $OWNER_1 # 4. 执行前无签名模拟预检任意执行者视角 cast safe simulate $SAFE $SAFE_TX_HASH --from $EXECUTOR --rpc-url $RPC # 5. 所有者 2 确认签名 cast safe sign $SAFE $SAFE_TX_HASH --rpc-url $RPC --account $OWNER_2 # 6. 达到阈值后链上执行 cast safe execute $SAFE $SAFE_TX_HASH --rpc-url $RPC --account $OWNER_1整个流程在 crates/cast/src/cmd/safe 目录下闭环实现部署与执行走 transaction.rs 的统一发送通道提案/签名/模拟/执行共享 service.rs 的 Transaction Service 客户端与哈希校验逻辑所有链上接口定义集中在 contracts.rs。如果需要在自动化脚本中集成 Safe 多签管理cast safe是除 Safe CLI / Web 界面之外的轻量命令行替代方案且与 Foundry 现有的--account、--ledger等钱包体系无缝衔接。【免费下载链接】foundryFoundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.项目地址: https://gitcode.com/GitHub_Trending/fo/foundry创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表