Lazy loaded image
区块链技术与应用笔记(BTC)
00 分钟
2025-1-13
2025-2-21
type
status
date
slug
summary
tags
category
icon
password

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)
公钥为什么可以验证签名,具体数学原理后续再说
 

BTC-数据结构

哈希指针

哈希指针(Hash Pointer)是一种数据结构,结合了哈希值和指向数据位置的指针。具体来说,哈希指针由两部分组成:
  1. 哈希值:该值是通过对某个数据块进行哈希计算而得到的。哈希值可以唯一地代表这个数据块,任何对数据块的修改都会导致哈希值的变化。
  1. 指针:指向该数据块存储位置的引用。它指示了数据的实际存储位置或位置。
哈希指针的作用
 
哈希指针的主要作用是确保数据的一致性和完整性,它广泛应用于区块链和其他分布式系统中。其用途包括:
  • 数据完整性:哈希指针可以确保数据没有被篡改。如果数据被修改,计算出来的哈希值会不同,进而改变哈希指针,使篡改的行为容易被检测。
  • 防篡改:在区块链中,每个区块的哈希指针指向前一个区块的哈希值。这意味着,修改任何一个区块的内容都会改变它的哈希值,进而改变后续所有区块的哈希指针,使得整个链条的篡改行为变得非常明显。
  • 高效性:通过哈希指针,可以避免存储整个数据,优化存储空间。在某些情况下,只存储哈希值就能验证数据的完整性,无需传输或存储整个数据。
在区块链中的应用
在区块链中,每个区块通过哈希指针链接到前一个区块,形成一个链式结构。这些哈希指针确保区块的顺序和数据的不可篡改性。任何试图修改某个区块的数据都会导致该区块的哈希值变化,从而影响后续所有区块的哈希指针,最终被网络中的其他节点发现。

Merkle树

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-协议

签名是我用我自己的私钥加密,你用我的公钥验证;加密则是我用你的公钥加密,你用你的私钥解密
在区块链中,区块(Block) 由两个主要部分组成:区块头(Block Header) 和区块体(Block Body) 。这两部分各自包含不同的信息。

区块头(Block Header)

区块头包含关于该区块的元数据,主要用于识别区块的属性以及进行验证。常见的字段包括:
  • 版本(Version) :区块的版本号,标识该区块遵循的协议规则。
  • 前一区块哈希(Previous Block Hash) :指向前一个区块的哈希值,这使得区块链形成了一个链条。
  • 梅克尔根(Merkle Root) :该区块内所有交易的哈希值根,用于快速验证该区块中的交易是否被篡改。
  • 时间戳(Timestamp) :区块被生成的时间。
  • 难度目标(Target) :工作量证明算法中的目标值,确定挖矿的难度。
  • 随机数(Nonce) :矿工用来挖矿的随机数,改变此值以满足目标值。
  • 区块哈希(Block Hash) :区块头的哈希值,是区块的唯一标识符,生成时会根据区块头的所有字段计算。

区块体(Block Body)

区块体包含区块的实际数据,通常包括所有的交易和其他相关信息。主要字段包括:
  • 交易(Transactions) :区块体内包含的所有交易数据。每一笔交易都记录了参与者、交易金额等信息。
  • 交易计数(Transaction Count) :区块中包含的交易数量。
 
区块哈希是通过计算区块头的内容生成的,而不包括区块体(即交易数据),因为merkle root hash就已经保证了区块体中数据的真实性不被篡改,因为merkle root hash的值就跟区块体有关

CAP定理

CAP定理(也叫Brewer定理)描述了分布式系统中三大关键特性之间的权衡关系。CAP定理的核心是,在分布式系统中,无法同时实现一致性、可用性和分区容错性。分布式系统最多只能同时保证其中的两个特性,而必须在三个特性之间做出选择。
CAP定理表明,分布式系统在设计时,不能同时满足以下三个特性:
  1. 一致性(Consistency):所有节点在同一时刻看到的数据是相同的,即每次读取操作都能返回最新的写入结果。换句话说,系统的所有副本都保持一致。
  1. 可用性(Availability):每个请求都会得到响应,无论请求是否成功,系统都会回应,保证系统持续可用,能够提供服务。
  1. 分区容错性(Partition Tolerance):即使系统发生网络分区(某些节点或网络无法相互通信),系统仍然能继续运行并提供服务,不会中断。
可能的组合:
  1. 一致性 + 可用性(CA)
      • 系统保证一致性和可用性,但在发生网络分区时无法容忍分区。例如,在没有网络问题的情况下,系统会保持一致且可用,但如果发生分区,系统可能会拒绝部分请求。
  1. 一致性 + 分区容错性(CP)
      • 系统保证一致性和分区容错性,但可能在发生网络分区时牺牲可用性。即系统保持一致性,尽管部分节点不可用,但不会让不一致的数据进入系统。
  1. 可用性 + 分区容错性(AP)
      • 系统保证可用性和分区容错性,但可能在网络分区时不保证一致性。即使发生分区,系统仍会回应请求,但数据可能不一致,直到分区解决。
网络分区是指在分布式系统中,网络故障导致部分节点之间无法通信,形成了若干个互相隔离的子网络。换句话说,网络中的一些节点因为通信中断而无法与其他节点交换信息,这种状态被称为“网络分区”。
网络分区的影响:
  1. 节点隔离:分区会导致某些节点无法访问其他节点的数据或服务,甚至无法知道其他节点的状态。
  1. 一致性问题:在分区状态下,系统的多个子集(分区)可能会继续执行操作,但由于无法通信,它们可能会对相同的数据进行不同的更新,导致数据的不一致性。
  1. 可用性影响:虽然分区后的子网络仍然可以响应请求,但系统的一部分可能会因为无法通信而无法正常工作。
网络分区的例子:
  • 数据中心之间的网络中断:假设一个分布式系统的不同数据中心之间发生了网络问题,导致某些数据中心不能与其他数据中心通信。
  • 节点故障导致的分区:如果某些节点由于硬件或软件问题失去连接,也会发生网络分区。
分布式系统中的应对:
根据CAP定理,当发生网络分区时,系统需要在一致性可用性之间做出选择:
  • 如果选择一致性(CP),系统会拒绝一部分请求,直到网络恢复连接,确保在分区状态下的数据一致性。
  • 如果选择可用性(AP),系统会继续响应请求,即使可能返回不一致的数据,直到网络恢复。
区块链系统中通常会保证分区容错性一致性
  1. 分区容错性(Partition Tolerance) :区块链系统必须能够容忍网络分区,即使部分节点或网络无法互相通信,系统仍然能够继续运行,并最终恢复一致性。这是分布式系统的基本需求,尤其在去中心化的环境中,分区容错性至关重要。
  1. 一致性(Consistency) :区块链系统通过共识机制(如Proof of Work、Proof of Stake等)来确保所有节点在同一时刻看到相同的数据。这意味着即使存在网络分区或延迟,最终所有合法节点都会达成一致,确保区块链的数据不会发生冲突。
通常,区块链系统在面对网络分区时,会选择牺牲可用性(Availability)来保持一致性和分区容错性。例如,在分区发生时,可能会暂停一些交易操作,直到网络恢复并重新达成一致。

区块链写入新区块

账本的内容要取得分布式的共识
比特币共识(consensus in bitcoin)
在比特币中共识机制(Consensus Mechanism)是用来确保网络中所有节点对区块链的状态达成一致的规则。比特币采用的是一种称为工作量证明(Proof of Work, PoW)的共识机制。这个机制通过矿工的计算能力来确保区块链的可靠性、数据一致性和去中心化。
1.工作量证明(PoW)
工作量证明是比特币和其他许多加密货币使用的核心共识机制。它要求网络中的矿工通过解决复杂的数学难题(哈希运算)来获得新区块的创建权。这个过程有以下几个关键步骤:
  • 计算哈希:矿工不断尝试调整区块头的Nonce值,计算区块头的哈希值,直到找到一个满足特定要求(通常是哈希值低于某个目标值)的哈希。
  • 竞争:矿工与其他矿工竞争,谁先找到有效的哈希值,谁就有权将该区块添加到区块链中。
  • 区块的广播:当矿工找到符合条件的区块时,他们将该区块广播到整个比特币网络中。网络中的其他节点会验证该区块是否合法(是否符合工作量证明的要求)。
2. 分布式网络中的共识
比特币网络是去中心化的,没有一个中央权威来验证交易或维护账本。网络中的每个节点都可以加入或退出,且节点间通过协议确保一致性。共识机制的作用是确保网络中所有的节点在没有信任的情况下对账本的内容达成一致。
3. 分叉和最长链规则
在比特币中,区块链的分叉可能发生,当两个矿工几乎同时找到有效区块时,网络中会出现两条相同长度的链。为了解决这一问题,比特币采用了最长链规则
  • 最长链规则:网络中的节点总是认为拥有最多工作量的链(即包含最多区块的链)是有效链。因此,分叉链中的较短链会被网络自动丢弃,节点会选择将新区块添加到最长链上。
  • 这个机制通过持续的竞争确保了比特币网络的最终一致性,并避免了网络分裂或无效区块的生成。
4. 矿工的激励
为了激励矿工参与工作量证明并维护网络安全,比特币为成功挖出新区块的矿工提供奖励。这些奖励包括:
  • 区块奖励:每成功挖掘一个新区块,矿工会得到一定数量的比特币。最初的区块奖励为50比特币,但每四年减半,截至2024年区块奖励为6.25比特币。
  • 交易费用:矿工还会收到该区块内所有交易的手续费。随着比特币区块奖励逐渐减少,交易费用将成为矿工的重要收入来源。
5. 网络安全与去中心化
通过工作量证明和矿工的竞争,整个比特币网络实现了去中心化的共识。没有任何单一实体可以控制整个网络。为了篡改区块链中的数据,攻击者需要重新计算并重做所有后续区块的工作量证明,这在算力充足的比特币网络中几乎是不可能完成的任务。
新区块写入链中的全流程
1. 交易的生成和广播:
  • 用户发起比特币交易,将交易信息(如发送者、接收者、交易金额等)广播到比特币网络。
  • 所有比特币网络中的节点都会接收到这些交易,并进行验证,确保交易的有效性(例如,确认发送者有足够的比特币余额)。
