简介面向区块链入门学习者的《区块链技术与应用》听课笔记源自北京大学肖臻老师公开课内容适合高校学生、程序员及对分布式账本技术感兴趣的读者快速建立知识框架。文档系统梳理了比特币等加密货币背后的核心原理包括哈希函数与SHA-256、数字签名、哈希指针、Merkle树、区块链协议及双花攻击应对思路并兼顾了分布式共识、区块头与交易结构等进阶内容。压缩包内仅含1个doc文档大小134KB内容紧凑、条理清晰基本覆盖区块链技术的关键数据结构与密码学基础。该文档已在CSDN获得约80人次浏览学习可作为课程复习、自学入门或技术分享前的提纲式参考。读者可通过这份浓缩笔记先理解主干概念再结合原始课程视频深入细节尤其适合准备区块链相关考试或项目汇报的人群。1. 区块链技术与应用这份公开课笔记的价值不在概念而在四个可验证环节做技术这些年我习惯拿到一份课程笔记先扫目录再决定要不要细读但这份区块链技术与应用公开课笔记有点不一样它没有停留在“分布式账本”这类定义上而是从哈希函数一路讲到UTXO把不可篡改拆成了四个可验证的环节——数据完整性靠哈希身份认证靠签名记账权靠工作量证明账本状态靠UTXO。读完你会得到一套统一标尺拿它可以去拆任何一条链的白皮书。适合刚接触分布式账本的新手也适合被各类共识机制绕晕、想回头补基础的开发者。2. 密码学原理哈希函数三性质与数字签名的完整拆解2.1 为什么一份笔记要把“哈希碰撞”放在第一位公开课第一节就抛出一个听上去很反直觉的结论哈希碰撞是常见的但人为制造哈希碰撞几乎是不可能的。这里的“常见”是指数学上一定存在两个不同的输入映射到同一个输出因为输入空间远大于输出空间而“不可能”是指对SHA-256这类哈希函数目前没有任何办法在可接受的时间内主动构造出这样一对输入。这个性质叫collision resistance碰撞抗性。它直接决定了区块链“不可篡改”的第一层保障一段消息m被篡改成m′只要哈希函数具备碰撞抗性H(m′)就必然不等于H(m)。所以校验数据有没有被改过只需要重新计算哈希值并与原值比较而不需要重新执行整个交易逻辑。哈希性质核心作用保护对象验证方式Collision resistance防篡改交易数据和区块内容重新计算哈希值做比对Hiding防泄露预测值、承诺值由H(x)反推不出xPuzzle friendly防作弊记账权分配遍历求解nonce验证只算一次需要提醒的是哈希碰撞抗性目前属于“经验安全”并未被数学严格证明。它能用是因为计算机科学和数学方法发展到现在还没有找到一条可行路径。但MD5的沦陷已经说明安全性会随算力与算法分析的进步而退化。所以笔记里那句“对于不同类型的哈希函数其安全性随时可能被破解”才是这个领域真正的常态。自测步骤可以这样做准备一个文件计算它的SHA-256值并记录把文件里某个字节改成0x00后重新计算哈希值如果两次哈希结果完全一致说明发生了碰撞——在SHA-256下这一步几乎不会成功而这正是区块链数据完整性依赖的底线。2.2 hiding与数字承诺预测结果不能提前公开时怎么自证第二个性质hiding指哈希函数计算不可逆给定x可以计算H(x)但从H(x)反推出x在计算上不可行。单独看它像是安全辅助但结合一个实际场景就立刻有了用处预测结果在正式公布之前不能公开又要证明自己当时确实预测对了。比如预测某场球赛比分直接把答案发出去会影响市场行情藏在抽屉里又没法自证清白。常见做法是预测方自己生成一个随机数nonce把“预测内容nonce”一起做哈希并公开哈希值。等到答案公布后再同时公开原始内容和nonce任何人都可以验证两者是否匹配。随机数的加入是为了让取值分布足够离散避免攻击者枚举所有可能的输入来猜测预测值。这套机制就是digital commitment的数字等价物很多人叫它“密封信封”。区块链里的随机数种子、预言机上链前的数据锁定本质都在用这个模式。我自己做模拟项目X时给测试网配过类似的承诺机制当时踩的坑是nonce长度太短被枚举爆破出真实预测值。从那以后我生成承诺时都用128位以上随机数。2.3 数字签名非对称加密在这里不是用来保密的区块链是完全公开的系统数据不需要加密传输那公私钥对用来做什么答案是数字签名。私钥加密、公钥解密目的是证明身份而不是隐藏内容。以比特币为例转账时要用转账方私钥对交易做签名全网节点用其公钥验证签名是否有效。因为公私钥对是256位的两个账户恰好拥有相同公私钥对的可能性低到可以忽略所以想通过批量生成公私钥对再逐一比对的方法冒充他人在计算上不可行。初学容易混淆的点在于普通PKI体系里“公钥加密、私钥解密”用于保密通信而区块链里的用法是“私钥签名、公钥验签”用于身份认证。两个方向正好相反。我在本地复现过一次签名验证流程发现只要把私钥和公钥的用途写反程序立刻报错——这种问题属于方向性错误调试半小时才发现签名验证函数用错了密钥。2.4 选型观察从SHA-256到抗量子哈希比特币选用SHA-256作为核心哈希函数看重的是它同时满足上述三个性质碰撞抗性保证区块头不可篡改hiding保证交易内容不会被提前破解puzzle friendly保证工作量证明只能靠遍历求解没有捷径。其他链有的改用BLAKE2、Keccak也都是为了在性能与安全性之间找平衡。选型时不要只看哈希函数本身还要看它所在协议如何组合这些性质比如哈希与随机数拼接的方式不同安全性结论可能完全不同。3. 数据结构hash pointer与Merkle tree两条验证链如何闭合3.1 hash pointer比普通链表多出的那个哈希值区块链最基本的形态是一条链表但它的特殊之处在于每一个区块里保存的不是普通指针而是hash pointer——一个指向前一区块的指针指针值等于前一个区块全部数据的哈希值。普通链表的前向指针只是内存地址A节点被修改后B节点毫无感知hash pointer则不同前一个区块任何数据发生改变都会让当前区块里保存的哈希值失效进而引发后续所有区块的哈希校验失败。所以校验整条链有没有被动过不需要从创世纪块一直检查到最新块只需要检查系统中保存的最后一个hash pointer即可。实际运行中“也不需要将整条区块链完整保存下来”这句话容易被误读。它指的是对于某些验证场景可以只缓存最后若干长度的区块实时更新、逐步验证。但如果你的节点要独立验证新交易是否双花仍然需要能访问到足够完整的历史数据。我把这理解为一种“简化支付验证”的思路而不是“只存尾巴就够了”。两者边界差很多后面第5章会细讲。3.2 Merkle tree与Merkle proof轻节点的低成本验证路径Merkle tree是另一种用hash pointer构建的结构与普通树的区别在于树的内部节点不直接保存数据而是保存左、右子节点哈希值。最原始的叶子数据保存在最底层根节点哈希值存到区块头里。这个结构带来的直接好处是全节点保存全部交易数据轻节点只保存block header两者之间可以用Merkle proof完成数据存在性验证。完整路径分四步轻节点收到一个交易和对应的Merkle路径从该交易叶子出发逐层把相邻节点的哈希值两两组合计算父节点哈希重复向上直到得到根哈希将计算结果与本地区块头的Merkle root比对一致则交易存在。如果交易按时间顺序排序后构建成sorted Merkle tree还可以用一种简洁方法证明“某笔交易不在链上”只需检查前驱与后继交易的路径就能确定目标交易不在排序区间内。普通未排序的Merkle tree做不到这一点这是两者重要的能力差异。3.3 验证实操从最后一个块头开始向上校验我在梳理这份公开课笔记时会照下面这张清单做一次模拟验证不需要真正接入测试网步骤操作预期结果1计算最后一个区块的块头哈希与系统中保存的hash pointer一致2读取倒数第二个区块的完整数据并计算哈希等于最后一个区块中记录的previous block header3重复上溯到创世纪块全程哈希值连续匹配4选一个交易做Merkle proof最终根哈希与块头Merkle root一致这套流程可以暴露一类常见问题如果同步数据过程中块头与块体来自不同节点经常会出现“根哈希算得出来但根对不上”的现象。原因通常是块体先于块头到达或者某个节点返回了不完整的交易列表。遇到这种情况先检查交易列表长度再检查叶子节点排序方式最后检查相邻哈希的拼接顺序——三者哪一个错了都会导致Merkle root不匹配。4. 协议与共识铸币、转账、分叉与工作量证明的选择逻辑4.1 去中心化记账与双花攻击数字货币本质是一段带数字签名的文件问题在于文件可以被复制。如果同一段货币被复制多次每份都带有权力中心的合法签名用户就可以在一次交易后又拿相同签名去发起另一笔交易。这就是double spending attack双花攻击。中心化系统的处理方案很直接在每张数字货币上加唯一编号由中央权力机构维护一个数据库实时记录货币编号与当前持有人。每一笔交易必须由中心机构检查这个编号是否已花费若已花费则拒绝。这能防双花却把整个系统的信任放在单一机构上数据库被攻破或机构内部造假整个货币体系就会跟着出问题。去中心化系统要防双花就不能依赖中央数据库只能让每一笔货币的来源与归属在账本上可追溯。区块链的做法是交易之间通过“说明货币来源的指针”互相咬合上一笔交易的输出成为下一笔交易的输入验证时必须把两者拼在一起执行检测逻辑——公开课里提到这叫BitCoin Script。4.2 铸币与转账coinbase与普通交易的区别在去中心化的账本里铸币权被下放给每个用户任意用户都可以发起铸币交易记作 →A(10)表示凭空产生10个币给A。这就是coinbase transaction它是全系统唯一合法的铸币渠道。与普通转账不同coinbase交易没有上一笔交易的输出可供验证它相当于在账本上写“系统给矿工发奖励”。协议里规定了初始铸造量为50BTC每当区块链延长21万个区块铸造数量减半。笔记整理的当时区块奖励是12.5BTC后续减半节奏是固定的每21万块减半一次经历过多次减半后奖励已远低于这个数。转账交易的结构则是A→B(5), A→C(5)表示A把10个币拆给两个不同地址。每笔转账必须包含转账方的签名和收款地址而验证方需要找到这笔交易输入所对应的上一轮输出确认资金来源真实存在且未被花掉。“total inputs total outputs transaction fee”这条守恒关系是账本一致性的底线如果输入总和大于输出总和差额并不是凭空消失而是成为矿工收取的交易费。交易费的金额占比通常很小但随着区块奖励持续减半矿工的收入会从“以区块奖励为主”逐步转向“以交易费为主”。这一点对理解后续手续费市场、矿工调度行为非常关键——长期来看交易费才是维持去中心化记账的经济基础。4.3 记账权竞争为什么找nonce没有捷径既然任何人都能铸币那怎么决定谁有资格把交易写入区块链答案是工作量证明。区块头里有一个target难度目标和一个nonce字段记账者需要找到一个nonce使得H(block header) ≤ target成立谁先找到谁就获得这轮的记账权。这个设计的关键是puzzle friendly除了逐个遍历nonce进行尝试没有任何已知捷径。我曾在本地用低难度参数模拟过挖矿遍历到十几万次才凑出一个满足条件的nonce而验证一个候选nonce是否合法只需要重新计算一次区块头哈希。这种“验证极快、求解极慢”的不对称正是工作量证明的本质属性。需要特别说明的是这里的“没有捷径”只针对求解过程。如果有人声称自己能不经遍历直接算出合法nonce要么他找到了哈希函数的严重弱点要么他在撒谎。公开课笔记强调这一点目的是帮人建立判断力避免被所谓“优化挖矿算法”的话术带偏。4.4 分叉与最长合法链去中心化系统没有统一时钟两个矿工可能几乎同时找到合法nonce各自向网络广播一个新区块这时区块链出现分叉。同一时间内系统里可能存在两条合法但内容不同的分支。分叉攻击是更危险的场景攻击者把交易所确认过的交易所在的区块从链上“摘下来”在中间插入自己构造的合法交易生成一条新分支。如果这条新分支被网络接受原本的交易就被回滚了等于同一笔钱被花两次。防范办法是协议层面的共识规则只接受能延拓最长合法链的交易。攻击者要成功回滚就必须把自己的分支做得比原链更长而这需要持续投入超过全网半数的算力——这就是51%攻击背后的逻辑。所以“最长链”并不是出于性能优化而是被设计成篡改成本的来源。普通用户等待多个区块确认本质上就是让自己的交易处在一个难以被追平的位置。每多一个后续区块回滚一把交易就需要从那个位置重新计算更多区块成本线性上升。5. 实现细节与常见问题UTXO、账本模式与四个踩坑点5.1 UTXO与transaction-based ledger的核心逻辑比特币采用transaction-based ledger基于交易的账本模式核心数据结构叫UTXOUnspent Transaction Output即未被花掉的交易输出集合。它的含义是一条链上所有仍可被当作资金来源的输出记录。验证一笔新交易是否合法需要做两件事第一检查交易输入引用的每笔输出是否都在UTXO集合中第二检查这些输出是否已被其他交易花掉。两者都通过交易才合法。每笔合法交易被确认时UTXO集合就同步更新一次交易引用掉的旧输出被移除新产生的输出被加进来。全节点内存中需要频繁使用UTXO来确认交易合法性所以UTXO集合的大小、缓存策略、更新效率直接关系到一个节点的实际吞吐能力。以太坊则采用account-based ledger基于账户的账本模式每个地址直接保存余额交易验证时只需要比较账户余额与转账金额不需要追溯每一笔历史输出。两种模式各有取舍UTXO天然适合并行验证与隐私保护但实现复杂账户模型直观且易于编写智能合约但需要额外处理重入攻击等问题。UTXO数据结构的边界要注意它是一个动态集合不是固定快照。区块重组发生时已确认交易可能被回滚UTXO集合也要相应回退。如果节点只保存当前集合而不保存历史快照遇到回滚就只能重放区块这是一个常见的实现坑。5.2 常见问题一FLP与CAP到底说明白什么现象看到“去中心化”四个字就认为系统可以同时做到强一致、高可用和高容错。 原因FLP impossibility result指出在一个异步系统中即使只有一个成员出错也不可能取得分布式共识。CAP定理则说明一致性、可用性、分区容错性三者最多同时满足两条而区块链恰恰运行在一个不可靠的网络分区环境里。 解决公开课笔记特意提及这两个结论是提醒我们区块链的“共识”是概率意义上的最终一致不是即时强一致。理解这一点之后再看“多少个确认才算安全”这类问题就不只是经验值而是对安全边界的推导。我通常会给测试网配置较低确认数以加快调试但要意识到这是牺牲安全性换来的开发效率。5.3 常见问题二hash pointer能不能用在环形结构现象有人想把最后一块的hash pointer指回创世纪块把链做成环以减少尾部校验成本。 原因hash pointer有一个隐含前提——必须先确立一个节点的值才能去计算与之相关的区块的值。环形结构让每个节点都依赖另一个尚未确定的节点形成循环依赖哈希值永远无法稳定计算。这个约束也意味着所有哈希指针结构必须保持有向无环。 解决不要在链式数据结构里设计环路。如果确实需要对尾部与头部做关联校验可以在系统状态里额外保存创世纪块哈希而不是把最后一个区块的指针物理指回创世纪块。5.4 常见问题三Merkle proof能否证明交易不存在现象轻节点想验证“某笔交易不在链上”直接把交易哈希放进Merkle树中找路径结果找不到误以为交易不存在。 原因普通Merkle tree只能证明叶子节点存在无法证明叶子节点不存在。一个节点的哈希路径缺失可能是因为它确实不在也可能是因为数据尚未同步完整。 解决需要证明不存在性时应使用sorted Merkle tree。它按交易顺序排列叶子轻节点只需要验证目标交易的前驱与后继叶子构成连续区间即可推断目标交易不在区间内。这份公开课笔记明确指出了这一区别我在实现某跨平台系统的数据校验模块时就是靠这个结论把不存在性证明的复杂度从O(n)降到了O(log n)。5.5 常见问题四轻节点能不能独立验证交易合法性现象轻节点保存了block header就认为自己可以独立完成全部交易验证。 原因轻节点没有UTXO集合无法判断某笔交易的输入是否已被花掉。它只能通过Merkle proof验证交易确实被打包进某个区块但无法确认该交易所在的分支最终是否被最长合法链接受。 解决轻节点依赖全节点提供交易与Merkle路径并自行计算路径哈希值验证交易存在性。理解这个边界才不会在生产环境中把轻节点当作全节点使用。我在调试某图像处理Demo的链上存证模块时曾因轻节点误报“验证通过”而放过一笔双花教训是轻节点只承担“存在性验证”合法性判断必须依赖完整账本。6. 验证技巧用几个区块复现hash pointer的雪崩效应讲完原理和踩坑最后分享一个我自己验证这份笔记时常用的小技巧不接测试网直接用Python构造一条三个区块的最小链观察修改中间区块后哈希值如何连锁变化。import hashlib def block_hash(index, prev_hash, data): payload f{index}|{prev_hash}|{data}.encode() return hashlib.sha256(payload).hexdigest() # 构造三个区块构成最小链 prev 0 * 64 # 创世纪块的前序哈希为空 block1 block_hash(1, prev, genesis) block2 block_hash(2, block1, tx_a: A - B) block3 block_hash(3, block2, tx_b: B - C) print(原始链:) print(block1:, block1) print(block2:, block2) print(block3:, block3) # 篡改block2的data再重新计算后续哈希 tampered_block2 block_hash(2, block1, tx_a: A - C) tampered_block3 block_hash(3, tampered_block2, tx_b: B - C) print(\n篡改block2后:) print(tampered_block2:, tampered_block2) print(tampered_block3:, tampered_block3) assert block3 ! tampered_block3, 哈希未变化说明没有雪崩效应这段代码的逻辑是每个区块的哈希值由三部分组成——区块序号、前一个区块哈希和区块数据。只要前一个区块哈希发生变化后续所有区块哈希都会跟着变。运行结果会显示block3与tampered_block3完全不同而且差异是雪崩式的篡改一个字母都会让最终哈希面目全非。参数需要注意两点第一prefix里的区块序号不能省略没有它两个不同位置但数据相同的区块会得到相同哈希破坏链的唯一性第二payload的拼接格式要固定一旦格式变化所有历史哈希都无法复现。这个最小实验的可扩展性很好往数据结构里加一个Merkle root字段再构造几笔交易做一次Merkle proof就能把笔记里讲解的区块头结构完整串起来。从那以后我每次拿到一条链的白皮书都会先写一遍这个最小实验确认自己能不能从头到尾复现出哈希连锁校验的逻辑再往下读共识部分。这比背结论扎实得多也让我能快速分辨哪些链的设计是在动真格哪些只是在堆概念。这份公开课笔记建议从头到尾过一遍边读边动手画自己的验证清单希望帮到你。本文还有配套的精品资源点击获取