如何验证账本
账号 | 收入 | 支出 | 余额 |
---|---|---|---|
张三 | 100 | 190 | |
李四 | 100 | 30 | |
王五 | 120 | 90 | 170 |
假设有上图这个账本,问题如下:
- 如何知道上图账本中的每笔记录是正确的?
- 如何知道上图的账本没有被篡改过?
方法:
当张三,李四,王五每个人手里都有一个这样的账本的时候,如果三个人中至少有两个人的账本数据是一致的,那么说明第三个人手里的账本可能是被篡改过的。这种少数服从多数的验证方法就是共识算法
问题:
这个方法可以校验账本的数据是否正确,但是放在一个更大规模的场景中会产生问题。比如在一个数亿万人的范围内,这种比较方法显然效率很低,需要和除自己以外的所有人进行比较。
解决方法:
使用Hash算法,Hash算法的特点:
- 同样的原始信息,使用同一个哈希算法,总能得到相同的摘要信息
- 原始信息任何一点变化,都会得到完全不同的摘要信息
- 从摘要信息无法逆向推算出原始算法
使用Hash函数,输入账本的所有信息(账本序号,账本创建时间,张三的信息,王五的信息等),输出一个摘要信息,这个摘要信息类似下图。
---------------
| 序号
| 时间戳
| Hash值
---------------
| 交易记录
|
---------------
假设生成时间:2018-06-10-11:10
假设生成hash值: AAAEEE1122
上图就是一个区块。
假设上图是生成的第一个账本,生成时间是2018-06-10-11:10, 十分钟后又生成了一个类似上图的账本,生成时间是2018-06-10-11:20. 此时计算摘要信息,会拿上一次生成的哈希值AAAEEE1122,和当前的账本信息作为原始值,输入到hash函数中,得到一个新的摘要信息,生成·一个新的区块。(hash值BBBCCC333444)
那么以此类推会生成类似下图的区块链
区块0 <--- 区块1 <---- 区块3 <-----区块4 <---- .........
那么每次核对账本的时候,只需要核对上一个块,如果上一个块是正确的,那么整个账本就是正确的。
网友评论