洞见 | 公链的根基

Ajian   |     |   2007 次阅读

编者注:2018 年 12 月 1 日,我们在上海举办了“洞见”系列活动的第二期,主题为“公链的基础设施”。这个名字听起来可能有些奇怪,因为在大多数人的理解中,对应用来说,公链本身就是基础设施。但看完两位主讲的演讲稿之后,相信读者会更清楚地意识到,公链之下有非常多的技术和非技术要素给它支撑。本文为 Neo 在本次洞见活动上演讲的整理稿。Neo 在这篇文章里既讲到了公链的许多技术组件,也讲到了他对当前热门话题的一些观点。文章很长,但看下来想必会有不少启发。

公链的根基

-“洞见”活动第二期现场照片-

区块链的定义

我们先来看看区块链的定义。“区块链(blockchain 或者 block chain)是用分布式数据库识别、传播和记载信息的智能化对等网络,也称为价值互联网”。这个定义其实是我从维基百科(Wikipedia)上搬过来的。大家看着好像很复杂,但对我们做技术的人来说,其实就很简单。

首先区块链是一个金融系统。从最早的区块链,比特币,到后来的区块链,都是如此。其次区块链是一个分布式的账本。也就是说,可以把区块链视为一个后台系统。在这个后台系统上可以做各种各样的 UI,普通用户可以根本不知道你的后台系统是什么样的。最后,这个账本的特点是自带确定性的清结算。这是它与现有的金融系统不太一样的地方。买股票和基金的朋友应该知道,在股票和基金市场中有所谓的“T + 1”,也就是说交易成功后也要等一天才能结算完成,但在区块链是即时清算的,当下就完成了。另外还有一点是准入条件。这一点其实也没有必要多讲,大家都知道,公链是没有准入条件的,像比特币和以太坊,你想加入网络就加入,想退出就退出,没有条件。2016 年的时候,市面上有很多企业在做联盟链,就是设置准入条件的区块链,只有联盟内同意才能加入某条链。

基于上述特点,区块链的适用场景是:非信多方价值互换与高效协作

现在有很多人在使用区块链来做解决方案,但是实际上,在那些传统行业中,区块链就只是一种技术方案,只能降低运营成本,没更多了。举个例子,假设你要用区块链做一个 Airbnb,这个 Airbnb 跟现有的 Airbnb 相比唯一的优势可能就是运营成本更低,在其它方面没有任何区别。如果没有什么特别的理由,你完全可以使用传统的解决方案,也可以做的很好,因为这些方案往往更加成熟。最近 NIST出了一份报告,感兴趣的朋友可以找来看一看,写的非常好。里面有一个列表,就是说如果你是这个行业,那么你不需要用区块链,用传统解决方案就够了;如果你是那个行业,那么你可以尝试使用区块链;写的非常清楚。

因此,实际上,我们更加关心那些没有区块链就很难做或者没法做的新业态。而这些新业态,我觉得总结下来其实还是“非信多方之间要产生交易”。比如物联网,各位都知道每天都有海量的设备连入互联网,而那些为我们提供服务的服务商会不断地收集我们的信息,这已经是行内公开的秘密。那么如果我们想要在物联网中保护隐私,光用互联网是肯定不行的。这就需要用到区块链。

安全,安全,安全

区块链中最重要的基础设施就是与安全相关的组件。

共识算法

首先是共识算法。现在主流的共识算法有这么几类:一是 PoW,也就是 Bitcoin、Ethereum、Zcash 等公链用到的共识算法;PoW 可谓是久经考验,迄今为止好像只有两种工作量证明的加密货币被51%攻击过,一个是 BitGold,另一个我忘了(编者注:应该是 XVG)。不过各位可以放心,在攻击事件中受攻击的都是交易所,攻击者是先把币存进交易所,然后发动 51% 攻击消除转账记录,造成双花。转账额度不大的话是根本不需要担心的。

