Skip to content

Commit 6d3c660

Browse files
author
建平
committed
README更新
1 parent 90a98c0 commit 6d3c660

1 file changed

Lines changed: 118 additions & 2 deletions

File tree

README.md

Lines changed: 118 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,72 @@ Merkle 树 (MerkleTree)
178178

179179
1. 提供了调试和可视化功能
180180

181+
### Block
181182

183+
Block中增加了merkleRoot_字段,其通过初始化时构造MerkleTree然后提取根节点的HASH值获得。
182184

183-
#### `buildProofPaths` 的逻辑。
185+
merkleRoot_可用于在后续验证交易是否被篡改。
186+
187+
### MerkleTree
188+
189+
#### MerkleNode
190+
191+
假设我们有4个交易(A、B、C、D),构建的默克尔树如下:
192+
193+
```
194+
Root
195+
/ \
196+
/ \
197+
AB CD
198+
/ \ / \
199+
A B C D
200+
```
201+
202+
相邻节点一起构造了一个父节点,其Hash值为2个子节点拼接后再次hash出的值。如果叶节点为奇数,则最后一个叶节点重复一次。
203+
204+
```
205+
MerkleTree::printTree
206+
ABCC Level 2: 779cc102d995f0cb01c420eddc2d9a2154a992cc4d93a113e18ab34e001850a2
207+
AB Level 1: e5d5262bd00f3ab8dc254c5ed2d4a8b9a3793d3fce38e8e8a693ad451218033f
208+
A Level 0: 43caa04a00f424b1911f5fff8ee452c32e2bc945ae8a88a05183021d27a69446
209+
B Level 0: 7cb17ad411d33feb075223d142e3cb631afd52370cfd1961c34dc4d300978a3a
210+
CC Level 1: 37f004022cc1769ebc8214ed4a5e17b387935f308bb6b81451b2fe0f0b6193d1
211+
C Level 0: 97fd3316a49190b85a5b9305b28854d30ac937e551f759d45b56319d82b777e3
212+
C Level 0: 97fd3316a49190b85a5b9305b28854d30ac937e551f759d45b56319d82b777e3
213+
```
214+
215+
###
216+
217+
#### ProofPaths
218+
219+
proofPaths 表为每个叶节点构造一个最快构建出根节点的相邻节点hash列表。即顺着列表逐个拼接HASH值并hash出父节点HASH值。
220+
221+
```
222+
MerkleTree::MerkleTree
223+
MerkleNode::MerkleNode A
224+
MerkleNode::MerkleNode B
225+
MerkleNode::MerkleNode C
226+
MerkleTree::buildTree
227+
MerkleNode::MerkleNode AB
228+
MerkleNode::MerkleNode CC
229+
MerkleTree::buildTree
230+
MerkleNode::MerkleNode ABCC
231+
232+
buildProofPaths leftPath CC true
233+
buildProofPaths leftPath B true
234+
buildProofPaths leaf A
235+
buildProofPaths rightPath A false
236+
buildProofPaths leaf B
237+
buildProofPaths rightPath AB false
238+
buildProofPaths leftPath C true
239+
buildProofPaths leaf C
240+
buildProofPaths rightPath C false
241+
buildProofPaths leaf C
242+
```
243+
244+
245+
246+
##### `buildProofPaths` 的逻辑。
184247

185248
默克尔树的证明路径(Merkle Proof)的目的是:证明某个交易确实存在于区块链中。为了做到这一点,我们需要提供从该交易到根节点的路径上所有兄弟节点的哈希值。
186249

@@ -262,7 +325,7 @@ for (const auto& [siblingHash, isLeft] : path) {
262325

263326
这就是为什么在构建路径时,我们要记录兄弟节点的哈希值而不是当前节点的哈希值。因为验证时需要的是兄弟节点的哈希值来重建父节点的哈希值。
264327

265-
#### verifyPath逻辑
328+
##### verifyPath逻辑
266329

267330
`verifyPath` 函数中,我们应该倒序访问路径,因为我们需要从叶子节点开始,一步步向上构建到根节点。让我修改这部分代码
268331

@@ -313,3 +376,56 @@ for (auto it = path.rbegin(); it != path.rend(); ++it) {
313376
2. 再用 AB 和 CD 的哈希值计算 Root
314377
- 所以需要倒序访问路径,先处理 CD 的哈希值,再处理 B 的哈希值
315378

379+
##
380+
381+
382+
383+
## 钱包系统 / 数字签名(v0.0.4)
384+
385+
添加钱包系统,包括密钥生成、签名和验证功能。使用 OpenSSL 的椭圆曲线加密(ECDSA)来实现。
386+
387+
这个实现添加了以下功能:
388+
389+
1. **钱包系统**
390+
- 使用 OpenSSL 的椭圆曲线加密(ECDSA)
391+
- 支持密钥对生成
392+
- 支持交易签名和验证
393+
- 使用 secp256k1 曲线(与比特币相同)
394+
395+
2. **交易签名**
396+
- 每个交易都可以被签名
397+
- 签名使用发送方的私钥
398+
- 任何人都可以使用发送方的公钥验证签名
399+
400+
3. **安全性**
401+
- 私钥永远不会离开钱包
402+
- 所有敏感操作都有适当的错误处理
403+
- 使用 OpenSSL 的安全随机数生成
404+
405+
4. **主程序:**
406+
1. 创建三个钱包(Alice、Bob 和 Charlie)
407+
2. 为每个钱包生成密钥对
408+
3. 创建并签名交易
409+
4. 验证交易签名
410+
5. 创建区块链并添加区块
411+
6. 验证区块链的有效性
412+
7. 打印详细的区块链信息,包括:
413+
- 区块基本信息(索引、时间戳、哈希等)
414+
- 交易详情
415+
- Merkle 树结构
416+
- 交易验证结果
417+
418+
### 钱包
419+
420+
- 钱包其实是相对于用户,而每笔交易对应着2个钱包之间。
421+
- 钱包生成时核心数拥有自己的私钥和公钥,私钥永不对外暴露,而公钥则暴露给交易
422+
- 钱包可对自己作为发起方的交易签名,签名时使用私钥加密
423+
424+
### 交易
425+
426+
- 交易保存交易双方的公钥(替代交易双方的HASH值)
427+
- 交易由发起方的钱包对交易的HASH值签名,并将签名保存在交易内
428+
- 交易可通过发起方的公钥对签名解码,解码后是否和交易HASH值一致判断交易是否签名合法
429+
430+
431+

0 commit comments

Comments
 (0)