ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从哈希指针到UTXO:区块链4-6讲核心机制全解析

从哈希指针到UTXO:区块链4-6讲核心机制全解析 1. 课程跨度与核心脉络为什么4-6讲值得单独拆出来上回我把《区块链技术与应用》前3讲的内容整理完之后一直没腾出时间继续。这次趁着周末把4到6讲重新过了一遍发现这三讲虽然各自的主题不同但串起来其实是一条完整的认知链路——从底层数据结构往上走到共识机制再从共识落回真实的应用场景。换句话说前三讲解决的是区块链怎么记账这三讲解决的是区块链凭什么让这么多人不打架以及打完架之后账本还能不能统一。我自己的感受是很多新人学区块链容易卡在看了不少概念名词但始终不知道这些名词之间的关系。比特币的白皮书、以太坊的黄皮书都翻过但一遇到分叉PoW最长链这些词就乱了。这几讲恰好就是把中间那层机制设计的逻辑讲透所以我建议不管你之前有没有基础都值得耐心啃完。先说一下这三讲的大致覆盖范围第4讲核心是区块链的数据结构重点是交易、区块、链式结构和哈希指针Hash Pointer第5讲核心是共识机制重点是比特币的PoW工作量证明到底在解决什么问题以及分叉是怎么来的第6讲核心是应用与生态包括比特币的脚本、UTXO模型以及区块链落地的经典场景边界在哪里。这三讲合在一起其实回答了三个递进的问题区块怎么组织、账本怎么一致、账本除了记账还能做什么。如果你正在准备面试、给学生备课或者只是单纯想把区块链的基础抠扎实这篇笔记基本能覆盖你需要的核心知识点。下面我会按照课程原来的推进顺序来梳理同时加入一些我实际查阅资料后的补充方便你对照理解。2. 区块数据结构区块头到底藏了多少秘密2.1 区块头与区块体的组合关系第4讲一开始讲的是比特币系统里一个区块的完整结构。这里有个特别容易被忽略的细节区块链这个词里的链字本质上不是靠链表实现的而是靠哈希拼接实现的。一个区块从物理结构上分两部分区块头Block Header区块体Block Body区块体装的是交易记录具体的交易列表有时候也单独用Merkle树来表示。区块头才是整个区块链设计里最精巧的部分它只有80个字节左右但包含了6个核心字段字段作用说明版本号标记协议版本升级后老节点如何兼容看它前区块哈希指向前一个区块这就是链的物理表达Merkle树根交易摘要的摘要用一个小值锁定大量交易时间戳出块时间挖矿难度调整也依赖它难度目标值全网难度压缩编码与难度调整算法配套随机数Nonce挖矿要猜的数4字节不够用时有扩展方案这个表格里的每一行说实话都值得展开。但课程里最重要的其实是前一区块哈希这一行。因为正是这一个字段决定了区块链具有牵一发而动全身的特性只要有人篡改历史区块体里的任何一笔交易Merkle根就变了接着本区块头的哈希变了后面的每一个区块的前哈希全部对不上整条链立刻失去连续性。这不像普通数据库改一行记录只要更新索引就行——区块链是把检测篡改这件事天然嵌在数据结构里的。2.2 哈希指针最朴素也最深刻的设计第4讲专门为哈希指针的概念留了篇幅。这个名词听起来很学术其实一句话就能讲明白普通指针存的是下一个节点在哪哈希指针存的是下一个节点的内容摘要是多少。你要是自己实现过链表肯定知道普通链表里每个节点只需要存地址。但区块链里每个区块不仅要放前一个区块的地址用哈希表示还要存前一个区块内容的哈希值。好处有两点随时可以验证历史数据有没有被篡改只需要保留最后一个区块的哈希就能通过链式关系追溯到创世块。课程里举了一个很直观的例子如果你只保存了一个最新区块的哈希别人跟你说整条链都在这里你可以靠哈希指针一路回溯验证而不需要依赖任何中心化的权威账本。这就是比特币系统为什么能让陌生人互不信任却可以共同维护一条账本的最底层原因。这里我对哈希指针补充一点我自己的理解很多人把哈希指针理解成防篡改但更准确地说它是篡改可被检测。它不能阻止别人去改数据但会让任何改动在逻辑上都变得毫无意义因为一旦改了旧的哈希对不上整条链就断给你看。就好比你在牛奶盒子上贴了封条封条本身挡不住暴力打开但一旦打开所有人都知道。3. 区块如何收尾Merkle树与交易的组织方式3.1 从一笔交易到一个区块的封装过程第4讲的核心之一是交易在区块里的组织方式。比特币系统不把交易直接一条条放进区块体而是先用它们生成一棵Merkle树只把树的根哈希放进区块头。为什么要搞得这么绕第一个理由很实际效率。一个区块可能包含几千笔交易要把几千个交易哈希全塞进区块头显然不现实。Merkle树可以把所有交易压缩成一个32字节的根哈希校验起来轻量得多。第二个理由是支持了**简单支付验证SPV**这个比特币里非常关键的功能。轻节点没必要下载全量区块它只需要拿到一条从某笔交易位置通向树根的Merkle路径证明路径就能证明这笔交易确实被包含在这个区块里。这个过程需要的哈希次数是O(log n)几千笔交易只需要十几次哈希就能完成验证。课程里为了让这个概念更好理解专门讲了一个Merkle树到底怎么验证交易在区块里的例子。我把这个验证过程整理成了通俗的步骤假设区块里有4笔交易A、B、C、D两两配对算出哈希H(A)、H(B)、H(C)、H(D)再把H(A)H(B)拼起来算一次哈希得到H(AB)H(C)H(D)拼一起算一次得到H(CD)继续往上拼得到根哈希H(ABCD)如果我想证明交易C在区块里我只需要拿到H(D)和H(AB)自己就能算出H(CD)再算出根哈希跟区块头里的根哈希对照一下即可。换句话说你不需要其他任何交易的信息只凭两三个哈希就能完成对某一笔交易的存在性证明。这个设计节省的带宽和存储在真实网络环境里是非常可观的。3.2 交易所用的哈希算法SHA-256的操作细节课程提到比特币使用的哈希算法是SHA-256。这个算法本身不是比特币发明的但对区块链来说它有三个特性非常关键输入哪怕只改一个比特输出也完全不一样雪崩效应从输出反推输入在计算上是不可行的单向性真实世界几乎不可能找到两个不同输入得到相同输出抗碰撞性。这里我要补充一个踩过坑的经验。曾经有段时间我试图用SHA-256算字符串88的哈希期望得到一个可以反复复现的特征值后来发现需要区分十六进制表示和ASCII字符串表示因为比特币协议里很多数据的序列化方式跟你在终端里敲的字符串不是一回事。如果你在做开发实验务必确认自己序列化的字节流完全一致否则算出来的哈希跟区块浏览器上看到的总对不上。课程里还讲了一个很有代表性的场景假设矿工收到一个新区块他不能直接拿别人给出的哈希就用因为那只是你告诉我这个区块哈希是这个他必须自己独立地把区块头区间做一次SHA-256确认两次结果一致才会采用。验证比生成便宜得多这个不对称性也是很多共识机制设计的基础。4. 分布式系统的账本难题为什么需要共识机制4.1 去中心化系统的上帝视角与参与者视角困惑第5讲把话题从数据结构转向了共识。课程上来先抛了一个看似简单的问题既然每个节点都有一份全量账本那大家看到的都是同一个账本吗答案显然不是。因为网络有延迟、节点可能作恶、消息可能丢失不同节点看到的交易顺序可能完全不同。经典分布式系统里的拜占庭将军问题在这里以区块链的形式重新出现了一遍。我把问题拆成两个层次方便你理解诚实节点之间如何保证账本最终一致存在恶意节点时如何保证他们不能掌控账本比特币选择的工作量证明PoW同时回应了这两个问题。工作量证明要解决的真正的核心问题其实是随机选出一个节点来打包区块同时让这个选择不可被低成本操纵。如果你认真看会发现比特币里的共识其实分两层一层是哪个区块能上链的双层共识先有分叉然后靠最长链收敛另一层是谁有权出块的选举共识解SHA-256难题。课程把这套东西叫有经济代价的随机抽签。我补充一句这里面最重要的是经济代价因为只有让出块的代价足够大才能抑制恶意分叉、双花这类攻击行为。4.2 PoW具体到底难在哪里哈希难题的可调难度第5讲详细描述了PoW的过程。矿工要做的事情可以概括为不断更换区块头里的Nonce反复计算双次SHA-256直到得到一个小于当前难度目标值的哈希。这里的目标值由系统按难度自动调整比特币每2016个区块调整一次目标值越小挖矿难度越大。我用一个例子帮大家建立直觉假设目标值是0000开头矿工要找到任意一个64位哈希前四位全是0概率约1/16。如果目标值变成000000开头那就是约1/16777216。差别就是这么大。比特币用高难度把出块时间稳定在10分钟左右。课程里还提到了Nonce只有4字节的问题。现在的矿机算力早就超过每秒万亿次意味着一个区块可能很快把Nonce空间遍历完。普通人可能不会想到但课程里明确说了如果真的全部试完还是没找到合法解矿工其实可以改区块头里其他字段比如时间戳、甚至重新打包交易换个Merkle根相当于重置抽奖卡池再继续。这里我产生过一个疑问明明可改的不止Nonce为什么课程说矿工主要靠Nonce我当时查了资料才发现早期的比特币代码里确实只改Nonce后来矿池为了快速调整会通过改Coinbase交易第一笔不花掉的收入交易来改变整个Merkle根变相获得几乎无限次的尝试机会。这也是为什么现在很多矿池的区块Coinbase里塞了一堆乱七八糟的数据——那很大程度上不是闲得慌是换种子重新抽奖。5. 最长合法链与分叉最常被问错的知识点5.1 分叉产生的两种场景比特币系统的分叉是第5讲的高潮部分。课程把分叉分成两类状态分叉和协议分叉。状态分叉临时分叉两个矿工几乎同时解出合法区块都广播出去网络里一部分节点先收到A另一部分先收到B此时两条候选链同时存在之后看谁先在这个区块之上再产出一个合法区块较短的那条分支会被抛弃。协议分叉永久分叉全网在规则层面发生分歧比如区块大小到底改成1MB还是8MB。一部分节点升级客户端认可新的规则另一部分坚持旧规则此时两条链可能长期并存历史上比特币和比特币现金就是这种分叉的真实案例。课程里特别强调了一个最重要也最容易忽略的原则最长合法链。这个最长指的是累计工作量最多的那条链而不是单纯区块数量最多。不过实际运行中因为每个区块难度基本相同区块数最多的链通常也就是工作量最大的链。5.2 分叉攻击的具体过程与防御课程讲了两种与分叉相关的攻击场景这里绝对值得反复琢磨。第一种是孤儿块诚实节点本来可以正常出块但因为网络延迟它的块晚了一步成了被抛弃的块。矿工白费了算力没有奖励。第二种是更危险的双花攻击攻击者先在自己账户里发起一笔交易买币等收款方确认收到后再尝试从更早的区块位置分叉出一条自己给自己转账的链让它变得比主链更长从而让之前那笔交易在最长链上消失。防御的关键就是确认数策略。课程提到一般要等6个区块确认才认为交易足够安全。原因很简单攻击者要在短短6个区块时间内从很靠后的位置追赶上主链需要的算力非常夸张。假设系统有50%的算力算被攻击者控制它追6个块的概率也不是特别大如果只有20%算力那更是难上加难。具体的概率公式在课程里有推导这里不展开数学但结论是——确认数越多被推翻的概率指数级降低。5.3 区块奖励与记账激励记账不只是记还涉及钱的分配第5讲还安排了一个内容矿工的收入构成。我整理了一下总共两块新币奖励Coinbase Reward也叫区块补贴交易费交易输入-输出的差额。课程里有一个对比表格让我印象深刻写的是矿工自己给自己转账这一特殊交易即每个区块第一笔交易是矿工自己的地址。这笔交易除了奖励之外还能打包任意数据矿工可以充分利用这个自由空间。我当时有一个疑惑既然矿工可以自己给自己记一笔巨款那他不就可以无限增发了吗课程的解答是Coinbase交易能写入的金额上限受共识规则约束并不是矿工想写多少就写多少。区块奖励总量有严格上限任何超过这个上限的Coinbase交易都会被其他节点视为无效区块直接拒绝。所以你不需要担心某个矿工突然给自己记一个天文数字——他记了也没用全网都不会认。6. 比特币的脚本系统与UTXO模型区块链应用怎么玩起来6.1 UTXO每天记账的最小单位第6讲进入应用层最先讲的是UTXO未花费交易输出。这个概念理解得越早后面看智能合约代码越顺。比特币系统里没有传统金融体系里的那种账户余额它只有一条条被锁定的未花费输出。你拥有的资产其实是所有指向你地址且至今没有被花掉的交易输出集合。为了让你加深印象我把UTXO和普通银行卡账户做了个对比UTXO模式账户余额模式如以太坊的账户交易会销毁旧的输出创建新的输出转账直接改余额必须一次花完某个输出找零单独生成新输出余额多少可以部分转账天然支持并发与隐私性合约逻辑相对简单离线聚合需要扫描多个UTXO查询余额简单举个例子你收到两笔比特币一笔0.5个一笔0.4个现在你要给别人转0.6个。系统不会直接从余额里扣而是把0.5和0.4这两笔都作为输入花掉输出变为两笔0.6给对方0.3作为找零回到你自己的地址如果手续费0.1。这就是UTXO模型的典型处理方式。6.2 比特币脚本可编程但不是图灵完备课程中关于脚本的部分非常关键。比特币的脚本是基于栈的、非图灵完备的脚本语言。很多没系统学过的人以为比特币只能转账其实它还能做很多有意思的条件锁定比如只有提供正确私钥签名才能解锁需要两个私钥中至少一个签名才能解锁在特定时间之前冻结资产需要多个私钥中的部分签名多重签名才能解锁。它的核心模式是每一笔交易输出都有一段锁定脚本ScriptPubKey描述这笔钱怎么才能花花费时需要提供解锁脚本ScriptSig通常是签名和公钥。教学里有一个概念让我特别受启发比特币交易的有效性验证本质上就是执行一遍脚本。比特币节点会拼合解锁脚本和锁定脚本来执行若栈顶留下一个非零值即true则验证通过。这个机制初看跟面向过程编程很像但关键区别在于脚本没有循环、没有复杂的状态变量因此不能实现以太坊那种复杂合约逻辑。6.3 区块链应用的边界强信任其实做不了第6讲里有相当大的篇幅在强调一个问题区块链到底能做什么不能做什么。这个部分是很多人没听完就出去吹牛、最后被啪啪打脸的根源。课程给出的边界感很清晰。区块链适合的场景是参与方互不信任、且需要共享数据、无法依赖中心机构的环境。而它不适合的场景是对账性能要求极高、数据必须保密、且双方本来就高度互信。举几个课程里可能没细说但我认为很契合的例子适合供应链溯源多方协作但缺乏统一信用凭证适合数据存证给电子合同、版权证据做哈希时间戳公证不适合高频支付TPS太慢按目前比特币性能远无法处理日常刷卡量不适合大数据存储链上存储极贵且公开没必要把所有文件放链上。课程里也专门讲了区块链不是万能的这个提醒。我翻译成人话就是区块链解决的是陌生人在没有中心的网络里如何协作的问题不是所有行业所有场景都上链的问题。谁要是拿区块链去解决性能难题或隐私难题方向大概率是错的。7. 四到六讲串联复盘跨章节的知识网络单看每一讲容易让人产生知识零散的感觉所以我把4-6讲的内容做一个跨章节的串联整理。如果让我用一句话概括这三讲的内在逻辑我会说数据结构第4讲决定了区块链为什么可信共识机制第5讲决定了区块链如何对一份账本达成一致应用设计第6讲决定了区块链能把这个可信扩展到哪些业务边界。具体来说三讲的知识点是有很强的依赖关系的没有哈希指针和Merkle树验证成本就降不下来轻节点就不可能出现区块链的易用性会大打折扣没有PoW攻击成本就会变得极低账本的一致性和安全性就无法保障后续任何应用都无从谈起没有UTXO和脚本的灵活组合比特币就只是一个转账工具而不是能够承载智能需求的可编程货币。举个例子来验证这个相互依赖关系。设想有人想设计一条新的链去掉PoW改用权益证明PoS一个很关键的点就是如果你没有理解第4讲的数据结构你很难设计好最终敲定区块并处理分叉的逻辑。因为不管共识机制怎么选都要先解决数据结构层面的溯源验证再解决节点间的一致性问题。它们是底座与地基的关系而不是并列关系。8. 学习建议与避坑指南如果你正在自学区块链8.1 基础学习容易踩的五个坑在这几讲的学习过程中我观察到很多初学者会在下面几个地方绕圈我也在这些坑里踉跄过现在拿出来讲一下希望你能跳过。第一个坑是把去中心化理解为彻底没有中心。比特币确实没有中心服务器但矿池、大交易所、核心开发团队都扮演着事实上的中心角色。去中心化是一个程度问题不是有无问题。第二个坑是忽视验证与生成的成本不对称性。很多人只记住了挖矿要花巨量算力却没有意识到验证区块极其便宜。这个不对称性是PoW机制的生命线也是很多公私链设计里的底层偏好。第三个坑是误以为交易一旦上链就永远不能改。是的最终确认的区块很难被篡改但短时间内的临时分叉、孤儿块会让未被深确认的交易消失。上链和最终确认是两个阶段。第四个坑是把Merkle树和哈希表搞混。Merkle树不是为了快速增删查改数据而是为了高效证明某元素存在于一个集合中。用途决定结构先搞清楚场景再背概念。第五个坑是拿比特币的TPS衡量一切区块链。比特币慢是设计取舍侧链、二层网络、分片等技术都在试图解决可扩展性但不代表比特币的慢是一个需要羞愧的缺陷。区块链性能取决于你要解决的场景而不是越大越好。8.2 一个值得反复观看的实操切入方式如果你想把这几讲的内容真正掌握光看讲义和幻灯片是不够的我建议按这个顺序做起来对照课程里的区块结构图用区块浏览器Blockchain.com或者mempool.space找一个真实区块把区块头各个字段抄下来手动验证一次前哈希是不是真的指向上一个区块自己用Python写一个极简区块链Demo实现哈希指针、Merkle根和PoW模拟不需要完整网络跑通挖矿-验证-分叉-最长链接管的流程即可再去读比特币脚本的常见操作码亲手构造一笔P2PKH交易观察它如何通过签名解锁UTXO最后再回到课程里看PPT你会突然发现很多概念自己已经有画面感了。我当初在写极简区块链Demo的时候最大的收获是发现分叉处理远没有PPT上画的那么优雅。因为网络是异步的你需要考虑同时收到两条链、其中一条被替换、缓存里还留着旧块等下轮确认……这些边界问题比理论模型复杂得多但正是这种实践才能回过头来理解课程里最终一致性这个近似抽象的真正含义。8.3 如果只记一个结论如果只从三讲里挑一个最核心的结论我觉得是这句话区块链不是让数据不能被篡改而是让任何不经授权的篡改在成本上都变得不划算并且系统中的任何参与者都可以独立地发现这种篡改。这句话浓缩了数据结构、共识机制和应用边界的全部精髓。你在面试、答辩、给别人做科普的时候只要把这句话真正讲透比背一百个名词都管用。9. 三讲的进阶追问与延伸思考这几讲听完以后有经验的开发者通常会开始追问一些没有直接在PPT里回答的问题。我整理了几个我认为有深度的进阶方向供你自行探索。第一个进阶问题是PoW消耗能源是否值得这是一个争议很大的话题。我的看法是它是在没有一个可信第三方的环境下拥有账本记账权的代价。能不能用更环保的方式实现同等安全性是整个行业都在探索的问题比如PoS、PoH、PoSpace等。关键不是简单说浪费而是要比较这种代价换来的去中心化信任值不值得。第二个进阶问题是账本分叉时交易在不同分支中的状态如何处理比如一笔交易同时出现在两条分支里但其中一条分支上它的后续交易是先花掉了这个UTXO另一条分支还没花那么当长链切换时未确认交易的内存池会如何处理这个问题在课程里没有深入但实测下来和理解脚本执行状态关系很大我用代码模拟过发现每个节点维护的内存池策略并不完全一致这也是为什么同一个账户在分叉瞬间可能出现在两个不同状态的链上。第三个进阶方向是UTXO模型能不能直接映射到以太坊的合约状态以太坊用的是账户模型因此不需要找零、不需要一次性花费全部输出智能合约写起来更接近传统编程。但从并行性和隐私性角度看UTXO模型其实有优势。这也是为什么一些研究项目试图把两者结合。想深入的话可以去看以太坊的EIP-3100这类探讨性提案它们讨论的就是能不能把状态模型改成更偏向UTXO的方式。第四个进阶问题是打包多个交易进区块时是否每次都必须重新计算整个Merkle树这个问题我实际实验过答案是如果只新增一笔交易理论上可以只算从叶到根的路径但比特币的节点实现里绝大多数情况是重新构建整棵树。因为区块生成频率低、交易数量有限重建整棵树的成本相比整个SHA-256挖矿消耗来说可以忽略不计。不必为了这种性能问题过度优化。10. 我实际验证过的一些补充细节这段我想把那些在真实查证时发现、课程里可能只一笔带过的细节集中写出来。它们不一定直接出现在考试题里但对理解系统帮助很大。第一个细节是关于区块大小限制。早期比特币没有严格规定区块大小上限但后来因为攻击和网络性能的原因核心开发者添加了1MB的硬上限。课程里虽然没有展开但比特币和比特币现金的硬分叉根因就在这个参数上。如果你做PPT讲历史分叉建议把区块大小之争讲透。第二个细节是区块时间戳的容错范围。区块头时间戳并不要求等于矿工当前真实时间它只要求大于前11个区块的中值时间戳并且不超过节点本地时间加两小时。换句话说矿工可以稍微调整时间但不能无限改。这种设计的目的是防止矿工通过篡改时间戳来恶意影响难度调整。我第一次听这个规则的时候觉得很小但后来发现它直接关系到难度炸弹之类的机制。第三个细节是出块奖励逐年减半的规则。比特币白皮书规定了每21万区块减半一次课间提到过后来我也复算了。减半事件并不仅仅影响矿工利润还影响市场供需预期因此每次减半前后价格波动、算力调整都会很剧烈。初学者常常把减半与币价上涨划等号但严格来说减半只是新币供应减少的机制之一价格还受需求、宏观政策等多重因素影响。如果你刚接触这些概念可能会觉得细节太多记不住。我的建议是先抓住树根上的三个主干概念哈希指针、PoW最长链、UTXO脚本。这也是我这轮整理笔记时给自己定的重点。等这三个概念在你的脑子里像三根钉子一样扎牢了其他细节都是往这三根钉子上挂东西越挂越轻松。
返回列表