Skip to content

Commit

Permalink
Merge pull request #127 from JackyLHH/main
Browse files Browse the repository at this point in the history
Add zh versions
  • Loading branch information
matt-nervos authored Dec 11, 2023
2 parents a2f6e8f + f4efbb8 commit 8d8047e
Show file tree
Hide file tree
Showing 4 changed files with 278 additions and 0 deletions.
96 changes: 96 additions & 0 deletions SHA256_most_used_hash_function_(explainCKBot)/index_zh.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
---
title: 'SHA256:加密货币领域最常用的哈希函数'
coverImage: 'images/image1.png'
category: Popular
subtitle: 'SHA256(Secure Hash Algorithm 256-bit)是一种加密哈希函数,已成为现代数字安全的基石。'
date: '2023-09-04T16:00:00.000Z'
author:
- github:explainCKBot
---

SHA256 在保障数据完整性、实现数字签名以及维护安全通信协议方面发挥着至关重要的作用。本文旨在深入探索哈希函数的世界,揭示 SHA256 的历史,以及介绍它如何在数字安全中发挥作用。



## 哈希函数简介

哈希函数是将任意长度的输入(或称为 “消息”)转换为固定长度字符串的算法。这一输出通常代表了原始数据的 “哈希值” 或 “摘要”。哈希函数具有以下几个独特的属性,使其成为各种安全应用的理想选择:

* **确定性:** 同一输入总会产生同一输出,保证了结果的一致性。输入的细微变化将导致输出显著不同,使得根据小幅度输入变化预测输出变得困难。
* **快速计算:** 哈希函数能迅速处理大量数据,适用于实时场景。
* **抗原像性:** 从输出的哈希值中推导出原始输入值在计算上是不可行的。
* **强抗碰撞性:** 极小概率出现两个不同输入产生相同输出值的情形。

这些属性使得哈希函数在数字安全领域发挥着至关重要的作用,广泛应用于多种加密技术中。



## SHA256 的历史

SHA256 是 SHA-2(Secure Hash Algorithm 2)家族中的一员,由美国国家安全局(NSA)设计,并于 2001 年由美国国家标准与技术研究院(NIST)正式发布。它是为了替代之前的 SHA-1 哈希函数而设计的,因为 SHA-1 已经出现了安全漏洞。

SHA-2 家族包括多个不同摘要长度的哈希函数:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224 和 SHA-512/256。其中,SHA256 是最常用的,因为它兼顾了性能和安全性。



## SHA256 的运作机制

SHA256 使用一种称为 Merkle-Damgård 架构的运作机制,该机制通过分块处理输入数据和利用压缩函数减少数据大小。下面简要介绍该算法的处理步骤:

信息预处理:分为两个步骤——附加填充比特和附加长度。其中,附加填充比特在消息末尾进行填充,使消息长度在对 512 取模以后的余数是 448。填充时先补第一个比特为 1,然后都补 0,直到长度满足对 512 取模后余数是 448。填充是至少补 1 位,最多补 512 位。附加长度值就是将原始数据(第一步填充前的消息)的长度信息补到已经进行了填充操作的消息后面,SHA256 用一个 64 位的数据来表示原始消息的长度。

常量初始化: 8 个初始哈希值,来自对自然数中前 8 个质数的平方根的小数部分取前 32 位。

信息处理:经过填充的信息被分成 512 位的数据块,每次处理一个数据块。对于每个区块,都要执行以下步骤:

* 512 位的数据块分解为 16 个 32 位的字。
* 利用原有的 16 个字和按位运算生成额外的 48 个 32 位字。
* 对字应用压缩函数,然后将压缩结果与初始哈希值相结合,生成该数据块的中间哈希值。
* 最终哈希值: 处理完所有数据块后,通过连接中间哈希值生成最终哈希值。



## SHA256 在数字安全领域的应用

SHA256 在确保数字安全的各个领域发挥着核心作用:

* **数据完整性:** 通过为特定文件或数据集生成唯一的哈希值,对数据的任何后续更改都会导致不同的哈希值,从而有效检测更改并确保数据完整性。
* **数字签名:** 结合公钥加密技术,SHA256 可以实现安全的数字签名,验证发送者的真实性和信息的完整性。
* **安全通信协议:** SHA256 广泛应用于 TLS(传输层安全性)和 SSL(安全套接字层)等协议,以确保在线通信安全和数据隐私。
* **密码存储: **在存储用户密码时,通常的做法是使用 SHA256 或其他安全哈希函数对密码进行哈希计算,以防止未经授权访问明文密码,即使在数据泄露的情况下也是如此。
* **加密货币:** SHA256 是比特币挖矿中使用的工作量证明(PoW)算法,要求矿工解决复杂的数学问题,以验证交易并获得奖励。



## 加密货币中的 SHA256 深入分析

在比特币等加密货币中,SHA256 在确保网络安全和保护区块链完整性方面起着至关重要的作用。

### 工作量证明(PoW)算法

SHA256 充当比特币挖矿中的工作量证明(PoW)算法,这是一种验证交易和防止双花的共识机制。矿工们竞相解决复杂的数学问题,本质上就是找到符合特定标准的哈希值。这一过程包括以下步骤:

1. 矿工收集一组未经确认的交易并创建一个新的候选区块。
2. 构建区块头,其中包含关键信息,例如前一个区块的哈希值、交易的 Merkle Root、时间戳、随机数和目标难度。
3. 然后,矿工对区块头重复执行 SHA256 哈希运算,每次尝试都会增加随机数值,直到找到低于或等于目标难度的哈希值。
4. 一旦找到有效的哈希值,矿工就会将解决方案广播到网络,其他节点通过执行相同的操作来验证哈希值。
5. 如果解决方案有效,新区块就会添加到区块链中,矿工也会收到区块奖励——新铸造的比特币和交易手续费。
6. 双重 SHA256:比特币对交易和区块哈希采用双重 SHA256 哈希以提高安全性。在此过程中,对输入数据计算两次 SHA256 哈希值,第一次计算的输出作为第二次计算的输入。这个额外的哈希层可以减轻潜在的漏洞,例如长度扩展攻击。


### Merkle Tree 和 Merkle Root

SHA256 还用于创建 Merkle Tree,Merkle Tree 是表示区块内交易的哈希二叉树。每笔交易都使用 SHA256 进行哈希处理,生成的哈希值会进行配对,再次进行哈希处理,依此类推,直到只剩下一个哈希值:Merkle Root。然后,Merkle Root 会被包含在区块头中,从而为验证区块内所有交易的完整性提供了一种简洁高效的方法。

### 基于哈希值的加密签名

比特币采用公钥加密技术确保交易安全。用户的私钥用于生成数字签名,相应的公钥则作为用户的比特币地址。创建交易时,发送者用自己的私钥对交易进行签名,并将生成的签名和自己的公钥包含在交易数据中。

SHA256 参与了数字签名的生成过程。首先使用 SHA256 对交易数据进行哈希计算,生成摘要,然后使用发送方的私钥对摘要进行签名。为了验证签名,收件人再次对交易数据进行哈希计算,然后使用发件人的公开密钥验证签名。这样就确保了发送方的真实性和交易数据的完整性。




## 总结

总之,SHA256 是比特币等加密货币不可或缺的一部分,为 PoW 挖矿、交易验证和数据完整性提供了安全基础。其强大的设计和广泛的应用促进了去中心化网络的发展和弹性,确保了数字资产可以放心地交换和存储。
62 changes: 62 additions & 0 deletions mempool_in_cryptocurrency_(explainCKBot)/index_zh.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
---
title: '一文看懂加密货币中的内存池'
coverImage: 'images/image1.png'
category: Popular
subtitle: '在日益繁荣的加密货币领域,交易是整个生态系统的支柱。'
date: '2023-11-28T16:00:00.000Z'
author:
- github:explainCKBot
---

每次加密货币的发送或接收都牵涉到一次交易。那么,在它们被正式纳入区块链之前,这些交易都去了哪里呢?答案是 “内存池(Mempool)”中,内存池是区块链基础设施中一个至关重要但却经常被忽视的组成部分。