另一类是 xBFT 算法。之所以在“BFT”签名加个“x”是因为它们都源出于拜占庭容错算法,都是 BFT 算法的变种,比如 PBFT 之类的。最近好像还有个俄罗斯团队做了个“sdBFT”算法,据说可以解决扩容等一系列问题,但做的比较复杂。总而言之,这些算法既然同根同源,那么它们就既保留了 BFT 算法的一些优点,同样也继承了 BFT 算法的一些缺点。比如算法比较慢、容错上限是 1/3,等等。

还有一类是 dPoS 算法。最早使用 dPoS 算法的其实是 Bitshares,但真正让 dPoS 火起来的是 EOS。它的意思是我们先用代币投票投出 21 个节点,然后让这 21 个节点来出块。我个人其实比较喜欢 dPoS,一方面它也经过了时间考验,另一方面也比较节能。

现在还有不少团队在研究 PoS 算法,比如以太坊。我觉得关于哪种共识算法更好是不太需要争辩的,最后时间会告诉我们答案。

曲线安全

关于曲线,首先要讲的就是 Secp256k1。这是比特币和以太坊用到的一条椭圆曲线,用来从私钥推导出公钥;用户发起交易时候的签名也是使用 Secp256k1 算出来的。中本聪一开始选择椭圆曲线的时候,据说 p-256 里面埋了 NSA 的后门,因此专门选择了这条。

然后是 Ed25519。这是一条比较新的曲线,一些比较新的号称区块链 3.0 的公链会用到这条曲线。其实这个 Ed25519 曲线会比 Secp256k1 效率更高,在 Safe Curve 里面它几乎是满分的,收到了很多好评。但是它比较新,所以当初做中本聪没有用。最新的一些链会用,那我们也拭目以待,因为目前没有发现他的问题;已经有一些人在用了,但是用的这些还都没有足够大的体量来证明 Ed25519 安全。因为你小的时候是没人在意的,当你大的时候没出问题,大伙才能真正看出来是安全的

然后是 SM2。SM2 是国密,你在中国跟政府跟国有企业做生意一定要用国密,不用国密的话几乎就没有机会,这个是没办法的事情,所以国密也可以适当去了解一下。

合约安全

合约安全我们一会会有个 Page 专门来讲。

今天的智能合约其实大概就这么几类,一个是比特币,它基于堆栈,是一个很简单的脚本,它没有循环,也是非图灵完备的。

然后是 EVM,这个就比较有名了,它是图灵完备的,但是它的问题也是最多的。当然,这个问题多不是说它本身不好,而是因为:第一,当初做 EVM 的时候,他们其实做的是比较匆忙的,没有经过太多的时间去验证;然后 Solidity(EVM 所用的主要编程语言)本身是从 js 来的,它也是一个比较新的东西,新的东西放在一起就容易有各种各样的问题。

然后 hyperledger 用的是 Docker

今年跟区块链相关的攻击几乎都是针对以太坊智能合约的,当然有一些是故意放的后门,但有一些,确实有一些合约上的问题。其实标准的合约也没有太多问题。比如说 ERC20,完全就是个 ERC20 的话,怎么都不会出问题。但是上次那个因为智能合约依赖库问题锁住 9000 万美元的那个事情,其中涉及到的多签名钱包,这还是以太坊的联合创始人之一(Gavin Wood)来主导的。所以说这个里面有太多的需要关注的东西。但那个多签名钱包的问题之一是太复杂,没有必要实现的那么复杂。

节点安全

节点安全这个不太会有人注意。因为对于 PoW 来说,节点相对来说还是蛮安全的,因为节点只需要公钥,不需要私钥;但是对于 PoS 来说,它的节点是有私钥的,所以相对来说节点本身的安全就会比较重要。

