区块链架构剖析

本文深入解析区块链的基本概念,包括区块链的定义、分布式特性、去中心化模式、架构设计原则及比特币和以太坊的架构特点。涵盖了区块链技术的核心要素,如共识算法、密码学原理、智能合约和图灵完备计算环境。

区块链的基本定义

#定义1:区块链
1.一个分布式的链接账本,每个账本就是一个“区块”;
2.基于分布式的共识算法来决定记账者;
3.账本内交易由密码学签名和哈希算法保证不可篡改;
4.账本按产生时间顺序链接,当前账本含有上一个账本的哈希值,账本间的链接保证不可篡改;
5.所有交易在账本中可追溯。

#定义2:分布式
分布式 是一种计算模式,指在一个网络中,各节点通过相互传送消息来通信和协调行动,以求达到一个共同目标。
在区块链中,分布式包括“完全去中心化”、“部分去中心”和“部分中心”3中模式,分别对应区块链的3中部署模式:“公共链”、联盟链和私有链。分布式意味着在区块链网络中不存在一个中心点,该节点负责生成、修改、保管所有账本。

#定义3:完全去中心
一种网络的架构模式,在该模式下网络没有拥有者,完全对外开放。网络中每个节点都可选择拥有相同的权限。在完全区中心的区块链网络上,所有的节点都可以读写区块链数据,都可作为记账的候选节点参与共识流程,有机会参与账本的生成和记账。

#定义4:部分去中心
一种网络架构模式,在该模式下网络属于一个联盟共同所有,网络只对联盟成员开放。网络中每个节点被赋予不同权限。在“部分去中心”的区块链网络上,节点根据所赋予权限读写区块链数据,参与共识流程以及参与账本的生成和记账。

#定义5:部分中心
一种网络架构模式,在该模式下网络属于一个所有者,网络只对所有者内部成员开放。网络中每个节点被赋予不同权限。在部分中心的区块链网络上,节点根据所赋予权限读写区块链数据,参与共识流程以及参与账本的生成和记账。

#定义6:架构
架构由两个层面的涵义。一个是静态层面的,主要是勾画系统边界、结构、组成的组件以及组件之间的关联关系;另一个是动态层面,主要是规范组件的行为以及组件之间的交互协议。根据一个IT系统的架构,可以界定该系统的功能特性和一些非功能特性。
例如:对于Bitconin,它的功能可以使虚拟货币的发行和流通,是支付,结算和清算,保证不可“双花”、交易不可篡改、交易可追溯;非功能特性则包括安全措施(签名、加密、隐私保护等)以及平均出块实间、每秒交易量等。

架构设计要考虑不断变化的和恒久不变的两方面。一个由长久生命力的系统都有一个设计高明的架构,其精髓在于架构能支持系统功能的变化、发展、演化,允许系统功能不断变化,也就是架构必须提供的灵活性。而系统对易用性、安全性、稳定性和性能却应该是恒久不变的,因此IT架构的设计必须强调非功能特性,其中开放性、可扩展性、可移植性、可维护性、灵活性、安全性、性能(响应时间、吞吐率、并发数等)最为重要。

区块链也会因部署模式的不同而有不同的架构。比如公共链、联盟链、私有链和侧链。多种区块链架构的出现也使得链与链之间的集成、整合成为挑战,因此互联链(Interledger)的概念也应运而生。

区块链1.0架构:比特币区块链

比特币架构总体上分为两部分,一部分是前端,包括钱包(Wallet)或图形化界面;另一部分是运行在每个节点的后台程序,包括挖矿、区块链管理、脚本引擎以及网络管理等功能。
#前端:
移动钱包(Mobile Wallet)、桌面钱包(Desktop Wallet)、客户端(HTTP/JSON RPC API)、命令行接口(bitcoin-cli)、浏览器(Explorer)、图形界面开发工具(QT)

