跳转到主要内容比特币被视为原始区块链或加密货币。虽然比特币网络的最后一次核心升级是在 2010 年,但已经对核心协议进行了几次较小的升级。其中最重要的是 Segwit 和 Taproot。
比特币区块
比特币区块可以被认为是证明几个交易有效性的容器。它以 0xD9B4BEF9
开头,然后继续描述网络的新状态,包括列出所有新包含的交易。比特币区块还描述了区块头。区块头是新添加状态的独立描述。如果您只关心区块中所有交易的子集,则区块头是区块本身的更有效描述。
为了在核心网络的_噪音_之外验证交易,区块头是完美的。中本聪将区块头设计为自描述的;也就是说,如果您有一个区块头列表,则可以验证新区块头是否属于该列表。区块头为 80 字节,由以下组成:
Version(4B) | PrevBlock(32B) | MerkleRoot(32B) | Time(4B) | Bits(4B) | Nonce(4B)
https://en.bitcoin.it/wiki/Block_hashing_algorithm
通过检查比特币哈希的哈希是否相对于指定的 Bits
足够_低_,可以将标头验证为正确挖掘。通过检查 PrevBlock
是否与列表中的前导交易的哈希相同,可以验证它扩展了您的列表。最后,必须检查 Bits
以确保它遵循难度规则。
您会注意到这些检查不会断言其中包含的交易的任何有效性。执行的检查可以被视为验证比特币区块所需的最少工作量。这种技术非常恰当地称为简化支付验证。
比特币交易
本节尚未编写。
交易输出
交易输出包含用比特币脚本编写的支出条件。传统交易在输出本身中包含支出条件的全部内容,而 Segwit 交易将支出条件放在见证中,并仅在输出中存储其哈希。比特币区块链本身没有地址的概念;相反,输出脚本已标准化为 7 种定义的交易类型,其中 5 种今天仍在普遍使用。通常不再使用的 2 种是 P2PK 和 P2MS。
虽然非标准脚本可能可以由用户的私钥支出,但它们不太可能被其钱包识别。此外,大多数自定义脚本通过 P2SH 实现,以允许钱包支付到其中。
每种标准化交易类型描述输出的外观。下面的脚本是传统的 P2PKH
输出脚本:
OP_DUP | OP_HASH160 | PUSH_20 | {publicKeyHash} | OP_EQUALVERIFY | OP_CHECKSIG
如果您需要支付到 P2PKH
地址,输出脚本需要具有上述格式。此外,publicKeyHash
定义了谁是支出者。因此,要完全生成输出脚本,您需要目标 publicKeyHash
。这就是地址的作用。P2PKH
地址是使用 Base58Check
编码的 00 + publicKeyHash
。比特币地址有 2 个目的:
- 识别需要使用哪个输出脚本。
- 识别需要填充哪些可变元素。
UTXO 类型表
下表列举了从 1 到 5 的 5 种交易类型。
版本 | 名称 | 编码方案 | 前缀 | 哈希长度 |
---|
0 | 未知 | 忽略 | | |
1 | P2PKH | Base58Check(00+PKH) | 1* | 20 |
2 | P2SH | Base58Check(05+SH) | 3* | 20 |
3 | P2WPKH | Bech32 | bc1q** | 20 |
4 | P2WSH | Bech32 | bc1q** | 32 |
5 | P2TR | Bech32m | bc1p** | 32 |
* 前缀由编码方案确定。
** 前缀的一部分——1q/1p——由编码方案确定。
交易输入
交易输入链接到其他交易的输出以及满足的解锁条件。对于 P2PKH
交易,这是交易的公钥和签名。
重要的是,所有输入的总和必须大于输出。两者之间的差异是费用,将由矿工索取。
证明比特币交易
本节尚未编写。
SPV 客户端在 1 次确认时不安全;需要在其上构建多个区块。这是因为任何人都可以挖掘通过所有 SPV 检查但包含欺诈性交易的交易。因此,SPV 客户端充其量与在其上构建的区块一样好。
此外,使用的 SPV 客户端不验证实际的难度调整。相反,它验证 1/4 法则。因此,每个区块应仅假定持有完全验证的比特币区块的验证能力的 1/4。根据经验,下表可用于将价值映射到确认数。
大小 | 确认数 |
---|
$0k - $20k | 2 |
$20k - $100k | 3 |
$100k - $200k | 4 |
$200k - $1m | 5 |
$1m+ | 6 |
请注意,从 5 次确认开始,您将获得完整的比特币安全性,因为 2 个比特币区块将始终将链重组到适当的难度(假设少数链没有用 51% 的挖矿能力进行挖矿)。