左耳听风
陈皓
网名“左耳朵耗子”,资深技术专家,骨灰级程序员
立即订阅
40357 人已学习
课程目录
已完结 108 讲
0/6登录后,你可以任选6讲全文学习。
开篇词 | 洞悉技术的本质,享受科技的乐趣
免费
01 | 程序员如何用技术变现(上)
02 | 程序员如何用技术变现(下)
03 | Equifax信息泄露始末
04 | 从Equifax信息泄露看数据安全
05 | 何为技术领导力?
06 | 如何才能拥有技术领导力?
07 | 推荐阅读:每个程序员都该知道的知识
08 | Go语言,Docker和新技术
09 | 答疑解惑:渴望、热情和选择
10 | 如何成为一个大家愿意追随的Leader?
11 | 程序中的错误处理:错误返回码和异常捕捉
12 | 程序中的错误处理:异步编程以及我的最佳实践
13 | 魔数 0x5f3759df
14 | 推荐阅读:机器学习101
15 | 时间管理:同扭曲时间的事儿抗争
16 | 时间管理:如何利用好自己的时间?
17 | 故障处理最佳实践:应对故障
18 | 故障处理最佳实践:故障改进
19 | 答疑解惑:我们应该能够识别的表象和本质
20 | Git协同工作流,你该怎么选?
21 | 分布式系统架构的冰与火
22 | 从亚马逊的实践,谈分布式系统的难点
23 | 分布式系统的技术栈
24 | 分布式系统关键技术:全栈监控
25 | 分布式系统关键技术:服务调度
26 | 分布式系统关键技术:流量与数据调度
27 | 洞悉PaaS平台的本质
28 | 推荐阅读:分布式系统架构经典资料
29 | 推荐阅读:分布式数据调度相关论文
30 | 编程范式游记(1)- 起源
31 | 编程范式游记(2)- 泛型编程
32 | 编程范式游记(3) - 类型系统和泛型的本质
33 | 编程范式游记(4)- 函数式编程
34 | 编程范式游记(5)- 修饰器模式
35 | 编程范式游记(6)- 面向对象编程
36 | 编程范式游记(7)- 基于原型的编程范式
37 | 编程范式游记(8)- Go 语言的委托模式
38 | 编程范式游记(9)- 编程的本质
39 | 编程范式游记(10)- 逻辑编程范式
40 | 编程范式游记(11)- 程序世界里的编程范式
41 | 弹力设计篇之“认识故障和弹力设计”
42 | 弹力设计篇之“隔离设计”
43 | 弹力设计篇之“异步通讯设计”
44 | 弹力设计篇之“幂等性设计”
45 | 弹力设计篇之“服务的状态”
46 | 弹力设计篇之“补偿事务”
47 | 弹力设计篇之“重试设计”
48 | 弹力设计篇之“熔断设计”
49 | 弹力设计篇之“限流设计”
50 | 弹力设计篇之“降级设计”
51 | 弹力设计篇之“弹力设计总结”
52 | 管理设计篇之“分布式锁”
53 | 管理设计篇之“配置中心”
54 | 管理设计篇之“边车模式”
55 | 管理设计篇之“服务网格”
56 | 管理设计篇之“网关模式”
57 | 管理设计篇之“部署升级策略”
58 | 性能设计篇之“缓存”
59 | 性能设计篇之“异步处理”
60 | 性能设计篇之“数据库扩展”
61 | 性能设计篇之“秒杀”
62 | 性能设计篇之“边缘计算”
63 | 区块链技术的本质
64 | 区块链技术细节:哈希算法
65 | 区块链技术细节:加密和挖矿
66 | 区块链技术细节:去中心化的共识机制
67 | 区块链技术细节:智能合约
68 | 区块链技术 - 传统金融和虚拟货币
69 | 程序员练级攻略:开篇词
70 | 程序员练级攻略:零基础启蒙
71 | 程序员练级攻略:正式入门
72 | 程序员练级攻略:程序员修养
73 | 程序员练级攻略:编程语言
74 | 程序员练级攻略:理论学科
75 | 程序员练级攻略:系统知识
76 | 程序员练级攻略:软件设计
77 | 程序员练级攻略:Linux系统、内存和网络
78 | 程序员练级攻略:异步I/O模型和Lock-Free编程
79 | 程序员练级攻略:Java底层知识
80 | 程序员练级攻略:数据库
81 | 程序员练级攻略:分布式架构入门
82 | 程序员练级攻略:分布式架构经典图书和论文
83 | 程序员练级攻略:分布式架构工程设计
84 | 程序员练级攻略:微服务
85 | 程序员练级攻略:容器化和自动化运维
86 | 程序员练级攻略:机器学习和人工智能
87 | 程序员练级攻略:前端基础和底层原理
88 | 程序员练级攻略:前端性能优化和框架
89 | 程序员练级攻略:UI/UX设计
90 | 程序员练级攻略:技术资源集散地
91 | 程序员面试攻略:面试前的准备
92 | 程序员面试攻略:面试中的技巧
93 | 程序员面试攻略:面试风格
94 | 程序员面试攻略:实力才是王中王
95 | 高效学习:端正学习态度
96 | 高效学习:源头、原理和知识地图
97 | 高效学习:深度,归纳和坚持实践
98 | 高效学习:如何学习和阅读代码
99 | 高效学习:面对枯燥和量大的知识
左耳听风
登录|注册

