BTC-密码学原理

比特币被称为加密货币,但其实加密货币都是不加密的,所有的数据都是公开的,只是它通过唯一的二进制子串地址将现实生活中人的身份信息给隐藏了。

区块链中主要使用了两种密码学原理:哈希函数(cryptographic hash function)和签名

哈希函数

两种性质:

  1. collision resistance 用处:对一个 message 求 digest,用来检测对 message 的篡改

  2. hiding 意思是哈希函数的计算过程是单向、不可逆的 hiding 的前提是输入空间足够大、输入分布均匀,使得 brute-force 不可行

    如果输入空间不够大,常用的方法是输入拼接一个随机数,然后整体取哈希 H(x||nouce)

    用处是:和 collision resistance 结合,实现 digital commitment,也称 digital equivalent of a sealed envelope

  3. puzzle friendly

    哈希值的计算事先是不可预测的, 比如:想得到前 k 位为 0 的哈希值则只能一个个去试,而没有捷径,所以才可以 PoW

    挖矿:找一个 nouce,nouce 和其他区块信息作为一个输入,计算哈希得到 H(block header),H(block header) <= target space

    挖矿很难,验证很容易,这个性质叫做:difficult to solve,but easy to verify

    当我们设计 mining puzzle 的时候需要注意这种性质。

    比特币中使用的哈希函数:SHA256(Secure Hash Algorithm)

签名

比特币的账户管理

开户的过程:创建一个公私钥对(public key, private key),公钥相当于银行账号,私钥相当于账户密码。

两个人公私钥相同的概率微乎其微,这里有个前提/假设:产生公私钥的时候有一个好的随机源 a good source of randomness.

比特币使用的签名算法不只是生成公私钥的时候有一个好的随机源,之后签名的时候也要有好的随机源,只要有一次签名时用的随机源不好,那就有可能泄露私钥。

数据结构

比特币中最基本的结构就是区块链,区块链就是一个一个区块组成的链表。区块链和普通的链表相比有什么区别:

每个区块中存储着前一个区块的哈希值,形成区块链。初始为创世区块 genesis block, 最新的为 most recent block。通过这样的数据结构可以实现 tamper-evident log

只要保存最后一个哈希值,就可以知道是否修改区块链任何一个部位的区块。

借助此性质,比特币中有些节点就不一定需要保存整条区块链的内容,只需要保存最近的几个就行,需要之前的向其他节点索取,并计算哈希值与自己保存的区块中上一个区块的哈希值验证就好了。

double spending attack

区块链中有两种 hash 指针:一种链接各个区块之间的,指向前一个区块,将它们构成各个链表

另一种指向前面某个交易的,说明钱是从哪里来的,一方面说明钱是从哪里来的,不是捏造的,另一方面防止双花问题。

别的节点收到转账的时候,从其自身逐个向前回溯至指向的交易哈希,看转给自己的钱是否已经被花出去了。

比特币中的另外一个结构是: Merkle tree

merkle tree

和 binary tree 的区别是:用哈希指针代替了普通指针

Merkle Tree,通常也被称作 Hash Tree,顾名思义,就是存储 hash 值的一棵树。Merkle 树的叶子是数据块(例如,文件或者文件的集合)的 hash 值。非叶节点是其对应子节点串联字符串的 hash。

merkle_tree

只要记住了 root hash,就可以检测对整个树的修改。

每个区块包含 block header 和 block body。 block header 里面包含哈希值,block body 里面存储交易信息

merkle 的用途:

  1. 提供 merkle proof 比特币中的节点分为两类:全节点和轻节点。