1.钱包:钱包保存用户的私钥数据库,并管理用户的余额,提供比特币交易(支付、转账)功能。钱包分为两种:非决定性钱包和决定性钱包。
1).非决定性钱包(Nondeterministic Wallet):该类钱包直接保存私钥,私钥数据保存在Berkeley DB上。所谓决定性(deterministic),指的是私钥是否由种子生成。如果是就叫决定性,反之就叫非决定性。非决定性钱包因为直接保存私钥,如果私钥被盗窃,钱包里的比特币就会被盗走。因此非决定性钱包的安全性不高。
2)决定性钱包(Deterministic Wallet):该类钱包所有的私钥都由一个私钥种子(Seed)通过单向哈希算法生成,因此备份此钱包非常容易,只要备份私钥种子,就可以利用种子一次性恢复所有的私钥。目前建议使用的一个钱包。决定性钱包又分两种类型,类型1是普通决定性钱包,其私钥种子直接生成所有私钥;类型2是层级决定性钱包(Hierarchical Deterministic Wallet),它的私钥保存在一个树形结构,由一个总私钥生成父私钥,父私钥生成子私钥等。

钱包从部署场景来说,分为移动钱包、桌面钱包、互联网钱包以及纸钱包。

移动钱包:运行在智能手机、移动终端的轻量级钱包。一般不会下载整条区块链,而是多数采用一种叫“简化支付验证”(Simplif ied Payment Verif ication SPV)的方法验证交易。这种钱包也叫SPV钱包。该方式依靠网络上的可信任节点查询所有区块的区块头,以及按照交易的确认数(相当于黑客攻击的难度),再有就是能否在相应的区块中找到该笔交易来验证支付的真伪。移动钱包的有点是灵活方便,缺点是因为不保存整条区块链,不做交易的全验证,因此安全性不是特别好。

桌面钱包:一种是厚钱包(Thick Wallet),另一种是薄钱包(Thin Wallet),厚钱包下载整条区块链,并进行完整的交易校验。比特币核心就是一个厚钱包。它提供完整的钱包功能,包括签名、钱包加密、备份、密钥导入、导出等。薄钱包不下载整条区块链,而是采用SPV等方式来验证与用户相关的支付交易。厚钱包的优点是安全,缺点是有交易全验证的开销,适合于资金安全性要求高的场景,比如非小额支付等场景。薄钱包的优点是灵活高效,但安全性不高,适合于小额支付场景。

互联网钱包也不下载整条区块链。其优点是可以在任何地方。任何设备管理钱包。互联网钱包依托第三方平台提对用户隐私的保护。互联网钱包也和桌面薄钱包一样由安全性不高的问题,但使用起来更灵活方便。

纸钱包用于将私钥进行冷备份,可以用于防范由于电脑或USB介质损坏所造成的私钥丢失。

2.HTTP/JSON RPC API
比特币提供HTTP/JSON RPC API接口,供外部通过接口控制比特币节点。当运行比特币核心bitcoin-qt传入-sever选项时,或运行bitcoind时,比特币提供一个HTTP/JSON RPC服务端,外部程序可以通过 JSON RPC API来访问比特币节点。缺省情况下该服务器端只允许访来自同一机器的客户端访问,开放任意机器进行远程访问是非常危险的,也是不建议的做法。
使用不同语言编写的程序可以方便地通过HTTP/JSON RPC API接口方访问比特币节点。例如:Bitcoin-JSON-RPC-Client是一个轻量级的Java客户端程序。

3.命令行工具
bitcoin-cli提供一个命令行工具来控制比特币节点。该命令行工具通过JSON RPC API接口访问比特币后台bitcoind。用户可以通过发命令来完成比特币的各项功能,例如:查询余额、支付、转账等。

4.比特币浏览器bx
比特币提供一个跨平台的C++libbitcoin库,该库支持比特币全节点服务端和浏览器(BitCoin Explorer(bx))作为客户端命令行工具。比特币浏览器命令提供与bitcoin-cli基本一样的功能。但同时bx提供bitcoin-cli没有的一些密钥管理功能和处理工具,包括对类型2决定性(type 2 deterministic)密钥管理、主语记忆的代码(mnemonic code)的密钥生成(例如用易于记忆的词汇作为私钥种子)、隐秘地址、支付和查询支持。

5.图形开发工具(Qt)
比特币核心是比特币使用最广的客户端,它是使用C++开源用户界面开发工具Qt所开发的桌面客户端。Qt是一个跨平台的C++图形用户界面应用程序框架。它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序。Qt是完全面向对象的,很容易扩展,并且允许真正的组件编程。Qt支持更多的平台(包括Microsoft Windows、GNU/Linux、Mac OS X、Android、iOS、WinCE、UNIX家族等)。

