-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
8 changed files
with
464 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
71 changes: 71 additions & 0 deletions
71
...cusaurus-plugin-content-docs/current/blockchain/bitcoin-basics/block/blk-dat.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,75 @@ | ||
--- | ||
sidebar_position: 7 | ||
--- | ||
|
||
# 区块存储格式blk.dat | ||
|
||
介绍比特币区块文件blk.dat的存储格式。 | ||
|
||
## 什么是blk.dat文件 | ||
|
||
比特币节点使用blk.dat文件存储区块链数据。每个blk.dat文件包含一系列的比特币区块,以紧凑的二进制格式存储。这些文件保存在比特币数据目录中,通常位于`blocks/` | ||
子目录下。 | ||
|
||
## blk.dat文件的结构 | ||
|
||
### 区块文件头 | ||
|
||
每个blk.dat文件以一个4字节的魔法字节开头,这个魔法字节用于标识区块的开始。在比特币中,魔法字节的值为`0xD9B4BEF9`。 | ||
|
||
### 区块数据 | ||
|
||
紧随魔法字节之后的是区块数据。区块数据包括: | ||
|
||
1. **区块大小**:一个4字节的整数,表示区块的大小(单位:字节)。 | ||
2. **区块内容**:实际的区块数据,包括区块头和区块体(交易数据)。 | ||
|
||
区块数据的顺序为:魔法字节 -> 区块大小 -> 区块内容。多个区块连续存储在一个blk.dat文件中。 | ||
|
||
### 文件轮换 | ||
|
||
当一个blk.dat文件达到最大大小(默认2GB)时,比特币节点会创建一个新的blk.dat文件,文件名按顺序递增,例如`blk00000.dat`,`blk00001.dat` | ||
,以此类推。 | ||
|
||
## 如何读取blk.dat文件 | ||
|
||
读取blk.dat文件可以使用比特币核心客户端或自定义的解析工具。解析过程包括以下步骤: | ||
|
||
1. **打开文件**:以二进制模式打开blk.dat文件。 | ||
2. **读取魔法字节**:验证是否为合法区块起始。 | ||
3. **读取区块大小**:获取区块大小信息。 | ||
4. **读取区块内容**:根据区块大小读取完整区块数据。 | ||
5. **重复步骤**:继续读取下一个区块,直到文件结束。 | ||
|
||
### 示例代码 | ||
|
||
以下是一个简单的Python示例代码,用于解析blk.dat文件: | ||
|
||
```python | ||
import struct | ||
|
||
def read_block(file): | ||
magic = file.read(4) | ||
if not magic: | ||
return None | ||
size = struct.unpack("<I", file.read(4))[0] | ||
block_data = file.read(size) | ||
return block_data | ||
|
||
with open('blk00000.dat', 'rb') as f: | ||
while True: | ||
block = read_block(f) | ||
if block is None: | ||
break | ||
print(f"Read block of size: {len(block)}") | ||
``` | ||
|
||
## blk.dat文件的重要性 | ||
|
||
1. **区块链存储**:blk.dat文件是比特币节点存储完整区块链数据的基础,确保所有交易和区块记录都被完整保存。 | ||
2. **节点同步**:新节点加入网络时,可以通过下载和解析blk.dat文件快速同步区块链数据。 | ||
3. **数据恢复**:在发生数据损坏或节点重启时,blk.dat文件提供了区块链数据的可靠恢复途径。 | ||
|
||
## 总结 | ||
|
||
blk.dat文件是比特币节点存储区块链数据的关键组件,通过紧凑的二进制格式存储区块数据,确保区块链的完整性和可靠性。理解blk.dat文件的结构和读取方法,有助于深入掌握比特币节点的运行机制和区块链数据管理。 |
69 changes: 69 additions & 0 deletions
69
...aurus-plugin-content-docs/current/blockchain/bitcoin-basics/block/block-hash.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,73 @@ | ||
--- | ||
sidebar_position: 6 | ||
--- | ||
|
||
# Block Hash (区块id) | ||
|
||
介绍区块id如何计算。 | ||
|
||
## 什么是区块哈希 | ||
|
||
区块哈希(Block Hash)是区块链中的一个唯一标识符,它通过对区块头进行两次SHA-256哈希运算生成。区块哈希用于标识和引用特定区块,并确保区块链的安全性和完整性。 | ||
|
||
## 区块哈希的生成过程 | ||
|
||
### 1. 构造区块头 | ||
|
||
区块头包含以下字段: | ||
|
||
- 版本号([Version](version.md)) | ||
- 前序区块哈希([Previous Block Hash](previous-block.md)) | ||
- Merkle根([Merkle Root](merkle-root.md)) | ||
- 时间戳([Timestamp](time.md)) | ||
- 难度目标([Bits](bits.md)) | ||
- 随机数([Nonce](nonce.md)) | ||
|
||
### 2. 哈希运算 | ||
|
||
1. 将区块头的内容转换为字节序列。 | ||
2. 对字节序列进行第一次SHA-256哈希运算,得到哈希值1。 | ||
3. 对哈希值1再次进行SHA-256哈希运算,得到最终的区块哈希。 | ||
|
||
### 示例代码 | ||
|
||
以下是生成区块哈希的示例代码: | ||
|
||
```ruby | ||
require 'digest' | ||
|
||
# 区块头字段 | ||
version = "01000000" | ||
previousblock = "0000000000000000000000000000000000000000000000000000000000000000" | ||
merkleroot = "3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a" | ||
time = "29ab5f49" | ||
bits = "ffff001d" | ||
nonce = "1dac2b7c" | ||
|
||
blockheader = version + previousblock + merkleroot + time + bits + nonce | ||
|
||
# 转换为字节序列 | ||
bytes = [blockheader].pack("H*") | ||
|
||
# 第一次SHA-256哈希 | ||
hash1 = Digest::SHA256.digest(bytes) | ||
|
||
# 第二次SHA-256哈希 | ||
hash2 = Digest::SHA256.digest(hash1) | ||
|
||
# 结果转换为十六进制字符串 | ||
blockhash = hash2.unpack("H*")[0] | ||
|
||
puts blockhash | ||
``` | ||
|
||
## 区块哈希的作用 | ||
|
||
1. **标识区块**:区块哈希作为区块的唯一标识符,用于在区块链中快速查找和引用特定区块。 | ||
2. **确保完整性**:通过对区块头的哈希运算,区块哈希保证了区块数据的完整性和不可篡改性。 | ||
3. **共识机制**:矿工在生成新区块时,必须找到一个使得区块哈希小于目标值的Nonce,从而确保区块链的工作量证明机制。 | ||
|
||
## 总结 | ||
|
||
区块哈希通过对区块头进行双重SHA-256哈希运算生成,是区块链中标识和验证区块的关键要素。了解区块哈希的生成过程和作用,有助于深入理解区块链的安全性和运行机制。 | ||
|
49 changes: 49 additions & 0 deletions
49
...urus-plugin-content-docs/current/blockchain/bitcoin-basics/block/merkle-root.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,53 @@ | ||
--- | ||
sidebar_position: 3 | ||
--- | ||
|
||
# Merkle Root(默克尔根) | ||
|
||
介绍merkle根的概念。 | ||
|
||
## 什么是Merkle根 | ||
|
||
Merkle根(Merkle | ||
Root)是区块链中的一个关键组成部分,用于验证区块内所有交易的完整性和一致性。它是通过将区块内所有交易的哈希值(TXID)进行递归哈希计算得到的一个单一哈希值。Merkle根被包含在区块头中,用于确保区块内交易数据的不可篡改性。 | ||
|
||
## Merkle根的生成 | ||
|
||
生成Merkle根的过程如下: | ||
|
||
1. **哈希交易**:将区块内所有交易的哈希值(TXID)进行哈希。 | ||
2. **两两哈希**:将哈希后的交易两两组合,再次进行哈希。如果交易数为奇数,则最后一个交易哈希值与自身组合进行哈希。 | ||
3. **递归哈希**:重复以上步骤,直到只剩下一个哈希值,即Merkle根。 | ||
|
||
### 示例 | ||
|
||
假设有四个交易TXID:A、B、C、D。 | ||
|
||
1. **初始哈希**: | ||
- 哈希A、B、C、D得到Ha、Hb、Hc、Hd。 | ||
2. **两两哈希**: | ||
- 将Ha与Hb组合,Hc与Hd组合,得到Ha+b、Hc+d。 | ||
3. **最终哈希**: | ||
- 将Ha+b与Hc+d组合,得到Merkle根Hroot。 | ||
|
||
## Merkle根的作用 | ||
|
||
### 1. 验证交易完整性 | ||
|
||
Merkle根提供了一种高效的方法来验证区块内所有交易的完整性。通过检查Merkle根,可以确定区块内的交易是否被篡改。 | ||
|
||
### 2. 提高数据处理效率 | ||
|
||
Merkle根允许轻节点(SPV节点)仅通过下载区块头而非整个区块来验证特定交易是否存在于区块中,从而提高了数据处理效率和带宽利用率。 | ||
|
||
### 3. 确保数据安全性 | ||
|
||
通过Merkle根,可以实现区块链数据的完整性验证,防止恶意节点篡改交易记录,确保区块链的安全性和可靠性。 | ||
|
||
## Merkle树和轻量级钱包 | ||
|
||
Merkle树结构不仅提高了区块链的安全性,还支持轻量级钱包的实现。轻量级钱包不需要下载整个区块链,只需下载区块头和对应的Merkle证明,即可验证交易的存在性和有效性。这大大降低了存储和计算资源的需求,使得区块链技术更为普及。 | ||
|
||
## 总结 | ||
|
||
Merkle根是区块链技术中的重要组成部分,通过递归哈希计算生成,用于验证区块内交易的完整性和一致性。它不仅提高了区块链的安全性,还支持轻量级钱包的高效实现,优化了数据处理和验证的效率。了解Merkle根的工作原理,有助于深入理解区块链技术及其在去中心化系统中的应用。 |
63 changes: 63 additions & 0 deletions
63
...docusaurus-plugin-content-docs/current/blockchain/bitcoin-basics/block/nonce.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,67 @@ | ||
--- | ||
sidebar_position: 6 | ||
--- | ||
|
||
# Nonce(随机数) | ||
|
||
介绍区块头中的nonce字段。 | ||
|
||
## 什么是Nonce | ||
|
||
Nonce是区块头中的一个32位字段,表示一个仅使用一次的随机数。在比特币挖矿过程中,矿工通过不断更改Nonce值并计算区块头的哈希值,直到找到一个满足特定条件(即小于当前网络难度目标)的哈希值。 | ||
|
||
## Nonce在区块头中的位置 | ||
|
||
区块头包含以下字段: | ||
|
||
- 版本号(Version) | ||
- 前序区块哈希(Previous Block Hash) | ||
- Merkle根(Merkle Root) | ||
- 时间戳(Timestamp) | ||
- 难度目标(Bits) | ||
- 随机数(Nonce) | ||
|
||
## Nonce的作用 | ||
|
||
### 1. 挖矿过程 | ||
|
||
在比特币挖矿过程中,矿工不断尝试不同的Nonce值,以找到一个使得区块头的哈希值小于当前难度目标的有效区块。当找到这样的Nonce时,区块就被认为是有效的,可以被添加到区块链中。 | ||
|
||
### 2. 保证公平竞争 | ||
|
||
通过使用Nonce,矿工之间可以公平竞争,确保区块的生成是随机的,而不是被某个特定的矿工垄断。 | ||
|
||
### 3. 防止重复使用 | ||
|
||
Nonce的唯一性和随机性确保了每个区块的唯一性,防止了区块的重复使用和交易的重复确认。 | ||
|
||
## Nonce的计算 | ||
|
||
在矿工生成新区块时,会不断改变Nonce值,并对区块头进行双重SHA-256哈希运算,直到找到一个满足条件的哈希值。 | ||
|
||
### 示例 | ||
|
||
以下是一个简单的伪代码示例,展示了如何通过改变Nonce值进行挖矿: | ||
|
||
```python | ||
import hashlib | ||
|
||
def mine_block(block_header, difficulty_target): | ||
nonce = 0 | ||
while True: | ||
block_header_with_nonce = block_header + str(nonce) | ||
hash_result = hashlib.sha256(hashlib.sha256(block_header_with_nonce.encode()).digest()).hexdigest() | ||
if int(hash_result, 16) < difficulty_target: | ||
return nonce, hash_result | ||
nonce += 1 | ||
|
||
block_header = "example_block_header" | ||
difficulty_target = 0x00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | ||
|
||
nonce, valid_hash = mine_block(block_header, difficulty_target) | ||
print(f"Valid Nonce: {nonce}, Valid Hash: {valid_hash}") | ||
``` | ||
|
||
## 总结 | ||
|
||
Nonce是比特币区块头中的一个关键字段,通过不断更改Nonce值进行哈希计算,矿工能够找到一个满足特定难度目标的有效区块,从而确保区块链的安全性和公平性。了解Nonce的作用和计算过程,有助于深入理解比特币挖矿机制及其在去中心化系统中的应用。 |
51 changes: 51 additions & 0 deletions
51
...s-plugin-content-docs/current/blockchain/bitcoin-basics/block/previous-block.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,55 @@ | ||
--- | ||
sidebar_position: 2 | ||
--- | ||
|
||
# Previous Block(前序区块) | ||
|
||
介绍区块头中的前序区块字段。 | ||
|
||
## 什么是前序区块 | ||
|
||
前序区块(Previous Block)指的是当前区块头中包含的前一个区块的哈希值。这一字段用于将区块链接起来,形成区块链。每个区块(除了创世区块)都包含其前序区块的哈希值,这使得区块链成为一个连续的、不可篡改的记录。 | ||
|
||
## 前序区块的作用 | ||
|
||
### 1. 形成区块链 | ||
|
||
前序区块字段使每个区块能够链接到其前一个区块,形成一个连续的链条。每个区块通过其前序区块的哈希值确定其在区块链中的位置。 | ||
|
||
### 2. 验证区块有效性 | ||
|
||
当节点接收到一个新块时,会检查其前序区块的哈希值是否存在并有效。如果前序区块无效或不存在,则该区块会被拒绝。 | ||
|
||
### 3. 防止篡改 | ||
|
||
由于区块的哈希值是由区块内容生成的,包括前序区块的哈希值,因此任何对区块内容的修改都会改变其哈希值。这使得篡改区块链的任何部分都需要重新计算并改变所有后续区块的哈希值,极大地增加了篡改的难度和成本。 | ||
|
||
## 前序区块在区块链中的重要性 | ||
|
||
### 1. 保证数据完整性 | ||
|
||
前序区块的哈希值保证了区块链数据的完整性和连续性,使得所有区块可以被顺序追溯。 | ||
|
||
### 2. 促进共识机制 | ||
|
||
前序区块的哈希值有助于网络节点达成一致共识,确保所有节点都认可相同的区块链版本。 | ||
|
||
## 获取前序区块的信息 | ||
|
||
### 获取区块信息 | ||
|
||
使用比特币核心客户端,可以通过以下命令获取区块的详细信息,包括前序区块的哈希值: | ||
|
||
```bash | ||
mvc-cli getblock <blockhash> | ||
``` | ||
|
||
### 获取最新区块哈希 | ||
|
||
```bash | ||
mvc-cli getbestblockhash | ||
``` | ||
|
||
## 总结 | ||
|
||
前序区块字段是区块链结构中至关重要的一部分,它通过链接每个区块形成区块链,确保数据的连续性和不可篡改性。了解前序区块的作用,有助于深入理解区块链的工作原理和技术细节。 |
Oops, something went wrong.