@sqfasd
2016-11-25T22:36:01.000000Z
字数 6227
阅读 3518
未分类
非常感谢梦真与btcbox公司组织这次区块链技术交流会,让我有机会与各位探讨区块链与比特币方面的技术。
请允许我做下自我介绍。
我是一名软件工程师,从大学期间开始学习编程,到现在大约有11年了。
我长期从事网络服务器编程和分布式系统架构,语言方面擅长c++与javascript。
我参与过的项目主要有柯达数字影院系统、云云网搜索引擎、微博搜索引擎等。
我从12年开始利用业余时间研究比特币,16年开始全职开发asch系统,这是一个基于侧链技术的dapp开发平台,稍微会给大家介绍。
今天我给大家分享的是我对区块链技术原理的理解与认识。
区块链最初是比特币的底层技术,后来逐渐演变成一种通用的分布式账本技术。区块链本质上是一个数据库,可以用于存储任何信息,只不过在比特币中,存储的是转账信息。
虽然区块链的思想是后于比特币发展起来的,但根据我向人布道的经验,如果先讲区块链,再把比特币作为一种区块链在支付领域的示例介绍出来,更容易让人理解。
因为比特币中包含了许多非区块链必须的复杂概念,比如proof of work,挖矿,链式交易等。如果把这些概念剔除掉,区块链的本质是很简洁的。
我们先来看下区块链的定义,用一句话来表达就是:
区块链是一种基于链式数据结构和密码学技术的分布式数据库
关于区块链的好处与特性,比如:防篡改、去中心、安全、透明、易追踪,我就不多讲了,我今天主要从技术角度介绍这些特性是如何实现的。
我把区块链的技术分成5个层次
第一层是基础层,包括链式结构(这是区块链的精髓,中本聪的灵光一闪)、哈希函数、数字签名,其中数字签名的基础是非对称加密。
链式数据结构和哈希函数是防篡改的基础,数字签名是去中心鉴权的基础。
第二层是网络层,因为区块链大多数情况下都是分布式系统,包含多个节点,节点之间的数据传输需要通过网络协议和广播或路由算法来实现。这一层主要解决了数据传输的问题。
第三层是共识层,我们暂且把这一层当做黑盒子。前面说到区块链本质上是一个数据库,普通的数据库都涉及到权限管理,并且是中央集权式的管理,区块链既然去中介,就不能有中央管理员,那么谁负责写入数据呢,假如每个参与者都有写入数据的权利,那么在每个时刻,以哪个参与者的数据为准呢。当一个参与者写入数据后,其他节点如何验证数据的正确性呢。这个层次主要解决这些问题。
第四层是数据层。区块链是既然是个数据库和共享账本,那么它存的是什么数据呢,共享的是什么信息呢,这一层解决的是这个问题。举个例子,我们可以存转账记录、投票记录、数字资产、版权登记等等。
当然我们还可以存更复杂的数据,比如合约或者代码,存储在区块链上的代码,我们一般称为智能合约,当然,也要视代码语言的完备程度。
第五层是解释器层,当第四层存储的是合约或者代码等复杂数据时,才需要有专门的解释器。比如比特币的脚本引擎,以太坊的虚拟机等。
我们先介绍下哈希函数的特点。
哈希函数是一种数据摘要算法,可以为不定长的数据计算出定长的摘要信息,我们可以把这种摘要信息理解为数据的指纹
这种算法有以下特点:1. 源数据的微小改动也会造成数据指纹的剧烈变动,因此可以用来检测源数据的变化 2. 指纹数据尺寸固定,方便存储 3. 无法预测,暴力碰撞的难度也极高
区块链是由多个区块串联而成,每个区块都有一个哈希值,作为一个区块的唯一标识,代表了区块的内容。区块中还存储了两个哈希值,一个是上一个区块的哈希,一个是代表了本区块内所有交易数据的哈希。
如果某个区块的交易信息变了,那么该区块的哈希值经过重新计算后,就跟以前不一样了,还会引发连锁反应,该区块之后的所有区块的哈希值都会变动,假如产生一个区块是有时间或者电力成本的话,那么改动一个交易数据的成本是巨大的,如果你不重新计算变动区块之后的所有区块,区块链的那种链式结构就被破坏了,当你把这种坏掉的数据发给别人的时候,别人就很容易检测到错误。这就是防篡改的理论基础。
我们对比下普通数据库是如何组织数据的,普通数据库用表格来组织数据,以row为基本存储单元,数据之间基本没有联系,只是一些防止重复的非常弱的约束条件,所以无法检测到数据变动。
所以说为什么中心化的系统是不安全的。因为只要被黑客入侵或职权滥用,被改动了一个数据,就会出现天文数字级的损失。
当然只有链式结构还不足以完全实现防篡改,还需要其他特性支持,比如,每个节点都存有一份完整的拷贝,每一个区块的添加,或者说每一次共识的达成,都要建立在大部分节点的当前状态一致的情况下,个别节点出现损坏或篡改时,是无法与大部分正常节点建立共识的,其数据也不会被其他节点所接受。
一般的中央集权系统,都有一个账户数据库,存储了每个用户的用户名和密码,当用户登录时,需要把密码发送到网站后台,以验证用户的权限。当然,也有一些安全措施比较高级的中央集群系统,也使用了非对称加密和数字签名技术,那就另当别论了。
区块链系统必须使用公私钥机制来完成用户的鉴权,而不能使用用户名和密码的方式,因为区块链是共享账本,所有数据是公开的。
私钥一般是在一个非常大的地址空间内随机选一段数据, 比如,比特币的私钥是256bit的随机数据,就有2^256种可能性,作为一个对比,地球上的沙子大约为2^80次方。
所以,黑客是无法通过穷举和碰撞去盗取用户私钥的。
私钥由用户自己保管,公钥对外发布。当用户需要转移资产或证明身份和权限的时候,可以使用私钥对涉及的数据做一个数字签名,就好像对一个文件盖章一样,那么别人就可以用他之前发布的公钥来验证这个签名的数据,这就是去中心鉴权。
非对称加密在理论上保证了,无法由公钥逆推出私钥或者需要非常高的难度,所以对外发布公钥是安全的,并不会暴露私钥,当然量子计算机是一种隐患,不过区块链系统都会使用一种聪明的方法来避免量子计算机的风险,在接收转账时,不需要暴露公钥,只有在自己发起交易时,才会暴露公钥。
区块链系统是分布式的,一般由多个对等的节点组成,节点之间只存在信息交换,不存在从属或信任关系。一个节点可以与多个其他节点建立连接。这种网络结构叫做p2p网络。
当一个节点要对外发布消息时,他可以使用广播协议,通知所有其他节点,但是当节点规模较大时,广播就变得低效,一般会采用信息逐步扩散的算法,即先把信息发给若干个邻居节点,再由邻居节点继续扩散出去,从而逐渐扩散到全网所有节点。
因为区块链系统每个节点都有全量数据备份,每个节点都可以与若干个节点建立连接,所以当一个节点退出时,或某一地区的网络瘫痪或被封锁,不影响其他区域的节点正常工作,所以区块链的容错性较高。
当有新的节点加入时,节点会通过消息扩散的方式通知其他节点,整个网络就会越来越大,容错性也会变得越来越高。
新节点是如何加入网络呢,一般是通过软件内置的初始化种子节点列表来寻找。
我们可以把区块中的每个交易数据当做一个action,当一个节点接收到一个区块后,就会执行区块中的所有action,每个action都会导致节点状态的变化。一个区块要么所有action都被执行,要么一个都不被执行。每产生一个新区块,区块链系统就由一个状态转移到另一个状态。
因为节点之间只有在一致的状态下,才能达成新的共识,即产生新的区块,所以每当有新区块产生并被大部分节点所接受时,就表示在上一个时间段,网络中大部分节点的状态是一致的。
这个状态有些抽象,我们举个具体的例子。
比如,GOD发给alice100BTC,alice发送给bob40BTC,这是两个action,这两个action执行以后,系统的状态就变成,alice拥有60BTC,bob拥有40BTC。在这个状态下,如果alice想发起一个转账给别人61BYC的action,是不可能的。也就是说这个action属于一个非法或无效的action,是不能被包含在区块中的,即使某个人强行把这个action塞入区块,并发送给其他节点,其他正常节点也会直接拒绝。
正常情况下。每个节点都使用了相同的软件版本,都有一致的初始状态,每次接受一致的区块,执行相同的action,因此总能形成新的一致的状态。
但是当软件升级时,并且这种升级改动了核心算法。比如,每个区块的容量上限提升了,原来是1M,现在是2M。那么当新版本的节点制造出新区块,旧的节点是不会接受的,只有新版本的节点才会接受,这样系统就会出现不一致,新旧节点在同一高度的区块拥有不同的内容,因此也可能拥有不同的状态,即账户在不同的节点看来拥有不同的余额。这时候,我们就说网络出现了分叉,并且这种分叉是无法被修复的,因为旧的节点始终不能兼容提高了容量的新节点产生的区块,这种分叉叫做硬分叉。与此相应的另一种分叉叫做软分叉,这种分叉达不需要全部节点都升级,达到一定条件后就可以被消除。
比特币是第一个应用了区块链技术的系统,是区块链技术在支付领域的应用。其数据层存储的是用简单的脚本程序构成的转账或支付记录。
比特币使用proof of work共识机制来选择数据的写入者,这种机制的通俗说法就是挖矿,比特币还通过给数据写入者奖励的方式实现了货币的发行。
Proof of work是一种思想,实际体现这种思想的算法叫做hashcash,它最初用于反垃圾邮件。
为了阻止滥发邮件,邮件系统要求发送者附带一个随机数,并且邮件内容与随机数组合起来的数据哈希满足一个特定条件,比如小于一个指定的哈希。
这个随机数是需要花费大量的计算的,因为你无法根据那个目标哈希去逆推出去那个随机数,只能取不断的尝试。
但一旦找到了,是很容易验证的。比如在这个例子中,程序花费了4000多步去尝试,但是验证只需要需要计算一次。
这个随机数专业术语叫golden nonce,因为它很珍贵,找到它就像挖到黄金一样。计算出来的hash就叫做hashcash。
比特币的挖矿就是基于这样一个简单的原理。最先找到golden nonce的矿工,就会迫不及待的去发布这个区块,因为如果他不及时发布,别的矿工就可能马上发布他们挖到的区块,以获取奖励,一旦他们的区块被大多数节点所接受,你的区块就很难被接受了,奖励也很难拿到了。
而一个正在计算的矿工如果收到其他矿工的区块,并且验证合法后,就会立即被迫停止当前计算,并且要尽快把新的区块添加到本地的区块链中,然后基于这个新区块重新开始新一轮的挖矿。因为大部分节点都会按照默认的算法去这样做,如果一个矿工不这样做,还是基于旧数据去挖矿的话,就是在做无用功,即使挖到了,也不会被其他节点所接受。
除了硬分叉和软分叉以外。系统还会经常出现一种暂时性的短暂分叉,这是由于POW的特点所导致,因为挖矿是个开放的算法,每个人都可以做矿工,而且挖矿是随机碰撞的算法,有一定的运气成分,所以有可能网络中的两个节点同时发布包含了不同内容的合法区块。这时候网络会出现分叉。比特币通过最长链同步法则来消除这种分叉。
比方说,红色节点收到绿块时,并不会丢弃,而是放在暂时存储起来,当新一轮的区块被产生时,程序会检查备用链是否成为最长链,如果是的话,就会撤销之前执行的区块的所有action,然后执行新的最长链上的所有区块,于是冲突就被消除了。
我们之前说过,每个节点收到区块后,都会立即暂停当前的计算,在执行了新的区块的状态转换后,再开始新的挖矿。
但是有个前提,这个节点是正常的、忠诚的节点。有一种情况是存在的,就是当一个节点拥有绝对优势的算力时,他可以选择偷偷的挖矿,因为他有绝对的算力优势,所以他有能力独立计算并超过正常网络中的区块链长度,这时候他可以通过双重支付的手段来进行欺诈,即先在正常网络中进行支付,然后等支付被确认后,再发布他偷偷挖出来的更长的区块,这时候,其他节点就会应用最长链法则,撤销旧的区块,执行新的区块,于是这个矿工的钱又回来了。
即使没有绝对的算力优势,矿工也可以发起攻击,只是成功的概率较低,因此对安全等级要求较高的系统,就要考虑能否容忍这种概率和风险。比特币白皮书中有关于算力与攻击成功率的计算模型,大家可以去参考下。
因为ASIC的出现,使得部分ASIC的厂商有垄断算力的可能性,因此也就有了腐败的条件。另外,矿工抱团组成矿池,也造成了矿池拥有非常强大的算力,并且矿池是一种中心化的系统,其管理员并不像矿工那样有良好的经济激励,也是很有可能出现腐败的现象的。
资源浪费。目前比特币的全网算力大约是2000PH/s,售价2000元的显卡的算力大概在0.7G,电力成本是5.4RMB/天。那么全网大概相当于30亿张显卡在工作。当然,矿机的电力成本远远小于显卡成本。
吞吐量低。因为比特币是一个高度冗余的系统,每个节点都有备份。导致了伸缩性和性能方面的问题。比如,交易量低于7笔每秒。
最后,比特币网络确认速度比较慢,并且不稳定,平均确认时间为10分钟1个确认,一般3-6次确认才算安全,具有非常低的回滚概率。
正是由于比特币的这些缺陷,区块链更有了发展的动力。大量的新技术在涌现。
比如,通过限制矿机的研发以改善算力垄断的哈希算法,还有组合了多种算法以降低破解风险的组合哈希算法
在共识机制方面,POS算法解决了资源浪费问题,DPOS拥有了更好的性能以及更稳定的出块时间。PBFT算法可以在一定条件下解决最终性的问题,即从理论上杜绝分叉的可能性。
asch系统在共识机制方面综合了DPOS与PBFT的优点,特别适用于对安全性和一致性要求较高的系统。
另外,在存储方面,人们开始探索支付领域以外的应用场景,比如数字资产、域名、身份认证、存证、去中心化交易所等。
以太坊则是把区块链与智能合约结合在一起,并提出了dapp开发平台的概念。
这时候区块链技术由比特币的1.0时代,进入2.0时代。
在伸缩性与性能方面,也有了非常多的探索和尝试。
比如,blockstream提出的侧链机制,synereo提出的namespace机制,这些都是通过分片策略改善了伸缩性,从而提高了整体效率。
闪电网络技术则是把频繁的小额支付的中间过程放到了链外进行,只是把最终结算的交易存储到比特币的区块链上,回避了比特币吞吐量低的缺点,也算是从另一个角度拓宽了比特币的应用。
最初应用区块链技术的比特币是一个完全开放的、自治的系统。这种特点有好处,但也有局限,比如政府和某些商业机构就要求这种开放性得到一定程度的控制,或者有一定的监管机制。
根据开发性和去中心化程度的不同,区块链可以分为公有链、联盟链、私有链三种类型。
公有链是完全开发的,任何人都可以参与,这是完全的去中心化。
联盟链,弱化了去中心化,只允许联盟成员参与,需要批准才能进入系统,但系统被整个联盟控制,也可以避免中央集权,因此这是一种由去中心到多中心的演变。
这样的系统节点个数有限,并且可以提高对关键节点的配置要求,因此性能可以大幅度提升。比如,hyperledger号称可以达到上千币交易每秒。
联盟链可以不需要激励制度。
私有链则是完全中心化的系统。但是仍然利用了链式存储结构,仍然保留了防篡改的特性,虽然数据的写入权限不开放,但读取权限可以视情况开放出去,因此其数据对内可以方便审计,对外也容易被监督。