大家好,我是比特桃。本系列主要将我之前学习区块链技术时所做的笔记,进行统一的优化及整合。其中大量笔记源于视频课程:北京大学肖臻老师《区块链技术与应用》公开课。肖老师的课让我找回了求知若渴般的感觉,非常享受学习这门课的过程。当我看到区块链难度根据区块之间的间隔自动调整的时候;当我看到双重签名,通过控制反转来解决收款人签名的时候;当我知道区块恋、TheDAO、美链贼有意思的故事的时候;当我听到:不要被学术界的思维限制了头脑,不要被程序员的思维限制了想象力,尽信书不如无书的时候……都让我畅快淋漓,欲罢不能!我还记得有一天晚上,看到 BTC 巧妙的设计后,当场直接拍案而起,妙极了!推荐对区块链感兴趣的同学听一下这门课,把握时代机遇,共创美好未来。
注:本系列笔记尽量阐述基础知识细节,但还是需要数据结构相关知识和一定的编程基础。
(系列笔记更新中……更新完后将统一整合目录)
区块链技术源自中本聪在 2008 年发表的《Bitcoin-Whitepaper》,并在 2009 年创立了 BTC (比特币)网络,开发出第一个区块,即创世区块
。有人将该技术称为下一代的价值互联网 WEB 3.0、伟大的发明并与工业革命相提并论。也有人说是庞氏骗局、割韭菜的工具、一文不值。虽然区块链技术的首次应用的确是 BTC,但其背后涵盖大量的计算机、分布式、密码学等多技术的交叉融合。在目前阶段,我们应当正视区块链的技术的应用。不用过分吹捧,也不必不屑一顾。目前,区块链技术正在高速发展,基于区块链技术的上层应用具有巨大价值。希望大家保持理性,不要错过区块链这么有价值的技术。
十四五规划中区块链已成为七大数字产业之一,是国家着重发展的技术。多项扶持政策陆续出台,迎来了发展机遇。区块链的产业生态也在更加繁荣,越来越多的企业加入了产业建设中。区块链正在解决具体的商业问题,大规模的应用正在到来。与其他技术 IOT 通讯等技术的融合发展,正在深刻改变产业协作中的生产关系。夯实数字经济可信链接的基础设施,产业协作的数字化浪潮已经到来。这将刺激产业经济,迸发出新的活力,释放出巨大的产业新动力。
区块链作为 BTC 的底层技术,本质上是一个去中心化的数据库。是指通过去中心化和去信任的方式集体维护一个可靠数据库的技术方案。区块链技术是一种不依赖第三方、通过自身分布式节点进行网络数据的存储、验证、传递和交流的一种技术方案。因此,有人从金融会计的角度,把区块链技术看成是一种分布式开放性去中心化的大型网络记账薄,任何人任何时间都可以采用相同的技术标准加入自己的信息,延伸区块链,持续满足各种需求带来的数据录入需要。
通俗一点说,区块链技术就指一种全民参与记账的方式。所有的系统背后都有一个数据库,可以把数据库看成是就是一个大账本。那么谁来记这个账本就变得很重要。目前就是谁的系统谁来记账,微信的账本就是腾讯在记,支付宝的账本就是阿里在记。但现在区块链系统中,系统中的每个人都可以有机会参与记账。在一定时间段内如果有任何数据变化,系统中每个人都可以来进行记账,系统会评判这段时间内记账最快最好的人,把他记录的内容写到账本,并将这段时间内账本内容发给系统内所有的其他人进行备份。这样系统中的每个人都了一本完整的账本。这种方式,我们就称它为区块链技术。
区块链技术被认为是互联网发明以来最具颠覆性的技术创新,它依靠密码学和数学巧妙的分布式算法,在无法建立信任关系的互联网上,无需借助任何第三方中心的介入就可以使参与者达成共识,以极低的成本解决了信任与价值的可靠传递难题。
从区块链的形成来看其具有如下特点:
区块链系统采用去中心化的组织形式,整个系统非常的扁平化不存在中心化的权威机构或者层级结构管理机构,通过分布式节点间博弈来达到整个系统的自适应,确保了系统整体的稳定性。区块链目前被普遍认为是一种颠覆性
的新兴技术,其最大的创新性在于重构了弱信用主体间的信任关系,从而避免了之前依赖中心化的具有高信用的中介机构的方式。这种重建信用体系的方式并非基于个人或者权威机构,而是依赖于共识算法和密码学,具有公开透明的特点。
区块链甚至可以帮助建立全球的去中心化信用体系,让价值传递可以像互联网信息传递一样的便捷,基于这样的方式可以重新构建新型的经济生态体系。以金融行业的清算和结算业务为例,传统中心化的数据库因无法解决多方互信问题,使得每个参与方都需要独立维护一套承载自己业务数据的数据库,这些数据库实际上是一座座信息孤岛,造成清结算过程耗费大量人工进行对账,目前的清结算时间最快也需按天来计。如果存在一个多方参与者一致信任的数据库系统,则可显著减少人工成本及缩短结算周期。
区块链目前被业界认为是引发产业革命的核心要素之一,其去中心化,去中介化,及难篡改,可追溯性,安全可靠等特点以及其发展前景乃至对社会带来的深刻影响都已经获得了广泛的认可。
一般来说业界会按照区块链中心化程度将区块链划分为公有链,联盟链和私有链三类。
公有链通常对加入网络的节点没有限制,节点可以自由的加入或退出网络,每个节点具有平等的权利参与到整个区块链平台的运行中,同时公链的区块链网络也是完全去中心化分布式的组织结构。也正是由于这种组织结构的灵活性就需要对区块链系统的网络扩展能力、可支撑节点数量,共识机制的可扩展性、容错能力、效率方面提出了更高的要求。在公链中每个节点都共享整个区块链系统的账本,无疑对系统的隐私性,安全性构成了巨大的挑战。最后还要对节点进行一定的激励,促使节点可以持续的维护下去从而对整个网络的持续运行作出贡献。比特币和以太坊就是典型的公链。
联盟链则弱化了公链完全去中心化的特性,做到了部分中心化或者多中心化以此来换得更好的性能和更低的维护成本,以便更好的满足企业对于区块链平台的期许。联盟链中的节点通常分属于不同的组织或者联盟,对于想要加入的节点需要获得中心化或者权限较高节点的授权,区块链的维护规则需要由联盟链的参与方协调定制。联盟链适用于小范围的数据交换频繁的组织间共享数据服务等的应用场景,比如跨境汇款结算等业务。超级账本就是非常典型的联盟链平台。
私有链是一种中心化满足特定需求的区块链平台,不对外提供服务或者选择性的开放少许接口,重点满足组织内部的数据管理和审计的区块链平台。
比特币,以太坊,超级账本,三个典型的技术架构体系:
区块链网络的 P2P 协议最主要的作用是节点间通信,将分布在不同地理位置的节点通过网络和 P2P 协议连接起来,节点间传输的内容主要是交易数据和区块数据。在区块链网络中,节点时刻监听网络中广播的数据,当接收到邻居节点发来的新交易和新区块时,其首先会验证这些交易和区块是否有效,包括交易中的数字签名、区块中的工作量证明等,只有验证通过的交易和区块才会被处理(新交易被加入正在构建的区块,新区块被链接到区块链)和转发,以防止无效数据的继续传播。
去中心化的区块链由多方共同管理维护,其网络节点可由任何一方提供,当缺乏准入机制时,部分节点可能并不可信,因而需要支持更为复杂的拜占庭容错(Byzantine Fault-Tolerant,BFT),像超级账本(Hyperledger Fabric)添加了准入机制,只有被授权的节点才能加入网络,因此采取更高效的不容错的RAFT算法。但是在公链场景下,并没有节点准入机制,并且节点数远远高于联盟链场景,导致并不适用BFT算法。同时也为了解决节点自由进出可能带来的女巫攻击(sybil attack)问题,比特币应用了工作量证明(Proof of Work,PoW)机制。其是一种基于哈希函数的工作量证明算法。比特币要求只有完成一定计算工作量并提供证明的节点才可生成区块,每个网络节点利用自身计算资源进行哈希运算以竞争区块记账权,只要全网可信节点所控制的计算资源高于 51%,即可证明整个网络是安全的。
女巫攻击是指攻击者通过创建大量的假名身份来破坏网络服务的信誉系统,并使用它们获得不成比例的巨大影响力。
比特币、以太坊和超级账本在区块链数据结构、数据模型和数据存储方面各有特色。在数据模型的设计上,比特币采用了基于交易的数据模型,每笔交易由表明交易来源的输入和表明交易去向的输出组成,所有交易通过输入与输出链接在一起,使得每一笔交易都可追溯;以太坊与Hyperledger Fabric 需要支持功能丰富的通用应用,因此采用了基于账户的模型,可基于账户快速查询到当前余额或状态。
在数据存储的设计上,因为区块链数据类似于传统数据库的预写式日志,因此通常都按日志文件格式存储;由于系统需要大量基于哈希的键值检索(如基于交易哈希检索交易数据、基于区块哈希检索区块数据),索引数据和状态数据通常存储在Key-Value 数据库,如比特币、以太坊与超级账本都以 LevelDB数据库存储索引数据。
智能合约是一种用算法和程序来编制合同条款、部署在区块链上且可按照规则自动执行的数字化协议。由于早期计算条件的限制和应用场景的缺失,智能合约并未受到研究者的广泛关注,直到区块链技术出现之后,智能合约才被重新定义。区块链实现了去中心化的存储,智能合约在其基础上则实现了去中心化的计算。
比特币脚本是嵌在比特币交易上的一组指令,由于指令类型单一、实现功能有限,其只能算作智能合约的雏形。以太坊提供了图灵完备的脚本语言Solidity、Serpent与沙盒环境以太坊虚拟机(Ethereum Virtual Machine)简称EVM
,以供用户编写和运行智能合约。超级账本的智能合约被称为链码(Chaincode),其选用 Docker 容器作为沙盒环境,Docker 容器中带有一组经过签名的基础磁盘映像及 Go 与 Java 语言的运行时和 SDK,以运行 Go 与 Java 语言编写的链码。
比特币平台上的应用主要是基于比特币的数字货币交易。以太坊除了基于以太币的数字货币交易外,还支持去中心化应用( Decentralized Application,Dapp),Dapp 是由 JavaScript 构建的Web 前端应用,通过 JSON-RPC 与运行在以太坊节点上的智能合约进行通信。超级账本主要面向企业级的区块链应用,并没有提供数字货币,其应用可基于 Go、Java、Python、Node.js 等语言的SDK 构建,并通过 gPRC 或 REST 与运行在超级账本节点上的智能合约进行通信。
简单来说,网络层保证了节点连通,共识层保证了节点间数据的一致性,数据层高效的组织了区块链中各种数据,智能合约层由用户定义了一套规则用于产生符合具体逻辑的数据,应用层则被用来对外提供各种服务。