zl程序教程

您现在的位置是:首页 >  大数据

当前栏目

学习区块链的基础知识--工作量证明

区块基础知识学习 -- 证明 工作量
2023-09-14 09:16:25 时间
作者认为最快的学习区块链的方式是自己创建一个,就跟随作者用Python来创建一个区块链。
对数字货币的崛起感到新奇的我们,并且想知道其背后的技术——区块链是怎样实现的。

但是完全搞懂区块链并非易事,我喜欢在实践中学习,通过写代码来学习技术会掌握得更牢固。通过构建一个区块链可以加深对区块链的理解。在学习区块链技术之前,先来了解一下什么是hash算法。


安全散列算法(Secure Hash Algorithm,缩写为SHA),是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的讯息不同,它们对应到不同字串的机率很高;而SHA是FIPS所认证的五种安全杂凑算法。这些算法之所以称作“安全”是基于以下两点(根据官方标准的描述):1、由讯息摘要反推原输入讯息,从计算理论上来说是很困难的。2、想要找到两组不同的讯息对应到相同的讯息摘要,从计算理论上来说也是很困难的。任何对输入讯息的变动,都有很高的机率导致其产生的讯息摘要迥异。


我们知道区块链是由区块的记录构成的不可变、有序的链结构,记录可以是交易、文件或任何你想要的数据,重要的是它们是通过 哈希值(hashes)链接起来的。下面就来通过python代码来了解hash的特性。在python里是使用hashlib来实现这个功能的。
hashlib 是一个提供了一些流行的hash算法的 Python 标准库.其中所包括的算法有 md5, sha1, sha224, sha256, sha384, sha512. 另外,模块中所定义的 new(name, string=”) 方法可通过指定系统所支持的hash算法来构造相应的hash对象。
简单例子代码如下:
#python 3.6  
#蔡军生   
#http://blog.csdn.net/caimouse/article/details/51749579  
#
from hashlib import sha256

sha = sha256('abc'.encode()).hexdigest()
print('abc :', sha)

sha = sha256('abc1'.encode()).hexdigest()
print('abc1 :',sha)
结果输出如下:
abc : ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
abc1 : dbfcfd0d87220f629339bd3adcf452d083fde3246625fb3a93e314f833e20d37
在这里是产生256位的HASH摘要,64个字符的16进制的文本字符串。

每次计算一次hash是需要大量的计算,这样非常消耗CPU资源,那么CPU就非常费电,需要大量的电力。下面就来做一个简单的工作量证明例子。


理解工作量证明
新的区块依赖工作量证明算法(POW)来构造。PoW的目标是找出一个符合特定条件的数字,这个数字很难计算出来,但容易验证。这就是工作量证明的核心思想。为了方便理解,举个例子:
假设一个整数 x 乘以另一个整数 y 的积的 Hash 值必须以 0 开头,即 hash(x * y) = 00...ac23dc。设变量 x = 5,求 y 的值?
用Python实现如下:
#python 3.6  
#蔡军生   
#http://blog.csdn.net/caimouse/article/details/51749579  
#
from hashlib import sha256

x = 5
y = 0  # y未知

while True:
    sha = sha256(f'{x*y}'.encode()).hexdigest()
    print(sha)
    #if sha[:4] == "0000":
    #    break
    if sha[:2] == "00":
        break 
    y += 1
    
print(f'The solution is y = {y}')

输出结果如下:

...

63727ee4cff30e597899af01a4a355ea91e54c9a055e1da18e25b89dfa90352c
75ca28395bfc9ad121e29198a3124a330e4ad2c10463dd7b9bae68f48423fe71
23d2c2e28f2dcbc3ffa0437156d70329f119c70f2f9a72479efe4e33111fc6d7
6c6ece85b5d6ea8c5b1901b34909d170569478006b74472e49d7535ab4b4a94d
c63bd0d975c69098ee4739650068349dd2812231b5b0a17c0772093ef07bbebd
00150bc11aeeaa3cdbdc1e27085b0f6c584c27e05f255e303898dcd12426f110
The solution is y = 530

在这里计算了530遍才找到一个结果。

在比特币中,使用称为Hashcash的工作量证明算法,它和上面的问题很类似。矿工们为了争夺创建区块的权利而争相计算结果。通常,计算难度与目标字符串需要满足的特定字符的数量成正比,矿工算出结果后,会获得比特币奖励。

深入浅出Matplotlib
https://edu.csdn.net/course/detail/6859

深入浅出Numpy
http://edu.csdn.net/course/detail/6149 

Python游戏开发入门

你也能动手修改C编译器

纸牌游戏开发

http://edu.csdn.net/course/detail/5538 

五子棋游戏开发

http://edu.csdn.net/course/detail/5487
RPG游戏从入门到精通
http://edu.csdn.net/course/detail/5246
WiX安装工具的使用
http://edu.csdn.net/course/detail/5207
俄罗斯方块游戏开发
http://edu.csdn.net/course/detail/5110
boost库入门基础
http://edu.csdn.net/course/detail/5029
Arduino入门基础
http://edu.csdn.net/course/detail/4931
Unity5.x游戏基础入门
http://edu.csdn.net/course/detail/4810
TensorFlow API攻略
http://edu.csdn.net/course/detail/4495
TensorFlow入门基本教程
http://edu.csdn.net/course/detail/4369
C++标准模板库从入门到精通 
http://edu.csdn.net/course/detail/3324
跟老菜鸟学C++
http://edu.csdn.net/course/detail/2901
跟老菜鸟学python
http://edu.csdn.net/course/detail/2592
在VC2015里学会使用tinyxml库
http://edu.csdn.net/course/detail/2590
在Windows下SVN的版本管理与实战 
http://edu.csdn.net/course/detail/2579
Visual Studio 2015开发C++程序的基本使用 
http://edu.csdn.net/course/detail/2570
在VC2015里使用protobuf协议
http://edu.csdn.net/course/detail/2582
在VC2015里学会使用MySQL数据库
http://edu.csdn.net/course/detail/2672