#节点后台
区块链管理、交易验证、内存池管理、邻节点管理、共识( Consensus)、规则(Policy)、密码(Crypto)、数字签名(Sec256kl)、脚步引擎(Script)、HTTP/JSON RPC 服务器(RPC)、数据库(LevelDB、BerkeleyDB)、P2P网络管理、队列管理(ZMQ)、挖矿节点【CPU挖矿(Cpuminer)、CPU挖矿(Cgminer)、ASIC挖矿(bfgminer)、矿池挖矿(bitminer)

比特币节点后台负责参与比特币网络的通信互联,维护区块链,验证区块、交易,广播、转播传递区块交易信息。比特币的后台程序主要是bitcoind,以及挖矿节点程序构成。比特币核心bitcoin-qt实际上是包含前后端(除挖矿功能以外)的一体化节点。下面简单介绍比特币后端组件的功能。

1.区块链管理
区块链管理涉及初始化区块链下载、链接区块、断开区块、校验区块和保存区块,以及发现最长链条的顶区块。区块链管理的代码逻辑都在main.cpp程序中实现。
1)下载区块链:在比特币全节点第一次加入网络运行时,先要下载并验证整条区块链。当区块链的容量不断增大时,要下载整条链的世界就会越来越长,在网络速度低的环境下,甚至要几天时间才能完成整条链的下载。2014年,比特币0.10.0版本正式发布一个新的初始化区块链下载方式,叫“区块报头先行”(header first)。当它下载了所有的区块报头之后,节点可以并行地从多个邻节点同时下载不同区间的区块,大大提升了整条区块链的下载速度。
2)接受区块链:现有节点在开启时会先将整个区块链的索引从LevelDB调进内存。需要注意的是,该区块链的索引不是单挑的链,而可能是一个树,也就是说每个区块只有一个父区块,但可能有多个子区块,因为子区块形成暂时分叉,需要逐渐发现哪个子区块属于最长的链条。按比特币的挖矿难度设计,在整个网络中新区块产生的速度被动态地调节在10分钟左右。一个节点接收到另一个新区块,如果该区块包含的指向前区块的区块头哈希值与节点当前顶端区块哈希值相同时,该节点会尝试连接新接收的区块,并将其作为当前链条的最顶端区块,从而延伸节点所拥有的区块链。这是因为在区块链中,每个区块都保存有前个区块的区块头哈希值,并通过这个方式来链接区块。
3)区块链验证:在区块链管理中,连接区块函数ConnectBlock()是一个检测“双花”交易的关键。该函数对新接收的区块中的所有交易进行检测,验证是否每个交易的比特币来源都能在当前的“尚未花比特币”(UNspend Transaction Output,UTXO)记录中找到匹配。在网络延迟情况下,节点接收的区块可能不按顺序到达,在这种情况下,有些交易的比特币来源可能在UTXO记录中暂时找不到,但当后面收到延迟到来的区块后,UTXO记录会被更新,区块链条会链接起来。
区块验证流程图
4)重组区块链:当节点发现网络中由一条不基于它当前区块链的一条更长区块链时,它需要断开现有的‘区块链并对区块链进行重组。大部分重组只是一个区块的重组,多发生在不同矿工几乎同时挖到合法的区块时。断开区块、重组区块链设计UTXO更该,被断开的区块中交易会回退到交易内存池(mempool),这个时候“回滚”记录就可以用来回滚断开区块中的交易。回滚记录将用于断开现有区块。

