钱包 Recovery 机制介绍(下):Recover 合约钱包
来源:    发布时间: 2023-11-02 21:53   97 次浏览   大小:  16px  14px  12px
相比于 EOA 的控制权就是那一把私钥,合约钱包的「控制权」可以非常复杂且多元,因为它是透过智能合约实现。

作者:Nic Lin @imToken Labs

校对:imToken Labs

封面来源:rawpixel.com @freepik

适合读者:一般区块链钱包使用者

先备知识:

  • 了解智能合约
  • 知道 EOA(External Owned Account)及合约帐户的不同

以下将视「帐户」或「钱包」两个词为同义并将交互使用;另外「Contract Account」、「Contract Wallet」也会视为同义,都是指「合约钱包」。

合约钱包的 Recovery 机制

相比于 EOA 的控制权就是那一把私钥,合约钱包的「控制权」可以非常复杂且多元,因为它是透过智能合约实现。举一个基本的合约钱包 Recovery 机制为例,这个合约钱包里有两个角色,分别是 Owner 与 Guardian。当 Alice 建立自己的合约钱包时会指定自己的地址为 Owner,并指定 Bob 的地址为 Guardian。当 Alice 遗失自己的私钥时,她可以请 Bob 去触发她的合约钱包,将 Owner 更新成她的新地址。

可以看到合约钱包的 Recovery 机制并不是真的找回 Owner 原本的私钥,而是找回合约钱包的控制权,确保使用者还能继续使用合约钱包就好。这是因为 EOA 的控制权和其私钥完全绑定,但合约钱包的控制权不需和某一把特定私钥绑定,而是可以任意切换。只要合约里规则定好,控制钱包的私钥都能随时进行更换。

和利用 SSS 的 Recovery 机制比较

利用 SSS 的 Recovery 机制可以参考上一篇的备份部分私钥。以下为了方便比较,会将 SSS 中负责保管 Share 的角色也称为 Guardian。

相同之处:必须要信任 Guardian

使用者必须相信 Guardian 在需要执行 Recovery 的时候会提供帮助、相信 Guardian 不会在未经允许的情况下执行 Recovery 并拿走钱包控制权。在合约钱包中 Guardian 会被授权可以将 Owner 设置为另一个地址,好让 Owner 在遗失私钥时可以透过 Guardian 协助更新 Owner 地址来拿回钱包控制权。但这也表示 Guardian 有权利来将 Owner 设置为任意地址,所以使用者必须相信 Guardian。

注:合约钱包没办法知道 Owner 是否真的遗失私钥,它只能按照它写好的规则执行:如果 Guardian 来执行 Recovery,它就相信 Owner 真的遗失私钥了。

合约钱包没办法识别 Owner 私钥是否真的遗失。Guardian 请求更新 Owner,合约钱包就会执行

相同之处:可以有多个 Guardian

如果使用者不相信单一个 Guardian,他也可以同时设置多个 Guardian。和 SSS 中一样,合约钱包也会设定一个门槛值 t,要有超过 t 个 Guardian 授权才可以执行 Recovery。

相同之处:可以设定 Share 或 Guardian 权重

和 SSS 可以为 Share 指定权重一样,合约钱包也可以让使用者指定每个 Guardian 的权重,例如 Alice 为自己的家人都指定 100 的权重,为自己的好友指定 50 的权重,为工作同事指定 10 的权重。所以如果门槛值 t 设为 100 的话只需要一位家人参与;如果是好友的话就需要两位;如果是好友加上同事的话就需要一位好友加上五位同事。

Guardian 权重及各个可以超过门槛值的 Guardian 组合

不过要注意权重这个设计带来弹性,但相对地在评估安全性会更复杂。例如每次当使用者新增或移除一位 Guardian、调整某位 Guardian 的权重,或调整门槛值 t,他都要评估过一次所有Guardian 彼此的不同组合,看是否会导致原本预期的某些组合从「足够权重可以还原」变成「权重不够还原」,或是从预期「权重不够还原」变成「足够还原」,破坏原本使用者的安全假设。

不同之处:SSS 的 Share 永久有效

前一篇用 SSS 将私钥分片并分配 Share 给不同 Guardian 的方式有一个缺点是:Share 是永久有效的,除非使用者换一把私钥。这表示虽然攻击者黑进了其中一个 Guardian 并拿到一份 Share,虽然还不足以还原出完整私钥,但攻击者可以持续发动攻击去拿到其他份 Share,直到他凑满足够的 Share。但在合约钱包里如果 Owner 怀疑 Guardian 被黑,他可以直接将 Guardian 替换掉,被替换掉的 Guardian 将无法再对该合约钱包起任何效用。

不同之处:合约钱包更多弹性

在 SSS 中,门槛值 t 一旦设定了就没办法改变,除非换一把私钥。但在合约钱包中,使用者可以新增、移除 Guardian,也可以随时改变门槛值 t。另外合约钱包也能加上例如时间锁的机制(下面会介绍)。

可以结合 SSS 和合约钱包 Recovery

合约钱包 Recovery 机制不会规定 Guardian 该怎么设计,只要 Guardian 能够送交易到合约来执行即可,所以使用者可以采用合约钱包 Recovery 机制,而让 Guardian 采用 SSS 来提升 Guardian 的可靠程度。

Guardian 的选择

