区块链的技术原理和意义(论文祥读)
文章重点
区块链技术原理、数据结构、运行机制、区块链的分叉
区块链技术原理
前言:今天在学校上了一门有关银行金融的课程,了解到一个术语
financial intermediation——金融中介,早期的银行直至现在贷款人和被贷款人依旧采取中介的方式进行交易,究其原因是现在的交易是基于信用。
而区块链打破的正是基于信用的交易方式,它假设交易双方互不信任,完全依靠密码学原理进行交易和记账,由此打破交易需要第三方介入的传统贸易方式。
区块链定义和特点
区块链,顾名思义,很容易就联想到链表这一数据结构。实际上,区块链就是一种分布式(1)数据库,通过去中心化(2)、去信任的方式,集体维护一个可靠数据库。
传统数据库的4中操作可以简写为CURD,C表示创建(create)、U表示更新(update)、R表示读取(read)、D表示删除(delete)。
而区块链作为分布式数据库,相当于放弃了更新(U)和删除(D)这两个操作,用“无法篡改”和“不可抵赖”两个重要特点代替,依托P2P网络提供的分布式端对端网络的特点,可将之归结为CROSS原则:
- C(create):创建
- R(retrieve):可溯,依托区块彼此相连的链式结构,用户可以追溯至最初交易来查看整个交易过程(想象拉链,总能通过任一个链条项找到其他任意链条项)
- O(open):开放,任何一个人都可以通过接入P2P网络来记账
- S(security):安全,基于密码学的安全通信,以及工作量证明机制,无人可以篡改数据库中的数据
- S(stable):稳定,系统中任何节点的退出,都不会影响到整个系统的稳定性,不会遇到中心化节点通常遇到的“单点故障”问题。
由此可见,具有CROSS特点的区块链技术极有可能改变现有的交易模式。传统的交易中,商家和消费者之间难以做到完全信任,为了保证对方是可信的,常常需要国家信用背书或者企业背书的第三方机构。商家和消费者为了证明自己合规,需要自己把自己部分的材料都汇聚到第三方机构,能想象一下这冗长的手续以及额外的费用,这也常常使得交易滞后。区块链技术则逐步实现去中心化、去中介,实现消费者和商家之间直接支付,减去了中间不必要的时间。
区块链的技术原语
主要运用了4个基础技术——哈希运算(SHA256)、数字签名、P2P网络、工作量证明(PoW)
哈希加密算法(SHA256)
将任何一串数据输入到SHA256都能得到一个256位的Hash值(散列值),特点:相同的数据输入将得到相同的结果,输入数据只要稍有变化,则将得到一个千差万别的结果,且结果无法事先预知——我们不能通过找规律的方式找到这个Hash值。
数字签名
通常数字签名是基于椭圆曲线加密技术的公私钥来实现,有两个很重要的概念:
- 公私钥是非对称加密技术,公钥和私钥不同,但是可以基于私钥生成公钥。
- 相关性,公钥加密的,对应的私钥才能解密。私钥加密的内容,对应的公钥才能解密。
P2P网络
P2P网络分为有结构和无结构,区别在于路由规则的制定方面。
有结构的P2P网络,例如Chord,利用一致性哈希表(DHT)构建每个节点的路由表。
无结构的P2P网络代表是Gnutella,节点之间的路由靠广播的方式。一个节点要想查找一个文件,首先问其邻居有没有这个文件,他的邻居再问各自的邻居有没有,这样迭代,容易形成广播风暴,因此一般设置一个网络TTL,来限制广播传播的范围。
区块链采用的是无结构P2P网络。
工作量证明机制
相当于一份工作证明,确认你做过一定量的工作。工作量是信任产生的基础,在区块链中,我们通过解决一个数学难题来证明自己的工作量。
这个数据难题就是,对一个数字串进行两次SHA256运算,如果得到的数小于一个指定的值,就算成功。否则,要通过不断的尝试试错,来求解这个数。一般来说,指定的结果值,前面都是多个零开头。
区块链的数据结构
一个区块链依托于一个P2P网络。
节点可以有 4 种功能,即钱包、完整的区块链拷贝、挖矿和路由。路由功能是每个节点必需的,前3个功能,根据节点自己的需求来定。
对于一个区块链拷贝来说,它记录了从 2009 年,中本聪建立创世区块以来,系统运行时记录的所有交易记录。
区块链分为区块头和区块体。
区块头包含版本号、上一个区块的哈希值、Merkle根节点哈希值、时间戳、难度值、随机数和交易记录这些字段。
区块与区块之间彼此相连,构成的一个链式结构,叫做区块链。这跟以前编写C语言,用指针实现链表是一个道理。不过,这里的指针不是内存地址,而是将上一个区块的区块头,使用两次SHA256加密算法,得到的哈希值。
区块头没有包含任何交易记录信息,怎么能保证交易记录不被篡改?
答案是,为了提高区块链的校验效率,把一个区块里的所有交易记录,构建成Merkle树这样的二叉树结构。如下图(c)所示,如果交易记录是奇数,图中的 3 个记录,剩下的二叉树节点由自己填补:图中的交易 2 和自己构成了一个二叉树。以此类推,直到根节点。二叉树的两个交易记录哈希值直接串联,作为下一个二叉树的输入。通过这种方式,如果有人更改任何一个交易记录,按照前面 SHA256 加密哈希的特性,Merkle根节点就会变动很大,以致其他节点在验证区块链的哈希值时,能够很明显地发现问题。