虽然节点安全说的主要是出块节点,但轻节点也会有安全问题:有时候会被钓鱼,或者说有其它的一些攻击方式。有时候你会看到一些建议,就是说,为了安全起见,你自己跑一个全节点,然后再用本地的轻节点去连你的全节点,这样就会比较安全,包括一些钱包。比如 Trezor(一种硬件钱包)就建议:你不相信我,你可以自己跑一个全节点,不用走网络连我们部署的全节点。

账户安全

账户安全就是通常说的钱包安全,但是像 Bitshares 跟 EOS 是基于账户的,所以我就没有选钱包安全来称呼。那么有账户名,有密码,有助记词,还有私钥,这个在下面会重点讲。

这些是跟公链安全有关的一些方面。你在做的时候可以去加强,或者说去减少攻击面,等等。

智能合约

什么是智能合约

大家天天都在讲智能合约,这个智能合约到底是什么?这是 Nick Szabo 在 90 年代提出来的概念,他的第一篇论文就是叫做上帝协议。其实它就是一个黑盒子,但他后来又把它完善了,给它取了个名字叫智能合约。但今天我们发现,这个智能合约既不智能也不太有什么合约的性质,包括上次小 V 他也说了,后悔当初用这个名字,其实小 V 的智能合约理念,包括以太坊这个东西,完全是受 Nick Szabo 的那几篇文章的影响。

那在我的眼里,智能合约是什么呢?在我看来,智能合约是传统软件的一个插件,是一个扩展功能。为什么?因为,如果大家都用一个东西,就把它写在链上就完了(指内置在协议层),不需要做一个什么智能合约。那为什么有这个合约?就是因为有些功能不是大家都用,有些人要用,因此他在链的基础上又做了一些。比方说 ERC721,那个以太猫,他就用合约形式实现。也就是说,因为不是所有人都喜欢那个猫,不是所有人都喜欢这种蠢萌的东西。还比方说 ERC20。这在以太坊上是最明显的。它不是所有人都需要,但是有些人要他又不想做下面这个公有设施,因此他们就在上面做一个插件。所以在我眼里它其实是一个插件的功能。

IBM 的说法是 Chain Code,其实 chain code 更符合我们今天理解的智能合约的定义,就是一些对链扩展的功能。

合约容器

合约它需要一个容器,这个容器不是 Docker 这种狭义的容器。这个容器是一个广义的东西。你写程序你就会知道,当你需要一个插件的时候,你需要把它包进去,要决定在什么里面跑这段代码。

现在用的最广泛的是虚拟机,有不同的虚拟机,但很多都是以太坊的 EVM 衍生出来的。还有一个就是比特币的这种堆栈的形式。

就是说,智能合约需要一个容器来运行,虽然智能合约是运行在出块节点上,但是它需要一个容器来运行,它需要一个独立的空间来跑。

合约语言

合约语言接口的关键是对高级语言友好。其实理论上说,智能合约你用汇编写也没有问题,毕竟对于机器来说,它不认识什么高级语言,它只认识 0 跟 1。

目前大约 40% 的区块链从业者在以太坊社区,因为以太坊的合约接口对高级语言太友好了。一个做 Web APP的,大概花两个小时就能写一个合约出来。当你要做一个智能合约平台的话,这一点是很重要的,就是开发者友好,不能写的太晦涩,然后学习曲线那么长或者那么陡,要让大家很快地能融入进去,所以你需要一个高级语言接口。

这些高级语言包括什么呢?比如 EOS 用的就是 C++,以太坊的 Solidity 是基于 js,也有其它项目在做,比如基于 Python、Lua。比特币就是一个简单的脚本,当然简单有简单的好处,它不会出错,或者极难出错。

预言机(Oracle)

还有一个重要的是预言机 Oracle,这个主题长期被人忽略。Oracle 的原理非常非常简单,简单到随便讲就明白它是个什么,但是实现很难,非常非常难,难到今天都没有一个正儿八经、让大家看的过去的。这是公链里面非常非常大的一个有前景的发展方向,里面也会有很多坑,但是绝对是一个有意思的东西。