2. 矿工收集交易并组成区块:
  • 一旦交易经过验证,矿工会选择一些未被确认的交易(这些交易还没有被包含在任何区块中),将其打包成一个候选区块。
  • 该候选区块除了包含交易数据外,还包含了一个区块头(block header),其中包括:
    • 上一个区块的哈希(Previous Block Hash)
    • 该区块的时间戳(Timestamp)
    • 默克尔根(Merkle Root):所有交易的哈希值的压缩表示
    • 难度目标(Difficulty Target)
    • Nonce:一个随机数,用于调整区块头的哈希值
3. 矿工开始挖矿:
  • 矿工会不断调整Nonce的值,以计算区块头的哈希值。哈希值是通过对区块头信息(包括上一个区块的哈希、时间戳等)进行加密计算得到的。
  • 矿工的目标是使区块头的哈希值小于或等于设定的目标值(target) 。这个目标值通常是一个很小的数值,要求哈希值必须非常小,才能符合条件。
4. 验证工作量证明:
  • 每当矿工调整Nonce并计算出一个新的哈希值时,他会检查这个哈希值是否满足目标条件。如果满足条件(即哈希值小于或等于目标值),矿工就成功地完成了工作量证明。
  • 此时,矿工可以将他计算得到的区块广播到整个比特币网络。
5. 网络验证新区块:
  • 其他节点会验证该区块中的交易和区块头的哈希值是否有效。如果区块是合法的(例如,哈希值确实满足条件,且交易有效),区块会被添加到本地的区块链副本中。
  • 验证通过后,该新区块就成为比特币区块链的一部分。
6. 矿工获得奖励:
  • 成功写入新区块的矿工将获得区块奖励,这通常包括新生成的比特币(即区块奖励)和该区块内交易的交易费用。这笔奖励鼓励矿工继续挖矿,并保持比特币网络的运行。
7. 重复过程:
  • 每当新区块被添加到区块链后,矿工开始使用新区块的哈希作为下一个区块的“前一个区块哈希”,开始新的挖矿过程。这确保了比特币区块链的连贯性和不可篡改性。
区块链出现分叉怎么办
当比特币网络中出现两个矿工同时算出新区块的情况,导致多个同样长度的链并存时,会发生一种称为分叉(Fork)的情况。即在同一时刻,两个不同的区块链版本存在于网络中,且它们具有相同的长度。以下是出现分叉后的处理过程:
1. 分叉的产生
  • 假设两个矿工几乎同时找到符合条件的区块,并将这两个新区块广播到比特币网络中。
  • 由于网络的传播延迟,部分节点可能会先收到一个新区块,而其他节点收到的是另一个新区块。在这种情况下,网络中会同时出现两个区块链的分支,节点会各自添加他们接收到的区块,形成两个具有相同长度的链。
2. 长链规则(Longest Chain Rule)
  • 比特币网络通过最长链规则(Longest Chain Rule)来解决分叉问题。当网络中的节点发现区块链分叉时,它们会选择最长的链作为有效链。
  • 长链规则的含义是,网络中的节点总是认为具有最多工作量的链是有效链。因为工作量证明的过程是消耗计算资源的,链中包含的工作量越大,表示在该链上的计算过程越长,可信度也就越高。
也就是说,即使当前出现两条同样长的区块链,但是随着时间的推移,总有一条链变的更长,于是短的那条链被抛弃,长的那条链留下了
3. 解决分叉(回滚较短链)
  • 由于网络延迟,节点最终会收到另一个新区块,该新区块附加到分叉较长的那一侧。随着新区块的产生,整个链的长度将发生变化。
  • 网络中的节点会发现另一条链变得比它们目前的链长,因此它们会“放弃”当前的链,回滚到较长的链,并接受长链上的区块。这个过程保证了最终每个节点都有一个唯一的、连续的区块链副本。
4. 孤立区块(Orphan Block)
  • 被“抛弃”的较短链上的区块会成为孤立区块(Orphan Block),这些区块的交易仍然有效,且已经完成了验证。因此,孤立区块中的交易会重新进入交易池,待处理,最终可能会被包含在下一个区块中。
  • 这种情况不会导致资金的丢失,因为在比特币的设计中,交易只会在被确认后生效。如果一个区块被回滚,意味着它的交易也没有被确认。
5. 最终一致性
  • 通过这种方式,分叉最终会被解决,网络会保持一致性,并且区块链将只有一条有效链。
  • 在这个过程中,矿工竞争通过工作量证明达成共识,确保最终每个节点都达成一致,接受长链作为网络的唯一合法版本。
 

BTC-实现

发布一个区块有出块奖励,记录一笔交易交易方要交手续费,这就是费力发布区块可以得到的的收益;
比特币系统设计为每10分钟产生一个区块,每多出21万个区块,出块奖励就减半;因此计算一下差不多每隔4(3.99)年就出块奖励减半,简单计算可以知道当时间无限长的时候,比特币总量时2100万个;
比特币区块链本身不记录任何与资金转移无关的多媒体信息,如新闻、书籍、图片等。其设计初衷就是为了专注于安全和有效地处理货币转移,而不作为一个通用的信息存储平台;以前觉得一个区块肯定会记录五花八门的信息,现在可以确定,比特币整个系统,只会记录跟钱有关的信息;

BTC的交易方式和原理

需要注意的是,比特币的区块链是一个分布式的公共账本,记录的是交易数据(transaction-based ledger),并不直接记录每个账户(或比特币地址)上的具体余额,账户的余额信息是通过交易信息间接计算而来的,相关步骤:
1. 交易驱动的账本
  • 比特币的区块链是一个分布式的公共账本,主要记录的是交易数据,而不是账户余额。每笔交易记录了比特币的转移情况,包括:
    • 发送者地址
    • 接收者地址
    • 转账金额
    • 交易时间戳
    • 交易的哈希值等。
2. 地址而非账户
  • 比特币使用的是地址而非传统银行账户。每个用户可以生成多个比特币地址,而这些地址之间的比特币转移通过交易记录实现。用户的“账户余额”实际上是所有与其地址相关的交易输出(未花费交易输出,UTXO)。
3. 未花费交易输出(UTXO)
  • 比特币系统中有一个重要的概念是“未花费交易输出”(Unspent Transaction Outputs, UTXO)。
    • 这意味着每当你收到比特币时,这笔比特币的数量被记录为未花费的输出,只有在你使用这些比特币进行新的交易时,这些输出才会变为花费(spent)。
    • 用户的实际可用余额是通过计算所有UTXO的总和来得出的。
4. 查询余额的方式
  • 虽然区块链中不直接存储余额,但用户或钱包软件可以通过遍历相关地址的UTXO来计算每个地址的实际余额。
  • 在区块链上,每个地址的交易活动都可以被追踪和查看,所以任何人都可以查询特定地址的所有交易记录,从而计算出其余额。
未花费交易输出(UTXO,Unspent Transaction Output)是什么
1. 交易输出
  • UTXO 代表某个比特币交易中的输出部分,某个交易中生成的输出(output)在未被花费前都被视为 UTXO。每个 UTXO 记录了比特币的数量、接收地址和签名条件等。
2. 发送者和接收者
  • 每笔交易必须从一个或多个 UTXO 中选择作为输入,以生成新的交易。当你发送比特币时,你选择某些 UTXO 作为输入。剩余的部分(如果有的话)作为新输出返回给你的地址(称为“找零”)。
3. 标准输出类型
  • UTXO 主要在以下几种情况下产生:
    • 支付给某个地址的比特币:当你收到比特币时,交易输出就会生成并成为 UTXO。
    • 找零交易:当你用某些 UTXO 支付比特币时,将生成新的 UTXO(例如,一个输入是 1 比特币,支付给对方 0.5 比特币,剩余的 0.5 比特币返回到你的地址,成为新的 UTXO)。
4. 交易条件
  • UTXO 除了存储金额外,还包含用于解锁这些比特币所需的条件(通常是公钥哈希或脚本)。这确保了只有具备特定私钥的用户才能使用这些 UTXO。
5. UTXO 集合
  • 用户的可用余额并不是一个简单的数值,而是所有未花费交易输出(UTXO)集合的总和。计算用户的余额都涉及对所有 UTXO 的跟踪和累计。
6. UTXO 的状态
  • 一个 UTXO 一旦被用于新的交易并作为输入而被花费,便不再是未花费的输出,将转换为已花费状态,从utxo数据结构中移除。交易确认后,会在区块链中记录这一变化。
UTXO数据结构的样子及交易具象化
UTXO 的基本结构
一个 UTXO 通常包含以下信息:
  1. 交易ID(txid):指向生成这个 UTXO 的交易的唯一标识符。
  1. 输出索引(vout):在该交易中的输出位置,通常是一个整数,从 0 开始计数。
  1. 金额(value):这个 UTXO 的可用比特币数量,通常以 satoshi 为单位(1 BTC = 100,000,000 satoshi,Satoshi 是比特币的微小亚单位,以比特币的创始人中本聪(Satoshi Nakamoto) 的名字命名。每个比特币是由1 亿个Satoshi 组成的)。
  1. 地址(address):与这个 UTXO 相关联的接收地址,表明这个比特币属于哪个用户。
示例
假设有一笔交易,其交易 ID 为:
假设交易包含了两个输出,构成 UTXO 的信息如下:
UTXO 集合
假设用户 A 收到了上述两个 UTXO,它们就可以被用户 A 用来进行后续的交易。在实际的 UTXO 集合中,可能还会有其他的 UTXO,例如:
用户余额的计算
在一个节点的 UTXO 集合中,用户 A 的 UTXO 范围会可能包括 UTXO 1、UTXO 2、UTXO 3 和 UTXO 4。用户的可用余额可以通过将这些 UTXO 的金额相加来计算:
后续进一步交易
假如A要再继续进行交易,转账给B 1.25BTC,那么A可以选择UTXO1和UTXO2,或者单独选择UTXO3或者UTXO4只要总额大于交易金额即可(实际使用中钱包会自动选择),交易完成后,区块链上会记录交易信息,utxo集合红中上会删除掉UTXO1和UTXO2,找零0.25BTC,作为新的UTXO5写入UTXO集合中
 
