2025-08-14
个人对 Bitcoin-Whitepaper 的一些理解
在互联网贸易中,双方都需要一个值得信任的第三方机构来处理支付,并且完全不可撤销的交易是不存在的(为了解决无法避免的欺诈问题),卖家和买家都互相警惕且要为此付出额外的代价。
比特币的诞生就是为了处理这个问题,我们需要一个基于密码学原理而非信任的电子支付系统,使得双方都能在无信任且无第三方机构的情况下直接进行交易,同时也避免了中心化的第三方机构从中抽成以及该机构权力过大所带来的各种风险,如银行封号,冻结账户等。并且该系统的交易也无法撤销,这将保护卖家不被欺诈,而买家则通过程序化合约保护。
“We define an electronic coin as a chain of digital signatures. Each owner transfers the coin to the next by digitally signing a hash of the previous transaction and the public key of the next owner and adding these to the end of the coin. A payee can verify the signatures to verify the chain of ownership.”
“ 我们将一枚电子货币定义为一条数字签名链。每个拥有者都通过将上一次交易和下一个拥有者的公钥的哈希值的数字签名添加到此货币末尾的方式将这枚货币转移给下一个拥有者。收款人可以通过验证数字签名来证实其为该链的所有者。“
这个数字签名链其实就是这个货币的流通过程,完整记录了这枚货币的所有权转移。这串链条完整记录了这枚货币从诞生到每一次交易的全部历史,就像一本公开的 “流转日记”,每一页都是一次交易的签名,环环相扣。
如图,比如所有者1
想把该货币转移给所有者2
,那么首先1
需要将上次的交易详情与2
的公钥进行一次哈希计算,得到一个哈希值,再将这个值利用1
的私钥进行加密得到1
的数字签名,再将签名加入链条的末端,本次交易完成。
2
收到这枚货币后用1
的公钥解密1
添加的那个数字签名,解密成功则说明该签名确实是由1
生成(因为1
的私钥只有自己知道),之后2
可以再次用上次交易详情与自己的公钥进行哈希计算,对比解密值与计算值,若完全一致,则证明没有被修改过。
这个交易的问题是无法判断卖家有没有双重支付,即把一枚货币卖给两个人。我们需要一种能让收款人知道卖方有没有对更早的一笔交易签名的方法,那么在不引入第三方信任机构来鉴定哪笔交易是更先到达的前提下,所有交易就必须公开,由该支付系统所有参与者来共同监督,每笔交易都需要被多数节点认同此次交易是卖家最早的一次签名才算成功完成。
时间戳服务器是防止篡改的核心,服务器会把多个需要记录时间的数据(比如多笔比特币交易)打包成一个 “区块”(可以理解为一个 “数据包”)。然后,用哈希算法(比如 SHA-256)计算这个区块的 “哈希值”。 哈希值有个关键特性:如果区块里的任何数据被修改(哪怕一个字符),哈希值会发生巨大变化;反之,只要哈希值不变,就说明区块里的数据完全没被动过。之后会把该哈希值广泛、透明的传播。
该时间戳能证明数据当时一定是存在的,因为时间只要改变了,哈希值就会变。并且后一个区块的哈希值是包含前一个区块的哈希值,若要改变前面区块的信息,那么后面所有区块的哈希值都会改变,又因为所有哈希值都是公开的,所有会被马上发现,这就严格保证了历史区块信息不会被偷偷篡改。
Pow做法是找一个特殊的数(比如 “随机数”),把它和区块数据一起用哈希函数(比如 SHA-256)计算,要求计算结果的二进制开头有 “多个连续的 0”。找到了即可打包区块,接入链中,这就导致了最长的一条链是花费CPU算力最多的,也是最能代表共识的,若要篡改则需要花费大量算力并且超过所有诚实节点的算力。
哈希函数是 “单向的”(从输入算输出容易,从输出反推输入几乎不可能)。要得到 “开头多个 0” 的结果,只能靠不断尝试不同的数去试(类似 “猜密码”),试的次数会随 “0 的数量” 呈指数级增长。而验证很简单,一旦找到这个数,其他人只需把它代入哈希函数重新算一次,看结果是否符合 “开头多 0” 的要求,1 次计算就能验证,不需要重复之前的试错过程。
也就是交易上链的过程。
网络中可能出现 “同一时间有两个不同区块被广播” 的情况(比如两个节点同时完成工作量证明),这会导致不同节点暂时拥有 “不同的链”。此时规则是:
这个系统对 “消息丢失” 不敏感,具体体现在:
即打包奖励,这个过程我们也叫做挖矿。就是上述pow证明竞争的过程,最先完成的节点会获得奖励,即新货币与交易费(一笔交易中的抽成)。
激励机制的核心作用之一是 “让诚实比作弊更有利可图”,从而遏制攻击行为:
假设一个贪心的攻击者掌握了超过全网诚实节点的 CPU 算力(理论上可以篡改区块链),他会面临两个选择:
显然,“诚实挖矿” 的收益远高于 “作弊”,因此攻击者更可能选择遵守规则 —— 这就通过利益驱动保障了系统的安全性。
区块链会不断积累交易数据,如果长期保存所有历史交易,磁盘空间会越来越大。这里提出的解决办法是:
通过 “默克尔树” 结构,只保留关键哈希值,丢弃老交易的详细数据。
具体做法:所有交易先被 “哈希化”(每个交易生成一个唯一哈希值),再通过默克尔树的结构层层向上哈希(比如两个交易的哈希合并成一个新哈希,再和其他合并哈希继续向上),最终形成一个 “根节点哈希”(默克尔根)。
这个 “默克尔根” 会被写入区块头,成为区块哈希值的一部分。
当一个交易被足够多的后续区块 “覆盖”(即交易已经被全网确认且难以篡改),就可以把这个交易的详细数据删除,只保留默克尔树的根节点和必要的哈希路径。
为什么不影响区块有效性?因为区块的哈希值只依赖默克尔根,而非单个交易的详细数据。即使删除老交易,只要默克尔根不变,区块的哈希值就不变,链的完整性依然成立。
输入:可以是 “一个较大的金额”(来自之前某笔交易的输出),也可以是 “多个较小金额的组合”(来自多笔历史交易的输出)。这些输入的总金额,就是本次交易的 “总支付能力”。
输出:最多包含两个输出: 1. 一个是支付给接收方的金额; 2. 另一个是 “找零”(如果总输入大于支付金额,比如用 100 元付 50 元,剩下的 50 元退还给支付方自己)。
传统银行的隐私保护靠 “信息封闭”—— 只有银行和交易双方知道交易细节,外人无法访问。但区块链是 “公开账本”,所有交易必须向全网广播(才能被节点验证和记录),因此不能用传统方法,而是换了一种思路:
通过 “公钥匿名” 保护隐私:
区块链上的交易只显示 “公钥地址”(类似一个随机字符串,比如 “1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa”),不直接关联用户的真实姓名、身份证号等信息。 公众能看到某地址向另一地址转了多少钱,但无法知道这些地址背后是谁。