Oracle 的原理很简单,就是说智能合约它是跑在链上的,它是机器,是程序,它有时候需要外部的数据,需要专门把数据传进来。最经典的例子就是在合约里面打赌,我们赌明天天气好不好,明天 12 点下雨,你方赢;明天 12 点不下雨,另外一方赢;一定要定义好是 12 点,你不能说明天下午,它需要明确的条件。 那合约怎么知道 12 点下不下雨?就得有人告诉它下不下雨。当然它也可以自己去调外部数据,写程序的都知道怎么去调,比如到 12 点的时候调用气象局的 API。

原理是比较简单,但是麻烦是在什么地方呢,或者说它的实现难点在什么地方?它的实现难点在于人性。为什么又是人性?我们两个打赌,打一块钱的赌,基本上不会有什么动机作弊,但是如果这个赌约是一个亿人民币,就像上次赌世界杯的时候,当你的赌注够大的时候,你不管是自己出去调数据,还是别人告诉你,你们都可以串通起来,骗对方。 这就是它难实现的地方,就是人性或者说激励机制。

我也看过很多 Oracle 的项目,没有一个很好的能让大家都肯定的东西,所以这是一个非常好的方向。大家有兴趣可以去研究一下。

误区与对策

我们看到了一些跟公链有关的说法,这些说法中有一些误区,当然也有一些解决问题的思路。这些方面其实也没有什么定论,就当是抛砖引玉吧。

TPS

TPS(Transaction Per Second,每秒处理的交易数量,用来衡量系统处理交易的能力) 一直以来都是大家诟病公链的地方。有些项目做宣传就说我有百万 TPS,BM 就说我的 EOS 就有百万 TPS,它怎么达到的呢,每个节点跑并行链,对吧?单条链的 TPS 如果是 100,可以跑 1 万条,所以号称有百万级 TPS。

但是实际上,现在全世界最牛的 TPS 就是支付系统;支付宝的 TPS, 在峰值也就是在双 11 的时候,好像也就是 20 几万,具体多少我也忘了,反正每年都会刷新。它是堆了无数的硬软件的资源,才达到的。VISA、Master 卡,包括银联的 TPS 都不如它。

大家喜欢讲 TPS,但是,为什么需要 TPS?你说你达到百万个 TPS,谁来用你?今天做支付,短期内还不可能做得过支付宝,也不可能做得过 Master、VISA,所以你真的需要那么高的 TPS 吗?这些都是成本,都是钱。所以这是个问题,就是你到底需要多少 TPS,实际上,Bitshares 现在是 3000 的 TPS,现在都有很大的一块是富余的,当然因为 Bitshares 这个网络没有那么活跃。

今天看到 TPS 问题的是比特币跟以太坊,包括比特币的各种分叉,比特币现金,包括最新的分叉,大家争论的还是网络阻塞、TPS 上不去。但是这两个 PoW 的公链,它真的需要那个 TPS 吗,如果需要的话,现在大家都在玩二层(Layer-2),比方说 Lightning Network,以太坊上也有个二层,雷电网络,他们做的没有 Lightning 那么好。那二层的概念是什么?当你做微支付的时候,是需要 TPS 的时候,那你就可以用二层。这个时候大家都是 Off-chain 的,这个是微支付。要做大额交易的时候,,比如说在区块链上买卖房子,这时候是不需要 TPS 的。你想上海的房地产交易,或者全国的房地产交易,一天折算下来能有多少 TPS?

所以细想你会发现,真正需要 TPS 的都是一些小的,或者说不需要全网来确认的场景。这里有一个局域 TPS 和全网 TPS 的区别。我们现在就在用软硬件结合的方式去做局域 TPS,因为我们是做物联网,物联网就更具有这个特点:它几乎是不需要全网 TPS 的,大部分交易都发生在局域。这里有一个好地方,就是物联网离不开路由器,同时路由器就是个“局域网”,所以我们很多 TPS 都可以在局域网里面解决,用路由器加上 Layer-2 去解决 TPS 问题,用软硬件堆一下,10 万 TPS 已经不是一个问题。当然这不是全网 TPS,是局域 TPS。

