Skip to content

Commit 3cdaa76

Browse files
committed
add address checksum and signature
1 parent 0fe174b commit 3cdaa76

File tree

7 files changed

+302
-0
lines changed

7 files changed

+302
-0
lines changed

i18n/zh-CN/docusaurus-plugin-content-docs/current/blockchain/bitcoin-basics/cryptocraphy/address.md

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,80 @@ sidebar_position: 4
33
---
44

55
# 比特币地址
6+
7+
介绍什么是比特币和MVC的地址。
8+
9+
## 地址简介
10+
11+
地址是UTXO接收者的标志,用于表示接收方的身份。它根据形态有多种类型,有些地址是通过[公钥哈希](public-key-hash.md)
12+
生成的,有些是通过脚本哈希生成的,有些是通过[公钥](public-key.md)生成的,根据不同的情况,地址的计算方法可能不同。
13+
14+
比特币地址是用户接收比特币的唯一标识符,相当于银行账户号码。它们通常以一串字母和数字组成,用于接收和发送比特币交易。比特币地址本质上是由公钥生成的,确保了用户的隐私和安全。
15+
16+
## 地址的计算
17+
18+
比特币地址的生成过程如下:
19+
20+
1. **生成私钥**:使用加密算法(如椭圆曲线加密)生成一个随机的私钥。
21+
2. **生成公钥**:通过椭圆曲线数字签名算法(ECDSA)从私钥生成公钥。
22+
3. **计算地址**
23+
- 公钥通过SHA-256和RIPEMD-160哈希算法得到公钥哈希(Public Key Hash)。
24+
- 公钥哈希加上版本前缀(通常是`0x00`,表示主网地址)得到一个新的哈希值。
25+
- 对新的哈希值进行双重SHA-256哈希运算,取前4个字节作为校验和。
26+
- 将校验和附加到公钥哈希后,得到最终的比特币地址。
27+
4. **Base58编码**:将上述得到的比特币地址进行Base58编码,生成最终的人类可读的比特币地址。
28+
29+
## 地址编码和校验
30+
31+
比特币地址的编码使用Base58Check编码。Base58是为了避免字符混淆而设计的编码方式,去除了容易混淆的字符(如0, O, l,
32+
I等)。Base58Check编码包含两部分:
33+
34+
1. **Base58编码**:将地址数据进行Base58编码。
35+
2. **校验和**:在地址数据后添加4字节的SHA-256哈希校验和,确保地址的有效性。
36+
37+
## 主网和测试网地址的区别
38+
39+
比特币主网和测试网的地址在前缀上有所不同:
40+
41+
- **主网地址**:通常以`1``3`开头,前缀为`0x00`(P2PKH)或`0x05`(P2SH)。
42+
- **测试网地址**:通常以`m``n`开头,前缀为`0x6F`(P2PKH)或`0xC4`(P2SH)。
43+
44+
## 主要的地址格式
45+
46+
### P2PK(Pay-to-PubKey)
47+
48+
P2PK地址直接将公钥用于接收比特币,通常不单独使用,而是作为P2PKH的基础。P2PK交易脚本如下:
49+
50+
```
51+
<pubkey> OP_CHECKSIG
52+
```
53+
54+
### P2PKH(Pay-to-PubKeyHash)
55+
56+
P2PKH是最常见的地址格式,基于公钥哈希生成地址。P2PKH地址通常以`1`开头。P2PKH交易脚本如下:
57+
58+
```
59+
OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
60+
```
61+
62+
### P2SH(Pay-to-Script-Hash)
63+
64+
P2SH地址允许更复杂的脚本和条件支付,基于脚本哈希生成地址。P2SH地址通常以`3`开头。P2SH交易脚本如下:
65+
66+
```
67+
OP_HASH160 <scriptHash> OP_EQUAL
68+
```
69+
70+
### P2MS(Pay-to-MultiSig)
71+
72+
P2MS地址用于多重签名支付,需要多个私钥签名才能解锁比特币。P2MS交易脚本如下:
73+
74+
```
75+
<m> <A_pubKey> <B_pubKey> <C_pubKey> <n> OP_CHECKMULTISIG
76+
```
77+
78+
其中,`m`是最小签名数量,`n`是公钥数量。
79+
80+
## 总结
81+
82+
地址是比特币和MVC网络中的重要组成部分,用于标识交易接收方。不同类型的地址适用于不同的使用场景,从简单的单一签名到复杂的多重签名机制。了解比特币地址的生成、编码和校验过程,有助于更好地理解比特币的安全性和隐私保护机制。

