区块链(BlockChain),是区块(Block)和链(Chain)的直译,其数据结构如图1所示,即每个区块保存规定时间段内的数据记录,并通过密码学的方式,构建一条安全可信的链条,形成一个不可篡改、全员共有的分布式账本。

比特币的区块分为区块头和区块体两部分。区块头的大小为80字节,包括4字节的版本号、32字节(256位)的上一区块哈希值、32字节的Merkle根节点、4字节的时间戳、4字节的难度值和4字节的随机数。区块体包含10分钟内选定的交易记录,第一笔交易(coinbase交易)是用于奖励矿工比特币的特殊交易,由矿工自己添加进区块。



图1  区块链的数据结构示意图

基本概念

区块链是很多现有技术交叉融合在一起的集成创新。因此,要了解区块链,首先要了解区块链到底集成了哪些技术。

P2P网络

如图2所示,P2P(Peer-to-Peer)网络是一种端到端的网络。P2P网络分为结构化(例如基于Chord的P2P网络)和非结构化的P2P网络(例如Gnutella)。比特币的区块链采用的是非结构化P2P网络,整个网络没有中心化的硬件或管理机构,任一节点既是服务端,也是客户端。任何节点只要安装相应的客户端软件,就能接入P2P网络(例如BT软件),参与区块链的记录和验证,不超过1/3节点的损坏、退出甚至被植入恶意代码,都不会影响整个系统的运作。



图2  传统中心化系统和P2P网络的拓扑对比图

加密算法和数字签名

加密技术分为对称、非对称和哈希(Hash)加密。对称加密是指用同样的密钥来进行加密和解密,非对称加密是指用一个密钥对来进行加密和解密,哈希加密主要是通过对数据进行哈希运算,用固定的哈希结果值验证信息是否被篡改。

非对称加密

在非对称加密技术中,对外公开、分发出去的密钥叫做公钥,不能公开、自己留存的密钥叫做私钥。公钥加密的,对应的私钥才能解密。反之亦然。如图3所示。



图3  非对称加密RSA算法的简化示例图

非对称加密算法有RSA、DSA和ECC等种类,区块链使用的是基于椭圆曲线加密技术的数字签名(ECDSA),具体实现是secp256k1。ECDSA相当于是DSA和非对称加密ECC的结合。相比RSA算法,ECDSA具有计算量小、存储空间小、带宽要求低等特点。

数字签名

基于数字签名的通信机制工作原理,如图4所示,发送报文时,发送方用一个哈希函数从报文文本中生成文件摘要,然后用自己的私钥对摘要进行加密,加密后的摘要将作为报文的数字签名和报文一起发送给接收方。接收方首先用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要,接着再用发送方的公钥来对报文附加的数字签名进行解密,如果得到的明文相同,那么接收方就能确认传输的文件并未受到篡改,是安全可信的。



图4  数字签名的流程示意图

哈希加密

安全哈希算法(Secure Hash Algorithm,SHA)是由美国国家安全局研发,由美国国家标准与技术研究院(NIST)发布的一系列密码哈希函数,包括SHA-0、SHA-1、SHA-2和SHA-3等系列。比特币的区块链使用的是SHA-256哈希加密算法,于2001年发布,属于SHA-2分支。由于SHA256伪随机性的特点,只要是相同的数据输入,一定会得到相同的结果,如果输入数据稍有变化,将得到一个千差万别的结果,如图5所示。SHA256还是一个单向不可逆的算法,即根据一个输入数算SHA256的结果很容易,但根据SHA256的结果反算输入数几乎是不可能。除此之外,比特币还使用ripemd160算法来生成比特币钱包的地址。



图5  哈希加密的示意图

梅克尔树

梅克尔(Merkle)树是区块链的基本组成部分。如果没有梅克尔树,区块链也是可以运转,但是要在区块头里包含所有交易记录,扩展性方面存在很大挑战。如图6所示,区块链中的每个区块,由区块头和区块体构成,区块头中含有一个Merkle根节点的字段,通过对区块体中所有交易记录,以二叉树的形式迭代地两两拼接 、进行哈希操作,可以得到一个最终的哈希值,我们称之为Merkle根哈希。Merkle根哈希相当于是对区块中所有交易记录进行了一个快照,区块中交易记录的任意改动都可以通过比较Merkle根哈希而很容易地察觉。Merkle根哈希主要用于简单支付验证(SPV),在验证某个交易是否在区块中时,也能极大地减少网络传输成本。



图6  Merkle树示意图

工作量证明机制