共识算法

共识算法方面,前面也已经说了,就是 BFT 的问题。前几天还看到一个俄罗斯项目,又把 BFT 做了一个 sdBFT,反正也就是做得又复杂了一点,说是能解决问题,但其实只要你是 BFT,都会继承它所有的优点,也会继承它的缺点。

PoW 里面会存在 51% 攻击,已知的好像是比特币黄金被攻击过,还有一条链因为比较小也被攻击过。但是你会发现,他们攻击的是什么?他们攻击的不是个人。51% 攻击都是针对交易所,你别担心,你会不会被 51% 攻击。 他们怎么攻击的呢?先给交易所转一笔,然后用 51% 的算力把这一笔抹掉,哭得是交易所(实际过程是指给交易所转钱并且得到确认后,用 51% 算力挖出一条更长的分叉链)。

然后就是能耗跟效率的问题,其实还是 PoW 和 PoS 的问题。

跨链

一些做区块链 3.0 的比较常吵吵跨链的问题。

其实一开始侧链就是做跨链的,它就是双向锚定。然后今天就变成了三四个比较明星的项目在做跨链。

那么在我们的概念中,跨链是什么呢?跨链做出来其实就是交易所。用户才不管你用什么技术,用户拿着一个比特币,我想跨链换成 10 个以太坊,你用市场价帮我换完,这就是跨链。另外,跨链需要一个清结算的节点。

原子交易,或者叫 HTLC,就是哈希时间锁,其实是可以做的,而且这个技术比较简单,也比较成熟。点对点之间是可以做跨链的,就是用哈希时间锁,这个在很多链上也有。

然后其他的一些跨链协议呢,永远会存在一个网关,或者说一个中央化的节点去做清洁算。为什么?我们可以考虑极端的状况,大家今天看到比特币跌了,大家都抛比特币,换以太坊,那他的以太坊哪里来?或者说他收进去的比特币怎么办,卖给谁?为什么我们说跨境就是交易所,因为交易所里面可以有做市商,或者还有其他的办法帮你撮合需求。如果你没有这个撮合在里面的话,纯粹的跨链协议其实挺麻烦的,就相当于是一个分布式的撮合协议,还要做到清结算。所以跨链这个方向我觉得不那么方便地做到,如果说要做,用原子交易也就是 HTLC 也可以做。

分叉

分叉有所谓的硬分叉和软分叉。其实 BFT 的链是不会分叉的,因为它是确定性的;会分叉的链就不是百分之百确定的,比如说 PoW 的这种,它会分叉(这里指的是协议正常运作过程中的软分叉)。

但是分叉也不是什么魔鬼。我们认为分叉其实很多时候是为了升级。当然比特币的历史上各种分叉币出来,其实就是炒作一把,这是另外一回事。写程序你也是要升级的,要修复 Bug,但是区块链是一个分布式的程序,一个人升级了没用。

这个里面还有一个比较有有意思的东西,也会涉及到分叉。曾经有很多项目,包括很多人都说,量子计算机出来了,今天整个区块链的世界就挂掉了,因为椭圆曲线对量子算法是不行的。也有很多人在项目白皮书里说,我们这个是抗量子计算的。其实不用担心,量子计算机什么时候出来还不知道呢,然后软件永远比硬件快。今天很多密码学也是基于这个,为什么 RSA 啊 ECC 啊,可以用在这个地方,就是因为硬件算得太慢,或者说需要的资源太大。那等量子计算机出来并且商用的时候,你把你的算法升级一下,做一下硬分叉就可以了。所以不用担心量子计算机,今天也不用做什么抗量子算法,因为量子计算机都没出来,这些抗量子算法都只是理论。这是一个跟分叉有关的小插曲。在我们看来分叉其实就是升级。

图灵完备