i18n/zh-CN/docusaurus-plugin-content-docs/current/blockchain/bitcoin-basics/cryptocraphy/checksum.md

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,66 @@ sidebar_position: 7
33
---
44

55
# Checksum 校验和
6+
7+
如何确保消息的完整性和正确性。
8+
9+
## 1. 什么是校验和
10+
11+
校验和是密码学中常用的技术,用于验证消息的完整性和正确性。在比特币中,校验和通常用于地址和私钥的生成过程中,以确保地址和私钥的有效性。
12+
13+
![img.png](/img/bitcoin-checksum.png)
14+
15+
校验和(Checksum)是一种用于验证数据完整性的方法。它通过计算数据的一部分或全部内容来生成一个固定长度的值,当数据传输或存储时,可以使用校验和来检测数据是否被篡改或损坏。校验和技术广泛应用于计算机网络、数据存储、文件传输等领域,以确保数据的准确性和完整性。
16+
17+
## 2. 校验和的作用
18+
19+
校验和的主要作用如下:
20+
21+
1. **验证数据完整性**:在数据传输或存储过程中,通过校验和可以检测到数据是否被意外修改或损坏。
22+
2. **错误检测**:校验和可以用于检测数据中的错误,尤其是在数据传输过程中可能发生的传输错误。
23+
3. **确保数据安全**:通过验证校验和,可以确保数据在传输或存储过程中未被篡改,从而提高数据的安全性。
24+
25+
## 3. 校验和的计算
26+
27+
校验和的计算过程通常包括以下几个步骤:
28+
29+
1. **选择算法**:根据应用场景选择合适的校验和算法,如简单的加法校验、CRC(循环冗余校验)等。
30+
2. **计算校验和**:使用选定的算法对数据进行计算,生成一个固定长度的校验值。
31+
3. **附加校验和**:将计算得到的校验和附加到数据的末尾或其他位置,便于接收方进行验证。
32+
33+
### 示例:简单加法校验
34+
35+
假设我们有一段数据`[1, 2, 3, 4, 5]`,可以通过简单加法校验计算其校验和:
36+
37+
1. **计算和**:将所有数据元素相加,得到`1 + 2 + 3 + 4 + 5 = 15`
38+
2. **取模运算**:根据校验和算法的要求,可以对计算结果进行取模运算,例如对`256`取模:`15 % 256 = 15`
39+
3. **生成校验和**:最终的校验和为`15`
40+
41+
## 4. 比特币中的校验和
42+
43+
在比特币中,校验和被广泛应用于确保数据的完整性和安全性。以下是比特币中使用校验和的几个重要场景:
44+
45+
### 4.1 比特币地址的校验和
46+
47+
比特币地址使用Base58Check编码,其中包含了校验和,用于验证地址的有效性。生成比特币地址的校验和步骤如下:
48+
49+
1. **生成公钥哈希**:通过SHA-256和RIPEMD-160哈希算法生成公钥哈希。
50+
2. **添加版本前缀**:在公钥哈希前添加版本前缀。
51+
3. **计算校验和**:对上述数据进行双重SHA-256哈希运算,取前4个字节作为校验和。
52+
4. **组合地址**:将校验和附加到公钥哈希后,进行Base58编码,生成最终的比特币地址。
53+
54+
### 4.2 WIF格式私钥的校验和
55+
56+
比特币私钥的WIF(Wallet Import Format)格式也使用校验和来确保私钥的完整性。WIF格式私钥的校验和计算步骤如下:
57+
58+
1. **添加版本前缀**:在私钥前添加版本前缀。
59+
2. **计算校验和**:对上述数据进行双重SHA-256哈希运算,取前4个字节作为校验和。
60+
3. **组合私钥**:将校验和附加到私钥后,进行Base58编码,生成WIF格式的私钥。
61+
62+
### 4.3 区块和交易的校验和
63+
64+
在比特币网络中,每个区块和交易都包含一个校验和,用于验证数据的完整性和合法性。区块和交易的校验和通常通过哈希函数(如SHA-256)来计算,确保数据未被篡改。
65+
66+
## 总结
67+
68+
校验和是一种重要的技术,用于验证数据的完整性和安全性。通过计算和验证校验和,可以检测和防止数据传输或存储过程中的错误和篡改。比特币中广泛使用了校验和机制,确保了比特币地址、私钥、区块和交易的完整性和安全性。理解校验和的原理和应用,有助于更好地保护和管理数字资产。

