1. 哈希算法
常见的哈希算法共有:
- MD5
- SHA-1
- SHA-2
- SHA-3
- RIPEMD-160
- RIPEMD-128
而在区块链中的哈希算法,一般是区块哈希和默克尔树
1.1 区块哈希
区块哈希是指区块的哈希值
- 它由区块头经过一个特定的哈希函数计算得到的
不同的区块链可能使用不同的哈希函数,例如:
- 比特币:SHA-256
- 以太坊:Keccak-256
区块哈希通常使用十六进制表示:
bash
0x00000000000000000000008e8c8a8fe3b5ca1c9a6f8f5f6e9c1c1
1.1.1 特点
唯一性:
- 每个区块都有独一无二的区块哈希,没有两个不同的区块会有相同的区块哈希
不可逆:
- 给定一个区块哈希,无法推算出区块的内容,智能通过查询区块链来获取区块的内容
敏感性:
- 如果区块头的内容稍微改变了一点点,那么经过哈希函数计算,得到的区块哈希将会变得面目全非
确定性:
- 对于同一个区块,无论出现什么,得到的区块哈希都是相同的
1.1.2 作用
验证:
- 通过计算区块头的内容得到区块哈希,并与已知的或者提供的区块哈希进行比较,可以验证该区块是否完整且未被篡改
查询:
-
通过提供或输入区块哈希,可以在区块链浏览器等第三方服务中查询该区块的详细信息
例如包含的交易、生成时间、奖励等
链接:
- 通过记录或者引用前一个区块的哈希值,可以将每个区块连接起来,形成一个不可篡改的历史记录,这就是区块链
1.2 默克尔树
在区块链中,主要作用范围覆盖在交易记录内
它排列了某个区块中所有的交易记录,并采取特定的算法进行查询
默克尔树重点使用了:哈希算法
默克尔树是一种数据结构,通常是一个二叉树(或多叉树)
- 它以特定的方式逐层向上计算
在最顶部的Hash块叫做:默克尔根

以比特币中使用的二叉Merkle树为例
每条交易的哈希值就是一个叶子节点,从下往上将两个相邻叶子节点的组合哈希作为新的哈希值,新的哈希值成为树节点继续与相邻的树节点组合成新的哈希值。
在重复一定次数后直到形成唯一的根节点。
最后得到的Merkle根需要保存到区块头中,以便仅需通过区块头就可以对交易进行简单支付验证,这一过程也成为SPV(Simplified Payment Verification)。
对于Merkle树而言,并不需要知道整棵Merkle树中每个节点的值
它可以通过节点的值 、Merkle根的值 和相关路径来快速验证该节点是否属于该Merkle树,从而快速验证该区块中是否包含了某条交易。
默克尔树的作用:
-
快速比较大量数据
当两个默克尔树的根哈希值相同时,说明所代表的数据都相同
-
快速定位修改

如这张图:
- 若是L3发生修改,那么
Hash 1-0、Hash 1、默克尔根(Top Hash)就一定会发生改变 - 如果想要快速定位,只需要从
默克尔根(Top Hash)》Hash 1》Hash 1-0寻找即可找到L3
- 若是L3发生修改,那么
-
零知识证明
可以证明某一个Hash块存在,但又不清楚该Hash块的具体内容
在默克尔树这里,就可以从
默克尔根(Top hash)一路往下找,就能清楚的知道某Hash块是否存在
2. 公开密钥算法
公开密钥算法(Public KeyCryptography)
- 也称为非对称加密算法(Asymmetrical Cryptography)
非对称加密需要两个密钥:
- 公钥 (publickey)
- 私钥 (privatekey)
公钥和私钥是一对,如果用公钥对数据加密,那么只能用对应的私钥解密。
如果用私钥对数据加密,只能用对应的公钥进行解密。
因为加密和解密用的是不同的密钥,所以称为非对称加密。
非对称加密算法的两个特点:
保密性好:消除了最终用户交换密钥的需要加解密速度慢:相对于对称加密算法,是非常非常慢的
- 再某些极端情况下,甚至能比对称加密慢1000倍
算法强度复杂、安全性依赖于算法与密钥
- 但是算法复杂,使得加密解密速度没有对称加密的速度快
对称密码体制中只有一种密钥,并且是非公开的
- 如果要解密,必须让接收方知道密钥

保证安全性其实就是保证密钥的安全。
非对称加密算法有两种密钥:公钥与私钥
-
不需要像对称加密算法一样传输密钥了
提高了信息安全性

常见的非对称加密算法:
- RSA
- Elgamal
- 背包算法
- Rabin
- D-H
- ECC(椭圆曲线加密算法)
- ...
3. 编码和解码算法
3.1 BASE64
Base64是一种二进制到文本的编码方式。
如果要更具体一点的话,可以认为它是一种将 byte数组编码为字符串的方法,而且编码出的字符串只包含ASCII基础字符。
因为它是基于(Base)64个字符的一种编码方式。
使用其编码后的文本只包含64个ASCII码字符(偶尔加一个填充字符=)
3.2 BASE58
Base58 与 Base64 异同
相同
- 一般都用于URL,邮件文本,可见字符显示。
- 都会造成信息冗余,数据量增大,因此不会用于大数据传输编码。
区别
- 编码集不同,Base58 的编码集在 Base64 的字符集的基础上去掉了比较容易混淆的字符。
- Base64 采用直接切割 bit 的方法(8->6),而 Base58 采用大数进制转换,效率更低,使用场景更少。
Base58 解码时需要将长度传入, 这点与 Base64 有区别, 在代码实现时应注意。
3.3 BASE58Check
Base58Check 是一种常用在数字加密货币中的 Base58 编码格式
- 增加了错误校验码来检查数据在转录中出现的错误。
校验码长4个字节
- 从需要编码的数据的哈希值中得到的
可以用来检测并避免转录和输入中产生的错误。
使用 Base58check 编码格式时,编码软件会计算原始数据的校验码并和结果数据中自带的校验码进行对比。
- 二者不匹配则表明有错误产生,那么这个Base58Check格式的数据就是无效的。

🎶🥸🏏区块链专栏前瞻
- 【区块链技术(01)】区块链概述与认识区块链基础知识;区块链标识、哈希值、梅克尔树、难度确认
- 【区块链技术(02)】区块链三种类型:公有链、私有链、联盟差异;激励问题、最终确定性问题
- 【区块链技术(03)】区块链核心技术:哈希与加密算法、智能合约;非对称加密算法与默克尔树;智能合约工作原理与区块链的关系
- 【区块链技术(04)】区块链核心技术:分布式网络的定义和特点;分布式账本的特性、实现与工作流程;共识机制