Lazy loaded image
⛓️BTC 密码学原理与数据结构
字数 2789阅读时长 7 分钟
2025-1-13
2026-8-17
← 返回总目录 · 区块链技术与应用笔记(BTC)
  1. collision resistance:对于输入,很难找到,经验性的,有的hash函数比如md5后续就发现没有碰撞抵抗的性质即可以认为制造碰撞
  1. hiding:计算过程单项,可以,不能;该性质前提是输入空间足够大且分布均匀
  1. puzzle friendly(比特币要求):哈希值计算事先不可预测,仅看输入很难猜出来输出,很难知道输出范围
比特币用的哈希函数是secure hash Algorithm256(sha-256),满足上面三条性质
asymmetric encryption algorithm(非对称加密),私钥加密(签名),公钥解密,比特币账户的创建就是在本地生成一对儿公钥和私钥,公钥公开;
发布一场交易,先用我自己私钥签名,别人再用公钥验证,就可以确定交易确实是我发起的而不是被冒名顶替;
为了避免生成同样的公钥私钥(即使概率几乎为0),需要good source of randomness(好的随即源)
比特币系统不仅公钥私钥生成用好的随机源,之后每一次签名也要好的随机源,否则可能泄露私钥
比特币一般先hash(message),然后再对哈希值签名
步骤
步骤 1: 哈希消息
假设消息是 "Hello, Bitcoin!"。使用 SHA-256 哈希算法对这个消息进行哈希处理。SHA-256 会将消息转换为一个固定长度的 256 位(32 字节)的哈希值。
步骤 2: 签名哈希值
接下来,需要对哈希值进行签名。签名过程通常使用椭圆曲线数字签名算法(ECDSA)。假设有一个私钥(在实际应用中,私钥是绝对保密的),用这个私钥来签署哈希值。
假设私钥是
使用这个私钥来对哈希值进行 ECDSA 签名。这个过程涉及到一些复杂的数学运算(需要用到生成点、随机数等),具体的计算可以通过比特币库或者密码学库来完成。
假设在这个过程后生成的签名为:
步骤 3: 发布消息、哈希值和签名
最终,会将消息、哈希值和签名一起发布,任何人都可以使用公钥来验证签名。
例如:
  • 消息: "Hello, Bitcoin!"
  • 哈希值: "c7b8a9f516a627082a415f7f8b77d8998ca7168f794bf30351985bb10f648e83"
  • 签名: (r, s)
公钥为什么可以验证签名,具体数学原理后续再说
哈希指针(Hash Pointer)是一种数据结构,结合了哈希值和指向数据位置的指针。具体来说,哈希指针由两部分组成:
  1. 哈希值:该值是通过对某个数据块进行哈希计算而得到的。哈希值可以唯一地代表这个数据块,任何对数据块的修改都会导致哈希值的变化。
  1. 指针:指向该数据块存储位置的引用。它指示了数据的实际存储位置或位置。
哈希指针的作用
 
哈希指针的主要作用是确保数据的一致性和完整性,它广泛应用于区块链和其他分布式系统中。其用途包括:
  • 数据完整性:哈希指针可以确保数据没有被篡改。如果数据被修改,计算出来的哈希值会不同,进而改变哈希指针,使篡改的行为容易被检测。
  • 防篡改:在区块链中,每个区块的哈希指针指向前一个区块的哈希值。这意味着,修改任何一个区块的内容都会改变它的哈希值,进而改变后续所有区块的哈希指针,使得整个链条的篡改行为变得非常明显。
  • 高效性:通过哈希指针,可以避免存储整个数据,优化存储空间。在某些情况下,只存储哈希值就能验证数据的完整性,无需传输或存储整个数据。
在区块链中的应用
在区块链中,每个区块通过哈希指针链接到前一个区块,形成一个链式结构。这些哈希指针确保区块的顺序和数据的不可篡改性。任何试图修改某个区块的数据都会导致该区块的哈希值变化,从而影响后续所有区块的哈希指针,最终被网络中的其他节点发现。
Merkle树是一种树形数据结构,用于高效和安全地验证大量数据的完整性。它的叶子节点包含数据的哈希值,而每个非叶子节点则是其子节点哈希值的组合。Merkle树在区块链中也得到了广泛应用,特别是在验证大量交易数据时。
Merkle树验证交易的过程
  1. 数据哈希:首先,通过哈希函数将所有的数据块(例如,交易记录)生成哈希值,这些哈希值存储在树的叶子节点。
  1. 递归哈希:非叶子节点通过对其子节点的哈希值进行计算,生成新的哈希值。直到根节点(Merkle根)形成,它代表了整个数据集合的唯一哈希值。
  1. 数据验证:通过比较树的根节点哈希值,验证数据是否在树中有效。如果树的某一部分被篡改,根节点哈希值将改变,立即暴露出数据不一致。