## 内存池简介

简而言之,内存池就是一个交易暂存区,可以视为数字世界中的等候室,各项交易在此排队等待确认。

与人们普遍认为的相反,区块链并非只有一个统一的内存池。实际上,每个节点在区块链网络上都维护着自己的待处理交易集,即自己的内存池 “视图”,从而确保去中心化的验证过程。



## 内存池的运作机制

想象一下,当你点击 “发送” 发起一笔加密货币交易时,这个交易并非立即被添加到区块链上。它首先会被送入内存池,加入其他正在排队的交易队列中。在这个阶段,它等待着矿工或验证者的验证和处理。

矿工和验证者从内存池中选择交易时会考虑多个因素,包括:


1. **交易费用(或"Gas Fee"):** 对于矿工来说,交易费用是决策中的关键因素之一。他们倾向于优先处理交易费用较高的交易,因为这些费用是对他们在验证交易并将其添加到新区块中所做努力的奖励。在网络高度拥堵期间,用户通常会提高交易费用,以确保其交易得到更快处理。
2. **交易大小:** 交易的大小因其输入和输出的复杂程度而异。较小的交易在区块中占用的空间通常较小,因此矿工可以包含更多的交易。但是,如果一笔较大的交易能提供足够高的费用,那么它仍然会被优先处理。
3. **交易年龄:** 一些矿工可能会考虑交易的年龄,优先处理内存池中较早的交易。这种做法并不普遍,但有助于确保长期待处理的交易最终得到处理。
4. **nonce(以太坊):** 在以太坊中,从特定地址发送的每笔交易都有一个 nonce,这是一个顺序号。矿工必须遵守这一顺序。如果你从一个以太坊地址发送了三笔交易,那么在上链的先后顺序中 nonce 为 2 的那笔交易就不能先于 nonce 为 1 的那笔交易。
5. **双花保护:** 矿工会始终检查一笔交易是否有双花。如果内存池中的两个交易试图花费相同的输出,矿工通常会优先处理费用较高的那个,而放弃另一个。
6. **合约复杂性(针对智能合约平台):** 如果交易触发了智能合约,该合约所需的复杂性和操作会影响其选择。需要更多计算能力的复杂合约可能需要更高的费用才能吸引矿工。
7. **区块 Gas 限制(以太坊):** 以太坊网络上的每个区块都有一个 Gas 限制,即该区块中的交易可以消耗的最大 Gas 量。矿工需要确保一个区块中所有交易使用的 Gas 总和不超过此限制。
8. **战略考虑:** 一些矿工可能有优先处理某些交易的战略原因,特别是当他们与特定服务或平台有关联时。不过,这种情况在去中心化网络中并不常见。



## 为什么内存池很重要?

内存池是加密货币网络的重要组成部分,它充当着交易验证前的中转站。交易在被纳入区块链前,首先在内存池中接受审查,以确保其真实性和完整性。这包括验证交易发起人是否拥有足够资金,以及交易格式是否正确。通过将交易存放在内存池中,系统可确保任何随后试图在其他地方使用相同资金的行为都会被拒绝,直到初始交易得到确认或被丢弃。

除了这些安全措施,内存池还提供了一种交易优先级机制。鉴于区块大小的限制,并非每笔交易都能立即进入下一个区块。这就是内存池发挥作用的地方,它允许矿工根据交易费用等标准对交易进行优先排序。这样的系统可以确保需要快速确认的用户可以选择支付溢价,从而提高其交易的优先级。

每个节点都拥有自己的内存池,这不仅加强了去中心化,还为系统增加了冗余。即便部分节点出现问题或作恶,网络依然可以正常运行,通过其余诚实节点的内存池处理交易。

此外,内存池的状况也是衡量网络活跃程度的重要指标。例如,拥堵的内存池可能意味着网络使用量增加,进而推高交易费用。这为交易者和用户提供了重要的信息,帮助他们决定何时进行交易。总之,内存池不仅是一个临时存放区,更是保障加密货币网络顺畅、安全、高效运作的关键环节。



