区块链简介
约 1318 个字 4 张图片 预计阅读时间 4 分钟
概述
区块链(BlockChain): 有一个一个的Block,每个Block中包括着一组交易信息,然后,每一个Block都会有一个ID(或是一个地址),这些Block通过记录前一个Block的ID来形成一条链
- 真正的数据
- 自己的ID(或地址):地址的编码使用了 Secure Hash
- 前一个Block的地址
PS: 每个Block的ID都是由内容来定的,只要内容变了,ID则完全不一样。因还包括上一个Block的ID,故产生连锁反应,即一个Block变化,后续的Block全要变化,修改成本大大提升。因此越旧的Block,越安全不容易被篡改,而新的Block则会越不安全
但仅仅是难以篡改,工作量证明的共识机制 使得无法篡改
哈希算法简介
Hash功能:
- 用来生成唯一标识一个数据块的ID,几乎不能重复
- 用来做数据的特征码。只要数据中有一个bit出现修改,那么整个hash值就完全不一样
Note
很多公司在互联网上发布信息或软件的时候,都会带上一个Checksum(校验码)
只要把整个文件的数据传入到那个特定的hash算法中,就会得到一串很长的字符串
如果和官方发布的Checksum字符串不一样,那么就说明信息或文件内容被人更改或是信息残缺了。 因此,也被应用在『数字签名』1 中
两个著名的Hash算法: MD5和SHA-2,而区块链用的是SHA-256
- 通过SHA-256虽然不能加密,但能知道某个数据是否被篡改了
比特币的哈希算法
- 区块数据协议头:
- Version:当前区块链协议的版本号(4字节)
- Previous Block Hash:前面那个区块的hash地址(32字节)
- Merkle Root:后面交易信息的hash值(32字节)
- Timestamp:区块生成的时间(4字节)
- Difficulty Target(Bits):表明了当前的hash生成的难度(4字节)
- Nonce:一个随机值,用于找到满足某个条件的hash值(4字节)
对这六个字段进行hash计算,就可以得到本区块的hash值,即其ID或是地址
SHA-256(SHA-256 (Block Header))
然而比特币对hash值是有要求的,要求是由Bits字段控制的,可以调整Nonce这个32位整型的值来找到符合条件的hash值。把这个事情叫做 挖矿
- 后面的部分为交易数据:
- 本块中的交易笔数H
- 交易列表
Q: Merkle Root如何计算?
因比特币的交易有三个字段:转出方 & 转入方 & 金额,则会对每个交易的这三个字段求hash,然后把交易的hash做两两合并,再求其hash,直到算出最后一个hash值,即是要求的值 Why? 这样合并有什么好处? → 把交易数据分成了若干个组,如上面二叉树所表示的一样,可以不断地把树分成左边和右边的分支,因为它们都被计算过hash值,所以可以很快地校验其内容有无被修改过
- 大量的交易数据分成小的,有利于整合和校验数据并可以提高网络的传输速度
PS: 『以太坊』2有三个不同的Merkle Root树
- 一个用来做交易hash的Merkle Root
- 一个是用来表示状态State的
- 一个是用来做交易收据的, 记录一个智能合约中最终发生的交易信息
比特币的交易模型
比特币区块里面的交易数据,其实也是一个链。两个术语:
- input: 即交易的支出方
- output: 即交易的收入方
一个交易可以有多个output,即我们可以把一笔钱汇给多个人,但一个output只能对应一个源的input,并且output和input的总数要吻合
Example
假设,Tom给Alice2个比特币,Bob给Alice3个比特币,此时Alice有5个比特币
然而,比特币的世界里是没有余额的
所以对Alice来说,她只有两个没有花出去的交易,一个是2个比特币,一个是3个比特币
这叫 UTXO(Unspent Transaction Output)
若此时Alice想要转给Jack4个比特币,但她自己的两个交易中都不够,因为不能拆开之前的那两个比特币交易,那么她只能把交易2和交易3当成input,然后把自己和Bob当成output,Jack分得4个,自己分1个,这样的交易才平衡
因此一笔交易可能会包含大量的Input和Output,并且可能需要通过多个input来凑,然后output这边还需要给自己找零(如上),这样在比特币交易中,你把钱给了我,我又给了张三,张三给了李四……就这样传递下去,形成了一个交易链。因为还没有花出去,所以就成了UTXO,而 系统计算你有没有钱可以汇出去时,只需要查看一下你的UTXO就可以