总结
需要注意的是,虽然提到了钱包,余额,但是只是为了方便理解,实际上你并未拥有过余额那么很多软件比如说直接显示账户余额,你只是有一个权限,因为你有私钥,于是你就可以访问区块链上的一个地址,并有资格支配和该地址对应的所有UTXO,为了方便起见把你能支配的所有的UTXO的和称为账户余额;
传统银行账户,别人是无法知道你账户上有多少钱的,但是再比特币这个系统中,区块链上的所有交易都透明,utxo所有的信息也是透明的,所有的地址也是透明的,任何人都可以知道一个地址上有多少“余额”(即UTXO的和),唯一不透明的,仅仅是地址背后所对应的人以及私钥,虽然区块链本身全部透明,但仅仅凭借这一点不透明,也足以称的上绝对的安全和隐私,以当前世界的科技水平来看,去中心化的货币其安全性和隐私性,这个安心感是无与伦比的,了解到这一点,便足以理解为什么加密货币有资格具有“存在的甚至很高的价值”
transaction-based ledger(基于交易的账本,例如BTC)和account-based ledger(基于账户的账本,利于以太坊)的区别
1. 比特币:交易驱动账本(UTXO 模型)
  • 结构
    • 比特币使用未花费交易输出(UTXO)模型。每笔交易都会引用前面交易的输出作为输入。当 UTXO 被消费后,它变为已花费状态,不再可用。
  • 可追踪性
    • 每笔交易都是独立的,可以追溯到它所引用的 UTXO。交易必须明确指定所有输入和输出,因此这使得交易的流动性和追踪性很高。
  • 状态
    • 比特币的网络状态是通过所有的 UTXO 集合来表示的。要计算一个地址的余额,需要将所有未花费的输出相加。
  • 优点
    • 增强的隐私性:由于操作的基本单元是 UTXO,而不是账户,跟踪资金流动变得更复杂。
    • 防止双重支付:使用 UTXO 模型可以有效防止在同一时间内产生对相同资金两次支付的情况。
2. 以太坊:账户驱动账本
  • 结构
    • 以太坊采用账户模型,由两个主要类型的账户构成:外部账户(由私钥控制)和合约账户(由智能合约控制)。每个账户都有一个状态,表示它的余额和其他数据。
  • 可追踪性
    • 交易与账户状态直接关联。当用户进行交易时,账户的余额会直接更新,交易记录会明确显示账户之间的转移,而不是基于 UTXO 的输入输出模型。
  • 状态
    • 以太坊的网络状态由所有账户状态组成。一个账户的余额可以直接查阅,不需要引用特定的交易。
  • 优点
    • 更适合复杂的智能合约操作:由于账户的设计使得合约可以维持自己的状态,程序化交互变得更灵活。
    • 更简化的用户体验:用户在进行交易时只需关心账户余额的变化,而不需要跟踪多个 UTXO。
总结
  • 比特币 强调的是交易之间的联系,使用 UTXO 模型,使得每笔交易都是独立的,且更注重隐私性和双重支付的防护。
  • 以太坊 侧重于账户间的状态管理,以账户模型支持智能合约和去中心化应用,提供了更直观和灵活的操作方式。

区块的样子

