对论文《区块链技术综述》 的学习
注:本篇中图片来自于论文《区块链技术综述》张亮 2017
侵删
1) 节点构造新的交易,并将新的交易向全网进行广播。
2) 接收节点对收到的交易进行检验,判断交易是否合法,通过检验后,交易将被纳入一个新区块中。
3) 全网所有矿工节点对上述区块执行共识算法,选取 打包节点。
4) 通过共识算法,该节点将其打包的新区块全网广播。
5) 其他节点通过校验打包节点的区块,经过数次确认后,该区块追加到区块链中。
特币系统的数据结构如图,比特币中的交易被组织成为默克尔树结构。交易均被存储在默克尔树的叶子节点上,通过两两合并哈希直至得到根节点。根节点的哈希值作为一个区块头的元素,除此之外,区块还包括时间戳、Nonce和前一区块哈希值等。Nonce是矿工完成工作量证明算法时的输入,也是矿工获取奖的凭证。区块头包含前一区块的哈希值使得每一个区逻辑上以链的方式串联起来。
默克尔树结构可使得在仅有部分节点的情况下,快速验证交易的有效性,该方式大大减少节点的存储空间并应用于轻节点。
分布式账本≠区块链
分布式账本指可以带多个站点、不同地理位置或者多个机构组层的网络里实现共同治理及分享的资产数据库,分布式账本技术指实现分布式账本的技术的集合。
账本是一系列包含交易和信息得数据结构,账本可以记录多方资金的往来记录,物品交换记录等信息。
区块链中的账本由于账本在所有参与节点中复制,并且交易被组织成块,然后块被组成逻辑上的链,因此区块链是一部不断增长的账本。
加密货币≠数字资产
一般数字资产特指排除加密货币的其他资产,例如电子文档、图片和音视频文档等。
根据区块链系统的构建目标,账本会呈现出不同的形态,本节从长账本的所有权和账本的个数为度介绍账本的特点。
区块链的节点可开放自由的参与,形成自治的系统,为了更好的适应区块链系统,大多数系统采用对等式网络即P2P网络来进行数据传播。 P2P网络中的每个节点均会承担网络路由、验证区块数据、传播区块数据、发现新节点等功能。为鼓励区块链中的节点有效的参与共识过程,区块链的共识算法往往包含两个部分,一是设计合理的经济激励机制,二是公平选取特定的打包节点。
传统分布式系统的评价标准:
对应于区块链系统,有人提出“不可能三角”评价标准,对任意的区块链系统不可能很好的同时满足这三个方面。
传统的共识算法也称作分部一致性算法,他们大多不考虑拜占庭容错问题,如:
矿工通过不断地尝试随机数使得计算得到的哈希值小于难度值,找到合适的随机数后便将其广播出去,其他节点对其进行验证。因此,算力越高的节点更有几率得到记账权。
具有很高的去中心化程度,最高可抵抗50%攻击。POW中的区块是概率确定的,也就是说追加在该区块上的区块越多,该区块的确定性就越高。
比特币系统认为至少有6个区块确认才能认为该区块是确定的,比特币系统每秒只能处理7笔交易,因此一笔交易的确认至少需要一个小时,这种效率有时是难以容忍的。(没懂)
当拜占庭节点总数占所有节点总数不超过1/3时,拜占庭将军问题才可以解决。
原始的BFT算法分为两种两种协议:
1999年提出的实用拜占庭PBFT算法解决了传统BFT算法信息传输复杂度过高的问题。PBFT的过程分为三个阶段:预准备、准备、提交。该算法可以很快地达到最终结果,但是PBFT不适用于节点较多的联盟链和私有链。
PBFT 主要解决原始 BFT 共识算法效率不高的 问题,将通信的复杂度从指数级降低到二次方的级别,使其能够在实际系统中使用。当系统中的拜占庭节点个数少于总数的 1/3 时,BFT 共识算法就可以正确的运行并保证区块链系统的可靠性。
2013年提出的委托权益证明算法,即系统中每个节点可以将其持有的股份权益作为选票授予一个 代表,希望参与记账并且获得票数最多的前 N 个代表节点将进入“董事会”,按照既定的时间表轮流对交易进行打包结算、并且生产新区块。
该系统其不仅能够很好地解决 PoW 浪费能源和矿池对去中心化构成威胁的问题,也能够弥补 PoS 中拥有记账权益的参与者未必希望参与记账的缺点。
DPoS 共识算法可与 PBFT 一起使用,首先通过 DPoS 的方式在区块链系统中选取一定数量的出块者,当出块者生成一个区块后,用 PBFT 算法在所有出块者中进行区块 共识,当 PBFT 共识过程结束才能将区块记录在账本中。
DPOS算法下,用户用过抵押一定数量的权益成为记账候选人,其他用户利用投票的结果来确定记账候选人的排名,得票最多的几个节点拥有某个时间片的记账权。
在“不可能三角”的评价体系中,任何的共识 算法都无法达到三个特性的最好状态,那么就需要 在三个特性中进行权衡。PoW 选择了去中心化和安全性,可用性很低。PoS 相对于 PoW 节约能源,但是依然不够灵活。PBFT 算法保证了去中心化和安全性,但存在大规模节点时可用性较差。DPoS 算法选择了高可用性和安全性,但是去中心化程度较低。
目前的区块链系统中还没有最好的共识算法,只能通过在权衡系统需求达到特定的目标。在保证区块链系统安全性的同时,要不断提升可用性以适用于大规模的应用落地,同时在满足一定的去中心化程度的情况下使系统中的用户积极的参与到共识中来,使所有参与投票、共识、验证的节点能够从中获利,所以共识算法的经济激励也是不可或缺的一部分。充分让系统中的资源流通和让用户交互、参与,才能使区块链系统稳固的运行下去。
定义:一个智能合约是一套以数字形式定义的承诺,包括参与方可以在这上面执行这些承诺的协议。
这些承诺指的是合约参与方同意的权利与义务,并且在智能合约中定义了明确的实施办法。区块链技术可以很好地支持智能合约,智能智能合约是传统合约的数字化版本,在区块链上是可执行的程序。
与传统程序一样,区块链智能合约拥有接口部分,接口可以接受和响应外部消息,并对外部的消息处理和存储。
基于区块链的智能合约是一段沙盒环境中的可执行程序,与传统程序不同,智能合约更强调事物,智能合约本身它也是一项事物产生的程序。
智能合约的输入、输出、状态变化均存在于区块链,也就是需要在节点间共识算法基础上完成。它是为了让能够被条件触发执行的函数能够按照调用者的意志准确的执行,在预设条件下,能够自动强制的执行合同条款,实现“代码即法律”的目标。
智能合约在共识和网络的封装之上,隐藏了区块链网络中各节点的复杂行为,同时提供了区块链应用层的接口,是的区块链技术应用前景广阔。智能合约也是区块链的一项重要功能,它标志着区块链不再仅仅是加密货币,而可以形成基于区块链的服务,及BaaS。智能合约是的区块链可以承载可编程的程序,运行去中心化的应用和构建需要信任的合作环境。
比特币脚本从功能上完成账户之间的转账和转账的有效性检验,其脚本具有一定的扩展性。但脚本的缺点也很明显,脚本处于在交易的数字阶段,逻辑部分与数据部分耦合,缺乏灵活性;指令扩展容易造成系统安全隐患;脚本的指令功能非图灵完备。
图灵完备:一切可计算的问题都能计算,这样的虚拟机或者编程语言就叫图灵完备的。
比特币的脚本系统是图灵不完备的,而一些Token的智能合约系统是图灵完备的。
图灵完备和图灵不完备各有其优势,图灵不完备会更安全些,图灵完备会更智能些。
在加密货币中,类似智能合约的功能是:
1)验证过交易中的签名是否正确
2)验证交易的输入和输出金额是否匹配
3)更新输入和输出账户的余额状态
受加密货币脚本语言的影响,具备图灵完备运行环境的区块链系统的只能胡月通常是定义若干合约,这些合约包含初始状态、转换规则、触发条件以及对应的操作;然后通过提交事务,经过共识算法后,合约安装部署到区块链上;区块链可以实时监控整个智能合约的状态,当某一新事务满足一定条件从而触发合约对应的条款执行;新的事物经过共识后,该事务的输入输出和合同内的状态变化均记录在链上。
以太坊为例,首先以太坊的账户分为外部账户和合约账户,外部账户只能以交易的形式发送消息,从而产生事务,这种事务可以是普通的交易,创建一个合约或调用某一合约。如果事务是创建一个合约,那么会产生一个 合约账户,如果事务是调用某一合约,对应的合约条款即代码将会被激活执行,代码对状态操作变化将被记录在区块链上。
智能合约不是直接运行在区块链节点所知的环境中,因为合约代码如果直接操作区块链,尤其是写区块链的数据,会导致合约不受管制,破坏区块链结构,威胁到区块链节点的安全,因此智能合约必须在隔离的沙箱环境中运行。
合约运行环境和宿主系统之间、合约和合约之间被沙箱环境有效的隔离,这既符合解耦合的设计也提升了智能合约的安全性。目前,主流区块链平台对沙箱的主要支持包括虚拟机和容器。
以太坊环境下智能合约采用高级程序语言实现, solidity 编程语言中,contract 关键字定义了一份合约, 合约由一组代码和数据组成,合约数据的共享规则由合约制定者设置。下例中,SimpleStorage 是一份合约, storedData 是该合约中的一个字段,set和 get函数规定了 该合约的 storedData 字段会被区块链上任意一个人读取和修改。
contract SimpleStorage
{
unit storeData;
function set(unit x)
{
storeData = x;
}
function get() constant returns (unit retVal)
{
return storedData;
}
}
为了保证账本的完整性、公开性、隐私保护、不可篡改、可校验等一系列特性,区块链技术高度依赖密码学。正是密码学的一些理论研究和技术特性,使得公有链的所有节点能一定程度上达到公平、安全、可信赖。
一个哈希函数是指将任意长度的字符串映射到 一个固定长度为l 的字符串,记为 H:{0,1}* → {0, 1}l。 一个哈希函数 H(x)可以认为是在一个映射集合中查找 x 对应的值,如果 x 不在该映射集合中,那么计算一个数 y,并且在上述映射集合中将y赋值给 H(x)。一个“好” 的哈希函数通常具有
加解密贯穿于密码学之中,公钥密码学又叫非对称密码学,是相对对称密码学而言。在对称密码学中, 加解密使用相同的密钥,在非对称密码学中,使用公私钥对完成加解密。常用求大数分解和离散对数困难问题原理产生非对称密码学的公私钥对。通常公钥对外公布, 私钥私有。为安全起见,区块链中常用椭圆曲线选取群, 进而根据求解离散对数困难问题来构造非对称密码学的公私钥。
公钥密码技术中,在保护隐私的情况下,可以通过签名和验签完成权属证明过程。加解密过程中发送者 用私钥加密(签名),接收者公钥解密(验签);签名验签过程中常用私钥签名,公钥验签。签名验签具体来说是指:私钥持有者对消息 m进行哈希得到H(m),并用私钥对 H(m)加密生成签名 s,将消息 m 和签名 s 发送给其他人,其他人用公钥对签名 s解密,得到 H’(m),对消息 m做哈希 H(m),然后通过对比H’(m)与 H(m)是否一致判断验签是否成功。
公钥或公钥哈希被视为用户在区块链中的身份。比特币系统中直接使用公钥哈希表明用户身份,在交易过程中用户不需要提供其余信息,并且用户可以在交易中使用不同的公钥地址来增加隐私性,因此比特币具有一定的匿名性。比特币系统采用椭圆曲线数字签名算法(ECDSA)产生用户的公私钥对,然后用公钥的哈希作为用户的身份,该身份用于作为接收数字货币的地址。用户通过其私钥签名可完成对该交易输出的确权,或者花费该交易输出。
私钥对于区块链系统是至关重要的,但从用户的角度来看,私钥是一串杂乱无章的字符串。这就为私钥管理带来了困难,尤其是当用户拥有很多个区块链地址。 分层确定性钱包是指在没有私钥参与前提下,通过公钥直接分散出子公钥,并且分散的子公钥可以由子私钥认证。分层确定性钱包一方面只需要通过备份一次私钥管理多个无关联的子公钥,另一方面,通过多个无关联的子公钥实现多账户的管理,从而实现多账户私钥管理和隐私保护。
区块链在设计之初就从不同的维度去解决一些的安全问题,例如它利用了非对称加密保证了支付的可靠性, 利用哈希和签名的唯一性保证了数据的无法被篡改,利用去中心的分布式设计防止数据丢失等。即便如此,随着区块链规模逐渐扩大,越来越多的安全问题随之暴露出来。
工作量算法是首先应用于区块链的共识算法,关于算力攻击也一直在热议之中。在比特币的工作量证明机制中,节点挖块的概率与它的算力成正比,因为算力越大则其计算正确哈希值的速度就会更快,更可能掌握打包权。因此不同节点希望联合起来并成为“矿池”以挖 掘更多的块,获得更大的利益。一旦矿池总算力足够大,超过全网51%的计算能力,它就可以破坏整个区块链系 统,导致一些安全问题:
分叉问题意识是当区块链系统升级的时候,共识规则中的新协议也发生了变化,一部分矿工还没来得及升级。对节点来说,已经升级了的节点是新节点,还没有来的及升级的节点是旧节点。当新节点的算力超过百分之五十一的时候,出现了遵循不同机制产生的分叉,这种分叉的类型又分为两种,硬分叉和软分叉。
软分叉:软叉意味着当系统开始升级的时候,引入了新版本或新的协议,它与以前的版本兼容,新的节点出产的区块可以被旧的节点接受。网络发生了软分叉时: 一开始旧节点产生的区块中的交易是不被新节点认同的,会产生一个短暂的分叉。但是新版本的分叉会超过就版本的分叉成为最长链。因此网络中的节点不需要必须同时升级新协议,它允许逐步升级。软分叉不会影响节点升级时系统的稳定性和有效性。
硬分叉:硬分叉意味着当系统打到新版本或新协议时,它不兼容以前的版本,旧节点不能同意新节点出产的区块,因此新旧节点会开始在不同的区块链上运行,一条链变成了两条链。虽然新的节点计算能力是比旧节点强,旧节点仍将继续维持它认为的正确的链。 在没有得到几乎所有生态中的参与者同意的情况下,硬分叉可能会导致整个区块链生态的分裂,所以这是一个极具争议和风险的安全问题。一旦发生硬分叉,区块链作为可信平台信任度将会降低。
智能合约本质是一段运行在区块链网络中的代码, 完成用户设定的业务逻辑,规范相互不信任的参与者的行为,其中最为突出的框架是以太坊。但是只要是人为编写的程序,就可能会出现错误与缺陷,而不同于传统程序,智能合约以无法逆转的形式存在,一旦出现漏洞将可能带来致命的损失。
欺诈攻击是以一种创造性的方式,使得没有达到 51%算力,攻击者仍旧有能力干扰区块链的正常工作。
在区块链中,对于资产的管理也是一个非常大的安全问题。区块链具有无中心化结构,用户通过一个公开的地址与密钥来宣示资产所有权,一旦密钥丢失,由于区块链的不可篡改的特性,意味着不可能通过修改区块链记录拿回资产。因此盗币事件经常发生,其主要是通过交易平台监守自 盗、交易所遭受黑客攻击、用户交易账号被盗等手段。