COMPAX

群组钱包

一个群体共同持有的钱
不需要司库

一个没有主人的钱包。每位成员把自己的密钥留在自己的设备上,签名的人够了,钱才动——三个里任意两个、九个里任意五个,取决于建钱包时群体自己定的规矩。

下面没有一样是我们自己发明的。每条链本来就有让多个人共同持有一个地址的办法,这里用的就是那个办法:比特币上的 P2WSH,EVM 链上的 Safe,波场上账户自带的 permission 体系,Solana 上的 Squads V4。后面几页里的地址,就是这个应用实际对接的部署。

它怎么运作

四步,而且只有
最后一步在链上

一笔付款在成为交易之前,先是一场对话。这不是比喻:它就发生在会话里,以消息的形式,而链只有在群体已经达成一致之后才看得见它。

  1. 1

    群体把规矩定下来

    谁签名,需要几个人签。这在钱包被创建的那一刻就写进钱包,而且写在链上,不在这个应用里。

    规矩在这里事后不做修改:换一条规矩就是换一个钱包,有它自己的地址,需要重新充值、重新搬过去。有些链是允许改的,而这个应用不做这件事——界面会在请求第二次点击之前把这件事说清楚。

  2. 2

    有人提出一笔付款

    它以一条消息的形式出现在会话里,来自提出它的那个人,写明付什么、付给谁。在被签名之前,它只是一个请求,仅此而已。

    提案由聊天所用的同一个加密群组承载,所以服务器只是搬运它,读不到它。

  3. 3

    每个签名人在自己的设备上签名

    读一遍,点一下,就用一把从未离开过它诞生的那部手机的密钥完成了签名。计数往前走,所有人都看得见。

    没有任何一台设备持有第二个人的密钥,所以不存在哪一台设备丢了就把钱包交到别人手上。

  4. 4

    到了门槛就上链

    签名被组装起来并广播出去。从那一刻起,执行规矩的是链,不是这个应用——把规矩放到链上,为的正是这一点。

    就算这个应用明天消失,钱包依然是钱包,规矩依然成立。

五条链

统一的界面

五条链,底下是四套不同的机器:比特币、以太坊、BNB Smart Chain、波场和 Solana 各自用自己的方式让多个人共管一个地址。这些差别都不会到屏幕上:发起一笔付款、签名、把它发出去,在五条链上都是一样的。

Bitcoin

P2WSH multisig · BIP 67 · PSBT

一段读作「这 n 把密钥里的 m 把」的见证脚本,以及一个由它的哈希得来的地址。密钥按字典序排列,这样任何人用同一组密钥构造脚本,得到的都是同一个地址,而不是 n! 个不同的地址。

付款以 PSBT 的形式流转:一个文件在签名人之间走一圈收集签名,够了就最终确定。

脚本
OP_m <key>… OP_n OP_CHECKMULTISIG
签名人
最多 15 个,门槛可以落在其中任意位置
链上数据
一台 Electrum 服务器

Ethereum

Safe · canonical deployment

以太坊上群体持有的钱,大部分本来就躺在这个合约里。代理由规范工厂创建,指向规范单例;所有者和门槛在创建它的同一次调用中设定。

没有分叉,也没有重新部署。版本是从合约上读出来的,而不是假定的——因为别人创建的 Safe,也是这里能打开的 Safe。

单例
0x41675C099F32341bf84BFc5382aF534df5C7461a
工厂
0x4e1DCf7AD4e460CfD30791CCC4F9c8a4f820ec67
批量
MultiSend —— 多笔转移,一次批准

BNB Smart Chain

Safe · the same addresses

同样的合约,同样的地址。Safe 的部署在各条 EVM 链上是确定性的,所以这里没有什么跟链相关的东西要学,代码里也没有跟链相关的东西。

这也是为什么以太坊上的一个账户,在 BNB Smart Chain 上就是同一个账户:一种币种,一把密钥,两条链。

合约
与上面以太坊的完全相同
币种
60 —— 与以太坊共用

Tron

Account permissions · no contract

波场把规矩直接内建在账户里。一个 permission 携带一份密钥清单、每把密钥的权重和一个门槛,写进账户本身——没有合约要部署,也没有合约需要去信任。

有了权重,规矩就可以不只是数人头:一把密钥算两票,三把密钥各算一票。

由谁写入
AccountPermissionUpdate
规矩
带权重的密钥,一个门槛
注意
更新是替换整份清单,而不是在上面修改

Solana

Squads Protocol V4

Solana 上大多数金库使用的多签程序。提案本身是链上的一个账户:成员对着它投赞成,赞成票达到门槛时它就执行。

程序 id 决定了钱包的每一个账户从哪里派生,所以它被钉死在已公布的部署上;换成别的会被拒绝,而不是被当真。

程序
SQDS4ep65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf
提案
在链上,对着它投赞成

为什么用标准的

只能在这里打开的钱包
是别人的钱包

有一条更省事的路:在每条链上放一个我们自己的合约,用我们自己的格式,配一个看得懂它的应用。代码会更少,结果会更糟——因为那样一来,群体的钱就取决于这个应用是否继续存在。