区块链的运行机制
用户A想把比特币支付给用户B,首先要知道用户 B 的钱包地址。B 可以通过钱包,产生一对公私钥,通过一些处理,得到新的私钥和钱包 B的地址。通过数字签名,B 将钱包地址发给 A。A 根据 B 的地址,发起一个交易,通过自己的数字签名授权,将这个交易发给 B,这时 B 已经收到了这些比特币,但是还不能用,因为没有得到系统的确认。之后,A向全网内所有人广播,告诉其他节点有关交易的信息。类似的交易重复发生,直到区块确权时间到,矿工们开始竞争记账权。首先,计算Merkle根节点的哈希值,然后不断调整区块头中的随机数,争取小于系统的设定值,此为工作量证明。第一个算出结果的矿工,得到系统给予的比特币奖励,也向全网广播这个消息。其他节点在收到该消息时,结束工作量证明,并对区块进行验证(随机数),如果验证合格,将区块接入到区块链的末尾。具体如下图:

相关技术细节:
地址生成机制
B通过钱包,生成256位的私钥,基于椭圆曲线加密算法,得到有前缀的512位公钥哈希字符串;经过SHA256算法,得到256位的哈希加密字符串;通过RIPEMD160算法,得到160位的公钥哈希字符串;使用Base58算法,将二进制字符串翻译成人眼可识别的字符串,也就是B钱包的地址。消息交互机制
- 区块确认机制
上下文固定,只能通过随机数的不断尝试来进行暴力破解,争取小于系统要求的门限值。最后的胜出者将区块链入区块链的末尾(只是链接到末尾,而不是确认)。区块链为了防止51%攻击,延迟6个区块再对这个区块进行确认。
区块链的分叉和51%攻击
分叉:指同一时间段内全网不止一个节点能计算出随机数,即会有多个节点在网络中广播它们各自打包好的临时区块。
某一节点若收到多个针对同一个前续区块的后续临时区块,则该节点会在本地区块链上建立分支,多个临时区块对应多个分支。
需要等到下一个工作量证明被发现,而其中一个分支被证实为最长的一条,那么在另一条分支链条上工作的节点将转换阵营,开始在较长的区块链条上工作,而其他分支将会被网络彻底抛弃。
51%攻击则是由区块链的分叉衍生出来的。