2.区块验证
交易验证模块会基于以下条件检查收到的比特币交易是否合规:

  1. 交易的格式是数据结构 必须正确;
  2. 交易的输入和输出不能为空;
  3. 交易的大小不能超出定义的区块最大值MAX_BLOCK_SIZE;
  4. 每个交易的输出,以及所有输出的合计,必须在一定范围内,也就是大于0,小于2100比特币;
  5. 交易输入的哈希值不能为0,不应该转播挖矿(coinbase)交易;
  6. nLocktime小于等于INT_MAX;
  7. 交易的字节大小要等于或大于100;
  8. 交易的签名操作数要小于签名操作的上限;
  9. 解锁脚本(scriptSig)只能把数字放入堆栈,锁定脚本(scriptPubkey)必须是标准格式;
  10. 和收到的交易相匹配的交易必须能在当前交易池或是主链上某个区块找到;
  11. 对交易的每个输入,如果其对应的UTXO输出能在当前交易池中找到,该交易必须拒绝(双花交易),因为当前交易池是未经记录在区块链中的交易,而交易的每个输入应该来自确认的UTXO,如果在当前交易池中找到,那就是双花交易;
  12. 对交易的每个输入,如果其对应的UTXO输出不能在主链或当前交易池中找到,该交易是一个孤儿交易,应将该交易放入孤儿交易池中;
  13. 对交易中的每个输入,如果其对应的UTXO输出是一个挖矿初始(coinbase)交易,该初始交易应该获得100个确认区块的确认;
  14. 对交易中的每个输入,其对应的输出必须是UTXO(存在且没被花掉);
  15. 用对应的输出交易来获得输入的值,检查每个输入的值及其合计,应该在允许的区间(0~2100万比特币);
  16. 如果一个交易的输入合计小于输出总计,则拒绝该交易;
  17. 如果交易的费用太低,则拒绝该交易;
  18. 每个输入的解锁脚本(unlocking script)必须和相应输出的锁定脚本(locking script)共同验证交易的合规性。

最后一个是检查,不容易理解缺失比特币平台设计的精髓。比特币的一个很大的创新是依靠脚本来验证交易的合法性,即每一个将要花掉的比特币必须由相对应的来源。简单来说,比特币交易中的输入(input)和输出(output)都由脚本和数值组成。通过比特币的脚本引擎,在一个简单的堆栈式计算平台上执行。

3.内存池管理
比特币内存池(mempool)管理也就是交易池管理。节点通过验证的交易放在一个交易池中,准备放在一个挖到的区块中。当矿工挖到一个合格的区块后,他将按一定的优先级次序从交易池中选出交易放到区块中。优先级是按交易中输入对应的UTXO的“链龄”和交易额的大小来划分的。越老的UTXO的交易以及交易额越大的交易优先级越高。

优先级(Priority)采用以下公式计算:
Priority = SUM(Value of input x output Age)/ Transaction Size

比特币区块中的前50k字节保留给高优先级的交易。高优先级的交易费即使是0都会被包括进区块链的优先区域。

4.邻节点管理
当一个新比特币节点做初始化启动(bootstrap)的时候,它需要发现网络中的其他节点,并与至少一个节点连接。一般是与一个已知的节点在8333端口建立TCP连接。连接的“握手”流程发送一个版本信息,包括:P2P协议版本,本节点支持的服务,当前实践,对方节点IP地址,本节点IP地址,比特币软件系统,以及本节点当前区块链的长度。对方节点收到握手信息会回复一个收到确认的消息。

新节点如何发现邻节点
1)用一些“DNS种子”查询DNS,“DNS种子 ”是提供比特币节点地址的DNS服务器。比特币核心带来5个不同的“DNS种子”。DNS种子可提供稳定的比特币节点地址。
2)直接把一个已知的邻节点作为种子节点,然后通过它发现更多的邻节点。当发现新的邻节点后,新节点一般将断开和种子节点的连接。新节点将其地址信息发送给邻节点,邻节点会继续将新节点的地址转发给它们的邻节点,这样新的节点会在网络上被其他节点知道,并保持其在网络上连接的畅通。

5.共识管理
比特币里广义的共识管理(Consensus)应该包括挖矿、区块验证和交易验证规则。由于比特币的关键是在陌生P2P环境建立共识机制,因此共识管理至关重要。

6.规则管理
比特币的共识规则是所有节点都必须遵守的规则(policy)。而每个节点可以采用一些共识规则以外的个性化规则。这部分的规则由规则管理模块实现。

7.密码模块
密码模块(Crypto)主要是处理比特币地址,采用RIMEMD和SHA-256算法以及Base-58编码来生成比特币地址。比特币的公钥是通过私钥产生的,然后采用Secure Hash Algorithm(SHA)算法SHA256和RACE Integrity Primitives Evaluation Message Digest(RIPEMD)算法RIPEMD160对公钥进行处理,最后通过Base58编码形成比特币地址。

8.签名模块
比特币采用椭圆曲线数字签名算法(ECDSA)来实现数字签名以及生成公钥。ECDSA是一种非对称加密算法,是基于椭圆曲线离散对数问题的计算困难性的一种公钥密码的方法。secp256k1曲线。