图灵完备指的就是智能合约的性能。我个人是不追求图灵完备的。

以太坊其实也不是图灵完备,因为它还有 Gas Limit(单个区块可以使用的 Gas 是有上限的)。所以从实际上来说,并不算图灵完备。我们觉得,够用就好。比特币它是完全放弃图灵完备,就是它没有循环,只有 if...else... 这种,它够安全。但是这种够安全的合约就带来它的问题:它能做的事有限。以太坊能做的事情够多,但是它有 Gas Limit。所以光说图灵完备不太有什么意义,还是要想这个适合用来做什么,还是要放到生产环境,或者是放到你的业务逻辑里面去,你要用它做什么。

代码审计

代码审计现在面临着一个比较麻烦的问题,也是区块链行业比较麻烦的问题。以前的代码审计已经很成熟了,你可以跑个 Fuzzer,然后你写个 Web APP 其实也就那么几个问题,已经非常不错了。但今天这是一个分布式的程序,它的安全模型或者说它的攻击面会不一样。所以今天做代码审计的公司或者团队都比较新,就是它没有一套成熟的东西,大家都在摸石头过河。 现在审以太坊合约的是发展得最快的,现在才刚开始审 EOS 和其它链的合约,但是其实链本身的代码审计会更加的重要,因为合约可能就涉及到一个两个项目,但链是基础设施

代码审计中最容易瞒过大家、最不容易发现的地方是什么?其实是逻辑。逻辑跟经济模型有关,跟你的业务逻辑有关,这个你要非常非常了解区块链并且非常清楚你做的这个事情(才能做到)。所以代码审计也是一个很大的方向,也是亟待解决的一块。

信任链

信任根

信任链的原理不难,就是说我们今天的安全系统其实是信任链,互联网安全其实是基于 PKI(公钥基础设施),就是大家讨论了一下,做了一个公钥的架构:大家互相签证书,我是个机构,我有合法的证书,因此我签出来的是合法的。

PKI 的问题是什么,是中间人攻击,也就是恶意攻击者在交互的双方中做了中间人,破坏了信任链。今天已经看到了很多 PKI 的问题,那怎么去解决?就是把这个信任根不要放在顶端,放在终端。把信任根放在终端也不是说就是一个灵丹妙药,可以直接搞定所有问题,但是相对而言会比以前的架构更能抵抗中间人攻击。

通常的做法其实就是用 SE 或者tpm,还有 HSM 相关的。硬件信任根在工业界已经用了十来年了,不是什么新东西;在消费品界也用了不少年了,包括苹果。苹果的电脑现在装了安全芯片,你以后不能再装 Linux 了,因为苹果安装了一颗硬件信任根的芯片在主板上,你开机的时候,它里面的程序如果检测证书不过的话不让你开机。所以你就只能装他的系统,这就是一个典型的硬件信任根的用法。还有一个就是苹果的手机屏幕,不知道从 iOS10 还是 11 的时候开始,就把这个功能加了进去,但现在还没有启用,以前换个屏幕,你可以去路边店花 150 块换一个。但是他已经加入了一个功能,如果它检测不是苹果的原产品的话,他就不给你点亮了。这也是通过硬件来做到的。通过软件做你容易去黑他,通过硬件不是说不能黑,但是很麻烦。

随机数

密码学里面比较关键的一个问题也是容易被忽略,或者说容易放后门的地方,就是随机数。 最近的几次 EOS 的合约攻击都是跟随机数有关的。

随机数不能说是千古难题,但基本上在量子计算机出来之前,我们这个世界还没有真随机数发生器,哪怕是硬件它也不够完美,它是一个如何收集“熵”的问题。那为什么量子计算机可以呢,因为量子的位数跟这个不一样。今天量子通讯的应用也是跟随机数有关,并不是说有什么更加高深的算法,也就是与随机数的不可预测有关。真随机数也就是你不管用什么办法都不能够预测出来那是什么东西。今天的随机数发生器还不够高级。所以大家在写程序或者看代码的时候也要尤其注意,看一下它的随机数是从哪里来的。