i18n/zh-CN/docusaurus-plugin-content-docs/current/blockchain/bitcoin-basics/cryptocraphy/signature.md

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,92 @@ sidebar_position: 6
33
---
44

55
# 签名
6+
7+
介绍签名系统,为什么签名可以保证比特币网络的安全性。
8+
9+
## 数字签名
10+
11+
签名用于证明你对一组公钥的所有权,以及你对交易的授权。比特币使用椭圆曲线数字签名算法(ECDSA)来生成和验证签名。
12+
13+
![img.png](/img/bitcoin-signature.png)
14+
15+
## 比特币的签名机制
16+
17+
比特币的签名机制是确保交易安全和完整性的核心技术之一。它基于公钥加密算法,通过数字签名来验证交易的合法性和防止篡改。比特币使用椭圆曲线数字签名算法(ECDSA)来创建和验证签名。
18+
19+
## 如何创建签名
20+
21+
创建比特币交易签名的过程如下:
22+
23+
1. **生成私钥**:每个用户生成一个唯一的私钥。
24+
2. **生成公钥**:通过椭圆曲线算法(ECDSA)从私钥生成对应的公钥。
25+
3. **创建交易哈希**:对交易数据进行哈希处理,生成交易哈希(message hash)。这包括交易的输入、输出和其他相关数据。
26+
4. **生成签名**:使用私钥对交易哈希进行签名,生成数字签名。
27+
28+
### 签名的创建步骤
29+
30+
1. **选择消息**:选择要签名的交易数据。
31+
2. **计算哈希**:对交易数据进行哈希处理,通常使用SHA-256算法。
32+
3. **使用私钥签名**:使用私钥对哈希值进行ECDSA签名,生成签名(r, s)。
33+
34+
签名生成的数学过程如下:
35+
36+
- 选择一个随机数k(保证唯一性和安全性)。
37+
- 计算r = (k * G).x mod n,其中G是椭圆曲线的基点,n是曲线的阶。
38+
- 计算s = (z + r * d) / k mod n,其中z是交易哈希,d是私钥。
39+
40+
最终,签名由(r, s)组成。
41+
42+
## 签名的编码
43+
44+
比特币的签名通常使用DER(Distinguished Encoding Rules)编码格式。DER编码是一种ASN.1的二进制编码格式,确保签名的规范性和一致性。
45+
46+
DER编码的签名由以下几部分组成:
47+
48+
1. **SEQUENCE**:表示签名由多个部分组成。
49+
2. **INTEGER r**:签名的第一个整数部分r。
50+
3. **INTEGER s**:签名的第二个整数部分s。
51+
52+
DER编码格式的步骤如下:
53+
54+
1. **编码r和s**:将签名的两个整数部分r和s分别进行DER编码。
55+
2. **组合SEQUENCE**:将r和s的编码结果组合成一个SEQUENCE。
56+
57+
DER编码的具体示例如下:
58+
59+
- r的DER编码:`02 <length_of_r> <r>`
60+
- s的DER编码:`02 <length_of_s> <s>`
61+
- SEQUENCE编码:`30 <length_of_sequence> <r_encoding> <s_encoding>`
62+
63+
## 签名哈希类型
64+
65+
Signature Hash Type(签名哈希类型)用于指定签名适用的交易部分,影响签名验证的过程。比特币中常见的签名哈希类型有以下几种:
66+
67+
1. **SIGHASH_ALL(0x01)**:对整个交易进行签名,包括所有输入和输出。这是最常用的签名哈希类型,确保交易的完整性。
68+
2. **SIGHASH_NONE(0x02)**:只对输入进行签名,输出可以由其他部分指定。适用于需要灵活调整输出的场景。
69+
3. **SIGHASH_SINGLE(0x03)**:对特定的输入和对应的输出进行签名,其他输出可以变化。适用于指定某个特定输出的场景。
70+
71+
MVC 针对签名哈希类型进行了拓展,需要增加SIGHASH_FORKID的前缀来区分与比特币网络的不同。具体请参考下表:
72+
73+
| Flag | Value including SIGHASH_FORKID | HEX / BINARY | Value excluding SIGHASH_FORKID | HEX / BINARY | Functional Meaning |
74+
|----------------|--------------------------------|--------------|--------------------------------|--------------|----------------------------------------------------|
75+
| SIGHASH_ALL | 0x41 | 0100 0001 | 0x01 | 0000 0001 | Sign all inputs and outputs |
76+
| SIGHASH_NONE | 0x42 | 0100 0010 | 0x02 | 0000 0010 | Sign all inputs and no output |
77+
| SIGHASH_SINGLE | 0x43 | 0100 0011 | 0x03 | 0000 0011 | Sign all inputs and the output with the same index |
78+
| SIGHASH_ALL | ANYONECANPAY | 0xC1 | 1100 0001 | 0x81 | 1000 0001 | Sign its own input and all outputs |
79+
| SIGHASH_NONE | ANYONECANPAY | 0xC2 | 1100 0010 | 0x82 | 1000 0010 | Sign its own input and no output |
80+
| SIGHASH_SINGLE | ANYONECANPAY | 0xC3 | 1100 0011 | 0x83 | 1000 0011 | Sign its own input and the output with the same index |
81+
82+
## 签名过程示例
83+
84+
假设有一个比特币交易,我们需要对其进行签名,并选择SIGHASH_ALL类型。签名的步骤如下:
85+
86+
1. **生成交易哈希**:对交易数据进行哈希处理。
87+
2. **选择签名哈希类型**:添加SIGHASH_ALL标志。
88+
3. **生成签名**:使用私钥对交易哈希进行签名,得到DER编码格式的签名。
89+
4. **附加签名哈希类型**:将SIGHASH_ALL标志附加到签名后。
90+
91+
## 总结
92+
93+
比特币的签名机制通过ECDSA算法确保交易的安全性和完整性。签名的创建过程涉及私钥生成、公钥生成、交易哈希计算和签名生成。DER编码用于标准化签名表示,确保其规范性。不同的Signature
94+
Hash Type提供了灵活的签名验证方式,适应不同的交易需求。了解比特币的签名机制,有助于深入理解比特币交易的安全性和技术细节。