Merkle树的样子
tx是transation,交易
通过非叶子节点的两个哈希值可以算出上一层的哈希值
notion image
区块链中一个区块可以包含很多个交易,每一个区块可以延伸出一颗merkle树,和二叉树不同,Merkle树的主要作用不是作为索引,而是用于高效验证和确保大规模数据的完整性和一致性。
  1. 叶子节点:每个叶子节点包含数据块的哈希值。比如,在区块链中,每个叶子节点可能存储一笔交易的哈希值。
  1. 非叶子节点:每个非叶子节点包含其两个子节点哈希值的组合哈希(通常是对子节点哈希值的拼接后再哈希)。例如,若有两个子节点 Hash1 和 Hash2,那么它的父节点会存储 Hash(Hash1 + Hash2)
Merkle树在以下几个方面非常有用:
1. 数据完整性验证
Merkle树可以帮助验证一个数据集(例如,一组交易)是否被篡改。因为每个非叶子节点的哈希值都依赖于其子节点的哈希值,所以一旦树中的任何部分(无论是叶子节点还是非叶子节点)发生变化,都会导致根节点的哈希值发生变化。因此,通过检查根节点的哈希值,用户可以轻松地验证整个数据集是否发生了变化。
2. 高效的数据验证
Merkle树可以大大减少验证数据所需的计算量。举个例子,在区块链中,如果你想验证某一笔交易是否包含在一个区块中,你不需要查看区块中的所有交易。只需查看包含该交易的路径上的哈希值(称为Merkle路径),并与Merkle根进行比对即可。这使得验证某个交易是否存在更加高效,特别是在区块链中,区块可能包含成千上万笔交易。
3. 节省存储空间
由于Merkle树的设计,存储数据的哈希值(而不是整个数据)使得数据验证过程更加轻量级。在区块链系统中,用户只需要存储和传递Merkle根,而不是存储每笔交易的完整数据。
4. 防篡改性
由于Merkle树的哈希结构,如果其中某个数据被篡改,那么从叶子节点到根节点的所有哈希值都会发生变化,从而使篡改变得非常容易被检测出来。这为区块链提供了强大的防篡改机制。
轻节点(Light Node)是区块链网络中的一种节点类型,它只存储区块链的一部分信息,通常仅存储区块头(包括Merkle根)和其他必要的元数据,而不存储完整的交易数据。
特点和工作方式
轻节点的主要特点是:
  • 存储需求低:轻节点不需要存储所有的交易和区块数据,因此对硬盘空间的需求较小。
  • 高效:通过查询全节点获取必要的数据来验证交易或区块,能够在不占用大量存储空间的情况下进行基本的区块链操作。
  • 依赖全节点:轻节点依赖于全节点提供交易信息和验证结果。轻节点不能完全独立验证交易和区块的完整性,它依赖全节点来获得信息的正确性。
轻节点的工作方式:
  • 轻节点在验证交易时,并不需要存储所有交易数据或Merkle树。它通过请求全节点提供特定交易的详细信息以及相关Merkle路径来验证该交易是否包含在某个区块中。
  • 轻节点只需要检查区块头的信息,而不需要存储所有交易数据。它通过Merkle根与全节点协作,验证交易的有效性。
与轻节点相对
特点
  • 存储完整数据:全节点存储区块链的完整历史数据,包括每个区块中的所有交易信息和所有区块的完整数据。
  • 完全验证:全节点能够独立验证所有区块和交易的有效性,确保网络的去中心化和安全性。它验证交易、区块的合法性,执行共识协议等。
 
  • 占用更多资源:由于需要存储大量的数据,全节点通常需要更多的硬盘空间、内存和计算能力。
 
上一篇
BTC 共识协议与区块写入
下一篇
lobechat数据库版服务端部署

评论
Loading...