工作量证明机制,简单地说,就是一种共识机制,用来确认你是否做过一定量工作的证明。比特币的区块链主要是依托计算数学难题来衡量工作量。每个区块,当选定一定数量的交易记录之后,填充版本号、时间戳、难度值,生成相应的Merkle根哈希。很容易看到,这些数值在选定交易记录以后,都是确定的,唯一能够改变的就只有随机数(Nonce)这个值。如图7所示,系统根据难度值,要求计算整个区块头的两次SHA256算法,得到的哈希结果要小于一个阈值。根据前面描述的SHA256算法的伪随机性,只有通过不断地尝试和枚举,才能找到相应的随机数,证明自己的工作量。



图7  工作量证明机制示意图

除了工作量证明机制(PoW)这类共识机制之外,还有股权证明机制(PoS)、授权股权证明机制(DPoS)、拜占庭容错机制(BFT)、实用拜占庭容错机制(PBFT)这些在不可信环境下的共识机制以及要求在可信环境下的共识机制,例如PaxOS和Raft。表1是做了简单的对比。



表1  共识机制的简单对比表

运行机制

接入网络和验证

节点通过安装相应的软件(例如比特币核心),接入区块链。节点启动以后,主要是在P2P网络上发现邻居节点、链接邻居节点、传递P2P消息和下载区块链验证。节点可以选择下载全量的区块链进行验证,或者是只下载区块头,通过Merkle树节点来进行简单支付验证(SPV)。

钱包软件可以分为移动钱包、桌面钱包、互联网钱包和纸钱包,都支持保存用户的私钥,钱包也可以根据私钥是否是种子产生的,而分为决定性钱包和非决定性钱包,关键区别在于私钥的备份和易恢复性。

区块链的存储和接受

比特币的区块链使用Berkeley DB(文件数据库)作为钱包数据库,使用LevelDB(键值数据库)存储区块的索引和UTXO(Unspent Transaction Output,未开销的比特币交易输出)。节点在启动的时候,将整个区块链的索引从LevelDB加载入内存。当收到一个新区块时,节点对新区块中的所有交易进行检测,验证交易格式、交易大小、交易签名、UTXO是否匹配、交易签名、脚本合规等方面。

如果验证成功,检查上一区块头与链头区块哈希值是否一致,如果是一致,则更新UTXO数据库和回滚交易数据库,如果不是,则将该区块放在孤儿区块池中 。当节点发现网络中存在另一条更长的区块链时,就需要断开现有的区块并对区块链进行重组。如果验证不成功,会抛弃该区块,继续等待新区块的到来(矿工会继续计算新区块的数学难题)。

区块链的工作量证明计算机制

“矿工”角色的节点一直收集网络中广播的交易记录,并致力于计算新区块的数学难题,即工作量证明。如果其他节点发来的新区块验证成功,节点除了更新UTXO数据库和回滚交易数据库,节点会立即开始下一个新区块的计算。新区块的构建优先选取交易内存池中优先级高的交易记录。优先级的计算方式为:

如果自己的工作量证明计算成功,节点会第一时间将这个区块广播至整个网络中,其他节点收到该新区块,如上所述,会进行相应的验证和存储。

整个区块链的运转机制如图8所示。



图8  区块链运转机制示意图

其他相关

脚本语言

区块链采用的脚本语言并不是图灵完备的语言,不支持循环,只能进行堆栈式操作。这种脚本语言的好处是,不允许矿工提交一个死循环的脚本,更注重的是安全方面的考量,但其扩展能力有限。从以太坊为首的区块链编程平台支持图灵完备的编程语言,引领区块链跨入2.0时代。由于支持循环等复杂操作,以太坊用Gas(燃料)机制来防止死循环的出现,确保系统的安全。

消息队列

比特币区块链采用Zero MQ(ZMQ)作为消息分发和消息队列管理工具。与很多人熟悉的RabbitMQ相比,ZMQ不像传统意义的消息服务器,更像一个底层的网络通信库,在多个线程、内核和主机盒之间弹性伸缩,在Socket API之上将网络通信、进程通信和线程通信抽象为统一的API接口。

挖矿设备和算法演进

挖矿设备从支持复杂指令(CISC)、适合串行计算的CPU矿机时代,经由基于众核体系、适合并行简单计算的GPU挖矿和低功耗却价格昂贵的FPGA挖矿,逐渐向集约高速的ASIC矿机和规模效应的矿池演进。

基于工作量证明机制的算法,容易导致矿工算力集中的问题。有人将这种“中心化”的责任归咎于SHA256算法。此时,基于SCRYPT算法的莱特币(Litecoin)进入了人们视线,其占用内存多、计算时间长、并行计算困难的特点,限制了矿工的“军备竞赛”。莱特币的成功催生了更多算法的交叉融合,衍生出串联算法(夸克币)、并联算法(HeavyCoin)和多用途算法(在工作量证明的同时,寻找大素数的素数币,PrimeCoin)。

开源项目和工具

区块链的开源项目

BitCoin