i18n/zh-CN/docusaurus-plugin-content-docs/current/blockchain/bitcoin-basics/cryptocraphy/wif.md

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,76 @@ sidebar_position: 5
33
---
44

55
# WIF私钥格式
6+
7+
介绍私钥如何被编码以及记录。
8+
9+
## WIF格式
10+
11+
WIF(Wallet Import Format)是一种将比特币私钥以人类可读格式表示的方法,便于用户在钱包间导入和导出私钥。WIF格式对私钥进行了编码和校验,以确保其有效性和安全性。
12+
13+
![img.png](/img/bitcoin-wif.png)
14+
15+
## 编码
16+
17+
比特币私钥的WIF编码过程如下:
18+
19+
1. **生成私钥**:使用随机数生成一个256位的私钥。
20+
21+
2. **添加版本前缀**
22+
- 对于主网私钥,前缀为`0x80`
23+
- 对于测试网私钥,前缀为`0xEF`
24+
25+
3. **添加压缩标志(可选)**
26+
- 如果使用压缩公钥,在私钥后添加一个字节`0x01`
27+
- 这样可以生成更短的公钥并减少交易大小。
28+
29+
4. **计算校验和**
30+
- 将前缀和私钥组合进行双重SHA-256哈希运算。
31+
- 取哈希结果的前4个字节作为校验和。
32+
33+
5. **组合数据**
34+
- 将前缀、私钥和校验和组合成完整的字节数组。
35+
36+
6. **Base58Check编码**
37+
- 将组合好的字节数组进行Base58编码,生成最终的WIF私钥。
38+
39+
### 编码示例
40+
41+
假设我们有一个主网私钥`0x1E99423A4EDF1000000000000000000000000000000000000000000000000000`,其WIF编码步骤如下:
42+
43+
1. 私钥:`1E99423A4EDF1000000000000000000000000000000000000000000000000000`
44+
2. 添加版本前缀:`801E99423A4EDF1000000000000000000000000000000000000000000000000`
45+
3. 计算双重SHA-256校验和:
46+
- 一次SHA-256:`C32D3FE4CFAEAB72ABF8735B5283D014B726B448D1747FDC524E8F8633E1DD56`
47+
- 再次SHA-256:`1C99E9B3F3E51E2F22E283B59C9AAB340084AE0D8FDC1FA83F3E9BEBFE4A01C2`
48+
4. 取前4字节校验和:`1C99E9B3`
49+
5. 组合数据:`801E99423A4EDF10000000000000000000000000000000000000000000000001C99E9B3`
50+
6. Base58Check编码:`5J1F3H9ZC8QK6FPU9U5JJMWMAAFN7F5Q0Q1BPE0Z3MN4UHV1Q9F`
51+
52+
最终的WIF私钥为`5J1F3H9ZC8QK6FPU9U5JJMWMAAFN7F5Q0Q1BPE0Z3MN4UHV1Q9F`
53+
54+
## WIF格式的校验
55+
56+
校验WIF私钥的过程如下:
57+
58+
1. **Base58解码**:将WIF私钥进行Base58解码,得到字节数组。
59+
2. **提取数据**:从字节数组中提取前缀、私钥和校验和。
60+
3. **校验和验证**
61+
- 对提取的前缀和私钥进行双重SHA-256哈希运算。
62+
- 比较计算得到的校验和与提取的校验和是否一致。
63+
4. **前缀验证**:确保前缀是合法的主网(`0x80`)或测试网(`0xEF`)前缀。
64+
65+
如果校验和和前缀都验证通过,则该WIF私钥是有效的。
66+
67+
## 区分主网和测试网私钥
68+
69+
主网和测试网私钥的WIF格式主要通过前缀进行区分:
70+
71+
- **主网私钥**:前缀为`0x80`,Base58Check编码后通常以`5`开头。
72+
- **测试网私钥**:前缀为`0xEF`,Base58Check编码后通常以`9``c`开头。
73+
74+
这种前缀区分方式确保了主网和测试网私钥不会混淆,从而避免了将测试网币误用在主网或反之的风险。
75+
76+
## 总结
77+
78+
比特币私钥的WIF格式提供了一种安全、易于导入和导出的私钥表示方式。通过版本前缀、校验和机制,以及Base58Check编码,WIF格式确保了私钥的有效性和人类可读性。同时,主网和测试网私钥的前缀区分进一步保障了比特币网络的安全性和稳定性。了解WIF格式的编码和校验过程,有助于更好地管理和使用比特币私钥。

static/img/bitcoin-checksum.png

7.59 KB
Loading

static/img/bitcoin-signature.png

24.7 KB
Loading

static/img/bitcoin-wif.png

25.9 KB
Loading

0 commit comments

Comments
 (0)