可以通过比特币区块链浏览器查看一下区块链的一个区块到底长什么样子(截止到2025/1/22 9:29,最新区块是#880277)
notion image
右侧是该区块中每笔交易的细节,先解释一下区块中的各项参数
区块基本信息
  • Coinbase Message:
    • Coinbase Message(或称为“Coinbase 交易的附加数据”)是指在矿工挖掘新区块时,包含在 Coinbase 交易中的额外信息。Coinbase 交易是区块中第一笔交易,you'jiao'zuo铸币交易(generation transaction)或币基交易(coinbase transaction)主要用于奖励矿工提供的服务,并且它是唯一可以创造新比特币的交易。
      特点
      1. 奖励:
          • Coinbase 交易用于向矿工支付新生成的比特币奖励和交易费用。它标志着区块链中经济活动的开始。
      1. 可包含附加数据:
          • 矿工可以在 Coinbase 交易中包含任意数据,这段数据是矿工自己的消息或附加信息。它通常用于庆祝某个成就、传达特定的信息或作为选定矿池的标志。
      1. 格式:
          • Coinbase 消息的数据格式没有严格的限制,因此可以是矿工自定义的文本、字符、哈希值或其他任何形式的信息。在区块链浏览器中,可能会显示为看似乱码或难以理解的字符组合。
      这块数据可以随便写;注意这也是个交易,其中的信息也会改变merkle root的哈希值从而改变区块头的哈希值,nonce也就四个字节的长度,如果nonce的不足以调控难度,可以规定Conbase Message的前几个字节,来辅助调整难度
  • Hash:
    • 区块的哈希值,是通过对区块头信息进行哈希计算得到的唯一标识符,用于验证区块数据完整性。0000000000000000000097b925fdefdf56a0726ac6f1f3b3d94c136dfa675705表示区块的标识。前面一大长串0并不是偶然,所谓挖矿就是不断调整随机数nonce,使得整个block header的哈希值小于等于给定的目标阈值,改目标阈值表现为16进制就是前面一大串0,因此凡是符合难度要求的区块,hash header前面是必然的一大串0
  • Capacity:
    • 区块的容量使用率,表示区块大小相对于最大允许容量的百分比(比特币最大区块大小为 1 MB,扩展后为 4 MB 权重单位)。146.23% 表示权重超出基准容量。
  • Distance:
    • 当前区块与前一个区块之间的时间间隔(出块时间)。示例值“8m 12s”表示两区块间间隔为 8 分 12 秒。

交易统计
  • BTC:
    • 区块内所有交易涉及的比特币总量。示例值“4,759.3896 BTC”表示该区块内所有交易累计了 4,759.3896 BTC。
  • Value:
    • 所有交易对应的比特币总价值,以该区块生成时的市场价格计算。示例值“$504,262,995”。
  • Value Today:
    • 当前市场价格下的比特币总价值。示例值“$504,124,973”。
  • Average Value:
    • 每笔交易的平均比特币金额。示例值“1.4435516026 BTC”。
  • Median Value:
    • 区块中交易金额的中位数,代表交易金额的中心趋势。示例值“0.00090795 BTC”。

输入输出数据
  • Input Value:
    • 所有交易的输入金额总和。示例值“4,759.44 BTC”。
  • Output Value:
    • 所有交易的输出金额总和。示例值“4,762.56 BTC”。
  • Transactions:
    • 该区块中包含的交易总数。示例值“3,297”表示有 3,297 笔交易。
  • Witness Tx’s:
    • 使用隔离见证(Segregated Witness)的交易数量。示例值“3,126”。
  • Inputs:
    • 区块中所有交易的输入数量总和。示例值“7,267”。
  • Outputs:
    • 区块中所有交易的输出数量总和。示例值“12,212”。

手续费和奖励
  • Fees:
    • 该区块中所有交易的总手续费。示例值“0.04971394 BTC”。
  • Fees Kb:
    • 每千字节数据的手续费平均值。示例值“0.0000324 BTC”。
  • Fees kWU:
    • 每千权重单位的手续费平均值。示例值“0.0000124 BTC”。
  • Minted:
    • 该区块中新生成的比特币数量。示例值“3.13 BTC”。
  • Reward:
    • 矿工获得的总奖励,包括新生成的比特币和交易手续费。示例值“3.17471394 BTC”。

区块技术信息
  • Depth:
    • 当前区块到最新区块的深度,1 表示这是最新区块。
  • Size:
    • 区块的物理大小,单位为字节。示例值“1,533,301”。
  • Version:
    • 区块的版本号,表示所使用的区块验证规则。示例值“0x30cd6000”。
  • Merkle Root:
    • 区块中所有交易的默克尔树根哈希值,用于验证交易的完整性。
  • Difficulty:
    • 挖出该区块的挖矿难度,代表当前网络的计算强度。示例值“110,451,907,374,649.52”。
      难度的意思:
      Difficulty(难度) 是一个用于衡量区块链网络挖矿难度的指标。具体来说,它指的是在区块链上找到一个有效的区块所需的计算工作量。难度值越高,表示挖掘新区块的难度越大。
      1. 挖矿过程:
          • 挖矿是通过计算来解决复杂的数学问题,以验证和记录交易。矿工们使用算力计算哈希值,目标是找到一个低于特定目标值的哈希值。
      1. 难度的计算:
          • 比特币网络每 2016 个区块(约每两周)会调整一次挖矿难度,以维持平均每 10 分钟生成一个新区块的速度。如果过去的区块产生速度过快,难度将提高;如果产生速度过慢,难度将降低。
      1. 示例值:
  • Nonce:
    • 矿工为找到满足条件的哈希值而调整的随机数。示例值“2,712,409,433”。
      注意,difficult和target都是网络协议机制自动计算并调整的,最终结果就是让整个系统差不多10分钟可以找到一个nonce,直观找到nonce即挖矿步骤
      1. 矿工收集交易: 矿工收集网络中的交易,将它们打包成一个区块。
      1. 构建区块头: 矿工构建区块,包括区块版本号、前一个区块的哈希、Merkle 根、时间戳、难度目标以及 nonce。
      1. 哈希计算: 矿工使用 SHA-256 哈希算法对区块头进行哈希计算。目标是找到一个哈希值低于当前难度目标的值。
      1. 调整 nonce: 如果没有找到有效哈希,矿工会尝试改变 nonce 的值,从 0 开始逐渐增加,每次重新计算哈希。
      1. 难度的适应: 如果在尝试完所有 nonce 值后还是没有找到有效哈希,矿工可以考虑更新时间戳或其他区块头信息,重新计算哈希。
      1. 成功发现: 一旦矿工找到了有效哈希,他们会将新挖掘的区块广播到网络,其他节点会验证该区块和其交易的有效性,然后将其添加到自己的区块链中。
  • Bits:
    • 当前挖矿难度的紧凑表示形式。示例值“386,042,977”。
  • Weight:
    • 区块的权重单位(WU),比特币采用 SegWit 后的度量标准。示例值“3,997,858 WU”。
      权重,隔离认证
      1. 隔离见证(Segregated Witness)
      背景:
      • 比特币网络在初期,交易的每一部分(包括输入、输出、签名等)都被放在一起存储,这种设计虽然直观,但会带来一些问题:
          1. 交易延展性问题:签名可以被修改,导致交易 ID 发生变化。
          1. 扩展性问题:区块大小被限制为 1 MB,网络处理能力有限。
      解决方案:
      隔离见证(SegWit)于 2017 年通过比特币改进提案 BIP-141 引入,它的核心思想是将交易数据中的签名(也叫“见证”部分)从主区块数据中分离出来:
      • 原始交易部分(Transaction Data):包含输入、输出等核心内容。
      • 见证数据(Witness Data):存储签名信息。
      通过隔离见证:
      • 签名被移到区块数据的单独部分,不再影响交易 ID,从而解决了交易延展性问题。
      • 区块的数据结构更高效,容纳更多交易,提升了扩展能力。

      2. 权重(Weight)和权重单位(WU)
      背景:
      为了提升区块存储和验证效率,比特币引入了新的区块大小度量方式——权重(Weight)。
      权重的定义:
      权重是一个综合指标,衡量区块中数据的大小和相对重要性。区块的权重通过以下公式计算:
      权重(该公式存疑后续修改)
       
      • Base Size:区块的基本大小,不包括见证数据。
      • Total Size:区块的总大小,包括见证数据。最大权重限制:
      • 传统区块大小限制为 1 MB。
      • SegWit 引入后,最大权重限制为 4,000,000 权重单位(WU)
      • 因为见证数据被赋予较低的权重(1/4),这相当于“逻辑上”将区块容量从 1 MB 扩展到了 4 MB。
      权重单位(WU):
      权重单位是衡量区块大小的单位:
      • 1 字节的基本数据(不包括见证数据)= 4 WU
      • 1 字节的见证数据 = 1 WU
      通过这种方式,见证数据的权重被降低,有效增加了可用容量。

      3. 见证数据(Witness Data)
      • 见证数据是交易的签名部分,用于验证交易的合法性。
      • 见证数据包括:交易输入的签名(Signature)、公钥等内容。
      为什么单独分离?
      • 解决交易延展性问题:将签名从交易主体分离,避免签名被篡改后影响交易 ID。
      • 提升区块效率:见证数据的权重较低,能够增加区块中的交易数量。


区块链时间和高度
  • Mined on:
    • 区块被挖出的时间。示例值“2025年1月22日 09:22:27”。
  • Height:
    • 区块的高度,表示它在区块链中的位置。示例值“880,277”。
  • Confirmations:
    • 确认次数,直接理解就是从该区块生成后,后续添加到区块链上的区块数。示例值“1”表示还没有更多区块确认。

交易费用
  • Fee Range:
    • 该区块内交易的手续费范围,单位为 sat/vByte(聪每字节)。示例值“1-340”。
  • Average Fee:
    • 区块内交易的平均手续费。示例值“0.00001508 BTC”。
  • Median Fee:
    • 区块内交易手续费的中位数。示例值“0.00000804 BTC”。

矿工信息
  • Miner: 挖出该区块的矿工或矿池信息。如果是“Unknown”,表示矿工身份未标明。

补充一下,比特币区块链中的每个区块只包含一些特定的核心信息,但是区块链浏览器还会显示的许多根据这些核心信息计算、分析或归纳得来的,以便于用户理解和浏览。所以该网站显示的一些信息比如当前区块的depth信息会随着时间变动,别疑惑,以为这个信息是网站为了用户体验给的,并不包括在区块中,区块一旦打包完成,就绝对不会发生任何改变
区块本身必带的核心信息是下面这些:
  • 区块头信息(Block Header):
    • Hash: 区块头的哈希值,用于唯一标识该区块。
    • Merkle Root: 区块中所有交易的默克尔树根哈希,用于快速验证交易完整性。
    • Version: 区块的版本号,指示该区块使用的规则集。
    • Previous Block Hash: 上一个区块的哈希值,保证链条的顺序性。
    • Timestamp: 区块被创建的时间戳。
    • Difficulty Target (Bits): 该区块的挖矿难度目标。
    • Nonce: 用于找到有效区块哈希值的随机数。
  • 区块体信息(Block Body):
    • Transactions: 区块中包含的所有交易列表,包括输入(Inputs)和输出(Outputs)的详细信息。
      • 每笔交易记录中包含:输入(来源)、输出(接收方)、金额、签名等。
  • 区块大小
    • Size: 区块的实际大小(以字节为单位),从头到尾包含的所有数据。

区块链体系的安全性(双重支付攻击和自私矿工几乎不可能成功)

在区块链网络中,双重支付攻击(Double-Spending)自私矿工(Selfish Mining) 是两种潜在的攻击方式,尽管这两种攻击方式在理论上是可能的,但实际上很难实施,并且承担着极高的风险(两种攻击方式都要冒着挖出的块被废掉的风险,即损失高额的出块奖励,但凡有点理智,赚出块奖励稳稳的),简而言之除非拥有全网51%以上的算力否则几乎不可能成功(因为要超过其余所有人的算力,自然是至少51%)
  1. 双重支付攻击(Double-Spending)
双重支付攻击指的是攻击者试图使用同一笔资金进行两次支付,达到欺诈目的。在去中心化的加密货币系统中,由于交易验证的延迟或网络问题,理论上攻击者可以在不同的交易中使用相同的加密货币进行支付。
实施方式:
  • 攻击者创建两笔交易,每笔交易使用同一笔资金(例如,向商家支付一笔款项并向其他地址支付相同的款项)。
  • 在理想情况下,攻击者希望这两笔交易能够在网络中独立传播,并让商家或接受方无法及时确认交易的有效性。
  • 如果区块链系统中某一部分节点接收到并确认了第一笔交易,而另一部分节点则确认了第二笔交易,那么就会发生双重支付。
难点:
  • 区块链的共识机制:比特币和许多加密货币依赖于 工作量证明(PoW)权益证明(PoS) 等共识机制来确保每个交易都被正确记录。攻击者需要控制相当多的计算能力,才能改变历史区块链中的交易记录。
  • 不可变性和确认:每笔交易都需要通过多个区块的确认才能被视为“安全”。如果商家等待足够的确认(通常为6次确认),即使攻击者试图通过重新广播未确认的交易,也无法改变已经确认的交易。
  • 矿工和节点的分布式验证:区块链网络由成千上万的分布式节点组成,攻击者很难操控大部分节点来产生冲突交易。
  1. 自私矿工(Selfish Mining)
自私矿工攻击是指矿工通过不立即广播他们发现的区块,而是保持这些区块的私密性,直到他们发现下一个区块,然后一起广播这两个区块。通过这种方式,攻击者试图延迟其他矿工的工作,从而获得更多的奖励。
实施方式:
  • 发现区块后,矿工不立即广播,而是继续挖掘下一个区块。攻击者等待在自己的私有链上挖到多个区块。
  • 当攻击者拥有更长的私有链时,他们会向网络广播其私有链。由于比特币网络遵循最长链规则,其他矿工会放弃他们的区块,并转而追随攻击者广播的链。
  • 这种策略可以让攻击者有效地消耗其他矿工的工作量,从而获得更多的奖励。
难点:
  • 时间和风险:自私矿工攻击需要矿工非常及时和精准地操作,并且在很长时间内保持自己的私有链。如果矿工过早地广播区块,攻击就会失败。如果私有链无法在短时间内赶超网络上已有的最长链,攻击者将面临极高的风险。
  • 算力资源需求:为了成功实施自私矿工攻击,攻击者需要持续保持超过50%的网络算力,否则他们的私有链很可能会被其他矿工的区块超越。控制大规模算力非常昂贵且困难。

BTC-网络

比特币网络是一个分布式和去中心化的网络
1. 信息传播
比特币网络使用点对点(P2P)技术来传播信息。这种传播机制确保没有中心服务器或单一故障点,所有节点(矿工和用户)都是网络的一部分。
  • 节点(Nodes):
    • 节点是比特币网络的重要组成部分,负责存储区块链副本,并转发交易和区块信息。
    • 节点分为全节点和轻节点(SPV节点)。全节点存储和验证完整的区块链,而轻节点则依赖全节点来确认交易。
  • 信息传播流程:
    • 当用户发起一笔交易时,交易信息首先广播到网络中的其他节点。
    • 节点接收到交易后,验证其有效性(如确认输入是否有效、签名是否正确等),然后将其传播给其他节点。
    • 经过验证的交易会被加入到待处理的交易池(mempool)中,矿工从中选择交易进行打包。
2. 应用层协议
  • 比特币协议:
    • 比特币网络使用一种称为“比特币协议”(Bitcoin Protocol)的执行标准。协议定义了节点之间如何交换信息,包括交易格式、区块头格式、以及节点间的通信方式等。
    • 该协议使用 JSON-RPC(Remote Procedure Call)标准,允许用户通过命令行界面或应用程序接口(API)与比特币节点进行交互。
  • 交易协议:
    • 交易由输入(引用已有的UTXO)和输出(创建新的UTXO)构成。比特币协议定义了如何创建、签署和广播交易。
3. 网络层协议
  • TCP/IP 协议:
    • 比特币网络基于 TCP/IP 协议运行,允许节点通过互联网相互通信。TCP(传输控制协议)确保数据包按顺序到达,而 IP(互联网协议)负责数据传输。
  • P2P 网络:
    • 比特币使用 P2P 技术管理网络拓扑结构,每个节点都维护一个连接池,与其他节点直接通信。节点连接使用“对等”模式,避免了中央服务器的单点故障。
  • 节点发现(Node Discovery):
    • 比特币网络中,节点通过 DNS Seeder(域名服务播种器)发现其他节点。新节点通过 DNS Seeder 获取当前活跃的节点的 IP 地址,然后建立连接。
    • DNS Seeders 是一种用于 P2P 网络(如比特币)中的节点发现服务,帮助新加入的节点找到其他活跃节点进行连接。这种机制是通过 DNS(域名系统)实现的,具体情况如下:
      1. DNS Seeders 的功能
      • 节点发现: DNS Seeders 提供一个列表,包括当前在线的、可连接的节点的 IP 地址。这允许新节点在启动时快速确定能够连接到的其他节点。
      • 简化连接过程: 因为新节点无法立即知道网络中的其他节点,DNS Seeders 给予这些节点一个快速的访问入口。它们可以向 DNS Seeder 发送查询,然后获取节点地址来建立连接。
      2. 所属
      • 维护者: DNS Seeders 通常由社区成员、开发者或特定组织维护。例如,在比特币网络中,可能有多个 DNS Seeder 由不同的开发者或社区成员负责,以确保冗余和可用性。
      • 开放性: 大多数 DNS Seeders 都是公开的,任何人都可以使用它们来发现网络中的节点。它们并非由单一实体控制,而是分散在多个维护者手中,以增强网络的去中心化特性。
      3. 位置
      • 网络服务器: DNS Seeders 通常配置在运行 DNS 服务的网络服务器上。这些服务器可以位于任何地方,并可能由不同的个人或组织拥有和管理。
      • 地理分布: 为了增强可用性和降低延迟,一些 DNS Seeders 可能会在不同的地理位置部署,确保无论用户身在何处,都能快速访问这些服务。

BTC-挖矿难度

在比特币挖矿中,挖矿难度(difficulty)是用来控制新区块生成速度的一个关键参数。
  1. 基本概念
  • 目标值(Target): 这是一个二进制数,与区块头中的哈希值进行比较,用于决定新区块是否有效。目标值越低,找到有效哈希的难度就越大。目标值是由网络根据当前的挖矿条件自动调整的。
  • 难度(Difficulty): 难度是相对值,用于量化挖矿成功找到一个有效区块所需的努力程度。难度的变化会影响矿工需要解决的数学问题的复杂性。
  1. 挖矿难度的计算公式
    1. 挖矿难度通常可以表示为:
  1. difficult_1_target
    1. 在比特币网络中,difficult_1_target 通常设定为一个非常大的数,数值相当于 2 的 224 次方减去 1(共计 256 位的数字,通常以十六进制表示为 )。 difficult_1_target 定义了“难度1”的基准。也就是说,当目标值(target)等于这个 difficult_1_target 时,我们就说挖矿的难度为 1。
target 越小,难度值越大,表明在挖矿时找到有效哈希的难度增加。
  1. 挖矿难度的调整:
    1. 比特币网络大约每两周(2016 个区块)会重新评估挖矿难度,以确保即使网络中的矿工数量和算力发生变化,平均每 10 分钟仍能生成一个新区块。
      难度调整的基本公式
      预期生成的时间就是两周即理想情况下10分钟一个区块,产生2016个区块的时间;难度变化也有范围这是为了防止波动超出范围则取最值,简单来说,范围是[1/4倍旧难度,4倍旧难度],为了直观理解这里都直接用target表示了,target越高难度越低

BTC-挖矿

挖矿的无记忆性
挖矿过程中如果监听到最长合法链增长了新区块,则必须停止现有的挖矿,然后重新在本地组建候选区块重新挖,但是这并不可惜,因为挖矿的过程是memoryless,任何时候挖矿,不管挖了多久,不管是继续挖原来的区块,还是重新挖区块,成功的概率是一样的
在数学和概率论中,这种特性通常与泊松过程等随机过程相关。
数学上的理解:
假设有一个随机过程,每次尝试的成功概率是 p,每次失败的概率是 1 - p。挖矿过程的成功与否取决于是否找到了符合要求的哈希值,且这些尝试是独立的。
泊松过程:
假设矿工每秒钟尝试一次计算,成功的概率p,那么对于每个时间间隔,挖矿过程可以被看作是一个泊松过程(Poisson process),其特征是:
  • 每次挖矿尝试的结果是独立的;
  • 每次尝试成功的概率是固定的。
在这种情况下,记忆性是缺失的:如果矿工已经尝试了100次而未能成功,这些尝试对下一个挖矿尝试的结果没有任何影响。即使他已经尝试了很多次,下一次成功的概率仍然是 p

BTC-脚本

输入脚本和输出脚本

比特币交易通过一种名为 Bitcoin Script 的简易脚本语言来定义和验证交易条件。每笔比特币交易包含两部分主要内容:输入(Inputs):用于引用和花费之前的交易输出。输出(Outputs):定义新的比特币接收者及其支付条件。输入脚本输出脚本是这两部分的核心组成部分,分别用于解锁和锁定比特币。
输出脚本(Output Script,也称为 scriptPubKey
1. 定义
输出脚本是比特币交易中的一段脚本代码,定义了比特币输出的锁定条件。它指定了谁可以花费该输出中的比特币以及如何花费。
2. 作用
  • 锁定比特币:设置条件,使得只有满足这些条件的用户才能花费该输出的比特币。
  • 定义接收者:指定接收比特币的地址或其他条件。
3. 典型结构
输出脚本通常采用以下格式:
最常见的输出脚本类型包括:
a. P2PKH(Pay to Public Key Hash)
这是最常见的输出脚本类型,使用用户的公钥哈希(即比特币地址)作为锁定条件。
脚本结构
解释
  • OP_DUP:复制栈顶部的元素。
  • OP_HASH160:对公钥进行哈希(SHA-256 后取前160位)。
  • <PubKeyHash>:接收者的公钥哈希。
  • OP_EQUALVERIFY:验证两个栈顶元素是否相等,若不等则交易失败。
  • OP_CHECKSIG:验证签名是否有效。
流程
  1. 把接收者的公钥哈希嵌入脚本中。
  1. 只有持有对应私钥的用户,能够提供有效的签名和公钥,从而解锁并花费该输出。
b. P2SH(Pay to Script Hash)
允许将更复杂的脚本条件隐藏在哈希值中,使得输出更加灵活。
脚本结构
解释
  • OP_HASH160:对赎回脚本进行哈希。
  • <ScriptHash>:赎回脚本的哈希值。
  • OP_EQUAL:验证两个栈顶元素是否相等。
流程
  1. 创建一个赎回脚本,定义复杂的支付条件(例如多重签名)。
  1. 对赎回脚本进行哈希,生成 ScriptHash
  1. 输出脚本中嵌入 ScriptHash
  1. 花费时,提供赎回脚本和满足其条件的数据。
c. OP_RETURN
用于在区块链上嵌入不可花费的数据。
脚本结构
解释
  • OP_RETURN:标识该输出为数据存储类型。
  • <数据>:要存储的任意数据,通常限制在80字节以内。
特点
  • 不可花费:包含 OP_RETURN 的输出无法被花费,等同于“销毁”比特币。
  • 数据存储:用于记录元数据、消息、代币发行等。
4. 应用场景
  • 普通支付:使用 P2PKH 脚本,将比特币发送到特定地址。
  • 复杂支付条件:使用 P2SH 脚本,实现多重签名、时间锁定等复杂条件。
  • 数据存储与智能合约:使用 OP_RETURN 脚本,在区块链上嵌入数据,实现简单的智能合约功能。
输入脚本(Input Script,也称为 scriptSig
1. 定义
输入脚本是比特币交易中的一段脚本代码,用于解锁和花费之前交易的输出。它提供了满足之前输出脚本中锁定条件的必要数据。
2. 作用
  • 解锁比特币:提供必要的数据(如签名、公钥)来满足之前输出脚本设定的条件。
  • 授权花费:证明交易发起者有权花费这些比特币。
3. 典型结构
输入脚本通常采用以下格式:
最常见的输入脚本类型包括:
a. P2PKH 输入脚本
针对 P2PKH 输出脚本,输入脚本需要提供有效的签名和对应的公钥。
脚本结构
解释
  • <Signature>:对交易数据的签名,证明拥有对应私钥。
  • <PublicKey>:用于验证签名的公钥,需与输出脚本中的公钥哈希相匹配。
流程
  1. 提供签名和公钥。
  1. 验证公钥哈希是否匹配输出脚本中的 <PubKeyHash>
  1. 验证签名是否有效。
b. P2SH 输入脚本
针对 P2SH 输出脚本,输入脚本需要提供满足赎回脚本条件的数据和赎回脚本本身。
脚本结构
解释
  • <满足赎回条件的数据>:根据赎回脚本的要求提供的数据,例如多签名中的签名。
  • <Redeem Script>:原始定义支付条件的脚本,用于与输出脚本中的哈希值进行匹配和验证。
流程
  1. 提供满足赎回脚本条件的数据(如签名)。
  1. 提供赎回脚本。
  1. 验证赎回脚本的哈希值是否与输出脚本中的 <ScriptHash> 相匹配。
  1. 执行赎回脚本,验证提供的数据是否满足条件。
c. OP_RETURN 输入脚本
一般情况下,OP_RETURN 输出脚本不需要输入脚本,因为这些输出是不可花费的。
4. 应用场景
  • 普通支付:使用 P2PKH 输入脚本,提供签名和公钥来解锁比特币。
  • 复杂支付:使用 P2SH 输入脚本,提供满足赎回脚本条件的数据和赎回脚本本身。
  • 多重签名:在输入脚本中提供多个签名来满足多签名赎回脚本的要求。
输入脚本与输出脚本的交互过程
1. 交易创建与输出
当用户 A 想向用户 B 发送比特币时,A 创建一个交易,包含一个或多个输出。每个输出定义了接收的比特币数量和锁定条件(即输出脚本)。
示例
User A 向 User B 发送 1 BTC:
  • 输出脚本
    2. 交易确认与存储
    该交易被比特币网络验证并打包进区块链,成为一个未花费的交易输出(UTXO)。这时,输出脚本锁定了 1 BTC,只有满足脚本条件的用户才能花费。
    3. 未来的交易与输入脚本
    当 User B 想要花费这 1 BTC 时,他需要创建一个新的交易,引用之前的输出作为输入,并提供满足输出脚本条件的输入脚本。
    步骤
    1. 引用之前的输出:新交易的输入引用 User A 发送给 User B 的那笔输出(通过交易 ID 和输出索引)。
    1. 提供输入脚本:User B 在输入脚本中提供签名和公钥,满足之前输出脚本的条件。
    1. 定义新的输出:新交易中定义比特币的接收者及其锁定条件。
    示例
    User B 向 User C 发送 0.5 BTC:
    • 输入脚本
      • 输出脚本
        4. 验证与执行
        比特币网络验证新交易时,会执行以下步骤:
        1. 执行输入脚本:解锁条件,提供签名和公钥。
        1. 执行输出脚本:锁定条件,验证公钥哈希是否匹配,验证签名是否有效。
        如果所有条件满足,交易被确认,1 BTC 的所有权从 User B 转移到 User C。
        具体示例分析
        1. 创建交易输出(User A 向 User B 发送比特币)
        输出脚本
        • 7c076ff316cb4a4dac2edc8a3f06e6b05c3f12ea 是 User B 的公钥哈希。
        解释
        • 只有拥有私钥对应于该公钥哈希的用户,才能花费这笔比特币。
        2. 花费交易输出(User B 向 User C 发送比特币)
        输入脚本
        • 3045022100dff1...022100f8ce... 是 User B 对交易数据的签名。
        • <User B 的公钥> 是 User B 的公钥,用于验证签名。
        输出脚本
        • 3a3b2c1d4e5f6g7h8i9j0a1b2c3d4e5f6g7h8i9j 是 User C 的公钥哈希。
        验证过程
        1. 执行输入脚本
            • 提供签名和公钥。
            • 将公钥进行哈希,与输出脚本中的公钥哈希进行比对。
            • 验证签名是否有效。
        1. 执行输出脚本
            • 确认提供的公钥哈希与输出脚本中的哈希一致。
            • 验证签名有效后,允许花费。
        结果
        • 比特币从 User B 转移到 User C。
         
        op_return可以销毁比特币
        OP_RETURN 是比特币脚本中的一个特殊操作码,允许用户在交易中嵌入不可花费的数据。通过使用 OP_RETURN,可以实现 “销毁” 比特币;当创建包含 OP_RETURN 的交易时,指定的比特币数量会被发送到该输出,但由于设置了 OP_RETURN,这些比特币会变得不可用。
        根据前面讲的,输入脚本是用于解锁之前的输出的,面对OP_RETURN
        1. 没有可解锁的条件
            • OP_RETURN 的输出脚本不是设计用来被解锁的。任何后续输入脚本都没有与之匹配的条件,因为 OP_RETURN 本身并不定义一个允许花费的条件。
            • 输入脚本的内容(例如签名、公钥)在解锁 OP_RETURN 输出时是完全无效的,因为输出脚本没有要求验证的公钥哈希,也没有签名等条件。
        1. 比特币脚本执行
            • 在比特币脚本执行过程中,包含 OP_RETURN 的输出被立即视为“销毁”的比特币。网络中的节点在验证交易时只会检查其存在性,而不会尝试解锁它。
        可以把 OP_RETURN 的机制想象成在比特币网络中加入一种特殊的输出类型,具有如下特性:
        • 禁止消费:一旦某个输出设置成 OP_RETURN,这表示这些比特币的一切消费权利已经被放弃,即使通过提供签名、公钥等传统方式也无法再次获取这些比特币。
        • 目的:这种设计让用户可以在区块链中存储自定义喜欢的信息(不再与比特币相关联),同时还能减轻全网的存储负担。因为可以选择不存储这些不可用输出的具体信息。

        比特币交易数据

        随意给出一个交易的json数据,数据内容如下
        这笔交易的主要内容是将比特币从地址 1Kr6QSydW9bFQG1mXiPNNu6WpJGmUa9i1g 转移到两个不同的地址,分别是 3E6A5SL5vkP34ww6i1gHAxnkes1XZaXSD61Kr6QSydW9bFQG1mXiPNNu6WpJGmUa9i1g。其中一部分金额(264642 satoshis)尚未被花费,而剩余的金额(20642350538 satoshis)已经被花费到其他交易中。各个字段的意思如下:
        交易基本信息
        • txid:交易 ID (f6ee6eca2a96d8039ad8e07fa776040de7b23a798206053845e6157a81478f89)
          • 这是交易的唯一标识符,用于标识这笔交易。
        • size:交易大小(223 字节)
          • 交易在区块链中占用的字节数。大小与交易的输入输出数量及其它数据有关。
        • version:交易版本(2)
          • 表示交易数据格式的版本。
        • locktime:锁定时间(0)
          • 锁定时间为 0 表示这笔交易可以立即被处理,不会延迟。
        • fee:交易手续费(1358 satoshis)
          • 这是交易发起者支付给矿工的费用,通常用于激励矿工处理交易。
        输入(Inputs)
        交易的输入部分包含了该交易所引用的上一笔交易的输出。输入信息指示从哪些比特币地址获取资金,以及如何授权(通过签名)来进行支出。
        • coinbase:是否为 Coinbase 交易(false)
          • 这表示该输入并不是一个新区块生成的交易。Coinbase 交易通常是矿工生成的第一笔交易。
        • txid:上一笔交易的交易 ID(cbde256f366df87627c5761876a10e534d089bd34811c206c30e612bc8530544
          • 这表示该输入引用的是上一笔交易的某个输出。
        • output:上一笔交易的输出索引(1)
          • 这是指向上一笔交易输出的位置,输出索引从 0 开始。
        • sigscript:签名脚本(47304402206f2090f9a61bbac2b11845a990486095c7e6c0e1334450e93d75ed3e8b0b6a4e0220688d40d34a044c6cbb9764cf2dc291f763d8e41077a78ca0ccec27134bcca787012103786af4b32017ec640dba2d2a7e1fd5aa4a231a658e4cbc114d51c031576e19bc
          • 这是交易发起者对交易的签名,用来证明其拥有用于支付的私钥。
        • sequence:序列号(4294967293)
          • 通常用于 RBF(Replace-by-Fee)交易的处理,控制交易的执行顺序。在没有 RBF 的情况下,它基本上不影响交易。
            RBF 机制允许你在一笔交易发布后,如果该交易尚未被矿工打包进区块,可以 通过增加交易手续费“替换” 原先的交易,使其更容易被矿工优先处理。
            过程:
            1. RBF交易的创建
                • 当你发起一笔交易时,你可以选择启用 RBF。启用 RBF 后,交易会被标记为可以被替换,即使它已经广播到比特币网络,但尚未被确认(即未被打包进区块)。
                • 在交易中,标记了 RBF 的交易通常会有一个特殊的字段,标记该交易为“可替代”的。
            1. RBF的替换机制
                • 一旦这笔交易在网络中传播,矿工会查看交易的手续费和优先级。如果你的交易没有被矿工选择打包(可能是因为手续费较低),你可以发起一个 新的交易,这个新交易引用的是同样的输入(即原交易的输出),但它提供更高的手续费。
                • 新交易的手续费更高,因此矿工更有动力处理这笔交易。新交易的手续费越高,它就越可能被优先打包进区块。
            1. 原交易的替代
                • 一旦新的交易被矿工接受,它就会替代原来的交易。这意味着原来的交易会被“淘汰”,不再被打包进区块。新的交易将以更高的手续费被矿工优先选择。
        • pkscript:公钥脚本(76a914cebb2851a9c7cfe2582c12ecaf7f3ff4383d1dc088ac
          • 这是一个用于验证输出的脚本,包含了发送者的公钥和相关的加密信息。
        • value:输入的金额(20642616538 satoshis)
          • 这是这笔交易输入的金额,单位是 satoshi(1 BTC = 10^8 satoshis)。
        • address:输入的来源地址(1Kr6QSydW9bFQG1mXiPNNu6WpJGmUa9i1g
          • 这是提供比特币的地址。
        • witness:见证数据(空数组 []
          • 在此交易中未使用 SegWit(见证交易),因此该字段为空。
        输出(Outputs)
        输出部分描述了这笔交易将比特币发送到哪些地址以及发送的数量。
        • address:接收比特币的地址
          • 第一笔输出地址:3E6A5SL5vkP34ww6i1gHAxnkes1XZaXSD6
          • 第二笔输出地址:1Kr6QSydW9bFQG1mXiPNNu6WpJGmUa9i1g
        • pkscript:公钥脚本,指定接收者地址的验证规则
          • 第一笔输出:a9148801e1f19845fb8aa47958cf92b2830cfdc7f3cd87
          • 第二笔输出:76a914cebb2851a9c7cfe2582c12ecaf7f3ff4383d1dc088ac
        • value:发送到每个地址的金额(单位:satoshis)
          • 第一笔输出金额:264642 satoshis
          • 第二笔输出金额:20642350538 satoshis
        • spent:是否已花费(falsetrue
          • 第一笔输出:未花费(false),表示这笔比特币还没有被花费。
          • 第二笔输出:已花费(true),表示这笔比特币已经被另一个交易使用。
        • spender:如果已花费,提供消费交易的 ID 和输入索引
          • 第二笔输出的 spender:提供了消费该输出的交易 ID 0e8920a026930f4172ecc337702e527661156b95877540147dd45ba85b55295d
        区块信息
        • block
          • height:区块高度(880413)
            • 这是该交易所在区块链中的位置(区块链中的区块编号)。
          • position:区块中的位置(108)
            • 表示该交易在区块中的位置索引。
        其他信息
        • deleted:交易是否已删除(false
          • 该字段表示交易没有被删除。
        • time:交易的时间戳(1737583780
          • 表示交易的时间,单位为 UNIX 时间戳。
        • rbf:是否为可替代费用(false
          • 这表示该交易不支持 RBF,即不能通过支付更高的手续费来替换该交易。
        • weight:交易的重量(892)
          • 这是比特币交易的一个度量标准,表示交易占用的区块大小。

         

        多重签名

        多重签名Multisignature,简称 multisig)是比特币协议中的一个强大的功能,它允许在比特币交易中使用多个签名来授权某个操作。多重签名要求多个密钥的签名才能完成一笔交易,从而提供更高的安全性和灵活性。
        原理:
        假设有 3 个密钥(K1, K2, K3),并且要求至少 2 个密钥 来签署并批准交易。这样就构成了一个 2-of-3 多重签名2-of-3 multisig)的模型。这意味着:
        • K1, K2, K3 都有独立的私钥。
        • 任何两个人(持有 K1, K2 或 K3)签署交易,交易才会生效。
        如何创建多重签名地址:
        1. 生成公钥:首先,所有签名者各自生成自己的公钥(而不是直接用私钥)。例如,签名者 A、B 和 C 各自拥有公钥 P_A, P_B, P_C
        1. 组合公钥:然后,所有参与者的公钥会一起组合成一个 多重签名地址。例如,假设我们使用 2-of-3 签名模型,则会生成一个地址,表示需要至少两个公钥的签名来完成交易。
        1. 脚本化输出:比特币的交易输出(Output)会使用特殊的脚本语言(Script)来表示这一多重签名要求。对于 2-of-3 的多重签名,其脚本(P2SH)将包含一个指定的条件:交易必须由至少两个签名者签署。
        1. 交易签名:当你发起交易时,必须满足多重签名条件,才能成功地将比特币转移到其他地址。这些签名会包含在交易的 输入 部分,并通过每个签名者的私钥签署。
        比特币多重签名地址示例:
        一个典型的 2-of-3 多重签名地址 的脚本结构类似于下面的示例:
        • 2 表示需要两个签名。
        • <P_A> <P_B> <P_C> 是三个参与签名的公钥。
        • 3 表示地址可以由最多三个公钥中的任意两个签署。
        • OP_CHECKMULTISIG 是比特币的脚本操作符,用于验证多重签名的有效性。
        多重签名的实际用途:
        1. 增加安全性
            • 使用多重签名可以减少因单一私钥泄露导致资金丢失的风险。例如,一个企业钱包可以设置成 3-of-5 签名,意味着只有当至少三位管理人员签署交易时,资金才会被转移,这样即使某个签名者的私钥被盗,资金也不会轻易丢失。
        1. 保险机制
            • 多重签名可以作为保险的一种形式。例如,在一个团队或公司中,可以通过设置 2-of-3 签名,保证在两个或以上的人同意的情况下,资金才会被转移,避免个人滥用资金。
        1. 联合钱包
            • 多重签名常用于 “联合钱包” 或者“合作钱包”中,在这种钱包中,多个签名者共同控制一个钱包的资金。例如,一个家庭的多个成员可能都需要参与确认资金转移,或者两个合作伙伴都需要批准资金的转移。
        1. 智能合约
            • 多重签名也可以与其他智能合约结合使用。比如,可以设置一个多签的条件,当满足某个特定的条件时,才需要执行特定的交易。
        1. 冷存储和热存储的结合
            • 多重签名地址可用于结合使用“热钱包”和“冷钱包”。例如,一个冷钱包用来存储长期资金,只有当需要用到这笔资金时,热钱包中的私钥才能参与签署交易,从而确保资金的安全。
        创建多重签名地址的示例(Python):
        假设我们需要创建一个 2-of-3 多重签名地址,我们可以使用 bitcoinlibbitcoin 等库来实现。
        使用 bitcoinlib(一个 Python 库)的示例:
        多重签名交易流程:
        1. 生成多重签名地址:如上所示,使用至少两个签名者的公钥创建一个多重签名地址。
        1. 发起交易:某个签名者发起交易并生成原始交易。
        1. 收集签名:所有需要签名的参与者用自己的私钥签署这笔交易。
        1. 广播交易:交易签名完成后,广播到比特币网络。交易会被矿工验证,确保所有签名者的签名是有效的。
        1. 交易确认:矿工确认交易后,它将被打包到区块中,完成确认。

        利用比特币区块链记录数据

        如果某个交易输出,其锁定脚本以OP_RETURN操作码开头:
        我们称这是一个数据记录输出(Data Recording Output),这笔交易也被称为 OP_RETURN 交易,或 Null Data 交易。
        1. OP_RETURN 的定义
        • OP_RETURN 是比特币脚本的一种操作码,其作用是允许用户在交易输出中嵌入数据。该操作码的使用使得输出不再是一种可消费的比特币,而是表示一条数据。通常,在这样的输出中,不可使用这些比特币。这也意味着比特币被销毁了;因为你的utxo会减少,但是并不会有其他人拥有你少的这部分utxo,这部分比特币永久无法使用(等于被销毁)
        2. OP_RETURN 的使用目的
        • 数据存储: 通过 OP_RETURN,用户可以在区块链上存储小段的数据。这通常用于标记、记录或存储与该交易相关的信息,例如智能合约的状态、身份识别信息、文档指纹等。
        3. 特点和限制
        • 不可消费: 标记为 OP_RETURN 的输出是不可消费的,即无法被后续的交易使用。这意味着这些比特币不会被转回到系统中。也意味着这笔交易并不会占用utxo的空间,因为矿工知道这笔交易的比特币永远不可能使用,自然就不会将其写入utxo集合中浪费空间;
        这种方式更现实的意义是利用区块链不可篡改的作用,来记录重要信息,比如把自己的专利加上作者时间戳等信息,取哈希值写入其中,可以保证专利的所有权且不被篡改;或者加一些其他各种信息,比如有人在里面加入表白信息
        (该交易id为b17a027a8f7ae0db4ddbaa58927d0f254e97fce63b7e57e8e50957d3dad2e66e可以自己查看):
        notion image

        BTC-分叉

        在比特币(BTC)区块链中,硬分叉(Hard Fork) 和软分叉(Soft Fork) 是两种常见的协议升级方式。它们用于引入新的功能、修复漏洞或优化网络性能;硬分叉是一种不向后兼容的协议升级,必须所有节点同时更新软件,以确保整个网络保持一致,否则将导致永久分叉和双重货币的出现。软分叉是一种向后兼容的协议升级,只需大多数算力(如矿工)更新软件即可确保网络一致性,未更新的节点不会阻碍网络的正常运行,也不会导致永久分叉。

        硬分叉(Hard Fork)

        硬分叉是对比特币协议的一种不向下兼容的重大更改。这意味着新规则与旧规则不兼容,旧版本的节点无法识别或接受新版本的区块和交易。
        特征
        • 不兼容性: 新旧协议之间存在不兼容性,如果部分节点不升级,将无法与升级后的网络正常交互。
        • 永久分叉的风险: 如果网络中的一部分节点继续运行旧版本软件,而另一部分节点升级到新版本,区块链将永久分裂成两个独立的链:一条遵循旧规则,另一条遵循新规则。
        • 双重货币的产生: 在永久分叉的情况下,原有的比特币和新分叉出的币将并存,形成双重货币体系。比如ETC各ETH
        实例
        比特币历史上几次著名的硬分叉包括:
        • 比特币现金(Bitcoin Cash, BCH): 2017年比特币现金作为硬分叉从比特币主链分裂出来,旨在增加区块大小以提高交易吞吐量。
        • 比特币钻石(Bitcoin Diamond, BCD): 另一种意在改进交易速度和隐私性的硬分叉。
        为什么硬分叉需要所有节点更新软件
        • 一致性维护: 为了确保整个网络对区块链的共识一致,所有节点必须遵循相同的协议规则。如果部分节点不升级,可能会接受不同的区块,导致链的分裂。
        • 避免永久分叉: 若所有节点都更新到新软件,整个网络都遵循同一套规则,避免出现永久分叉的情况。否则,未更新节点将继续按照旧规则运作,形成独立的区块链。

        软分叉(Soft Fork)

        软分叉是对比特币协议的一种向后兼容的更新。新规则限制了某些旧规则,意味着升级后的节点仍能与未升级的节点正常通信,但未升级的节点无法识别或执行新规则下的某些功能。
        特征
        • 向后兼容性: 旧版本的节点依然能够验证并接受新规则下的区块(尽管它们可能无法完全理解新的功能)。
        • 无需全部节点更新: 只需大多数网络算力(即大多数矿工)遵循新规则,即可确保网络整体一致。
        • 安全性较高: 因为新规则是对旧规则的限制,链的安全性不会因为少数节点未升级而受到威胁。
        实例
        比特币社区中的著名软分叉包括:
        • 隔离见证(SegWit): 2017年实施的软分叉,旨在解决交易的扩展性问题,通过分离签名数据来增加区块的有效容量。
        • BIP66 和 BIP141: 其他一些针对比特币协议的软分叉提案,也用于提高网络性能和安全性。
        为何软分叉只需大多数算力更新软件即可避免永久分叉
        • 多数算力的支持: 当超过50%的算力遵循新规则,新的区块将主要由遵循新规则的节点生成。未遵循新规则的节点生成的区块由于不符合新规则,将被网络中遵循新规则的节点拒绝。
        • 链的主导权: 因为大多数算力支持新规则,整个网络将朝向支持新规则的链发展,未升级节点的链将变得次要或孤立,不会形成永久分叉。
        • 兼容性处理: 旧节点在接收到新规则下的区块时,虽然不能完全理解其中的新规则,但还是可以验证区块的基本有效性,只要这些区块也符合旧规则的基本要求。

        BTC-匿名性

        任何加密货币,即使是零币零钞,数学原理设计再完美,但是只要和现实世界产生交互,就必然泄露隐私只看是否有;比如比特币,即总有手段知道某人拥有某些地址,拥有多少比特币(即使不知道私钥,但是如果物理上能找到人,那所谓的匿名加密隐私就没有意义了)

        零知识证明

        零知识证明是指一方(证明者)向另一方(验证者)证明一个陈述是正确的,而无需透露除该陈述是正确的外的任何信息。
        零知识证明的基础是同态隐藏
        1. 如果x,y不同,那么它们的加密函数值E(x)和E(y)也不相同。
        1. 给定E(x)的值,很难反推出x的值。
        1. 给定E(x)和E(y)的值,我们可以很容易地计算出某些关于x,y的加密函数值。
            • 同态加法:通过E(x)和E(y)计算出E(x+y)的值
            • 同态乘法:通过E(x)和E(y)计算出E(xy)的值
            • 扩展到多项式
        简单版本
        上述例子可以理解为A向B证明自己知道一组数,可以使得,但是并不想让B知道的具体数值是多少;于是A告诉B:的值,根据性质性质3,B可以算出的值,又因为根据性质2,B无法知道的值,这样A就成功向B证明了自己知道知道一组数,可以使得
        上述过程有些缺陷,零只是证明要求无需透露任何正以外的信息,但是上述过程透露了的值,且B有可能暴力反推的值(无法通过反推,但是可以遍历的值,找到对应的,因为根据性质1,是一一对应的;
        更复杂的做法是A先对作随机化处理,但是不变,这样B无论如何也不会知道A知道的到底是哪个
        类似零知识证明的示例还有证明两个富豪间谁有钱,等等
        零币(Zerocoin)和零钞(Zcash)都是与隐私保护和匿名性相关的加密货币,旨在提高交易的隐私性。零币和零钞在协议层就融合了匿名化处理,其匿名属性来自密码学保证。
        零币(Zerocoin)
        1. 定义
            • Zerocoin 是一种旨在增强比特币隐私性的加密货币协议。它最早是在 2013 年提出的,作为比特币的一种扩展。
        1. 隐私特性
            • Zerocoin 通过使用零知识证明(Zero-Knowledge Proof)技术实现交易匿名性。用户可以将其比特币兑换为很难追溯的零币,这些零币即便在交易时也不会暴露任何关于交易者身份的信息。
        1. 工作原理
            • 创建零币的过程涉及将比特币发送到一个特定的地址,从而“消耗”这些比特币,并生成相应数量的零币。用户可以随后将零币换回比特币,但在这个过程中,零币的交易是完全匿名的。
        1. 实现方式
            • Zerocoin 方案可以被集成到比特币网络中,但需要大量的数学计算和复杂的协议,所以其应用并不广泛。
        零钞(Zcash)
        1. 定义
            • Zcash 是一种加密货币,旨在提供比特币所没有的隐私保护。它于 2016 年正式推出,建立在 Zerocoin 概念的基础上。
        1. 隐私特性
            • Zcash 采用 zk-SNARK(Zero-Knowledge Succinct Non-Interactive Argument of Knowledge)技术,能够实现零知识证明,允许用户在不透露任何交易信息的情况下验证交易的合法性。
        1. 交易类型
            • Zcash 支持两种类型的交易:
              • 透明交易(Transparent transactions):类似于比特币的交易,交易的发送者、接收者和金额是公开可见的。
              • 私人交易(Private transactions):使用 zk-SNARK 技术,交易的细节对外是隐蔽的,无法进行追踪。
        1. 工作原理
            • Zcash 的 zk-SNARK 技术允许用户提交一个证明,表明他们知道某个秘密(如交易金额)而不需要向任何人透露这个秘密。这样的设计确保了交易的隐私性与安全性。总
        对比
        1. 零币(Zerocoin)旨在为比特币提供增强的隐私保护,使用零知识证明的原理,但并没有被广泛应用于实际的货币系统。零币系统中存在基础币和零币,通过基础币和零币的来回转换,消除旧地址和新地址的关联性,其原理类似于混币服务
          1. 混币服务(Coin Mixing Service)又称为“混合服务”或“币混合器”,是一种旨在增强加密货币交易隐私的工具。其主要目的是通过将用户的加密货币与其他用户的加密货币混合,从而掩盖交易的来源和去向,保护用户的匿名性和隐私。
            混币服务的基本工作原理通常包括以下几步:
            1. 用户存入资金
                • 用户将其加密货币(如比特币)存入混合服务提供的地址。
            1. 混合过程
                • 混币服务将多个用户的资金进行混合,形成一个大的池。这些资金会与服务提供者持有的其他资金进行混合,增加转换交易的匿名性。
            1. 输出转账
                • 用户选择一定的混合时间后,混币服务会将混合后的金额发送回用户控制的新的地址。这些输出地址通常是用户事先准备好的,以确保生成新的转账地址,从而增加隐私。
            1. 附加步骤
                • 某些混合服务可能提供额外的功能,例如对资金进行分段转账、设定延迟以防止被追踪等。
            混币服务的类型
            • 集中式混币服务:由一个中心化实体提供,用户需要将资金发送到该实体的地址。这些服务通常简单易用,但可能面临信任和安全问题。
            • 去中心化混币服务:使用智能合约技术(例如在以太坊网络上)来进行混合,用户无需信任中心化实体,增加了安全性和匿名性,但需要较高的技术理解。
            优势
            1. 隐私性增强:混币服务可以隐藏资金的来源和去向,保护用户身份和交易隐私。
            1. 匿名交易:用户可以在不公开身份的情况下进行交易,避免被外部机构追踪。
            1. 防止链上分析:混合服务能有效抵御链上分析工具,通过给交易加入“噪声”来提高追踪难度。
            风险
            1. 信任问题:在使用集中式混币服务时,用户需要信任服务提供者,因为他们掌控着用户的资金。
            1. 潜在的资金滥用:如果混币服务被不法分子使用,用户可能无意中与非法活动相关联,导致法律责任。
            1. 费用问题:混合服务通常收取一定费用,以补偿操作成本。
        1. 零钞(Zcash)是一种独立的加密货币,不依赖一种基础币,利用 zk-SNARK 技术实现隐私,支持私人和透明交易,具备实际应用价值和较强的隐私保护层。区块链中只记录交易的存在性和矿工用来验证系统正常运行所需要关键属性的证明。区块链上既不显示交易地址也不显示交易金额,所有交易通过零知识验证的方式进行
        1. Zerocoin 更像是一个理论上的隐私扩展,而 Zcash 则是一个成功实现隐私保护的加密货币,它在保证隐私的同时,仍能进行有效的验证与合规性。

        盲签

        盲签(Blind Signature)是一种密码学技术,它允许用户在不透露信息内容的情况下,对消息进行签名,并且该签名在之后仍然可以被验证。
        • 用户 先对消息进行“盲化”(加密或扰动),然后将盲化后的消息发送给 签名者
        • 签名者 在不知晓原始消息内容的情况下,对盲化消息进行签名,并返回给用户。
        • 用户 之后可以去除盲化操作,得到一个对原始消息有效的签名。
        盲签的应用:
        1. 隐私保护的电子投票:选民可以得到政府或机构的签名,而不泄露其投票内容。
        1. 匿名数字现金(如Chaumian电子现金系统):银行可以签署盲化的交易,确保用户匿名性。
        1. 身份认证系统:可以用于防止身份追踪,提高用户隐私。
        盲签是零知识证明、去中心化身份(DID)等技术的基础之一,在加密货币和隐私保护领域有广泛应用,比如 Zcash、Monero 以及某些比特币隐私协议
        盲签示例(简化版)
        1. 设定基础
        • Alice 有一个消息
        • Bob 使用私钥进行签名,公钥用于验证
        Alice 想要 Bob 签名,但不想让 Bob 看到
        2. Alice 盲化消息
        Alice 生成一个随机数 rr 作为盲因子(相当于加密因子),然后用它对消息进行变换:
        其中 是 Bob 签名算法的模数(如 RSA 的模数)。RSA算法详情
        这个 现在是一个“盲化”的消息,Bob 看到的是它的变形,而不是原始消息。
        3. Bob 签名
        Bob 用他的私钥 对盲化消息 进行签名:
        然后把 发送回 Alice。
        4. Alice 解除盲化
        Alice 用 的逆元 处理签名:
        最终得到的 S 就是对原始消息 M 的有效签名。
        5. 任何人都可以验证签名
        任何人可以使用 Bob 的公钥 pk 来验证:
        如果成立,说明 Bob 确实签名了这个消息。

        现实应用
        • 电子现金:银行签名代币但不知道具体金额(如 David Chaum 电子现金系统)。
        • 隐私投票:选民的投票内容被隐藏,但选票仍然可以被官方验证。
        这个方法确保了 Alice 得到 Bob 的签名,但 Bob 永远不知道自己签名的是什么,使得 Alice 既能获得合法签名,又能保持隐私。
         
         
        数学基础
        1. 模运算(Modulo,取模)是整数运算的一种,表示除法的余数表示 a 除以 n 后的余数
        1. 模逆元(Modular Inverse) 是模 n 下某个数 a 的“倒数”,即找到一个数 x,使得,这意味着 除以 余数是 1。可以使用 扩展欧几里得算法(Extended Euclidean Algorithm, EEA),它可以快速求得 a 在模 n 下的逆元。
        1. 表示“同余”(mod 运算),如果两个整数 aaa 和 bbb 对于某个整数 nnn 来说,它们的余数相同,就写作:
         
         
         

        BTC-完结

        关于安全性

        在比特币系统中,从私钥生成公钥,再从公钥生成地址是两个重要的加密过程,从加密过程中可以窥得安全性
        比特币私钥钥是一个随机生成的256位数字,用私钥生成公钥过程是通过使用椭圆曲线算法(Elliptic Curve Cryptography, ECC),特别是 secp256k1 曲线,来实现的。该过程是通过椭圆曲线乘法实现的。该过程不会损失信息,且公钥并不能反向推导出私钥
        相同的值通过椭圆曲线乘法得到的值是一样的,不同的私钥有几乎为0的概率产生相同的公钥,不足以影响到比特币系统的有效性
        椭圆曲线算法讲解相关视频
        • 公钥通常有两种形式:
          • 未压缩公钥(由 0x04 开头,后面跟两个坐标 x 和 y,总共 65 字节)
          • 压缩公钥(由 0x02 或 0x03 开头,后面跟 x 坐标,长度为 33 字节)
         
        从公钥到地址会损失信息,通过哈希算法比如说SHA-256,任何数据量都会变成256bit,这个过程中损失信息是显然的,实际地址生成的步骤更复杂,如下;可以断定的说,没有任何办法从地址出发,反推出公钥,量子计算机来了也没用
        1. SHA-256 哈希:对公钥进行 SHA-256 哈希运算。
        1. RIPEMD-160 哈希:将 SHA-256 的结果再经过 RIPEMD-160 哈希运算,得到一个160位的哈希值,称为公钥哈希(Public Key Hash,PKH)。
        1. 添加版本前缀:在公钥哈希前添加一个字节(例如,主网地址前缀为 0x00)。
        1. 生成校验和:对包含前缀的公钥哈希进行两次 SHA-256 哈希,取结果的前4个字节作为校验和。
        1. 生成地址:将前缀、公钥哈希及其对应的校验和结合,形成最终的比特币地址,通常使用 Base58Check 编码。
         
        比特币系统中如果只是为了收款的话,是不需要公钥的,只暴露出公钥生成的哈希地址即可,取钱(即转账)的时候才需要公钥,因为交易的时候,系统需要验证你是该地址的所有者。这时就需要使用私钥对交易进行签名,从而确保只有持有相应私钥的人可以支配该地址上的比特币。在签名过程中,公钥用于生成交易的验证数据,以便网络节点能够确认签名是否有效,确保交易的合法性。
        假设有黑客定位到你,实时监控你的交易,从而知道了你的公钥,他要偷你的钱,他就需要立刻从公钥反推出你的私钥,然后产生一个和你竞争的交易(即把你的地址里的钱转移到别的地方),即使是量子计算机也很难几分钟逆推出私钥,且黑客还要抢在你前面发布交易,如果你已经交易完成把账户上的钱取走了,就来不及了;
        这也启示了,为了安全,比特币地址里的钱,如果使用,最好一次性全部用完,且即使是公钥,也最好不要暴露;
        从上述得知,哪怕量子计算机真的出现,且量子计算机还刚好是和现代计算机一样适用于通用任务,从根本上,对比特币系统也构不成威胁而且与其担心比特币系统,不如担心全世界现存传统金融业,毕竟比特币的市值体量,不足现代金融体系的万一
         

        相关课件

         
        上一篇
        建立自己的wordpress网站并nginx反向代理绑定域名签发证书
        下一篇
        lobechat数据库版服务端部署

        评论
        Loading...