用标准的换来了什么

下面每一条都是这个选择带来的结果,而不是后来加上去的功能。

  • 审计它的人比我们多。Safe 和 Squads 加起来持有数十亿,被审视的程度也相应地重。P2WSH 和波场的 permissions 本身就是共识规则。
  • 别的工具也读得懂。这个地址就是一个普通的 Safe、一个普通的 Squads 多签、一个普通的 P2WSH 地址、一个普通的波场 permission——区块浏览器和这些协议自己的界面都读得了它们,根本不需要知道这个应用存在。
  • 没有什么需要迁移。不存在一个会把你困住的私有格式,所以也不存在日后离开要付出代价的那一刻。
  • 规矩比我们活得久。门槛是链在执行。这个应用是群体讨论这笔付款的地方,而不是批准它的东西。

AUDITS

Read by people
who are not us

This is the argument for using each chain’s own multisig rather than writing one: the reports below exist, they were paid for by somebody else, and they are about exactly the contracts a wallet made here is made of. Every address and every program id on this page was checked against the projects’ own published deployment records while this section was written.

Tron

Account permissions · consensus, not a contract

none

The same again: the rule is a property of the account, enforced by the nodes rather than by code somebody deployed. There is no contract to audit because there is no contract.

  • Nothing to link, and that is the honest answer

An audit is a reading of a codebase at a commit, not a guarantee about the money in it — and none of these reports is about this application. They are about the contracts underneath it, which is exactly why they are worth more than a report we commissioned about ourselves would be.

如果你带着助记词来

你已经在别处用过的
二十四个词

助记词遵循的不是一套约定,而是好几套,而它们的分歧恰恰在同一件事上:当你要「账户 2」时,路径中哪一个元素往前挪。每一套都是对的,而按错的那一套去读一组助记词,会为一笔只差一行算术的钱显示零余额。所以这里不去猜约定——它是一项设置,每条链各有一项,而且它给出的是一份应用清单,不是一份规范清单。看起来不见了的钱,是躺在这个应用没有去看的那条路径上的钱。

Bitcoin

Native SegWit 默认

m/84'/0'/{account}'/0/0

  • Electrum
  • BlueWallet
  • Sparrow
  • Exodus

地址索引

m/84'/0'/0'/0/{account}

  • Trust Wallet
  • Muun
  • Phoenix

Ethereum &amp; BNB Smart Chain

地址索引 默认

m/44'/60'/0'/0/{account}

  • MetaMask
  • Rabby
  • Trust Wallet
  • Rainbow
  • Phantom

强化账户

m/44'/60'/{account}'/0/0

  • Ledger Live
  • Trezor Suite
  • Exodus

四个元素

m/44'/60'/0'/{account}

  • MyEtherWallet (legacy)
  • Ledger (legacy)

Tron

地址索引 默认

m/44'/195'/0'/0/{account}

  • TronLink
  • Trust Wallet

强化账户

m/44'/195'/{account}'/0/0

  • Ledger Live
  • Trezor Suite

Solana

四个元素 默认

m/44'/501'/{account}'/0'

  • Phantom
  • Solflare
  • Backpack

仅账户

m/44'/501'/{account}'

  • Ledger Live
  • Solflare (hardware)

传统

m/501'/{account}'/0/0

  • Sollet (legacy)

比特币的传统布局和嵌套布局是故意不提供的。地址构造器只派生 native SegWit,别的都不派生,所以在这里写 m/44'/0'/… 会得到一个 bc1…,而别的每一个钱包在那条路径上显示的是 1… 或 3…——一个看着没问题、确实属于你的助记词、却不是任何其他人在那条路径上读到的地址的字符串。一个悄悄表示了别的意思的选项,比没有这个选项更糟。

如果你带着钱包来

如果你从别处过来

两条进来的路,进度不一样

直说,因为一个用同样的口气描述「打算做的」和「已经做好的」的页面,是一个你没法拿来做决定的页面。

  • 你的助记词——现在就可以。二十四个词,外加一个问题:你是在哪个钱包里用过它们的。上面表格描述的每一个地址,都是在你的设备上从助记词派生出来的,哪里都不保存;一个 EVM 账户、一个波场账户和一个 Solana 账户,在各自链的所有网络上都是同一个地址。
  • 已经存在的多签——还不行。读取这一半已经做完了:底下的库可以按地址打开一个 Safe,报出它的所有者、门槛和版本;能读出一个 Squads 多签的成员和门槛、一个波场 permission 的签名人和权重,也能把一段比特币见证脚本反解回地址、门槛和密钥。没做的是那个带你走完流程、并把它挂到一场对话上的界面。在它做好之前,这一页不会装作它已经有了。

在那之前也没什么拦着你:你已经有的 Safe 或 Squads 多签,在你创建它的那个界面里照常运作,因为它本来就从来不是别的东西,就是一个 Safe 或一个 Squads 多签。

本网站的任何内容均不构成财务建议:示例只是示例,钱 — 和风险 — 都是你自己的。 免责声明.