重要概念

  1. 电子签名(Digital signatures) Signature为256bit,意味着有\(2^256\)种可能,如果没有sk,很难伪造正确的Signature。

     Signature = Sign(Message, sk)
    
     Verify(Message, Signature, pk) = True/False
    
  2. 密码哈希函数(Cryptographic hash functions) 密码哈希函数对不同的信息生成不同的哈希值,而且已知哈希值无法进行逆向计算,只能进行试错(暴力穷举)计算。

     sha256(Message/file) = Digest
    
  3. 工作量证明(Proof of work) 以计算成本衡量可信度,让人们信任计算工作量最大的账本,使得欺诈在计算上不可行。 找到一个数字,将其加到账单之后,然后对其应用sha256哈希函数,使得生成的值的前n位都为0。而且因为哈希函数的性质,使得必须通过穷举的方法找这个数。换言之,如果有人找到了这个数字,那么就可以相信他做了海量的计算。反之,这个数字很容易验证,只需应用一次sha256即可。 如果修改了账单,就意味着必须重新开始找这个数字。

协议

  1. 公共账本就是货币
  2. 将交易信息广播出去
  3. 只认可有签名(Signature)的交易
  4. 将账本收集成区块(Block)进行组织
  5. 每个人都保留完整的区块链(去中心化)

区块链(Block Chain)

将账本(Ledger)的交易信息分割,以区块(Block)的形式组织。

区块:

// 哈希结果的零前缀数目
const difficulty = 1

type Block struct {
    // 数据记录在区块链中的位置
    Index int
    // 自动确定写入数据的时间
    Timestamp string
    // 数据
    Data int
    // 此数据记录的SHA256标识符
    Hash string
    // 链中上一条记录的SHA256标识符
    PrevHash string
    // 哈希结果的零前缀数目
    Difficulty int
    // 为了是哈希结果符合要求拼接到区块的值
    Nonce string
}

区块链:

+--------------+                 +--------------+                 +--------------+
|  Prev  hash  |           ----> |  Prev  hash  |           ----> |  Prev  hash  |
|--------------|          /      |--------------|          /      |--------------|
|交易信息(签名)|         /       |交易信息(签名)|         /       |交易信息(签名)|
|交易信息(签名)|        /        |交易信息(签名)|        /        |交易信息(签名)|
|交易信息(签名)| ------/         |交易信息(签名)| ------/         |交易信息(签名)|
|交易信息(签名)|                 |交易信息(签名)|                 |交易信息(签名)|
|交易信息(签名)|                 |交易信息(签名)|                 |交易信息(签名)|
|--------------|                 |--------------|                 |--------------|
| Prof of work |                 | Prof of work |                 | Prof of work |
+--------------+                 +--------------+                 +--------------+

允许所有人都参与到建设区块链的行动中,意味着每个人都可以监听交易信息,把他们收集成区块,然后做工作量证明(找那个特殊的数字)。

一旦找到这个数,就可以广播出新发现的区块,每个人将其加到自己的区块链中。

为了奖励区块发现者的工作,当他整理出新的区块时,会为他在这个区块上加一个特殊的交易,让他得到相应的奖励。因为这以工作需要很大的计算量,而且产出了新的货币,所以这一工作被称为挖矿(mine)。

对于普通的用户,他们不需要监听所有的交易信息,而只需监听矿工广播出来的区块,然后更新到自己保存的区块链中就可以了。

当收到多条不同的区块链更新时,只保留最长的,也就是工作量做大的那一条。例如:如果A尝试欺骗B,只向B发送假的区块(即区块中的交易信息有A修改的假信息),那么A必须比其他矿工更快的进行工作量证明,因为其他矿工也在进行区块的整理。即使A足够幸运,比其他矿工更快的完成了区块的整理,那么A之后也要不断的做大量的工作来维持这条假的区块链,而另一半是其他矿工维持的正确的区块链,如果A没有全网50%以上的计算力,那么正确的区块链一定会长于A维护的假的区块。这也意味着不能立即相信刚更新的区块。

中本村共识:为了找到工作量最大的链,不能由长度来确定,因为每个区块可以通过修改工作难度(即Difficulty)来伪造较长的链,所以工作量应由难度(2^d+2^d….)确定。

如何交易

  • 所有权:一个人能够安全的拥有token
  • 交易权:一个人能够把自己的token和他人交易

公钥、私钥系统

私钥对消息进行签名,公钥可以验证签名:

signature = sign(message, privateKey)

isValid = verify(signature, publicKey)

一个有效的私钥是一个32字节的字符串,一个有效的公钥是由’04’开头,紧跟着64个字节的字符串。

公钥是由私钥演绎得到的,我们可以直接把公钥作为区块链中的一个用户的账号地址。当前数字货币(比特币、以太币等)采用的是「椭圆曲线算法」, 每一个钱包账户包含一份密钥对,即私钥与公钥。私钥通常是随机选出的,之后我们就可以使用椭圆曲线乘法这个单向加密函数生成一个公钥,在之后我们就可以使用一个单向加密哈希函数生成该账户地址(A)。

当你发生交易时,每笔交易都需要一个有效的签名才会被存储在区块链。只有有效的私钥才能产生有效的数字签名,因此拥有钱包账户的私钥就拥有了该账户的支配权。

记录交易:

hlo