这个图说的是信任链的问题,关键就是你把硬件,把芯片放到最底层,然后从下往上去保护。它是从硬件上电开始,一层一层往上保护,最终回到应用。

钱包

钱包也是区块链里面比较重要的。不管是个人还是企业,基本上你的资产全部放在钱包里面。钱包就是做支付,做转账。今天你在现实社会中,你的银行账户有问题,你还有办法去跟银行 PK 一下,去告他。你说这个钱是被骗的,或者这个钱是被怎么着,它是一个中央化的体系,你还有机会能找回来,等等。但数字货币的世界里基本是没机会的。这跟它的特性有关系。

其实钱包最关键的是什么?最关键的是私钥,永远是私钥,别的东西都属于次要的;不管你用什么方式,把私钥看好,基本上就不会有问题

钱包基本上就分为冷钱包跟热钱包,区分方式也比较简单,冷热钱包区分的唯一方式就是它是不是联网。一台不联网的电脑,也是个冷钱包。一个上网设备就是一个热钱包。冷钱包当中还是纸钱包相对安全,当然得放保险柜,然后你得把那些东西再加密一下。当年 Mt.GoX 的交易所,他们很多的币都是放在冷钱包里面的。 现在比较流行的是硬件钱包,特指的是 U 盾那种。基于安卓的一般不叫硬件钱包。钱包也有一些需要考虑的问题。

随机数

为什么又是随机数?如果你的随机数生成器里有后门或者使用不当的话,别人就拿去重新生成一模一样的东西(就是重新生成出你的私钥)。随机数生成器也跟开源有关系。我个人是不会把大的数字资产放到不开源的冷钱包或者热钱包里面去的,因为我不知道他有没有故意放的后门,或者有没有漏洞。我宁愿把它放在一个稍微复杂点,但是有源代码的,我能看过的钱包里。当然说的是大额资产了,小额的话就无所谓了,大家开玩笑,用四位数的钱包,保护三位数的资产,也没什么意义。

随机数是可以在代码中看出来的;即便它是硬件钱包,就是 U 盾式的钱包,里面也是有嵌入式程序的,然后你要看它的随机数是从哪里来的。这个非常非常重要。

备份

通常来说,备份助记词就好了,或者是你的种子(Seed),当然是跟 BIP32/39 有关的这些协议的备份。

但是还有一个问题就是数字资产丢失的问题。拿交易所来说,交易所的冷钱包一般是要多签名的,而掌握多钱私钥的人一般不会去坐同一班飞机,防止失事或者被绑架,关键不仅在于他们的冷钱包里有太多资产,还在于现在没有一个机制能恢复出私钥。EOS 试图去解决,但是我看了一下,他好像还没实现。但是,你只要提供这个功能,就可能被坏人用来恶意恢复。很简单的例子:很多网站提供找回密码功能,这个功能其实也成了一个很重要的攻击点,通过短信或者通过第二个邮箱来找回密码,或者回答安全问题。区块链为什么不提供,因为这个太容易被攻破了。所以要做恢复资产也需要非常小心地决定用什么来恢复。你不提供这个功能,就会有很多资产 lock 在里面;你提供这个功能就要考虑不要被坏人利用,这也是一个比较有意思的问题,现在还没什么人做出来。

另外,我们还说钱包要经常备份,私钥要备份,那为什么要备份?为了应对意外。因为很多恶意软件,比方说那些勒索软件,它只是简单地加密一下你的硬盘,如果没有备份的话就很麻烦。日常备份这个习惯是对付很多问题的终极法宝

说到备份,其实有一个很简单的原则,就是“321原则”:把你认为重要的东西备份到三个地方,其中至少有两个地方不是同样的媒介;你说我 C 盘的一个东西,我备份到 D 盘、备份到 F 盘一个,这不叫不同的媒介,备份到移动 U 盘上就叫不同的媒介了;剩下的那个“1”是说,其中至少有一个媒介是没有连网的

