常见问题
通用问题
问:区块链是谁发明的,有什么特点?
答:区块链相关的思想最早由比特币的发明者-中本聪(化名)在白皮书中提出,将其作为比特币网络的核心支持技术。自那以后,区块链技术逐渐脱离比特币项目,成为一种通用的可以支持分布式记账能力的底层技术,具有去中心化和加密安全等特点。
问:区块链和比特币是什么关系?
答:比特币是基于区块链技术的一种数字现金(cash)应用;区块链技术最早在比特币网络中得到应用和验证。比特币系统在 2009 年上线后面向全球提供服务,在无中心化管理的情况下运转至今。
问:区块链和分布式数据库是什么关系?
答:两者定位完全不同。分布式数据库是解决高可用和可扩展场景下的数据管理问题;区块链则是在多方(无须中心化中介角色存在)之间提供一套可信的记账和合约履行机制。可见,两者完全可以配合使用。
问:区块链有哪些种类?
答:根据部署场景公开程度,可以分为公有链(Public Chain)、联盟链(Consortium Chain)和私有链(Private Chain);从功能上看,可以分为以支持数字货币为主的数字货币区块链(如比特币网络)、支持智能合约的通用区块链(如以太坊网络)、面向复杂商业应用场景的分布式账本平台(如超级账本)。
问:区块链是如何保证没有人作恶的?
答:恰恰相反,区块链并没有试图保证每一个人都不作恶。以比特币区块链为例,通过经济博弈手段来容忍部分参与者作恶。参与者默认在最长的链(唯一合法链)上进行扩展。当作恶者尝试延续一个非法链的时候,实际上在跟所有的合作者们进行投票竞争。因此,当作恶者占比不高(如不超过一半)时,概率意义上无法造成破坏。而作恶代价是所付出的资源(例如算力)都将浪费掉。
问:区块链的智能合约应该怎么设计?
答:智能合约也是一种应用程序,在架构上既可以采取单体(monolithic)的方式(一个合约针对一个具体商业应用,功能完善而复杂),也可以采取微服务(microservice)的方式(每个合约功能单一,多个合约可相互调用共同构建应用)。 选择哪种模式根本上取决于其上商业应用的特点。从灵活性角度,推荐适当对应用代码进行切分,划分到若干个智能合约,尽量保持智能合约的可复用性。
问:如何查看 PEM 格式证书内容?
答:可以通过如下命令转换证书内容进行输出:openssl x509 -noout -text -in <ca_file>;此外,还可以通过如下命令来快速从证书文件中提取所证明的公钥内容:openssl x509 -noout -pubkey -in <ca_file>。
问:已知私钥,如何生成公钥?
答:取决于加密算法。对于椭圆曲线加密算法,可以通过如下命令生成公钥:openssl ec -pubout -outform PEM -in <private_key>。
问:如何校验某证书是否被根证书签名?
答:已知根证书文件 <root_cafile> 和待验证证书文件 <ca_to_verify> 情况下,可以使用如下命令进行验证:openssl verify -CAfile <root_cafile> <ca_to_verify>。
问:为何 Hash 函数将任意长的文本映射到定长的摘要,很少会发生冲突?
答:像 SHA-1 这样的 Hash 函数可以将任意长的文本映射到相对很短的定长摘要。从理论上讲,从大的集合映射到小的集合上必然存在冲突,这是鸽笼原理的结果,与输入数据的分布无关。
之所以在实践中几乎遇不到冲突,原因有两点:一是输出空间极大,SHA-1 有 2^160 种取值,SHA-256 有 2^256 种;二是设计良好的 Hash 函数会把输入尽量均匀地散布到整个输出空间,因此按生日界估算,随机撞上一次冲突大约需要 2^(n/2) 量级的尝试(SHA-256 约为 2^128 次),远超现实可用的算力。
需要区分“随机碰上”和“被人为构造”。一旦算法本身出现弱点,攻击者就能以远低于生日界的代价构造出冲突:SHA-1 的实际碰撞已由 SHAttered 项目在 2017 年以约 2^63.1 的复杂度做出(详见「Hash 算法与数字摘要」一节),因此它已不适合再用于需要抗碰撞的场景。
比特币、以太坊相关
问:比特币区块链为何要设计为每 10 分钟才出来一个块,快一些不可以吗?
答:这个主要是从公平的角度,当某一个新块被计算出来后,需要在全球比特币网络内公布。临近的矿工将最先拿到消息并开始新一轮的计算,较远的矿工则较晚得到通知。最坏情况下,可能造成数十秒的延迟。为尽量确保矿工们都处在同一起跑线上,这个时间不能太短。但出块时间太长又会导致交易的“最终”确认时间过长。目前看,10 分钟左右是一个相对合适的折中。另外,也是从存储代价的角度,让拥有不太大存储的普通节点可以参与到网络的维护。
问:比特币区块链为何要限制区块容量,大一些不可以吗?
答:这个也是折中的结果。区块产生的平均时间间隔是固定的 10 分钟,容量大一些意味着交易吞吐量可以增加,但节点进行验证的成本会提高,同时存储整个区块链的成本会快速上升。以早期的 1 MB 上限计算,每秒可以记录 1 MB/(10*60)=1.7 KB 的交易数据,而一般的交易数据大小在 0.2 ~ 1 KB。
需要注意,“每个区块 1 MB”是 SegWit 之前的说法。2017 年 8 月 SegWit 激活后,共识规则改用区块重量(block weight)来限制容量,上限为 4,000,000 weight units,其中基础大小(不含 witness 数据)仍受约 1 MB 约束,因此实际区块可以超过 1 MB(详见「基本原理和设计」一节)。
历史上比特币社区围绕扩容有过长期争论:若干直接调大区块的提案未能达成共识,部分设计者选择了分叉;而 SegWit 这种通过隔离见证间接提升容量的方案最终被接受并激活。
问:以太坊网络跟比特币网络有何关系?
答:以太坊网络所采用的区块链结构,源于比特币网络,基于同样设计原理。此外,以太坊提出了许多改善设计,包括支持更灵活的智能合约。需要注意的是,以太坊已经在 2022 年 9 月 15 日通过 The Merge 从 PoW 转向 PoS,不再依赖工作量证明挖矿出块。
超级账本项目
问:超级账本项目与传统公有区块链有何不同?
答:超级账本是目前全球最大的联盟链开源项目。在联盟场景下,参与多方可以容易达成一定的信任前提。另外,企业十分看重对接入账本各方的权限管理、审计功能、传输数据的安全可靠等特性。超级账本在考虑了商业网络的这些复杂需求后,提出了创新的架构和设计,成为首个在企业应用场景中得到大规模部署和验证的开源项目。
问:区块链最早是公有链形式,为何现在联盟链在很多场景下得到更多应用?
答:区块链技术出现以前,人们往往通过中心化的信任机制来实现协作,但一旦中心机制出现故障,则无法进行。区块链技术可以提供无中介化情况下的信任保障。公有链情况下,任何人都可以参与监督,可以实现信任的最大化,但随之而来带来包括性能低下、可扩展性差等问题,特别扩大到互联网尺度时存在许多目前很难解决的技术难题。
联盟链在两者之间取得了平衡。多方共识模型中,系统整体可信任度随独立参与方的增多而提升;同时,联盟的信任前提,可以选用更高性能的共识机制,并支持权限管理。这些对企业场景来说都是迫切的需求。
问:采用 BFT 类共识算法时,节点掉线后重新加入网络,出现无法同步情况?
答:这是某些算法设计导致的情况。掉线后的节点重新加入到网络中,其视图(View)会领先于其他节点。其他节点正常情况下不会发生视图的变更,发生的交易和区块内容不会同步到掉线节点。出现这种情况,可以有两种解决方案:一个是强迫其他节点出现视图变更,例如也发生掉线或者在一段时间内强制变更;另一种情况是等待再次产生足够多的区块后触发状态追赶。
问:超级账本 Fabric 里的安全性和隐私性是如何保证的?
答:首先,Fabric 1.0 及往后的版本提供了对多通道的支持,不同通道之间的链码和交易是不可见的,即交易只会发送到该通道内的 Peer 节点。此外,在进行背书阶段,客户端可以根据背书策略来选择性的发送交易到通道内的某些特定 Peer 节点。更进一步的,用户可以对交易的内容进行加密(基于证书的权限管理)或使用私密数据,同时,只有得到授权的节点或用户才能访问到私密数据。另外,排序节点无须访问到交易内容,因此,可以选择不将完整交易(对交易输入数据进行隐藏,或者干脆进行加密或 Hash 处理)发送到排序节点。最后,所有数据在传输过程中可以通过 TLS 来进行安全保护。许多层级的保护需要配合使用来获得不同层级的安全性。
实践过程中,也需要对节点自身进行安全保护,通过防火墙、IDS 等防护对节点自身的攻击;另外可以通过审计和分析系统对可疑行为进行探测和响应。
最后更新于