## 常见问题和误解

一个常见的疑问是:“为什么我的交易处理这么慢?” 这通常与内存池的状态有关。在网络繁忙时期,内存池可能变得拥挤,导致处理延迟。还有一个误解是关于交易费用的作用,虽然更高的费用可能加快处理速度,但它并不能保证立即完成交易确认。



## 从内存池中释放交易

如果你的交易卡在内存池中,请不要惊慌。你可以采取几种策略:一是耐心等待,如果网络只是拥堵,你的交易最终会被处理;二是可以选择提高交易费用,以激励矿工优先处理你的交易。

43 changes: 43 additions & 0 deletions transaction_confirmation_in_blockchain_(explainCKBot)/index_zh.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
---
title: '什么是区块链交易确认?'
coverImage: 'images/image1.png'
category: Popular
subtitle: '区块链交易确认是确保交易有效性和安全性的关键步骤。这个过程始于交易被提交到内存池中,终于被打包到新区块里并添加至区块链上。'
date: '2023-11-29T16:00:00.000Z'
author:
- github:explainCKBot
---

当一个交易发起后,它会被广播至整个网络。在这一阶段,参与网络的节点(在 CKB 等基于工作量证明的加密货币中,这些节点被称为矿工)会验证交易的详细信息和真实性。一旦交易被认为符合协议规则,矿工便会将其与工作量证明一起打包进区块,并将该区块广播给网络中的其他节点。

网络中的其他节点在接收这个新区块时,会对里面的交易及其工作量证明进行验证。若验证通过,这些节点便会将该区块加入到它们各自的区块链副本中。交易一旦被纳入区块并添加至区块链中,就被称为确认交易。

这一过程保障了网络中所有节点持有一致的区块链信息。



## 交易确认所需时间

一个区块的确认并不意味着交易的终极确定。有时,多个矿工可能几乎同时发现有效的区块。这会导致网络的部分节点在同一区块高度上构建不同的区块,形成所谓的 “意外分叉”。

区块链往往通过 “最长链规则” 来解决这类问题,这意味着网络将把最长的链(背后累积工作量最多的链)视为标准链。一旦矿工观察到一条链比另一条链长,他们就会放弃较短链上的新区块(称为孤块),继续在最长链上构建区块。

因此,一笔交易通常需要多次确认(通常是三次或以上)才被认为是最终确定或不可逆。至于单笔交易确认需要多长时间,这取决于具体的区块链。例如,比特币平均每 10 分钟产生一个区块,而 Nervos Layer 1 区块链 CKB 的出块时间大约是10 ~ 12 秒。



## 为什么我的交易没有得到处理?

用户的交易在广播到网络后并不会立刻被处理,而是首先进入一个名为内存池(mempool)的暂存区,与其他待处理的交易一同排队。

矿工会根据交易手续费的高低来挑选内存池中的交易并进行打包处理。因为区块空间(可容纳一个区块的交易数量)有限,矿工无法将所有交易都纳入一个区块,因此他们会优先选择手续费较高的交易进行打包,费用较低的交易可能会被延迟处理。

当处理时间过长时,用户可以选择编辑交易并提高交易手续费,以吸引矿工加快处理速度。



## 如何查询交易状态

用户可以通过区块链浏览器,如以太坊的 [ethexplorer.io](https://ethplorer.io/es/)、比特币的 [blockstream.info](https://blockstream.info/) 和 CKB 的 [explorer.nervos.org](https://explorer.nervos.org/) 来查询他们的交易状态。当交易处于待处理状态时,意味着该交易尚未被纳入区块中。

当一笔交易被确认时,就意味着它已经被记录在区块链上了。需要注意的是,在以太坊上,存在被标为 “失败” 的交易,这意味着尽管交易被处理过,但并未成功执行,矿工或验证者仍会收取 Gas 费用。相比之下,比特币和 CKB 仅将有效的交易纳入链中。
Loading

1 comment on commit 8d8047e

@vercel
Copy link

@vercel vercel bot commented on 8d8047e Dec 11, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.