李睿智
学号19021211293
转载自https://blog.csdn.net/weixin_42634787/article/details/103190729
【嵌牛导读】区块链技术是在多方无需互信的环境下,通过密码学技术让系统中所有参与方协作来共同记录维护一个可靠的数据日志的方式。
【嵌牛鼻子】区块链、密码学、数据日志
【嵌牛提问】区块链技术如何从数据结构、节点如何工作、密码学原理的知识解释?
【嵌牛正文】
1 数据结构
从狭义的定义来说区块链是一个可以记录多方资金的往来记录、物品交换记录的公共账本,是包含一系列交易和信息的数据块以顺序相连的方式组合成的链式数据结构。
1.1 哈希指针(Hash Pointer)
链上各个区块通过哈希指针相连,除了第一个被最早构建的区块(Genesis Block),每个区块都有指向前一个区块的哈希指针,它不仅指向前一个区块的地址,还存储其哈希值。一个简单的区块链如图1所示,H()是把前面整个区块的内容取哈希包括它的哈希指针。通过这样的数据结构能够实现防篡改日志(tamper-evident log),好处是只要记录最后的哈希值,就可以检测出区块链中任何部位的修改,不论是在哪个部位做了改动,最后都会导致最后的哈希值发生变化。
1.2 区块
每个区块的大小不能超过1M,包括两个部分:区块头(Block Header)和区块体(Block Body)。
1.2.1 区块头
区头包括以下6个部分:
1)版本号(Version):4个字节,用来标识交易版本和所参照的规则,例如Windows7、安卓9.0。
2)前一区块的哈希值(Hash of previous block header):32个字节,通过对前一个区块的区块头数据进行哈希计算得出,使得每个新挖出的区块都按秩序接在前一个区块的后面。
3)根哈希值(Merkle root hash):32个字节,区块链中的交易被组织成为默克尔树结构,交易均被存储在默克尔树的叶子节点上,通过两两合并哈希直至得到根节点的哈希值。
4)时间戳(Time):4个字节,用于记录区块的封装时间,保证数据的不可篡改性,具备数据溯源功能。
5)随机数(Nonce):4个字节,挖矿就是找对应的随机数,它是矿工完成工作量证明算法时的输入,也是矿工获取奖励的凭证。
6)难度值(Target):4个字节,挖出区块的难度目标,通过输入不同的随机数,使生成区块的哈希值小于等于目标域值。
1.2.2 区块体
区体主要包括一系列的交易列表,所有交易均被组织成默克尔树结构(Merkle Tree)。树的叶子节点存储的是数据信息的哈希值,非叶子节点的存储是对其下面所有叶子节点的组合进行哈希计算后得出的哈希值。默克尔树结构可以快速验证交易的有效性,并大幅减少节点的存储空间。
1.3 比特币(BTC)系统中的数据结构
2 节点
区块链具有去中心化的特性,去中心化的应用就是由很多台服务器管理存储信息,并且相互验证。节点就是去中心应用中的服务器。节点的数据一般存储在磁盘中,区块链通过特定的数据库来访问磁盘中的数据。
2.1 节点的分类
比特币网络中区块链的节点分为全节点(Full node)和轻节点(Light node)。
2.1.1 全节点
全节点包含区块头和区块体,职责如下:
1)一直在线。
2)在本地磁盘上维护完整的区块链信息。
3)在内存里维护UTXO(Unspent Transaction Output)集合,以便快速检验交易的正确性。
4)监听网络上的交易信息,验证每个交易的合法性(有无合法的签名,是不是双花攻击)。
5)决定哪些交易会被打包到区块里。
6)监听别的矿工挖出来的区块,验证其合法性,从三个方面验证:每个交易是否合法、区块头的难度目标域值是否设置正确、检查这个区块是否在延伸最长合法链。
7)挖矿,沿着最长合法链挖;当出现分叉时,选择最先听到的分叉挖下去。
2.1.2 轻节点
轻节点只包含区块头,职责如下:
1)不是一直在线。
2)不用保存整个区块链,只保存每个区块的块头。(跟存整个块大概差1000倍)
3)不用保存全部交易,只保存与自己相关的交易。
4)无法检验大多数交易的合法性,只能检验与自己相关交易的合法性。
5)无法检测网上发布的区块的正确性。(因为职责4)
6)可以验证挖矿的难度。
7)只能检测哪个是最长链,不能检测哪个是最长合法链。(因为职责4)
2.2 节点的小结
网络上大部分节点都是轻节点,只需转账,无需挖矿。轻节点默认全节点挖出的块里的交易都是合法的,因为挖矿的代价太大,需要大量的工作证明,如果区块里有非法的交易,就相当于白挖了。
3 密码学原理
为保证账本的完整性、公开性、隐私保护、不可篡改、可校验等一系列特性,区块链技术高度依赖密码学。
3.1 哈希函数
哈希函数是将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。
主要有两个特性:
1)抗碰撞性(collision resistance)
有必要说下什么是哈希碰撞,哈希碰撞就是两个不同的输入,算出的哈希值是一样的。如:x!=y,H(x)==H(y)。
2)不可逆性(Hiding)
x→H(x),单向不可逆。已知H(x), 得到x的概率极低。
挖矿就是找nonce,使得H(block header)<=target(目标域值),目标域值和整个输出空间如图3所示:
3.2 加解密
区块链中常用椭圆曲线选取群,进而根据求解离散对数困难问题来构造非对称密码学的公私钥。加密和解密都是用的接受方的公钥和私钥。公钥不用保密,链上所有人都可知道;私钥需保密,只有自己知道。
比如:发一份邮件,我用你的公钥加密,你收到后再用你的私钥解密,同样的回复邮寄,你用我的公钥加密,我接收后再用自己的私钥解密。
3.3 数字签名
签名用的是私钥,验证签名用的是公钥。具体来说是指私钥持有者对消息m进行哈希运算得到H(m),并用私钥对H(m)加密生成签名s,将消息m和签名s发送给其他人,其他人用发送者的公钥对签名s解密,得到H’(m),对消息m进行哈希运算H(m),然后通过对比H’(m)与H(m)是否一致判断验签是否成功。
3.4 身份管理
公钥或公钥哈希被视为用户在区块链中的身份,从用户的角度来看,私钥是一串杂乱无章的字符串。
创建比特币账号只需本地创建一对公私钥(比特币系统采用椭圆曲线数字签名算法产生用户的公私钥对),公相当于银行卡号,私钥相当于密码。