写在前面的故事
本文是阅读《区块链指南》这本书总结的学习心得。感兴趣的朋友可直接购买阅读。
https://item.jd.com/12007317.html
本文将为有意学习区块链开发的coder介绍区块链的基础知识。
区块链的定义
区块链本质上是一个对等网络(peer-to-peer)的分布式账本数据库。
区块链本身其实是一串链接的数据区块,其链接指针是采用密码学哈希算法对区块头进行处理所产生的区块头哈希值。每个数据块中记录了一组采用哈希算法组成的树状交易状态信息,这样保证了每个区块内的交易数据不可篡改,区块链里链接的区块也不可篡改。
基本概念
数据区块
每个数据区块包含区块头(Header)和区块体(Body)两部分
区块头封装了当前的版本号(Version)、前一区块地址(Prev-block)、时间戳(Timestamp)、随机数(Nonce)、当前区块的目标哈希值(Bits)、Merkle树的根值(Merkle-root)等信息。
区块体中则主要包含交易计数和交易详情。交易详情就是比特币系统中的记账本,每一笔交易都会被永久的计入区块中,而且任何人都可以查询。区块体中的Merkle树将会对每一笔交易进行数字签名,如此可以确保每一笔交易都不可伪造且没有重复交易。所有的交易将通过Merkle树的Hash过程产生一个唯一Merkle根值记入区块头。
挖矿与分叉问题
区块在挖矿过程中产生。所谓挖矿,实际上是穷举随机数算法。
上一个区块的Hash值 + 10分钟内的全部交易单 + 随机数 = 256位的字符串哈希值,这个256位字符串哈希值满足一定的条件就获得这个区块的交易记账权。新产生的区块需要快速广播出去,以便其他节点进行对其验证,以防造假。每个区块存着上一个区块的Hash值,可以溯源到源头,只有经过验证后才最终会的区块的交易记账权。
两个矿工几乎同时挖出新的区块,就会出现分叉。系统并不会马上确认哪个区块不合理,而是约定后续矿工总是选择累计工作量证明最大的区块。因此,当主链分叉以后,后续区块的矿工将通过计算和比较,将其区块链接到当前累计工作量证明最大化的备选链上,形成更长的新主链,并自动抛弃分叉处的短链,从而解决分叉问题。
时间戳和不可篡改性
获得记账权的节点在链接区块时需要在区块头中加盖时间戳,用于记录当前区块数据的写入时间。每一个随后区块中的时间戳都会对前一个时间戳增强工作量证明,形成一个时间递增的链条。时间戳为未来基于区块链的互联网和大数据增加了一个时间维度,使得数据更容易追溯,重现历史也成为可能。同时,时间戳可以作为存在性证明的重要参数,它能够证实特定数据必然在某个特定时刻是的确存在的,这保证了区块链数据库是不可篡改和不可伪造的,这也为区块链技术应用于公证、知识产权注册等时间敏感领域提供了可能。
分布式数据库
数据区块中的交易数据存放在每一个比特币用户的客户端节点中,所有这些节点则组成了比特币的分布式数据库系统。任何一个节点的数据被破坏都不会影响整个数据库的正常运转,因为其他的健康节点中都保存了完整的数据库。
UTXO交易模式
UTXO(Unspent Transaction Outputs)为花费的交易输出,它是比特币交易过程中的基本单位。除创世区块以外,所有区块中的交易(Tx)会存在若干个输入(Tx_in,也称资金来源)和若干个输出(Tx_out,也称资金去向),创世区块和后来挖矿产生的区块中给矿工奖励的交易没有输入,除此之外,在比特币系统中,某笔交易的输入必须是另一笔交易未被使用的输出,同时这笔交易输入也需要上一笔输出地址所对应的私钥进行签名。当前整个区块链网络中的UTXO会被存储在每个节点中,只有满足了来源于UTXO和数字签名条件的交易才是合法的。所以区块链系统中的新交易并不需要追溯整个交易历史,就可以确认当前交易是否合法。
哈希函数
区块链中的数据并不只是原始数据或者交易记录,还包括它们的哈希函数值。
使用哈希函数的优点:
- 哈希函数处理过的数据是单向性的,通过输出几乎不可能计算出输入;
- SHA256函数,输入数据越长,处理时间越长;
- 输入值即使只相差一个字节,输出值也迥然不同。
Merkle树
比特币区块链系统中采用的是Merkle二叉树,它的作用主要是快速归纳和校验区块数据的完整性。它会将区块链中的数据分组进行哈希运算,向上不断递归运算产生新的哈希节点,最终只剩下一个Merkle根存入区块头中。
使用Merkle树的优点:
- 极大地提高了区块链的运行效率和可扩展性,使得区块头只需包含根哈希值而不必封装所有底层数据,这使得哈希运算可以高效地运行在智能手机甚至物联网设备上;
- Merkle树可以支持“简化支付验证协议”(SPV)即在不运行完整区块链网络节点的情况下,也能够对交易数据进行检验。
双重支付
双重支付问题又称为“双花”问题,即利用货币的数字特性用“同一笔钱”完成两次或者多次支付。物理世界,金钱具有客观唯一性,所以没有双重支付的情况。但是在电子货币系统中,则需要可信的第三方管理机构提供保证(银行系统、支付宝、微信支付)。区块链的去中心化系统不需要借助任何第三方机构而只通过分布式节点之间的互相验证和工时机制,有效的解决了双重支付问题。通过时间戳以及UTXO验证和数字签名,避免双重支付。如果有人用同一个UTXO构造两笔交易,客户端只会向其他节点转发第一个监听到的交易,这个交易被6次确认之后,才得到认证。按照中本聪在比特币白皮书中的计算,6个确认后出现“双花”的概率大概在0.024%。
P2P网络
比特币系统的节点间为P2P网络,每个节点都具有同等地位。网络节点根据存储数据量的不同分为全节点和轻量级节点,全节点储存创世区块以来所有的区块链数据(几十GB,增长中),进行校验时不依赖其他节点,缺点是硬件成本较高。轻量级节点存储部分数据,需要别的数据时可以通过建议支付验证方式(Simplifield Payment Verification, SPV)向邻近节点请求所需数据来完成验证更新。
加密算法
比特币为交易加密时使用的加密算法,是一种叫做椭圆曲线算法的非对称加密算法。
密钥与钱包地址生成流程
生成密钥对:
- 从操作系统底层的一个密码学安全的随机源中取出一个256位随机数作为私钥,私钥总数为2256个,所以很难遍历出所有的可能性;
- 根据私钥,通过椭圆曲线加密算法,生成公钥。
生成钱包地址
- 根据公钥,两次哈希运算(SHA256 RIPEMD160)记录结果result1;
- result1添加比特币系统版本号(0x00),两次哈希运算(SHA256 SHA256),结果取前4bit地址校验码,result2;
- 比特币版本号+result1+result2字符串拼接后,base58编码,生成钱包地址。
数字签名
数字签名就是在信息后面加上另一段内容,作为发送者的证明并且证明信息没有被篡改。
- 发送者将信息使用哈希算法得到哈希值;
- 发送者使用其私钥对哈希值进行加密,得到一个签名(签名的概念,在私钥不泄露的情况下,只有发送者才可以根据其私钥对信息进行加密,正如只有我们自己才能写自己的签名一样,形象的称之为签名);
- 发送者讲信息与签名一起发给接收者;
- 接收者使用发送者的公钥,解密签名,还原出信息的哈希值;
- 接收者通过哈希算法,得到信息的哈希值;
- 接收者对比自己得到的哈希值,与解密的哈希值,如果相同,说明内容可信。
比特币的隐私模型
传统隐私模型中,个人信息存在于可信任的第三方机构中,个人信息又泄露的风险。比特币的隐私模型中,所有交易不需要第三方操控,也不需要提供任何身份信息,只需要提供比特币的地址就可以和任何人完成一次准匿名交易。