BitCoin是最早、也是现网运行区块链最成功的一个开源项目,核心技术框架采用C++开发,共识算法采用PoW,每秒交易量(TPS)为不多于7笔,开源许可协议为MIT。

  • 官方编程语言:C++

  • 开源许可协议:MIT

  • 开源项目地址:https://github.com/bitcoin/bitcoin

Ethereum

以太坊(Ethereum)是一个支持图灵完备脚本运行的区块链开发平台,基于智能合约,降低用户搭建DApp应用的门槛。目前以太坊正式运行的版本是1.0,采用的是POW共识算法,公网TPS是25笔,未来将采用类POS的Casper算法,区块链的确认速度将得到大幅提升。在规划的2.0版本中,TPS有望可以达到2000TPS。

  • 官方编程语言:Go

  • 开源许可协议:GPLv3

  • 开源项目地址:https://github.com/ethereum

Hyperledger Fabric

Hyperledger Fabric是IBM开源的区块链项目,开发环境可以适配多种环境(virtualbox虚拟机、自建网络和IBM的BlueMix),支持Docker,共识算法插件化,注重角色的权限控制和企业级的安全机制。主要开发语言是Go语言,支持JavaScript、Java和Python等语言,交易频率TPS最高能够达到100K。其子项目Iroha助力区块链移动应用程序的开发,值得关注和进一步跟踪。

  • 官方编程语言:Go

  • 开源许可协议:Apache 2.0

  • 开源项目地址:https://github.com/hyperledger/fabric

OpenChain

OpenChain 是区块链技术公司Coinprism的开源工具,目标是大型企业和金融机构,基于一种独特的分布式账本技术,帮助用户部署自己定制的区块链,减少用户的交易成本和结算时间。

  • 官方编程语言:C#

  • 开源许可协议:Apache 2.0

  • 开源项目地址:https://github.com/openchain

BitShares

比特股(BitShares)提供的BitUSD等锚定资产,是虚拟币历史上的一个最重要变革之一,消除了虚拟货币估值波动大的问题。比特股创新地提出了DPoS共识算法,核心技术框架采用C++语言开发,既适用于公有链,也适合于联盟链。在比特股2.0中,交易频率TPS最高能够达到100K。

  • 官方编程语言:C++

  • 开源许可协议:MIT

  • 开源项目地址:http://github.com/bitshares

Ripple

瑞波(Ripple)是世界上第一个开放的支付网络,也是目前最成功的区块链技术公司。其核心产品Ripple协议本质上是一个实时结算系统,通过引入新的共识机制RPCA,只要特殊节点投票,就能在很短时间内完成交易的验证和确认。

  • 官方编程语言:C++

  • 开源许可协议:ISC

  • 开源项目地址:https://github.com/ripple/rippled

Tendermint

美国公司Tendermint推出的Tendermint是第一个实施分片技术的公共区块链。Tendermint主核心负责管理所有区块链分区,支持比特币分区和以太坊分区,具有很大的灵活性,共识引擎通过Tendermint套接字协议(TMSP)与应用程序进行连接,不依赖于某一特定的编程语言,所以开发人员可以使用任意一种编程语言来编写智能合约。

  • 官方编程语言:Go

  • 开源许可协议:Apache2.0

  • 开源项目地址:https://github.com/tendermint/tendermint

Corda

Corda是R3CEV于2016年12月初开源的区块链平台,采用一种类区块链的分布式账本,基于产业标准工具,通过创新智能合约和数据处理,为金融服务设计一种新型分布式的分类帐平台。

  • 官方编程语言:Go

  • 开源许可协议:Apache2.0

  • 开源项目地址: https://www.corda.net/

具体对比图如表2所示。



表2  开源项目的对比表

以太坊的集成开发环境(IDE)

Remix是以太坊官方IDE,它允许开发者在以太坊区块链创建和部署合约及去中心化应用。它包含一个Solidity源代码排错器,Solidity是以太坊开发的智能合约语言,可以将智能合约代码编译成以太坊虚拟机(EVM)可识别的字节码。此外,如要和以太坊节点交互,主要用到的Web3.js API;与节点进行底层交互,需要用到JSON RPC API。以太坊主流项目的对比如表3所示。



表3  以太坊主流项目的对比表

