Py学习  »  Python

数据结构与算法(Python版)四十:区块链技术

亥虫 • 3 年前 • 209 次点击  

散列函数的最酷应用:区块链技术

区块链是一种分布式数据库

通过网络连接的节点
每个节点都保存着整个数据库所有数据
任何地点存入的数据都会完成同步
在这里插入图片描述

区块链最本质特征是“去中心化”

不存在任何控制中心、协调中心节点,所有节点都是平等的, 无法被控制

如何做到不需要相互信任和权威, 即可防止篡改和破坏?

区块链

区块链由一个个区块(block) 组成, 区块分为头(head) 和体(body)

区块头记录了一些元数据和链接到前一个区块的信息

生成时间、前一个区块(head+body)的散列值

区块体记录了实际数据

在这里插入图片描述

区块链不可修改性

由于散列值具有抗修改性, 任何对某个区块数据的改动必然引起散列值的变化

为了不导致这个区块脱离链条,就需要修改所有后续的区块,由于有“工作量证明”的机制,这种大规模修改不可能实现的,除非掌握了全网51%以的计算力
在这里插入图片描述

工作量证明: Proof of Work(POW)

由于区块链是大规模的分布式数据库, 同步较慢, 新区块的添加速度需要得到控制

目前最大规模区块链Bitcoin采用的速度是平均每10分钟生成一个区块

大家不惜付出海量的计算, 去抢着算出一个区块的有效散列值

最先算出的那位“矿工”才有资格把区块挂到区块链中

散列不是非常容易计算吗? 为什么要付出海量计算? 为什么要抢先?

为什么有效散列值那么难算出?

因为很难算出, 所以控制了新区块生成的速度, 便于在整个分布式网络中进行同步

每个区块设置了一个难度系数Difficulty, 用常数targetmax除以它, 得到一个target, 难度系数越高, target越小

在这里插入图片描述

矿工的工作是, 找到一个数值Nonce, 把它跟整个区块数据一起计算散列, 这个散列值必须小于target, 才是有效的散列值

由于散列值无法回推原值, 这个Nonce的寻找只能靠暴力穷举, 计算工作量+运气是唯一的方法。

Bitcoin的一个区块

在这里插入图片描述

为什么矿工抢着生成区块?

因为有利益!

在加密货币Bitcoin中, 区块内包含的数据是“交易记录”, 也就是“账本”, 这对于货币体系至关重要

Bitcoin规定, 每个区块中包含了一定数量的比特币作为“记账奖励”, 这样就鼓励了更多人加入到抢先记账的行列

由于硬件摩尔定律的存在, 计算力将持续递增, 为了维持每10分钟生成一个区块的速度, 难度系数Difficulty也将持续递增

挖矿计算力升级: CPU(20MHash/s) →GPU(400MHash/s) →FPGA(25GHash/s) →ASIC(3.5THash/s) →大规模集群挖矿(3.5THash/s*X)

另外, 为了保持货币总量不会无限增加,每4年奖励的比特币减半

2008年开始是50个, 2019年为12.5个

工作量证明

在这里插入图片描述

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/70830
 
209 次点击