区块链技术基础

一、区块链技术特点

区块链可以理解为是基于区块链技术形成的公共数据库。而区块链技术是比特币的底层技术,包含现代密码学、分布式一致性协议、点对点网络通信等技术,这些技术通过一定的规则协议,最终形成区块链技术。有如下特点

  • 去中心化——区块链数据的存储、传输、验证等过程均基于分布式的系统结构,整个网络中不依赖一个中心节点。公共链网络中所有参与的节点都可以具有同等的权利与义务。
  • 可靠数据库——区块链系统中的数据库采用分布式存储,任一参与节点都可以拥有一份完整的拷贝。在比特币中,除非能控制系统中超过一半以上的算力,否则在节点上对数据库的修改都将是无效的。
  • 安全可信——区块链技术采用非对称密码对交易进行签名,使得交易不能被伪造;同时利用哈希算法保证交易数据不能被轻易篡改,最后借助分布式系统各节点的工作量证明等共识算法形成强大的算力来抵御破坏者的攻击,保证区块链中的区块及区块内的交易数据不可篡改和不可伪造,因此具有极高的安全性。

著名的开源项目有比特币以太坊Hyperledger等。

二、区块链技术基础

1、数据区块

在区块链技术中,数据以区块的方式永久储存。区块按时间顺序逐个先后生成并连接成链,每一个区块记录了创建期间发生的所有交易信息。区块的数据结构一般分为区块头和区块体。其中,区块头用于链接到前一个区块并且通过时间戳特性保证历史数据的完整性;区块体则包含了经过验证的、区块创建过程中产生的所有交易信息。
这里写图片描述

//这段代码摘自比特币源代码中区块头的定义
/** 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;
	.......

2、挖矿

并不是所有的区块链都有挖矿这个概念,一般公有链才有挖矿,区块在挖矿过程中产生。挖矿,实际上就是穷举随机数算法,找到一个随机数Nonce使得计算出来的哈希值满足一定的条件,以获得该区块的记账权,同时获取系统给的一定数量的比特币奖励。

3、哈希函数

参考另一篇博文:哈希算法及在区块链中的应用

4、双重支付(double-spending)

双重支付问题又称为“双花”问题,即利用货币的数字特性用“同一笔钱”完成两次或多次支付。这个问题引申出来的就是如何保证每一笔数字现金都只会被花掉一次,避免重复支出。比特币运行的底层技术区块链技术很大程度上就是在解决这个问题以及“拜占庭将军问题”。这里只简述相关概念。

在传统的金融和货币体系中,由于金钱货币是物理实体,具有客观唯一存在的属性,所以可以避免双重支付的情况。但在其他的电子货币系统中,则需要可信的第三方管理机构提供保证。区块链技术则在去中心化的系统中不借助任何第三方机构而只通过分布式节点之间的相互验证和共识机制,有效地解决了双重支付问题,在信息传输的同时完成了价值转移。

5、P2P网络

P2P网络技术是区块链系统连接各对等节点的组网技术,在比特币出现之前,P2P网络计算技术已被广泛用于开发各种应用,如即时通讯软件、文件共享和下载软件、网络视频播放软件、计算资源共享软件等。

三、区块链运作的核心技术

1、区块链的链接

区块链是由一个个区块组成的链,每个区块分为区块头和区块体两部分。区块主体只负责记录前一段时间内的所有交易信息,区块链的大部分功能都由区块都实现。
这里写图片描述

2、共识机制

区块链是分布式的,如何在没有中心控制的情况下,在互相没有信息基础的个体之间就交易的合法性等达成共识?这里就需要共识机制去解决。区块链的共识机制目前主要有4类:PoW、PoS、DPoS、分布式一致性算法。这里只简要概述,详见:http://blog.csdn.net/s_lisheng/article/details/78022645

2.1 PoW

PoW,比特币中采用的就是这个,矿工通过把网络尚未记录的现有交易打包到一个区块,然后不断遍历尝试来寻找一个随机数Nonce,使得新区块加上随机数的哈希值满足一定的难度条件。找到满足条件的随机数,就确定了区块链最新的一个区块,获得了区块链的本轮记账权。矿工把满足难度条件的区块在网络中广播出去,全网其他节点在验证该区块满足挖矿难度条件,同时区块里的交易数据符合协议规范后,将各自把该区块链接到自己版本的区块链上,从而在全网形成对当前网络状态的共识。

  • 优点:完全去中心化,节点自由进出,避免了建立和维护中心化信用机构的成本。只有网络破坏者的算力不超过网络总算力的50%,网络的交易状态就能达成一致。
  • 缺点:目前比特币挖矿造成了大量的资源浪费;挖矿的激励机制也造成了矿池算力的高度集中,背离了去中心化的初衷。更大的问题是PoW机制的共识达成的周期较长,每秒最多做7笔交易,不适合商业应用。
2.2 PoS

PoS权益证明,要求节点提供拥有一定数量的代币证明来获得竞争区块链记账权的一种分布式共识机制。如果单纯依靠代币余额来决定记账者必然使得富有者胜出,导致记账权的中心化,降低共识的公正性,因此不同的PoS机制在权益证明的基础上,采用不同的方式来增加记账权的随机性来避免中心化。例如点点币PoS机制中,拥有最长链龄的比特币获得记账权的几率就越大。

  • 优点:在一定程度上缩短了共识达成的时间,降低了PoW机制的资源浪费。
  • 缺点:破坏者对网络攻击的成本低,网络安全性有待验证。另外拥有代币数量大的节点获得记账权的几率更大会使得网络的共识受少数富裕账户支配,从而失去公正性。
2.3 DPoS

与PoS的主要区别在于节点选举若干代理人,由代理人验证和记账。

  • 优点:大幅缩小参与验证和记账节点的数量,可以达到秒级的共识验证。
  • 缺点:有可能不适用于完全去中心化的场景。在网络节点数少的场景,选举的见证人的代表性不强。
2.4 分布式一致性算法

分布式一致性算法是基于传统的分布式一致性技术。其中有分为解决拜占庭将军问题的拜占庭容错算法,如PBFT。另外解决非拜占庭问题的分布式一致性算法(Paxos、Raft),该类算法目前是联盟链和私有链场景中的常用的共识机制。

  • 优点:实现秒级的快速共识机制,保证一致性。
  • 缺点:去中心化程度不如公有链上的共识机制;更适合多方参与的多中心商业模式。

3、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详解

展开阅读全文

没有更多推荐了,返回首页