9.脚本引擎
比特币的脚本语言是一种专门设计的与“Forth”类似的、基于堆栈的编程脚本(script)语言。基于堆栈的语言的指令只按顺序执行一次,也就是说没有循环或跳转指定。因此脚本的指令数给我们一个程序运行实践的上限和所需的内存上限。这种基于堆栈的运算平台不是图灵完备的运算平台。
常用比特币脚本指令表
10.挖矿
很多人觉得比特币挖矿很神秘,其实简单说就是:不断对区块报头进行哈希处理,每次尝试改变一个随机数,直到区块报头的哈希值符合一定的条件,比如说起始必须有多少个零,才算挖到一个合格的区块。

11、HTTP/JSON RPC 服务端
该组件对外提哦功能HTTP和JSON RPC的接口,外部程序可以通过JSON RPC接口来调用比特币的API,达到控制比特币节点的功能。比特币在启动的时候,初始化程序init.cpp会启动HTTP/JSON RPC服务端的线程组。该接口缺省是仅接收来自本机的客户端连接请求。

12.Berkeley DB和LevelDB数据库
比特币用Berkeley DB做钱包数据库。
比特币的区块原始数据不存放在数据库中,而只是作为文件类型存放在硬盘上。在系统的目录是block/blk*.dat. 这个主要是用来快速搜索钱包缺少的交易记录,或者重组本地区块链的不同部分,同时给外部的节点提供区块链的同步服务。
LevelDB用来存储区块的索引和UTXO记录。

13.P2P网络管理
P2P网络管理的代码主要是在P2P网络上实现和其他邻节点的通信功能。这些功能包括:发现邻节点;连接并管理与邻节点的Socket连接;与邻节点交换不同的P2P消息(这些消息包含区块和交易);有时在特殊情况下,会禁止异常行为的邻节点的连接。

14.ZMQ队列管理
比特币采用Zero MQ作为消息队列管理和消息分发工具。ZMQ是一个简单好用的传输层,提供像框架一样的一个socket library,使得Socket编程更加简单、简洁,性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。

区块链2.0架构:以太坊区块链

核心理念:把区块链作为一个可编程的分布式信用基础设施,支撑智能合约应用,以与过去比特币区块链作为一个虚拟货币支撑平台区别开来。
以太坊架构以太坊架构
1.账户设计
以太坊的设计是将区块链作为一个通用的管理对象状态转换的去中心化平台,账户就是有状态的对象。外部所有账户的状态就是余额,而合约账户的状态可以是余额、代码执行情况,以及合约的存储。

2.区块链设计
比特币采用Merkle树来将交易的哈希值按一定算法组成二叉树状结构,顶层节点的哈希值相当于整个交易清单的指纹,可以用来校验交易清单。以太坊采用Merkle Patricia数来实现对交易和状态的校验和查询。

3.PoW机制
以太坊的PoW(工作量证明)算法叫Ethash算法(是一个经过修改的Dagger-Hashimoto算法),该算法主要寻找一个随机数作为输入,使得运算结果小于一个特定的难度门槛。PoW机制的前提是,不存在币逐个试更好的找到该随机数的方法,同时验证结果必须非常方便且成本小。

以太坊是通过动态调控难度来达到平均每15s在全网中找到一个新区块的。每15s的“心跳”基本上是全网更新系统状态的节奏,并保证当攻击者的计算能力不超过全网的计算能力的一半时,攻击者无法改写交易记录或进行分叉(以便进行双花交易)。这就是所谓的“51%”攻击。
以太坊的交易费用按以下公式计算:

Total cost=gasUsed x gasPrice

其中gasUsed是执行该交易所消耗的燃料,燃料的价格由用户和矿工决定,一般来说在用户建一个交易的时候,可以提一个燃料价格。

4.计算和图灵完备
在以太坊上,一个和比特币非常大的不同点就是选择了图灵完备的计算环境-----以太坊虚拟机(EVM)。

5.EVM高级语言
6.以太坊P2P网络
7.事件
以太坊的事件是一个以太坊日志和事件检测的协议的抽象。

区块链3.0架构:超越货币、金融范围的区块链应用

应用场景:自动化采购、智能化物联网应用、供应链自动化管理、虚拟资产兑换、转移、产权登记等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值