程序必备区块链基础知识相关推荐

  1. 区块链基础知识与关键技术解析

    区块链基础 1. 区块链的来龙去脉     1.1 区块链技术起源     1.2 比特币产生背景与现状     1.3 数字货币概念     1.4 比特币技术原理 2. 区块链概念与产业现状   ...

  2. 区块链 - 区块链基础知识:交易哈希链

    区块链 - 区块链基础知识:深入了解交易哈希链 本文的主题是执行有关交易哈希链. 交易池的角色以及 一个最长的区块链如何永远占据主导. 讨论的细节包括以下内容: 事务哈希链的实现细节 交易池的角色 为 ...

  3. 【问链财经-区块链基础知识系列】 第三十五课 区块链跨境贸易完全简析

    一.跨境贸易存在的问题 在国际跨境贸易中,数据和信息无疑是贯穿整个业务流程的重要要素,数据流的打通对于国际跨境贸易至关重要.然而,恰恰是因为数据在业务中所扮演的重要角色,其对各参与方而言都是私密且重要 ...

  4. 区块链基础知识系列 第一课 区块链网络简介

    区块链是一种分布式分类帐技术 (DLT),通过建立新一代事务性应用程序的新信任度.可计帐性和透明度,来简化业务流程.区块链网络首次引入到了比特币兑换市场,但其实际使用范围远远超出了加密数字货币事务处理 ...

  5. 【问链财经-区块链基础知识系列】 第四十四课 邮储银行:U链福费廷业务系统

    一.案例摘要 福费廷业务是银行根据客户或其他金融机构的要求,在开证行.包买行或其他指定银行对信用证项下的款项做出付款承诺后,对应收款进行无追索权的融资.邮储银行以企业级开源区块链平台 Hyperled ...

  6. 【问链财经-区块链基础知识系列】 第四十一课 中外银行跨境业务运用区块链技术创新案例对比

    中国作为贸易大国,国际贸易和内外贸一体化的市场规模庞大.近年来,随着"走出去"和"一带一路"国家战略的深化,企业层面的跨境支付与结算业务将迎来新的市场契机.加之 ...

  7. 【问链财经-区块链基础知识系列】 第三十二课 从区块链溯源来看农产品链的设计

    在区块链的应用场景中,农产品溯源和食品溯源一直是翻来覆去讲的故事,但实际上溯源是一个伪命题,农产品和食品的加密上链实现溯源看起来很丰满,然而现实却很骨干.我们经常忘记了初心:溯源的目的是为了什么? 农 ...

  8. 【问链财经-区块链基础知识系列】 第十九课 区块链应用于电子存证

    编者按:在传统的具有法律效益的存证需要第三方权威公证处进行公证,并且需要绑定时间戳和相关信息,步骤繁琐,进度比较慢,后来存证电子化后一定程度上提高了效率.节省了成本,但也会有一些其他的问题,比如第三方 ...

  9. 【问链财经-区块链基础知识系列】 第十八课 区块链应用于贷款结算

    编者按:在金融业务中,企业或个人向金融机构进行借贷,产生贷款业务,贷款结算是当贷款所有本金.利息和费用都收回后,贷款即告结清.贷款结清是信贷资金的风险已不存在,贷款安全回收,并为银行带来了收益.那结合 ...

最新文章

  1. 【硬核解说】一口气讲明白Angular的5种路由守卫RouteGuard是嘛玩意儿
  2. python神经结构二层_《python深度学习》笔记---8.3、神经风格迁移
  3. 生成,保存和转换pcd点云文件
  4. 利用circpedia 数据库探究circRNA的可变剪切
  5. linux每日命令(27):chmod命令
  6. 前后端分离开发,日志应该如何进行记录,在出现问题的时候,方便定位问题
  7. Unity3D 预设打包的注意事项
  8. 第十章 基本数据结构——链表
  9. ios 主题切换 思路_iOS 使用 NSObject 的分类实现快速切换主题
  10. 面向小姐姐的编程——java面向对象之final、static关键字
  11. 三个火一个木组成的燊怎么读,燊是什么意思?
  12. html 二级菜单延迟消失,让HTML5通知在延迟后消失? - Let HTML5 Notification disappear after a delay? - 开发者知识库...
  13. 伺服电机抖动原因分析
  14. python之while循环、无限循环
  15. 1038: 绝对值最大
  16. paip 破解网站手机验证码
  17. 零基础学java(6)——面向对象的基本特征
  18. When you gather it, things would be counted. ​​​​
  19. NOIP2017 游记
  20. Android Framework开发大揭秘!从小白到大佬的进阶之路

热门文章

  1. 一周AI回顾 | 南沙设立人工智能视觉图像研发中心,旷视科技C轮筹资4.6亿美元
  2. 短视频如何写爆款文案?爆款短视频文案技巧分享
  3. 【显著性物体检测】【ECCV2018】Reverse Attention for Salient Object Detection【论文笔记】
  4. 【论文阅读】Can Spatiotemporal 3D CNNs Retrace the History of 2D CNNs and ImageNet?
  5. 领取奖品html页面,我的奖品.html
  6. [MM32生态]如何使用不带SLCD控制器的MCU IO直接驱动段码屏
  7. 微信小程序体验版数据加载不了,打开调试模式下才行(在微信开发者工具上也能加载数据)
  8. 基于java的学生考试成绩分析程序
  9. 流程管理-测试面试题
  10. 2019校园招聘 ——百度、京东、苏宁等产品经理面试经验总结