64 | 区块链技术细节:哈希算法

陈皓 2018-05-10
对于计算机来说,区块链就像一个单向链表,一个数据块中保存着三个信息。
真正的数据。
自己的地址(或是 ID)。
前一个数据块的地址。
这样,通过追溯前一个块的地址,把所有的数据块存成了一条链。所以,我们叫其 BlockChain。如下图所示。
每个数据块的“地址”的编码使用了计算机上的一个算法,计算机圈内人士把这个算法叫 Secure Hash。有人音译为“安全哈希”,也有人意译为“安全散列”。在计算机应用中,hash 算法主要有几个功能。
用来生成唯一标识一个数据块的 ID(身份证),这个 ID 几乎不能重复。
用来做数据的特征码。只要数据中一个 bit 的数据出现更改,那么整个 hash 值就完全不一样了。而且数据学上保证了,我们无法通过 hash 值反推回原数据。
于是,很多公司在互联网上发布信息或软件的时候,都会带上一个 Checksum(校验码)。你只要把整个文件的数据传入到那个特定的 hash 算法中,就会得到一串很长的字符串。如果和官方发布的 Checksum 字符串不一样,那么就说明信息或文件内容被人更改或是信息残缺了。因此,也被应用在“数字签名”中。
在计算机世界里,有两个很著名的 hash 算法,一个叫 MD5(Wikipedia 链接),一个叫 SHA-2(Wikipedia 链接), 区块链用的是 SHA-256 这个算法。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《左耳听风》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(31)

  • 杜小琨
    所以,为什么是1M?

    作者回复: 我居然写漏了……😓

    1)中本聪经常在代码里放一些不说明的事,这个就是一个。

    2)区块有大小限制容易理解,一个是为了更好地去中心化,因为如果尺寸下限,算力大的可以打包更多的交易,就中心化了。另一个是为了节省网络带宽。

    3)为什么是1M而不是2M,这是中本聪设置的,但他并没有做出解释。

    2018-04-03
    26
  • 逆行
    一次交易完成后,Merkle Root 就会改变,那么每次交易都要重写整个区块链表,那效率太低了吧,是不是我错过了什么细节?

    作者回复: Merkle Root 是一组交易的层层hash的结果。

    2018-04-03
    5
  • Nelson
    "假如你有多个 UTXO,你可以进行多笔交易而不需要并行锁。"这一句没懂,不会出现一个UTXO被使用两次情况吗?

    作者回复: 不同的交易在不同的UTXO上并行,在同一个上不行。如果用余额来做,则无法并行,上一笔不完成,下一笔无法执行。

    2018-04-03
    4
  • 登高
    “”对这五字段进行 hash 计算,就可以得到本区块的 hash 值“”

    数了下,前面介绍了6个,这里写的五个,是笔误吗?
    2018-04-29
    3
  • jimmy
    近期在研究event-sourcing架构,比特币的交易感觉有点像event-sourcing的味道,记录的只是事件,无状态,天然适应分布式,不知道这个类比是否有点牵强

    作者回复: 是很牵强

    2018-04-03
    3
  • 吴天
    UTXO不太理解 我有多少可交易的比特币是系统从哪里验证的?从区块链追溯下去还是另外有一个存储记录?
    2018-04-10
    2
  • 多米
    然而对比特币没兴趣
    2018-04-03
    2
  • 痴痴
    本区块的Id值等于 【version、previous block hash、merkle root、timestamp、bits、nonce】hash计算而得到的,而merkle是交易两两hash得到的,假如产生一笔新交易,merkle root的值肯定就会改变,区块Id的值不就也会跟着变吗?那您是怎么得出【merkle和区块无关】的结论呢??
    2018-06-26
    1
  • neohope
    建议补充一下ETH和BITCOIN的一些不同啦,比如ETH是有世界状态的,而比特币只有UTXO。比如BITCOIN也是通过脚本来完成交易的,ETH通过EVM来让大家都可以写智能合约。比如ETH发明了Gas,积极推送DAO、DAPP什么的,会不会好一些?
    2018-06-22
    1
  • Donald
    为什么是对区块头做两次 SHA-256 的 hash 求值?
    2018-04-14
    1
  • 郎哲
    赞赞赞讲的通俗易懂
    2018-04-03
    1
  • 尘埃观世界
    " 就像上面那个二叉树所表示的一样,我们可以不断地把这个树分成左边的分支和右边的分支,因为它们都被计算过 hash 值,所以可以很快地校验其中的内容有没有被修改过。"

    为什么这样可以很快的校验其中的内容是否变更呢?比如如果改变了第一条交易的余额. 不明白为什么目前的设计可以加速校验。 还望解答,谢谢

    2019-12-04
  • edisonhuang
    区块链的核心原理是针对每一个区块,内容都包含本身数据,上一个区块的id,以及利用id+数据计算的区块本身的id。由于id计算基于内容生成,当数据中任何一个bit改了就会导致完全不同的id,而所有的区块是像链表一样彼此链接,改变自己还要改变自己后面的子孙,因此可以让数据不易更改
    2019-07-30
  • 永光
    区块链的协议格式,这部分数据是存在区块链图(本区快hash地址,前一个区块hash
    地址,数据)中的数据中吗?总感觉不太对?不知道协议格式具体在哪里存着?
    2018-07-12
  • 痴痴
    1.是不是只有前一个区块交易满了,才会产生下一个区块? 2.Merkle的生成过程理解,不过不理解的是:假设a区块有新的一笔交易产生,放到这个区块里,那么这个区块的id自然也就变了,后面所有的区块id也要跟着变,这样是不是太麻烦了

    作者回复: 1、不是,这个由各个矿工自己决定。2、merkle和区块无关,但是与交易有关。

    2018-06-25
  • i
    既然一个区块可以存放至多四千笔交易,那什么时候才能生成新区块?够四千笔交易还是其他别的生成逻辑?
    2018-06-03
  • 龚极客
    Merkle Root是否至多三层?因为每个hash4个字节*7 =28<32 。如果这样,那么超过3层怎么处理?

    作者回复: 没有啊,hash无论hash多长的字符,总是得到一样的长度。你说的 “hash4个字节*7=28”是什么意思?

    2018-04-19
  • 怀兵
    关于以太坊state存储的部分有点模糊,表达成是账户状态的存储,而非合同状态,可能更好一些
    2018-04-18
  • 总指挥
    生成Merkle Root 过程理解的,但它的目的还是不能理解,如果是要验证完整性为什么不直接全部tx来哈希?小弟不才,望各位解答。

    作者回复: 文中已经讲了。可以分块整理

    2018-04-13
  • 湖心亭看雪
    同问为什么是1M?
    2018-04-05
收起评论
31
返回
顶部