在 SSS 中将 Share 存在云端或交给亲朋好友保管,并在有需要的时候再取回 Share 来还原私钥。但在合约钱包中,Guardian 不是作为单纯保管 Share 的功用,Guardian 需要是能持有私钥并能实际去链上执行合约钱包的角色。

钱包厂商作为 Guardian

使用者使用钱包厂商提供的合约钱包及钱包软件,其实就隐含着使用者相信钱包商。钱包商如果要作恶,它是可以拿走使用者资产甚至钱包控制权的。而因为这一个不可避免的信任关系,钱包商很适合作为 Guardian:使用者沿用原本对钱包商的信任,就不需再引入对其他第三方的信任需求。

Social Recovery

如果使用者请自己的朋友同学来担任 Guardian,那就属于 Social Recovery。如果使用者觉得要相信钱包厂商作为 Guardian 而感到不放心的话,使用者也可以指定他相信的亲朋好友作为 Guardian。但因为这些亲朋好友不一定是专业的人,不像钱包商那样能保管好自己的私钥、能随时提供服务,而这也是 Social Recovery 的缺点:亲朋好友的服务品质较低且参差不齐。因此如何设计出简单好用但又安全的 Social Recovery 界面与流程,避免机制出错或亲朋好友失误导致无法还原就是 Social Recovery 的主要挑战。

注:如果使用者邀请许多信任度没有那么高的朋友同事来作为 Guardian 的话,有一个能降低这些 Guardian 彼此合谋机会的机制会是一个不错的设计,例如不让其他人从合约钱包就能看出 Guardian 有谁,就能避免 Guardian 彼此互相联系。但这样的功能会有相对应的代价,不过这边碍于篇幅不展开介绍。

遏止 Guardian 作恶的机制

前面有提到不管是哪种 Recovery 机制,都必须要信任 Guardian。使用者可以新增多位 Guardian 并设定较高的门槛值 t,但一样必须要相信这些 Guardian 中不会超过 t 位坏人。这个信任是没办法避免的,要引入第三方的帮忙,就会需要信任第三方,否则就只能靠自己备份。

如果使用者对「完全信任 Guardian」的关系感到不安,他可以在合约钱包的 Recovery 机制中加入一些遏止机制来提升一些保障,例如时间锁。但请记住,这些遏止机制「不能取代对 Guardian 的信任需求」!这些遏止机制只是多了一些机关让使用者在发现 Guardian 作恶时能即时制止对方。

注:这些防范机制只适用于合约钱包的 Recovery 机制,不适用于 SSS Recovery 机制。

时间锁及取消键

时间锁能延长 Recovery 生效的时间。例如 Guardian 来执行 Recovery 将 Owner 地址换掉,但需要两天才能生效。在这两天期间内,Owner 能随时来「取消」Recovery,并把 Guardian 换掉。但如果 Owner 没能在时间锁期间内取消,Recovery 就会生效,Owner 就会被换掉,使用者就失去钱包控制权。

时间锁能多一层保障,让 Recovery 不会马上生效、让使用者有时间反应,但仍然无法免除对 Guardian 的信任需求。

如果 Owner 没有发现,当时间锁结束 Owner 就会被换掉,等于失去合约钱包控制权

总结

  • 合约钱包因为是用智能合约来实现,所以它的控制权可以比 EOA 钱包来得更弹性多元
  • 合约钱包的控制权并不会和单一把私钥绑定,而是可以随时依照合约写好的规则将有控制权的私钥换成另外一把。因此使用者并不需要担心一定要把他的私钥备份好,当他遗失旧的私钥时,只要产生一把新的私钥并透过 Recovery 机制换掉合约钱包里记录的私钥即可
  • 使用者在合约钱包里的角色是 Owner,而合约钱包 Recovery 机制会有另一位角色,称为 Guardian。Guardian 会负责在使用者遗失私钥时,将 Owner 地址更新成使用者新的私钥对应的地址
  • 合约钱包的 Recovery 机制和利用 SSS 的 Recovery 机制相比,有以下相同之处:(1) 都必须信任 Guardian、(2) 可以有多位 Guardian、(3) 可以为 Share/Guardian 设定权重
  • 如果 Guardian 是坏人(或多数是坏人)或被黑,那 Guardian 就能透过 Recovery 机制拿走合约钱包或 EOA 钱包的控制权
  • 权重设计带来弹性,但也要记得每次新增移除 Guardian、调整 Guardian 权重或是调整门槛值 t,都要记得重新评估不同 Guardian 组合,看是否有新的组合从「权重不够还原」变成「足够还原」,或是旧的组合从「权重足够还原」变成「不够还原」
  • 合约钱包的 Recovery 机制和利用 SSS 的 Recovery 机制相比,有以下不同之处:(1) 合约钱包的 Guardian 是可以被移除、注销的,不像 SSS 的 Share 是永久有效的,除非使用者换一把私钥、(2) 合约钱包更多弹性,可以随时调整门槛值 t、可以新增像是时间锁的机制
  • Guardian 可以选择钱包厂商作为 Guardian,优点是其专业程度,以及可以沿用原本对钱包厂商的信任(Guardian 是必须要被信任的);使用者也可以选择找亲朋好友作为 Guardian,但要确保对方能保管好自己的私钥、能随时提供服务
  • 如果对 Guardian 不是太放心,可以加上时间锁的机制,避免 Recovery 马上生效,让使用者有时间反应。但要注意,时间锁并不能移除对 Guardian 的信任。如果 Guardian 是坏人且使用者没有在时间锁结束前取消,钱包控制权依然会被拿走