区块链 BlockChain

1 背景

现有的记录设备基本是中心化的,无论是记账还是存储各种数据。即使如git也是将所有人的代码托管到服务器上进行存储,然后通过个人签名来提交修改。这样的做法已经非常成熟,并且看起来也足够稳定和安全。但是一旦服务器拥有者去篡改数据或者数据中心不幸被损毁,非中心的节点是无能为力的,我们只能选择相信这些服务器的拥有者是值得信任的。这当然已经足够好了,毕竟任何政府或者任何想要吸引人来使用的服务提供方都会极力维护这种稳定和秩序。

2. 基本设计思路

区块链则是为这种记录方式提供了一种新的形态——通过算法来保证记录的真实。也即无论谁发布了基于区块链的记录服务,将可以通过算法保证记录中的每项提交都真实可靠。只要这种算法还无破解方法,无论开发这套系统的人还是其他任何一个参与者,他们都将无法随意篡改和销毁数据。

  1. 去中心化
    首先需要改变的就是中心化的问题,因此区块链将所有的完整记录保存在每个参与者中,以下将参与者称为节点,这样任何一个节点的数据被销毁都不会影响数据安全,除非所有节点都被摧毁。
  2. 对提交进行签名
    由于每个节点都保管同一个账本,因此需要对修改的提交进行校验,否则每个节点都可以篡改。这里使用的方式是每个节点都有一对公/私钥。公钥作为其他人识别自己的标识是完全公开的,私钥作为证明身份的最终证据,因此需要各节点自行保密。每次提交修改时需要将私钥和信息进行联合并生成签名,所有的节点收到这串签名后将与发出这串消息的节点公钥进行校对,从而保证这串消息由持有私钥者才能发出。
    generate_signature(private_key, message) -> signature   # 生成签名
    validate_signature(signature, public_key) -> True/False # 校验签名
    
  3. 加入自增计数 nonce
    现在虽然签名无法伪造,并且无法与任意其他信息搭配,但是签名和消息可以同时被复制,这也使得其他人可以反复发送同样的信息。因此需要加入自增计数,称为nonce。这样其他人复制交易信息时将包含计次信息,即使多次重复发送也不会造成误解,因为此nonce的信息被记录后不会再记录。可以理解为:
    forge_commit(message, signature, nonce) -> commit_message   # 生成提交信息
    
  4. 工作量证明 Proof of Work
    现在所有人从同一个数据源本开始,发生提交时节点会进行广播,其他节点接收到消息后进行校验和记录。可是所有人接收到消息的时间和顺序都是不一样的,如果需要保证各方记录的一致,则需要有个机制来确定谁可以进行记账。此处采用工作量证明。
    每个人手里的全部记录(data)包含一个随机数,也叫nonce,不同于上面那个,这个数字随机而不是自增的。这个nonce目前只能通过暴力计算获得。计算的依据是将整个账本与nonce联合并做哈希(Hash)计算,如果结果的hash满足一定规则(比如前50位都是0,猜中的概率为1/2^50),则此nonce正确,从而具备进行本次记账的权力(并获得比特币,非必须)。每个区块包含上一个区块的hash值、数据记录和对应数据的nonce。代码描述如下:
    while data_hash[:50] != [0] * 50:
     nonce = rand()
     data_hash = Hash(data, nonce)
    else:
     get_bitcoin()
     write_data()
    
  5. 有效区块链筛选
    如果有节点A需要按自己意图修改数据,需要计算出正确的nonce才能发布本区块,但是其他所有节点都在同时计算并且记录,而只要其他节点都不按照A节点发布的新区块续写的时候,A节点即使发布了新区块,区块曾长的速度也无法与其他统一的区块相比拟。而筛选有效区块链的方式就是看哪条链更长,并且超出一定长度。目前比特币交易需要约1小时等待有效链超出其他链6个区块。
    • 可是如果平台上交易甚少时,篡改者有充分时间计算新区块时该怎样呢?
      因此对于篡改者来说,计算nonce并发布新区块后还需要继续维持本链的长度以成为有效链,而这则需要它能掌握整个系统中超过50%的算力才有可能做到。当然似乎反过来说,如果篡改链能超出正确链,则后续的节点也会无知地选择篡改链进行续写从而无从纠正。
    • 而如果有多股势力参与篡改各自的版本时,是否只要成为掌握算力最多的一方即可?

3. 公链与联盟链

公链

  • 开源
  • 无限制准入
  • 业务方向丰富
  • 升级困难
  • 出错风险高而维护成本高

联盟链

  • 非开源
  • 限制CA证书准入
  • 业务单一
  • 升级相对可控
  • 出错风险相对可控

4. 波卡 Polkadot

安全性、可扩展性与去中心化通常不可兼得,不同的区块链项目通常根据具体应用场景进行取舍。而波卡则主要有以下改进:

  • 将基于substrate的区块链全部挂载到同一个链上提高并行效率
  • 挂载的链仍可以按自己需求去定制服务
  • 波卡上的链之间有了共享信息和功能的可能,而不需要中心化的跨链服务商
  • 允许波卡上的链开发者对自己的链进行维护和定制
  • 无分叉升级,升级时不必维护两套交易历史来区分升级和未升级的节点

个人感想

  1. 是否可以异化节点,而不是所有节点功能都一样,仿造社会机构设计一样,以使得不仅在算力上也在功能上互相制衡。
  2. 以前没有意识到中心化的节点也有资源的消耗,所以倾向于认为为了维护区块链去挖矿烧电毫无意义,但实际上中心化节点也为自身稳定构建了服务器,开发和行政人员,甚至可以说印刷代币或者铸造通过也是消耗自然资源的,这样比下来,电费和几块芯片可能还不算是很大的消耗。不过这增大了各行各业的芯片荒可能是另一个需要讨论的话题
  3. 总的来说区块链给出了一种信任传递的方案,当我们没有坚不可摧的中心节点时,如何从平庸、自私的节点中构建信任。区块链给出的一个是权益的反馈以使大部分节点倾向于诚实,当大部分节点诚实时,做恶的难度则大大增加。而这需要消耗硬件成本和电费来维持,如果能稍微引入先验或者不仅在节点上传递信任并且累积信任,比如惩罚在事后证明错误的链上续写的节点,是否是不错的设计。