我认为重要的是首先要澄清区块链实际上解决了什么问题。 目前,我们依靠一个单一实体来管理通过通信渠道(计算机网络)发生的支付,我们也依靠这些第三方来存储文件、医疗记录、或是我们想要存储的任何东西。 只要它是数字存储的,就是由第三方存储。 现在,该系统并没有明显的损坏或功能失调,因此大多数人忽略了它的固有弱点。

  • 完全安全的数据是不可能的,因为总有一个失败的关键点,攻击者以及人们是不可信的
  • 第三方有法律义务维护监督(完全的隐私是不可能的)
  • 第三方强制跟踪数据,因为欺诈基本上是不可避免的,而且这种调解既费钱又耗时

中间人并不总是做正确的事(非故意或是其他原因):

  • 丢失你的数据
  • 把安全漏洞留给攻击者利用
  • 违背你的意愿滥用或出售你的数据

区块链使用密码学证明代替信任。 我们相信密码学证明和数学原理因为它们是可靠的。 不理智、自私自利、并且容易出错的人类是不可靠的。

区块链是解决第三方问题的最佳方案。

1. 什么是区块链?

区块链是一条数字化的分布式记录链。

它是数字化的因为它只是一种电子技术,而非物理上的,仅仅是一堆 0 和 1。 “链”是记录的链接列表,一条记录是一个任意类型数据的组合存储。 该列表是在所有同意存储在他们计算机上并在每次发生变化时重新下载的志愿者中复制来的。

区块通过哈希值链接到链上。

2. 什么是哈希值?

哈希值是把区块链接到一起的东西。

一个哈希值看起来像是一堆随机的字母和数字。比如这个:

bd68cf569a8ca8033474a900140a5d41d75e538832b24e0d91f044563cdf6b58

或这个:

d17fd1a2b0b61d46afd0c85621cf43011a571ee88ae90b47937610db0041c046

为了创建一个哈希值,你需要一个散列函数。 想象一下散列函数就像一台神奇的机器,放入一些数据并吐出一个哈希值。 所以为了生成一个哈希值,你首先需要把一些数据放入散列函数。

注意对用于散列函数的数据的任何改变(甚至是微小的改变)都会输出完全不同的哈希值。

在处理数据之后,你会发现哈希值有一些有趣的特性:

  • 它们总是 64 个字符长度
  • 不同的数据总会产生一个不同的哈希值

这儿有个挑战:我给你一串哈希值,然后你要找到指定的数据:

bf2b60474405012c2a2c002fff59e958a71df02273fd40a8fdec6a32798989ae

数据是:培根和鸡蛋(Bacon and eggs)

如果你找不出来不要灰心,因为那个挑战本来就是不可能的,即使是计算机也要花费很长时间来解决,所以这个挑战能证明什么呢?

只知道哈希值,基本上不可能找到对应的数据。

这儿还有一个挑战(这次有可能):

判断这句话是真(True)还是假(False):

具有大小写的数据鸡蛋和培根导致哈希值以 6f78266 开头。

真的!数据鸡蛋和培根会导致一个以 6f78266 开头的哈希值! 这就是人们验证某些数据是否产生指定哈希值有多么的容易。 所以你能想象这对一台计算机来说有多么的简单和高效!

请记住以下关于哈希值的几件事:

  • 数据可以是任意长度
  • 哈希值是固定长度
  • 不同的数据总会产生一个不同的哈希值
  • 只知道哈希值找对应的数据很困难
  • 验证数据是否能产生一个哈希值很容易

哈希值对于学习区块链如何防止篡改是至关重要的。

3. 什么是区块?

区块链是一条数字化的记录链,每个记录被称为一个区块。

每个区块都包含以下信息:

  • 索引
  • 时间戳
  • 数据
  • 前一个哈希值
  • 随机数(Nonce)
  • 哈希值

索引是链上区块的位置(从 0 开始)。 时间戳是一条区块被创建时的记录。 索引和时间戳有助于保持区块链的连续性以及它们被创建的顺序。 最终区块链用于存储数据,该区域可以存储任何内容,文件、文档、或付款人、收款人交易的金额(稍后说明)。

前一个哈希值是其前面区块的散列。对于创世区块(区块链上的第一个区块),前一个区块的哈希值为“0”。

随机数是计算机生成的值,用于确保哈希值以两个零开头(稍后说明)。

哈希值像是整个区块的一个数字指纹,它把所有的值(索引,时间戳,数据,前一个哈希值,随机数)散列到一起。

4. 什么是“随机数(Nonce)”?

要理解随机数的作用你首先必须意识到存在有效的哈希值和无效的哈希值。 有效哈希值满足难度要求。 在本例中这些难度要求只是一个以一定数量的“0”开头的哈希值。 为了我们的目的,我们将使一个哈希满足以 2 个“0”开头难度要求为有效。 一个无效的哈希值则不满足这些难度要求。

如果一个新区块的哈希值满足特定的难度要求那么它将被接受进入区块链中。

因为随着难度要求增加,有效的哈希值越来越少,则需要更多的计算能力。

那么如何计算有效的哈希值呢?记住传入散列函数的这些信息:

  • 索引
  • 时间戳
  • 数据
  • 前一个哈希值
  • 随机数

索引、时间戳、数据和前一个哈希值保持不变。 为了创建一个新的区块,矿工会改变随机数! 它们用新的随机数重新计算哈希值,并检查该值是否满足难度要求。 如果不满足,再次改变随机数直到哈希值最终满足通过网络设置的难度要求。 重复该过程(通常数十万次)。

世界上成千上万的人都在做相同的事,这些人被称为矿工。

他们使用他们的计算机,为什么?因为他们遵循货币激励。 一个区块奖励只给第一个人,通常该奖励是大量的。 其余的矿工则浪费了时间和计算能力。 这就是为什么,对大多数人来说,比特币挖矿不盈利,因为他们的能源成本超过了潜在的回报,或者前期的成本根本承受不了。

网络难度是一个不断变化的目标值,确保在平均一致的时间周期内创建区块。 例如,在比特币中,平均每 10 分钟创建一个区块,它保持在 10 分钟,因为全球的区块难度基于前 2016 个区块的创建时间变化。

增加一个单值并反复检查它产生期望的哈希值需要的时间和计算能力。 随着难度要求的增加(一个额外的“0”),节点计算出一个随机数的平均时间和计算能力也会增加。

参考链接