区块链简介
区块链定义
区块链可以理解为是基于区块链技术形成的公共数据库。而区块链技术是比特币的底层技术,包含现代密码学、分布式一致性协议、点对点网络通信等技术。下图是区块链技术架构,大致可以看到是这些技术通过一定的规则协议,最终形成区块链技术。
区块链分类
以参与方分类,区块链可以分为:公共链、联盟链、私有链。
公共链
公共链就是对外公开,任何人都可以参与。公共链是真正意义上的完全区去中心化的区块链,它通过密码学保证交易不可篡改,同时利用密码学验证以及经济上的奖励,在互为陌生的网络环境中建立共识,从而形成去中心化的信用机制。比特币和以太坊都是公共链。比特币:https://bitcoin.org/;以太坊:https://www.ethereum.org/
联盟链
仅限于联盟成员参与,区块链上的读写权限、参与记账权限按联盟规则来制定。Hyperledger项目属于联盟链。Hyperledger:http://cn.hyperledger.org/
私有链
仅限私有组织使用,区块链上的读写权限、参与记账权限按私有组织规则来制定。
特点
去中心化
区块链数据的存储、传输、验证等过程均基于分布式的系统结构,整个网络中不依赖一个中心节点。公共链网络中所有参与的节点都可以具有同等的权利与义务。
可靠数据库
区块链系统中的数据库采用分布式存储,任一参与节点都可以拥有一份完整的拷贝。在比特币中,除非能控制系统中超过一半以上的算力,否则在节点上对数据库的修改都将是无效的。
安全可信
区块链技术采用非对称密码雪原理对交易进行签名,使得交易不能被伪造;同时利用哈希算法保证交易数据不能被轻易篡改,最后借助分布式系统各节点的工作量证明等共识算法形成强大的算力来抵御破坏者的攻击,保证区块链中的区块及区块内的交易数据不可篡改和不可伪造,因此具有极高的安全性。
区块链的应用
这个不多说了,简单以下图所示:
基本概念
数据区块
在区块链技术中,数据以区块的方式永久储存。区块按时间顺序逐个先后生成并连接成链,每一个区块记录了创建期间发生的所有交易信息。区块的数据结构一般分为区块头和区块体。其中,区块头用于链接到前一个区块并且通过时间戳特性保证历史数据的完整性;区块体则包含了经过验证的、区块创建过程中产生的所有交易信息。
- //这段代码摘自比特币源代码中区块头的定义
- /** Nodes collect new transactions into a block, hash them into a hash tree,
- * and scan through nonce values to make the block's hash satisfy proof-of-work
- * requirements. When they solve the proof-of-work, they broadcast the block
- * to everyone and the block is added to the block chain. The first transaction
- * in the block is a special one that creates a new coin owned by the creator
- * of the block.
- */
- class CBlockHeader
- {
- public:
- // header
- int32_t nVersion;
- uint256 hashPrevBlock;
- uint256 hashMerkleRoot;
- uint32_t nTime;
- uint32_t nBits;
- uint32_t nNonce;
- .......
挖矿
区块在挖矿过程中产生。挖矿,实际上就是穷举随机数算法,找到一个随机数Nonce使得计算出来的哈希值满足一定的条件,以获得该区块的记账权,同时获取系统给的一定数量的比特币奖励。
哈希函数、Merkle树
参考另一篇博文:http://blog.csdn.net/s_lisheng/article/details/77937202
双重支付(double-spending)
双重支付问题又称为“双花”问题,即利用货币的数字特性用“同一笔钱”完成两次或多次支付。这个问题引申出来的就是如何保证每一笔数字现金都只会被花掉一次,避免重复支出。比特币运行的底层技术区块链技术很大程度上就是在解决这个问题以及“拜占庭将军问题”。这里只简述相关概念。
在传统的金融和货币体系中,由于金钱货币是物理实体,具有客观唯一存在的属性,所以可以避免双重支付的情况。但在其他的电子货币系统中,则需要可信的第三方管理机构提供保证。区块链技术则在去中心化的系统中不借助任何第三方机构而只通过分布式节点之间的相互验证和共识机制,有效地解决了双重支付问题,在信息传输的同时完成了价值转移。
P2P网络
P2P网络技术是区块链系统连接各对等节点的组网技术,不同于中心化网络模式,P2P网络中各节点的计算机地位平等,每个节点有相同的网络权力,不存在中心化的服务器。所有节点间通过特定的软件协议共享部分计算资源、软件或者信息内容。在比特币出现之前,P2P网络计算技术已被广泛用于开发各种应用,如即时通讯软件、文件共享和下载软件、网络视频播放软件、计算资源共享软件等。P2P网络技术是构成区块链技术架构的核心技术之一。
加密算法
非对称加密算法是指使用公私钥对数据存储和传输进行加密和解密。公钥可公开发布,用于发送方加密要发送的信息,私钥用于接收方解密接收到的加密内容。常用的非对称加密算法有RSA和ECC。非对称加密算法的过程如下图所示。区块链正是使用非对称加密的公私钥对来构建节点间信任的。
以比特币为例,在⽐特币系统中,我们⽤公钥加密创建⼀个密钥对,⽤于控制⽐特币的获取。密钥对包括⼀个私钥,和由其衍⽣出的唯⼀的公钥。公钥⽤于接收⽐特币,⽽私钥⽤于⽐特币⽀付时的交易签名。公钥和私钥之间的数学关系,使得私钥可⽤于⽣成特定消息的签名。此签名可以在不泄露私钥的同时对公钥进⾏验证。⽀付⽐特币时, ⽐特币的当前所有者需要在交易中提交其公钥和签名(每次交易的签名都不同,但均从同⼀个私钥⽣成)。⽐特币⽹络中的所有⼈都可以通过所提交的公钥和签名进⾏验证,并确认该交易是否有效,即确认⽀付者在该时刻对所交易的⽐特币拥有所有权。
数字签名(Digital Signature)
基本概念
- 目的:保证信息传输的完整性、发送者的身份认证、防止交易中的抵赖发生。
- 实现过程:数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。
- 数字签名是个加密的过程,数字签名验证是个解密的过程。
- 数字签名是非对称密钥加密技术与数字摘要技术的应用。
基本原理
首先要了解什么叫非对称加密和消息摘要。
1. 非对称加密
在通信双方,如果使用非对称加密,一般遵从这样的原则:公钥加密,私钥解密。同时,一般一个密钥加密,另一个密钥就可以解密。
因为公钥是公开的,如果用来解密,那么就很容易被不必要的人解密消息。因此,私钥也可以认为是个人身份的证明。
如果通信双方需要互发消息,那么应该建立两套非对称加密的机制(即两对公私钥密钥对),发消息的一方使用对方的公钥进行加密,接收消息的一方使用自己的私钥解密。
2.消息摘要
消息摘要可以将消息哈希转换成一个固定符长度的值唯一的字串。值唯一的意思是不同的消息转换的摘要是不同的,并且能够确保唯一。该过程不可逆,即不能通过摘要反推明文。
利用这一特性,可以验证消息的完整性。
3.数字签名
假设现在有通信双方A和B,两者之间使用两套非对称加密机制。
现在A向B发消息。
那么,如果在发送过程中,有人修改了里面密文消息,B拿到的密文,解密之后得到明文,并非A所发送的,信息不正确。
要解决两个问题:1. A的身份认证 2. A发送的消息完整性 那么就要用到上面所讲的基础知识。
数字签名的过程如下图:
简单解释:
A:将明文进行摘要运算后得到摘要(消息完整性),再将摘要用A的私钥加密(身份认证),得到数字签名,将密文和数字签名一块发给B。
B:收到A的消息后,先将密文用自己的私钥解密,得到明文。将数字签名用A的公钥进行解密后,得到正确的摘要(解密成功说明A的身份被认证了)。
对明文进行摘要运算,得到实际收到的说明消息没有被篡改(消息完整性)。
区块链运作的核心技术
区块链的链接
区块链是由一个个区块组成的链,每个区块分为区块头和区块体两部分。区块主体只负责记录前一段时间内的所有交易信息,区块链的大部分功能都由区块都实现。
共识机制
区块链是分布式的,如何在没有中心控制的情况下,在互相没有信息基础的个体之间就交易的合法性等达成共识?这里就需要共识机制去解决。区块链的共识机制目前主要有4类:PoW、PoS、DPoS、分布式一致性算法。
这里只简要概述,详见:http://blog.csdn.net/s_lisheng/article/details/78022645
PoW
PoW,比特币中采用的就是这个,矿工通过把网络尚未记录的现有交易打包到一个区块,然后不断遍历尝试来寻找一个随机数Nonce,使得新区块加上随机数的哈希值满足一定的难度条件。找到满足条件的随机数,就确定了区块链最新的一个区块,获得了区块链的本轮记账权。矿工把满足难度条件的区块在网络中广播出去,全网其他节点在验证该区块满足挖矿难度条件,同时区块里的交易数据符合协议规范后,将各自把该区块链接到自己版本的区块链上,从而在全网形成对当前网络状态的共识。
- 优点:完全去中心化,节点自由进出,避免了建立和维护中心化信用机构的成本。只有网络破坏者的算力不超过网络总算力的50%,网络的交易状态就能达成一致。
- 缺点:目前比特币挖矿造成了大量的资源浪费;挖矿的激励机制也造成了矿池算力的高度集中,背离了去中心化的初衷。更大的问题是PoW机制的共识达成的周期较长,每秒最多做7笔交易,不适合商业应用。
PoS
PoS权益证明,要求节点提供拥有一定数量的代币证明来获得竞争区块链记账权的一种分布式共识机制。如果单纯依靠代币余额来决定记账者必然使得富有者胜出,导致记账权的中心化,降低共识的公正性,因此不同的PoS机制在权益证明的基础上,采用不同的方式来增加记账权的随机性来避免中心化。例如点点币PoS机制中,拥有最长链龄的比特币获得记账权的几率就越大。
- 优点:在一定程度上缩短了共识达成的时间,降低了PoW机制的资源浪费。
- 缺点:破坏者对网络攻击的成本低,网络安全性有待验证。另外拥有代币数量大的节点获得记账权的几率更大会使得网络的共识受少数富裕账户支配,从而失去公正性。
DPoS
与PoS的主要区别在于节点选举若干代理人,由代理人验证和记账。
- 优点:大幅缩小参与验证和记账节点的数量,可以达到秒级的共识验证。
- 缺点:有可能不适用于完全去中心化的场景。在网络节点数少的场景,选举的见证人的代表性不强。
分布式一致性算法
分布式一致性算法是基于传统的分布式一致性技术。其中有分为解决拜占庭将军问题的拜占庭容错算法,如PBFT。另外解决非拜占庭问题的分布式一致性算法(Paxos、Raft),该类算法目前是联盟链和私有链场景中的常用的共识机制。
- 优点:实现秒级的快速共识机制,保证一致性。
- 缺点:去中心化程度不如公有链上的共识机制;更适合多方参与的多中心商业模式。
解锁脚本
脚本是区块链上实现自动验证、自动执行合约的重要技术。脚本类似一套规则,它约束着接收方怎样才能花掉这个输出上锁定的资产。交易和合法性验证也依赖于脚本。锁定脚本和解锁脚本。
锁定脚本是在输出交易上加上的条件,通过一段脚本语言来实现,位于交易的输出。解锁脚本只有满足锁定脚本要求的条件,才能花掉这个脚本上对应的资产,位于交易的输入。解释脚本是通过类似编程领域里的“虚拟机”,它分布式运行在区块链网络里的每一个节点。
比特币中的脚本机制相对简单,以太坊深入增强了脚本机制,发展成了支持脚本的一套图灵完备语言,该脚本语言通过“虚拟机”执行,可以说,以太坊实现了一个支持图灵完备脚本语言的区块链平台。
交易规则
区块链的交易就是构成区块的基本单位,也是区块链负责记录的实际有效内容。一个区块交易可以是一次转账,也可以是智能合约的部署等其他事务。就比特币而言,交易即指一次支付转账。其交易规则如下:
- 交易的输入和输出不能为空。
- 对交易的每个输入,如果其对应的UTXO输出能在当前交易池中找到,则拒绝该交易。因为当前交易池是未被记录在区块链中的交易,而交易的每个输入,应该来自确认的UTXO。如果在当前交易池中找到,那就是双花交易。
- 交易中的每个输入,其对应的输出必须是UTXO。
- 每个输入的解锁脚本必须和相应输出的锁定脚本共同验证交易的合规性。
对于以太坊来说,交易还可能是智能合约的部署。交易规则就确定了符合一定语法的规则的合约才能被部署在区块链上。
交易优先级
区块链交易的优先级由区块链协议规则决定。对于比特币而言,交易被区块包含的优先次序由交易广播到网络上的时间和交易额的大小决定。随着交易广播到网络上的时间的增长,交易的链龄增加,交易的优先级就被提高,最终会被区块包含。对于以太坊而言,交易的优先级还与交易的发布者愿意支付的交易费用有关,发布者愿意支付的交易费用越高,交易被包含进区块的优先级就越高。
Merkle证明
比特币的Merkle树
Merkle树的一个重要应用是快速支付验证。轻量级节点不用下载每一笔交易以及每一个区块,可以仅下载链的区块头,如下面这段代码,数据块头部大小为80字节。如果一个轻客户端希望确定一笔交易的状态,它可以简单地要求一个Merkle证明,显示出一个在Merkle树特定的交易。
- //摘自比特币源码
- class CBlockHeader
- {
- public:
- // header
- int32_t nVersion;
- uint256 hashPrevBlock;
- uint256 hashMerkleRoot;
- uint32_t nTime;
- uint32_t nBits;
- uint32_t nNonce;
- CBlockHeader()
- {
- SetNull();
- }
- ADD_SERIALIZE_METHODS;
- template <typename Stream, typename Operation>
- inline void SerializationOp(Stream& s, Operation ser_action) {
- READWRITE(this->nVersion);
- READWRITE(hashPrevBlock);
- READWRITE(hashMerkleRoot);
- READWRITE(nTime);
- READWRITE(nBits);
- READWRITE(nNonce);
- }
- void SetNull()
- {
- nVersion = 0;
- hashPrevBlock.SetNull();
- hashMerkleRoot.SetNull();
- nTime = 0;
- nBits = 0;
- nNonce = 0;
- }
- bool IsNull() const
- {
- return (nBits == 0);
- }
- uint256 GetHash() const;
- int64_t GetBlockTime() const
- {
- return (int64_t)nTime;
- }
- };
(如果对比特币源码感兴趣,在这里:https://github.com/bitcoin)
以太坊中的就复杂些,以太坊的每一个区块头中并非只包含一棵Merkle树,而是包含了3棵Merkle树。下图是以太坊的Merkle证明树:
这里还没有理解,深入理解可以参考这篇博文——Merkle Patricia Tree详解:http://ethfans.org/posts/588
RLP
RLP(Recursive Length Prefix,递归长度前缀编码)
是Etherenum中对象序列化的一个主要编码方式,其目的是对任意嵌套的二进制数据的序列进行编码。以太坊中的所有数据都以RLP形式存储,这种编码格式将任意长度和维度的字符串构成的数组串连接成字符串。更多参考:https://github.com/ethereum/wiki/wiki/RLP
区块链交易流程
以比特币的交易为例,区块链的交易并不是通常意义上的一手交钱一手交货的交易,而是转账。如果每一笔转账都需要构造一笔交易数据会比较笨拙,为了使得价值易于组合与分割,比特币的交易被设计为可以纳入多个输入和输出,即一笔交易可以转账给多个人。从生成到在网络中传播,再到通过工作量证明、整个网络节点验证,最终记录到区块链,就是区块链交易的整个生命周期。整个区块链交易流程如下图所示:
- 交易的生成——所有者A利用他的私钥对前一次交易和下一位所有者B签署一个数字签名,并将这个签名附加在这枚货币的末尾,制作成交易单。(B以公钥作为接收方地址)
- 交易的传播——A将交易单广播至全网,每个节点都将收到的交易信息纳入一个区块中。(对B而言,该笔比特币会即时显示在比特币钱包中,但直到区块确认成功后才可用。目前一笔比特币从支付到最终确认成功,得到6个区块确认之后才能真正确认到账)
- 工作量证明——每个节点通过相当于解一道数学题的工作量证明机制,从而获得创建新区块的权力,并争取得到数字货币的奖励。(新比特币在此过程中产生)
- 整个网络节点验证——当一个节点找到解时,它就向全网广播该区块记录的所有盖时间戳交易,并由全网其他节点核对。(时间戳用来正式特定区块必然于某特定时间是的确存在的,比特币网络采取从5个以上节点获取时间,然后取中间值的方式作为时间戳)
- 记录到区块链——全网其他节点核对该区块记账的正确性,没有错误后他们将在该合法区块之后竞争下一个区块,这样就形成了一个合法记账的区块链。(每个区块的创建时间大约在10分钟。随着全网算力的不断变化,每个区块的产生时间会随算力增强而缩短、随算力减弱而延长。其原理是根据最近产生的2016个区块的时间差,自动调整每个区块的生成难度,使得每个区块的生成时间是10分钟)
补充——比特币难度调整公式
新难度计算公式: .
补充概念
拜占庭将军问题
“拜占庭将军问题”就是军中可能有叛徒,将军们无法互相信任,又相隔较远,能否找到一种分布式协议让他们远程协商,以保证进攻的一致性。由此引申到计算领域,发展成了一种容错理论。
拜占庭容错技术(Byzantine Fault Tolerance,BFT)是一类分布式计算领域的容错技术。拜占庭假设是对现实世界的模型化,由于硬件错误、网络拥塞或中断以及遭到恶意攻击等原因,计算机和网络可能出现不可预料的行为。拜占庭容错技术被设计用来处理这些异常行为,并满足所要解决的问题的规范要求。
UTXO(Unspent Transaction Outputs,未花费交易输出)
Unspent Transaction Outputs,未花费交易输出,它是比特币交易过程中的基本单位。
公钥密码体制(Public-key cryptography)
公钥密码体制分为三部分:公钥、私钥、加密解密算法。加密是指通过加密算法和公钥/私钥对内容(明文)进行加密,得到密文,加密过程需要用到公钥;解密是通过解密算法和私钥/公钥对密文进行解密,得到明文,解密过程需要用到解密算法和私钥。
公钥密码体制的公钥和算法都是公开的(这也是公钥密码体制名称的来源),私钥是保密的。针对不同的用途,可选择采用公钥还是私钥进行加密,再用对应的私钥或者公钥进行解密。
加密算法分为对称加密算法和非对称加密算法。对称加密算法中,加密的密钥和解密的密钥是相同的;非对称加密算法中,加密使用的密钥和解密使用的密钥是不相同的。比特币的区块链上使用的是非对称加密算法中比较典型的代表“椭圆曲线算法”(ECC)。
私钥的生成一般是通过在一个密码学安全的随机源中取出一长串随机字节,对其使用SHA256哈希算法进行运算,这样就可以方便地产生一个256位的数字。如果运算结果小于n-1(其中n=1.158*1077,略小于2256),我们就有了一个合适的私钥。否则,我们就用另一个随机数再重复一次。公钥的生成可通过加密算法从私钥中获得,而反向从公钥推到出私钥被证明几乎不可能。
比特币钱包
比特币钱包是个形象的概念,比特币本身是由一对数字密钥(私钥、公钥)来决定归属,因为拥有私钥就能拥有对应地址比特币的处置权,可以说私钥就等同于比特币,所以通常将管理这些数字密钥的软件称为“钱包”。
图灵完备
一个能计算出每个图灵可计算函数(Turing-computable function)的计算系统被称为图灵完备的。一个语言是图灵完备的,意味着该语言的计算能力与一个通用图灵机 (Universal Turing Machine)相当,这也是现代计算机语言所能拥有的最高能力。
参考资料
[1]. 比特币深度分析:http://lib.csdn.net/article/67/46910?knId=1797
[2]. https://bitcoin.org/en/faq
[3].数字签名原理简介: http://www.cnblogs.com/SirSmith/p/4985571.html
[4].拜占庭将军问题深入探讨: http://www.8btc.com/baizhantingjiangjun
[5]. 谈谈以太坊的Merkle树:http://www.8btc.com/merkling-in-ethereum
[6]. An introduction to Digital Signatures:http://www.youdzone.com/signature.html