Keyless 钱包
私钥分片恢复和刷新原理介绍
Keyless 钱包核心使用 MPC 协议中的分布式私钥分片恢复协议实现,此部分首先介绍 Keyshare 的结构,然后介绍私钥分片恢复协议和刷新协议对私钥分片结构的影响,为理解如何使用 Safeheron MPC Node 套件构建 Keyless 钱包打下理论基础。
私钥分片 Keyshare 的结构
一个私钥分片不是简单的一个密钥,而是包含了多个密钥、其他参与方私钥分片公钥及一些公开信息的数据集合。这里我们重点关注私钥分片中的密钥组成,了解完私钥分片中的密钥结构后,我们再来看私钥分片恢复协议和刷新协议对私钥分片结构的影响。

一个私钥分片的密钥可以分为两类:
(1)和实际单私钥相关的密钥,即和资产控制权相关的密钥,我们称之为资产密钥(Asset Secret),包含密钥 x 。
(2)多个参与方之间执行 MPC 协议需要的密钥,我们称之为协议密钥(Protocol Secrets),如其中包含了 Paillier 密钥等。
一个私钥分片中如果丢失了 Protocol Secrets 或者和其他参与方的 Protocol Secrets 不配套,将不能正常执行 MPC 协议;但是如果 Asset Secret 存在,我们依然可以使用满足门限个数的 Asset Secret 恢复单私钥。
分布式私钥生成协议

分布式私钥生成协议生成一组 KeyId 为 1 的私钥分片 A、B、C,每个私钥分片有各自的 Asset Secret 和 Protocol Secrets。
私钥分片恢复单私钥
恢复单私钥需要 A、B、C 中任意两个私钥分片的 Asset Secret,比如使用私钥分片 B 和私钥分片 C 恢复单私钥,原理上只需要使用 x2、x3 再加上 chaincode 和 BIP44 路径即可恢复单私钥。
私钥分片恢复协议

通过 KeyId 1 中的私钥分片 A 和 C,使用私钥分片恢复协议得到新的一组私钥分片A’、B’、C’,这一组私钥分片中,A’ 中的 Asset Secret 和 A 中一致,没有变化,B’ 和 C’ 同理。A’、B’、C’ 三个私钥分片中只有 Protocol Secrets 发生了变化。
由于 B’ 和 B 的 Asset Secret 没有发生变化,因此使用私钥分片 B’ 和私钥分片 C 也可恢复单私钥。
由于 A’、B’、C’ 三个私钥分片中只有 Protocol Secrets 发生了变化,因此无法使用 A 和 B’ 执行 MPC 签名协议。
私钥分片刷新协议

通过 KeyId 1 中的私钥分片 A 和 C,使用私钥分片刷新协议得到新的一组私钥分片A*、B*、C*,这一组私钥分片中,A* 中的 Asset Secret 和 A 中发生了变化,B* 和 C* 同理。A*、B*、C* 三个私钥分片中 Protocol Secrets 也发生了变化。因此无法使用私钥分片 B* 和私钥分片 C 恢复单私钥,必须使用同一组 KeyId 中的私钥分片恢复单私钥;也无法使用 A 和 B* 执行 MPC 签名协议,必须使用相同组的私钥分片执行 MPC 协议。
Keyless 钱包场景和核心思路
此部分以一个实际案例介绍如何基于 Safeheron MPC Node 套件构建一个面向 C 端用户的 Keyless 钱包,门限为 2/3,其中开发者服务器持有一个私钥分片 A,开发者的浏览器应用/手机应用中持有两个私钥分片 B 和 C。

(1)在用户创建钱包时,使用浏览器应用/手机应用和开发者的服务端进行分布式私钥生成,得到 KeyId 1 一组私钥分片,其中服务端生成私钥分片 A,浏览器应用/手机应用生成私钥分片 B 和 C。
(2)在用户使用钱包发送交易时,使用 KeyId 1 浏览器应用/手机应用中的私钥分片 B 和开发者服务端的私钥分片 A 进行分布式签名。
(3)开发者只帮助客户保管了私钥分片 A,私钥分片 B 和 C 由用户自行保管。为了实现 Keyless 效果,我们将用户生成的私钥分片 C 定义为备份私钥分片,开发者在自己的应用中实现将私钥分片 C 备份到用户自己的掌握的云服务中功能, 如备份到 iCloud 或者 Google Drive,备份完成后删除 App 中的私钥分片 C。

(4)当用户删除应用/手机丢失/更换设备时,私钥分片 B 丢失,此时开发者应用提供恢复功能,将用户云端的私钥分片 C 恢复到应用中,使用 KeyId 1 中的应用私钥分片 C 和服务端私钥分片 A 进行分布式私钥恢复,协议运行完成后,得到一组新的 KeyId 2,服务端生成新的私钥分片 A’,应用中生成新的私钥分片 B‘ 和 C‘。然后删除应用中的私钥分片 C 和 C‘。
(5)恢复后使用钱包发送交易时,用户签名使用 KeyId 2 中的服务端私钥分片 A‘ 和 应用中的私钥分片 C’ 进行签名。

(6)当用户再次删除应用/手机丢失/更换设备时,私钥分片 B‘ 丢失,此时流程类似步骤(4),开发者应用提供恢复功能,将用户云端的私钥分片 C 恢复到应用中,使用 KeyId 1 中的应用私钥分片 C 和服务端私钥分片 A 进行分布式私钥恢复,协议运行完成后,得到一组新的 KeyId 3,服务端生成新的私钥分片 A’’,应用中生成新的私钥分片 B‘’ 和 C‘’。然后删除应用中的私钥分片 C 和 C‘‘。
(7)恢复后使用钱包发送交易时当用户再次签名时,使用 KeyId 3 中的服务端私钥分片 A‘‘ 和应用中的私钥分片 C’’ 进行签名。再次使用私钥分片 C 恢复时重复步骤(5)(6)即可,择机删除服务端的 A’ 以提升安全性。

Keyless 的核心流程为使用 KeyId 1 中的服务端私钥分片 A 和应用中私钥分片 C可以多次恢复一组新的 keyId,和对应的新的一组私钥分片 A’,B’,C‘。开发者务必保证不要删除服务端的 KeyId 1,以及务必保证备份到用户云盘中的私钥分片 C 和服务端的 A 是相同的 keyId,不同 KeyId 的 A 和 C,如 KeyId 1 的 A 和 KeyId 2 的 C 无法进行分布式私钥恢复协议。
(8)恢复单私钥
当用户不想使用开发者服务,希望恢复单私钥时,用户可以使用存储在自己云端的私钥分片 C,以及应用中的 B’ 或者 B’’ 合成单私钥。
(9)刷新私钥分片
为了提升安全性行,开发者可以定期刷新私钥分片,如使用 KeyId 为 1 的私钥分片 A、B、C 刷新得到一组新的私钥分片,新的 keyId 为 2,私钥分片为 A*、B*、C*;然后禁用老的私钥分片,后续签名和恢复都使用新的一组私钥分片。需要注意,一旦刷新私钥分片后,如果作废老的私钥分片 A、B、C,则需要用户重新备份 C* 到 iCloud 或者 Google Drive 中。