::: motto 犯罪图鉴
人类呼吸的每一口空气,都有生活痕迹的气息。
:::
::: tip 转载声明
本文转载自原语云公众号 Lotus私钥安全管理和数据为先的 FIP 探讨。欢迎订阅,第一时间获取技术干货。
:::
钱包是区块链的基石,他的本质是一个数学模型支撑的公私钥对,所以技术上我们通常也称为私钥,一般是用公钥加密数据,然后私钥去解密。
只要能解密数据就意味着你拥有数据的所属权,这个签名和解密的过程也不是100%的安全。
只是现代的计算机架构要算出碰撞需要很长的时间,依据算法复杂度从几年到几百年都有可能,但是这个问题一直都存在。
这里我们分享下原语云建议的 Lotus 集群私钥的管理方式。
1. Lotus 私钥的认识和分类
Lotus 的网络是一个复杂的系统,本身一个私钥可以满足全部的需求,但是为了安全一般会对私钥做如下的三个分类:
Owner 私钥: 这个看名称也知道 - 所属者,这个私钥控制着整个存储集群,通常和网络共识交接的操作基本都会需要
Owner
私钥来签名操作消息,
例如:提现,终止扇区,更换所属者/质押/时空证明私钥等都需要owner私钥的签名。之所以把这个私钥单独拆分也是因为他的重要性,如果被盗取了,
意味着整个存储集群都不是你的,包括全部的质押和后续的出块奖励,甚至数据都可以被重新生成,所以这个私钥一般都是离线管理的,用完就拔掉。Worker 私钥:
Worker
私钥主要是用于质押过程中的扣款签名,按照质押上链的消息类型本身又可以分为前置私钥和后质私钥,通常一个就够了。出块过程中的 WinCount 计算也是通过Worker
地址来和有效的存储空间来做绑定的。Post 私钥: 这个私钥单独用作时空证明的提交,也是为了更流畅的时空证明结果的提交,如果和
Worker
私钥混用可能会导致时空证明结果提交延迟而过期的情况,经历过 Space Race 的工程师会更感同身受为什么会需要这么一个单独的私钥。
如果一个存储集群的 Owner 私钥丢了,这个丢了可能情形如下:
- 是真的丢了: 备份的私钥找不到了,因为存储私钥的硬件设备出现了损坏,或者真是不知道丢到哪儿了。
- 私钥还能找到: 但是被人盗取了,这个人利用盗取的私钥重新初始化了你的 Miner ,然后再更换了 owner 私钥为一个新的私钥。
无论是上述那种情况,意味着这个存储集群已经不是你的了,因为无法提现,全部的出块奖励以及所有的质押也都拿不回来了。
最痛苦的是第二种,出块奖励和质押都属于别人的了,如果对方再弄一些机器用一定的时间可以把全部的 CC 扇区数据都生成一遍,这样集群就完全属于他了,质押币在完美为他人服务。
这种情况目前没有任何应对措施,这也是我认为目前 lotus 网络不合理的地方。
2. Lotus 私钥的安全管理
要如何保护这些私钥,避免不必要的麻烦呢?
对于 worker 私钥:可以定期转入 FIL,按照增速转入1-3天的量,这样即使被盗取也损失有限。
对于 post 私钥:从 post 给定单独的地址提交后,时空证明的 Gas 费已经可以忽略不计了,也就是如果 1 个 FIL 可以供很长一段时间的时空证明提交。
对于 owner 私钥:介于他的重要性,这里作为重点讲述一下:
2.1 Owner 私钥的备份和删除:
通过上一步确认了私钥已经成功导出后,就可以把线上的 owner 私钥给删除了,因为环境就绪了后,后期质押/出块/时空证明这些都不需要 owner 私钥。
这里删除是为了防止你的 lotus 服务器或者 miner 服务器被攻击了,可能是网络攻击也可能是物理攻击导致私钥被盗取了,就会出现上面描述的悲剧。
这里一定要记得通过 delete 命令和 文件删除的方式彻底删除私钥,具体步骤请阅读 钱包私钥的备份和删除。
2.2 Owner 私钥的生成
我建议可以在一个安全的环境运行一个 Lotus 区块同步节点,例如办公室/家里的 ADSL 拨号环境放一台 lotus 机器,用柜子锁起来。
owner 私钥通过这个节点来创建,然后 miner 也通过这个 Lotus 节点去创建和初始化,
之后把初始化后的 miner 数据拷贝到机房的 miner 机器去继续后续的工作,也就是正式的环境并不需要 owner 私钥,提现等这些操作可以在本地的隔离环境下的 miner 完成 (注意这个 miner 不做任何的出块或者时空证明计算),这固然是最安全的方式。
如果 owner 私钥没法在隔离的办公室/居家环境中生成或者使用,owner 私钥确认备份好了后,后期的使用就要坚守插拔模式,需要的时候导入,用完了一定要立即从线上彻底删掉。
3. 数据为首的网络提案和问题分析
owner 私钥的重要性上面已经提到了,也提过如果被盗了,后果让人很绝望,目前 lotus 网络 owner 私钥处于 miner 的绝对统治地位,被盗取了,不仅出块奖励没了,原始的质押也无法拿回了,再去链上弄回来 PC1 计算的 ticket 数据,弄点机器还可以把这个 miner 全部的 CC 扇区计算回来,可以说已经完全没原来 miner 什么事了,这种事情貌似圈子里面也发生过几起,除了上面说的防护措施以外,接下来描述下原语云提案的 ”通过随机时空证明挑战修改 owner 私钥”。
- 提案原文:https://github.com/lionsoul2014/FIPs/blob/master/FIPS/fip-draft_ocpc.md
- 提案讨论:https://github.com/filecoin-project/FIPs/discussions/269
原语云主张网络以数据为首 - 也就是只要 miner 还能提供正确的存储服务,就应该要能拿回属于他的奖励和质押,这里提到了一个以随机时空证明挑战的方式的来修改 owner 私钥的方案,大体思路如下:
注册一个新的私钥,并且激活。
用这个新的私钥发起一个随机时空证明挑战申请。
网络返回挑战参数并且要求 Miner 在指定的区块高度前完成指定扇区的时空证明计算和提交(这个必须要求是有数据的人才能完成)。
等待验证结果,并且要求在指定的高度内完成后续的 owner 私钥更换。
随机挑战验证通过,通过类似如下的命令发起 owner 私钥的修改提案,修改 owner 私钥为指定的新私钥:
1
lotus-miner actor change-owner-key-proposal --proposal-key=PoSt_wallet --owner-key=new owner key
利用新 owner 私钥再度签名确认提案,完成 owner 私钥的修改:
1
lotus-miner actor confirm-owner-key-proposal --proposal-key=new owner key --owner-key=new owner key
上述逻辑的安全考虑和解决方案如下:
数据拥有的真假问题:因为目前 lotus 的 CC 扇区可以通过PC1/PC2计算重新生成,也就是任何人可以生成任何 miner 的任何 CC 扇区,这个可以通过给 ticket 混入随机数 (有待验证) 或者通过在 CC 扇区里面混入一些不对外公开的随机 piece 来确保数据没法通过公开的区块数据来生成,当然,对于那些经常修复扇区数据的 miner 来说会增加一个本地元数据备份的烦恼,备份下也没啥麻烦的,另外扇区数据也没那么容易坏掉。
随机挑战的可靠性问题,这个是一个概率问题,本身zk-snark就是一个概率准确性问题,只要挑战的扇区足够随机,数量站比足够大,完全是可靠的,例如直接挑战 miner 超过 50%的扇区。
以上是原语云针对此 FIP 的一些分析和解决方案,此方案有可能存在考虑不周的地方,但是我们始终认为 一个分布式存储项目应该是以数据为主导,不同 miner 的数据不应该可以通过公开的链上数据直接计算出来,只要数据还能提供正确的服务,就应该得到该有奖励并且能够拿回为这些数据所做的质押,我们在此抛砖引玉,对此提案感兴趣的小伙伴欢迎参与探讨,争取得到一个更加完善的解决方案。
另外,Lotus 目前已经是一个社区性很强的项目了,当前提案可能会让 Lotus 网络的共识发生重大改变,问题固然会有很多但是我们认为会一定程度上促进 lotus 生态的发展,如果方向在此,问题总会有解决办法的。