← 返回总目录 · 区块链技术与应用笔记(BTC)
可以通过比特币区块链浏览器查看一下区块链的一个区块到底长什么样子(截止到2025/1/22 9:29,最新区块是#880277)

右侧是该区块中每笔交易的细节,先解释一下区块中的各项参数
区块基本信息
- Coinbase Message:
- 奖励:
- Coinbase 交易用于向矿工支付新生成的比特币奖励和交易费用。它标志着区块链中经济活动的开始。
- 可包含附加数据:
- 矿工可以在 Coinbase 交易中包含任意数据,这段数据是矿工自己的消息或附加信息。它通常用于庆祝某个成就、传达特定的信息或作为选定矿池的标志。
- 格式:
- Coinbase 消息的数据格式没有严格的限制,因此可以是矿工自定义的文本、字符、哈希值或其他任何形式的信息。在区块链浏览器中,可能会显示为看似乱码或难以理解的字符组合。
Coinbase Message(或称为“Coinbase 交易的附加数据”)是指在矿工挖掘新区块时,包含在 Coinbase 交易中的额外信息。Coinbase 交易是区块中第一笔交易,you'jiao'zuo铸币交易(generation transaction)或币基交易(coinbase transaction)主要用于奖励矿工提供的服务,并且它是唯一可以创造新比特币的交易。
特点
这块数据可以随便写;注意这也是个交易,其中的信息也会改变merkle root的哈希值从而改变区块头的哈希值,nonce也就四个字节的长度,如果nonce的不足以调控难度,可以规定Conbase Message的前几个字节,来辅助调整难度
- Hash:
区块的哈希值,是通过对区块头信息进行哈希计算得到的唯一标识符,用于验证区块数据完整性。0000000000000000000097b925fdefdf56a0726ac6f1f3b3d94c136dfa675705表示区块的标识。前面一大长串0并不是偶然,所谓挖矿就是不断调整随机数nonce,使得整个block header的哈希值小于等于给定的目标阈值,改目标阈值表现为16进制就是前面一大串0,因此凡是符合难度要求的区块,hash header前面是必然的一大串0
- Capacity:
区块的容量使用率,表示区块大小相对于最大允许容量的百分比(比特币最大区块大小为 1 MB,扩展后为 4 MB 权重单位)。146.23% 表示权重超出基准容量。
- Distance:
当前区块与前一个区块之间的时间间隔(出块时间)。示例值“8m 12s”表示两区块间间隔为 8 分 12 秒。
交易统计
- BTC:
区块内所有交易涉及的比特币总量。示例值“4,759.3896 BTC”表示该区块内所有交易累计了 4,759.3896 BTC。
- Value:
所有交易对应的比特币总价值,以该区块生成时的市场价格计算。示例值“$504,262,995”。
- Value Today:
当前市场价格下的比特币总价值。示例值“$504,124,973”。
- Average Value:
每笔交易的平均比特币金额。示例值“1.4435516026 BTC”。
- Median Value:
区块中交易金额的中位数,代表交易金额的中心趋势。示例值“0.00090795 BTC”。
输入输出数据
- Input Value:
所有交易的输入金额总和。示例值“4,759.44 BTC”。
- Output Value:
所有交易的输出金额总和。示例值“4,762.56 BTC”。
- Transactions:
该区块中包含的交易总数。示例值“3,297”表示有 3,297 笔交易。
- Witness Tx’s:
使用隔离见证(Segregated Witness)的交易数量。示例值“3,126”。
- Inputs:
区块中所有交易的输入数量总和。示例值“7,267”。
- Outputs:
区块中所有交易的输出数量总和。示例值“12,212”。
手续费和奖励
- Fees:
该区块中所有交易的总手续费。示例值“0.04971394 BTC”。
- Fees Kb:
每千字节数据的手续费平均值。示例值“0.0000324 BTC”。
- Fees kWU:
每千权重单位的手续费平均值。示例值“0.0000124 BTC”。
- Minted:
该区块中新生成的比特币数量。示例值“3.13 BTC”。
- Reward:
矿工获得的总奖励,包括新生成的比特币和交易手续费。示例值“3.17471394 BTC”。
区块技术信息
- Depth:
当前区块到最新区块的深度,1 表示这是最新区块。
- Size:
区块的物理大小,单位为字节。示例值“1,533,301”。
- Version:
区块的版本号,表示所使用的区块验证规则。示例值“0x30cd6000”。
- Merkle Root:
区块中所有交易的默克尔树根哈希值,用于验证交易的完整性。
- Difficulty:
- 挖矿过程:
- 挖矿是通过计算来解决复杂的数学问题,以验证和记录交易。矿工们使用算力计算哈希值,目标是找到一个低于特定目标值的哈希值。
- 难度的计算:
- 比特币网络每 2016 个区块(约每两周)会调整一次挖矿难度,以维持平均每 10 分钟生成一个新区块的速度。如果过去的区块产生速度过快,难度将提高;如果产生速度过慢,难度将降低。
- 示例值:
挖出该区块的挖矿难度,代表当前网络的计算强度。示例值“110,451,907,374,649.52”。
难度的意思:
Difficulty(难度) 是一个用于衡量区块链网络挖矿难度的指标。具体来说,它指的是在区块链上找到一个有效的区块所需的计算工作量。难度值越高,表示挖掘新区块的难度越大。
- Nonce:
- 矿工收集交易: 矿工收集网络中的交易,将它们打包成一个区块。
- 构建区块头: 矿工构建区块,包括区块版本号、前一个区块的哈希、Merkle 根、时间戳、难度目标以及 nonce。
- 哈希计算: 矿工使用 SHA-256 哈希算法对区块头进行哈希计算。目标是找到一个哈希值低于当前难度目标的值。
- 调整 nonce: 如果没有找到有效哈希,矿工会尝试改变 nonce 的值,从 0 开始逐渐增加,每次重新计算哈希。
- 难度的适应: 如果在尝试完所有 nonce 值后还是没有找到有效哈希,矿工可以考虑更新时间戳或其他区块头信息,重新计算哈希。
- 成功发现: 一旦矿工找到了有效哈希,他们会将新挖掘的区块广播到网络,其他节点会验证该区块和其交易的有效性,然后将其添加到自己的区块链中。
矿工为找到满足条件的哈希值而调整的随机数。示例值“2,712,409,433”。
注意,difficult和target都是网络协议机制自动计算并调整的,最终结果就是让整个系统差不多10分钟可以找到一个nonce,直观找到nonce即挖矿步骤
- Bits:
当前挖矿难度的紧凑表示形式。示例值“386,042,977”。
- Weight:
- 比特币网络在初期,交易的每一部分(包括输入、输出、签名等)都被放在一起存储,这种设计虽然直观,但会带来一些问题:
- 交易延展性问题:签名可以被修改,导致交易 ID 发生变化。
- 扩展性问题:区块大小被限制为 1 MB,网络处理能力有限。
- 原始交易部分(Transaction Data):包含输入、输出等核心内容。
- 见证数据(Witness Data):存储签名信息。
- 签名被移到区块数据的单独部分,不再影响交易 ID,从而解决了交易延展性问题。
- 区块的数据结构更高效,容纳更多交易,提升了扩展能力。
- Base Size:区块的基本大小,不包括见证数据。
- Total Size:区块的总大小,包括见证数据。最大权重限制:
- 传统区块大小限制为 1 MB。
- SegWit 引入后,最大权重限制为 4,000,000 权重单位(WU)。
- 因为见证数据被赋予较低的权重(1/4),这相当于“逻辑上”将区块容量从 1 MB 扩展到了 4 MB。
- 1 字节的基本数据(不包括见证数据)= 4 WU。
- 1 字节的见证数据 = 1 WU。
- 见证数据是交易的签名部分,用于验证交易的合法性。
- 见证数据包括:交易输入的签名(Signature)、公钥等内容。
- 解决交易延展性问题:将签名从交易主体分离,避免签名被篡改后影响交易 ID。
- 提升区块效率:见证数据的权重较低,能够增加区块中的交易数量。
区块的权重单位(WU),比特币采用 SegWit 后的度量标准。示例值“3,997,858 WU”。
权重,隔离认证
1. 隔离见证(Segregated Witness)
背景:
解决方案:
隔离见证(SegWit)于 2017 年通过比特币改进提案 BIP-141 引入,它的核心思想是将交易数据中的签名(也叫“见证”部分)从主区块数据中分离出来:
通过隔离见证:
2. 权重(Weight)和权重单位(WU)
背景:
为了提升区块存储和验证效率,比特币引入了新的区块大小度量方式——权重(Weight)。
权重的定义:
权重是一个综合指标,衡量区块中数据的大小和相对重要性。区块的权重通过以下公式计算:
权重(该公式存疑后续修改)
权重单位(WU):
权重单位是衡量区块大小的单位:
通过这种方式,见证数据的权重被降低,有效增加了可用容量。
3. 见证数据(Witness Data)
为什么单独分离?
区块链时间和高度
- Mined on:
区块被挖出的时间。示例值“2025年1月22日 09:22:27”。
- Height:
区块的高度,表示它在区块链中的位置。示例值“880,277”。
- Confirmations:
确认次数,直接理解就是从该区块生成后,后续添加到区块链上的区块数。示例值“1”表示还没有更多区块确认。
交易费用
- Fee Range:
该区块内交易的手续费范围,单位为 sat/vByte(聪每字节)。示例值“1-340”。
- Average Fee:
区块内交易的平均手续费。示例值“0.00001508 BTC”。
- Median Fee:
区块内交易手续费的中位数。示例值“0.00000804 BTC”。
矿工信息
- Miner: 挖出该区块的矿工或矿池信息。如果是“Unknown”,表示矿工身份未标明。
补充一下,比特币区块链中的每个区块只包含一些特定的核心信息,但是区块链浏览器还会显示的许多根据这些核心信息计算、分析或归纳得来的,以便于用户理解和浏览。所以该网站显示的一些信息比如当前区块的depth信息会随着时间变动,别疑惑,以为这个信息是网站为了用户体验给的,并不包括在区块中,区块一旦打包完成,就绝对不会发生任何改变
区块本身必带的核心信息是下面这些:
- 区块头信息(Block Header):
- Hash: 区块头的哈希值,用于唯一标识该区块。
- Merkle Root: 区块中所有交易的默克尔树根哈希,用于快速验证交易完整性。
- Version: 区块的版本号,指示该区块使用的规则集。
- Previous Block Hash: 上一个区块的哈希值,保证链条的顺序性。
- Timestamp: 区块被创建的时间戳。
- Difficulty Target (Bits): 该区块的挖矿难度目标。
- Nonce: 用于找到有效区块哈希值的随机数。
- 区块体信息(Block Body):
- Transactions: 区块中包含的所有交易列表,包括输入(Inputs)和输出(Outputs)的详细信息。
- 每笔交易记录中包含:输入(来源)、输出(接收方)、金额、签名等。
- 区块大小:
- Size: 区块的实际大小(以字节为单位),从头到尾包含的所有数据。
在区块链网络中,双重支付攻击(Double-Spending) 和 自私矿工(Selfish Mining) 是两种潜在的攻击方式,尽管这两种攻击方式在理论上是可能的,但实际上很难实施,并且承担着极高的风险(两种攻击方式都要冒着挖出的块被废掉的风险,即损失高额的出块奖励,但凡有点理智,赚出块奖励稳稳的),简而言之除非拥有全网51%以上的算力否则几乎不可能成功(因为要超过其余所有人的算力,自然是至少51%)
- 双重支付攻击(Double-Spending)
双重支付攻击指的是攻击者试图使用同一笔资金进行两次支付,达到欺诈目的。在去中心化的加密货币系统中,由于交易验证的延迟或网络问题,理论上攻击者可以在不同的交易中使用相同的加密货币进行支付。
实施方式:
- 攻击者创建两笔交易,每笔交易使用同一笔资金(例如,向商家支付一笔款项并向其他地址支付相同的款项)。
- 在理想情况下,攻击者希望这两笔交易能够在网络中独立传播,并让商家或接受方无法及时确认交易的有效性。
- 如果区块链系统中某一部分节点接收到并确认了第一笔交易,而另一部分节点则确认了第二笔交易,那么就会发生双重支付。
难点:
- 区块链的共识机制:比特币和许多加密货币依赖于 工作量证明(PoW) 或 权益证明(PoS) 等共识机制来确保每个交易都被正确记录。攻击者需要控制相当多的计算能力,才能改变历史区块链中的交易记录。
- 不可变性和确认:每笔交易都需要通过多个区块的确认才能被视为“安全”。如果商家等待足够的确认(通常为6次确认),即使攻击者试图通过重新广播未确认的交易,也无法改变已经确认的交易。
- 矿工和节点的分布式验证:区块链网络由成千上万的分布式节点组成,攻击者很难操控大部分节点来产生冲突交易。
- 自私矿工(Selfish Mining)
自私矿工攻击是指矿工通过不立即广播他们发现的区块,而是保持这些区块的私密性,直到他们发现下一个区块,然后一起广播这两个区块。通过这种方式,攻击者试图延迟其他矿工的工作,从而获得更多的奖励。
实施方式:
- 发现区块后,矿工不立即广播,而是继续挖掘下一个区块。攻击者等待在自己的私有链上挖到多个区块。
- 当攻击者拥有更长的私有链时,他们会向网络广播其私有链。由于比特币网络遵循最长链规则,其他矿工会放弃他们的区块,并转而追随攻击者广播的链。
- 这种策略可以让攻击者有效地消耗其他矿工的工作量,从而获得更多的奖励。
难点:
- 时间和风险:自私矿工攻击需要矿工非常及时和精准地操作,并且在很长时间内保持自己的私有链。如果矿工过早地广播区块,攻击就会失败。如果私有链无法在短时间内赶超网络上已有的最长链,攻击者将面临极高的风险。
- 算力资源需求:为了成功实施自私矿工攻击,攻击者需要持续保持超过50%的网络算力,否则他们的私有链很可能会被其他矿工的区块超越。控制大规模算力非常昂贵且困难。
在比特币系统中,从私钥生成公钥,再从公钥生成地址是两个重要的加密过程,从加密过程中可以窥得安全性
比特币私钥钥是一个随机生成的256位数字,用私钥生成公钥过程是通过使用椭圆曲线算法(Elliptic Curve Cryptography, ECC),特别是 secp256k1 曲线,来实现的。该过程是通过椭圆曲线乘法实现的。该过程不会损失信息,且公钥并不能反向推导出私钥
相同的值通过椭圆曲线乘法得到的值是一样的,不同的私钥有几乎为0的概率产生相同的公钥,不足以影响到比特币系统的有效性
椭圆曲线算法讲解相关视频
- 公钥通常有两种形式:
- 未压缩公钥(由 0x04 开头,后面跟两个坐标 x 和 y,总共 65 字节)
- 压缩公钥(由 0x02 或 0x03 开头,后面跟 x 坐标,长度为 33 字节)
从公钥到地址会损失信息,通过哈希算法比如说SHA-256,任何数据量都会变成256bit,这个过程中损失信息是显然的,实际地址生成的步骤更复杂,如下;可以断定的说,没有任何办法从地址出发,反推出公钥,量子计算机来了也没用
- SHA-256 哈希:对公钥进行 SHA-256 哈希运算。
- RIPEMD-160 哈希:将 SHA-256 的结果再经过 RIPEMD-160 哈希运算,得到一个160位的哈希值,称为公钥哈希(Public Key Hash,PKH)。
- 添加版本前缀:在公钥哈希前添加一个字节(例如,主网地址前缀为 0x00)。
- 生成校验和:对包含前缀的公钥哈希进行两次 SHA-256 哈希,取结果的前4个字节作为校验和。
- 生成地址:将前缀、公钥哈希及其对应的校验和结合,形成最终的比特币地址,通常使用 Base58Check 编码。
比特币系统中如果只是为了收款的话,是不需要公钥的,只暴露出公钥生成的哈希地址即可,取钱(即转账)的时候才需要公钥,因为交易的时候,系统需要验证你是该地址的所有者。这时就需要使用私钥对交易进行签名,从而确保只有持有相应私钥的人可以支配该地址上的比特币。在签名过程中,公钥用于生成交易的验证数据,以便网络节点能够确认签名是否有效,确保交易的合法性。
假设有黑客定位到你,实时监控你的交易,从而知道了你的公钥,他要偷你的钱,他就需要立刻从公钥反推出你的私钥,然后产生一个和你竞争的交易(即把你的地址里的钱转移到别的地方),即使是量子计算机也很难几分钟逆推出私钥,且黑客还要抢在你前面发布交易,如果你已经交易完成把账户上的钱取走了,就来不及了;
这也启示了,为了安全,比特币地址里的钱,如果使用,最好一次性全部用完,且即使是公钥,也最好不要暴露;
从上述得知,哪怕量子计算机真的出现,且量子计算机还刚好是和现代计算机一样适用于通用任务,从根本上,对比特币系统也构不成威胁而且与其担心比特币系统,不如担心全世界现存传统金融业,毕竟比特币的市值体量,不足现代金融体系的万一
- 作者:JIAHE
- 链接:https://blog.jiaheliu.top/Study-Notes/BTC-Block-Structure-and-Double-Spending-Security
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。