2FA

2FA 就是双因子验证授权,注意不要用短信。现在短信的安全性稍微好一点,以前的短信有各种问题,这个我见过太多了,所以双因子不要用短信。你可以选那个 Google 的,当然这些 OTP 的协议都有一些开源的东西可以选。

然后 2FA 对于企业端或者说后台,会存在一个分化与管理的问题。也有很多开源程序。这个 FreeOTP 是我推荐的一个工具,因为我不太喜欢用 Google 的东西,能用开源的就用开源的。

多签名

刚刚说了,企业用户需要用多签名钱包,说白了是因为你的资产够大。企业用户、交易所、项目方都需要多签。最著名的以太坊多签名钱包就是以太坊上出了问题的那个。其实有好几个人开发了只有多签功能的、很好用的基于以太坊的钱包。它的原理很简单,就不用搞太复杂,功能太多就容易出问题。

其实父母跟子女之间就是一个典型的应用多签场景,比如说小孩的压岁钱,只有爸爸跟小孩同意,或者妈妈跟小孩同意,或者爸爸跟妈妈同意的时候才能用。

开源

开源我刚刚其实已经说了,你不会放心把你的大资产放在任何一个不开源的钱包里面去。即便它是一个冷钱包,不上网,你还要考虑如果钱包丢失或者被偷,别人能不能从里面恢复出私钥来。所以你一定要看到开源的东西,而且软硬件都要开源。硬件钱包中开源最彻底的是 Trezor,它的硬件全部开源了。

依赖库就是前两天 js 的那个问题,就是 Copay 钱包上有个 js 依赖库,它们在 GitHub 上被人植入了一个很深的后门,不知道有没有人损失了比特币,反正它是一直用的依赖库的问题。包括以太坊上出问题的那个多签名钱包,出问题的也是一个依赖库,出问题后整个就挂掉了。所以依赖库也是一个需要重视的问题,因为现在已经过了那个东西都自己写的时代了,大家都用库,如果库被恶意或者不小心搞出问题了,那整个就出问题了。所以说开源还不够,还要去做代码审计,包括审依赖库,不管是什么库。特别是重大的依赖库出了问题,那就是一个灾难性的问题。

交互

有些钱包会说我使用二维码,而不是 WiFi、蓝牙、NFC,我就更安全。当然二维码是基于今天的移动支付,但是后面特别是到了物联网时代的话,机器之间是不可能通过二维码去交互的,一定是射频,射频就是 NFC、蓝牙、WiFi 以及类似的东西。

安全芯片

还有一个是安全芯片的问题。为什么要提安全芯片?从 CC EAL5+ 说起,这是一个安全标准,它有认证的,我们经常用的银行卡的芯片,就是 CC EAL5+。它是一个经过认证的东西,也不是说百分之百安全,但总归是安全等级更高。它有个特点,就是它的私钥永远不可以被读出来,你可以把它整个破坏掉,但你拿不到它的私钥。这是它对区块链的好处,它本来就这么设计的,在区块链里就更加没问题,就是说你丢了这样的一个硬件钱包,不用担心你的资产会有损失,因为你的私钥是不可以被恢复的。而且它的随机数发生器也是在芯片里面做的,不是软实现,它都是硬实现。

未来

未来 = 物联网 + 区块链 + 人工智能。

我们所有的数据一定是产生于硬件的,就是说,所有的数据都来自于物联网。区块链,大家知道,是改善生产关系的,同时也是保护数据更安全的。然后 AI 是需要正确的完整的数据才能做出好的模型。所以我们非常看好这三者结合的未来。


作者: NEO MA

技术极客,浙江大学应用电子本科,复旦大学微电子硕士。具有15年硬件设计、生产相关经验,20年应用密码学实战经验。物联网+区块链项目 - μNEST创始人。

 
0 人喜欢