人工智能和区块链诞生至今已经有了十几年,当这些技术出现时,人们都说他们会改变世界,但至今为止,这两项技术对现实的影响依然有限。从技术上看人工智能的原理其实是从大量数据中寻找规律或模式,但区块链的技术原理是什么呢?在我看来区块链的原理一直处于云里雾里,有很多近乎玄学的解释将其笼罩,有人从经济学解释,有人从社会学解释,从”人文“角度解释的区块链总是过于夸大其词,这些说法中往往又包含不良用心。

由此我想去芜存真,我们不用关心区块链如何”改变世界“,我们就从纯技术角度去探讨,其实区块链和人工智能一样,从技术的角度看去,他们都有着极为美妙的设计思想,这些设计的美妙就像唐诗宋词,就像毕加索的话,如果我们没有去欣赏它的美,那岂不可惜。相比于人工智能,我认为区块链在技术上更容易被普通人触碰,因为前者需要大量的数据和算力,而后者只要我们掌握其技术原理就能参与其中,不需要太高的硬件门槛。

话不多说,我们看看如何用python代码把最基本的区块链原理编写出来。首先我们看区块链的数据结构,它包含三部分信息,一是用于标志自己的id,它是一个整数,第二个是用于记录前一个区块的id,也是一个整数,由于区块用于记录信息,因此它还包含一个字段,我们用history来表示,这个字段用来记录当前发生了的信息,区块链最大的作用就是让这段信息可验证而且不可更改,我们先看数据结构的定义,先创建文件block.:

class Block:def __init__(self):self.id = Noneself.history = Noneself.parent_id = None

接下来我们看看区块如何行成”链“,同时如何记录信息。假设我们想要记录这么一个事件:张三想跟李四用一百块买三条鱼,李四收到一百块后给了张三三条鱼”,那么我们可以使用下面代码用区块链进行记录,创建main.py,然后给出如下代码:

from block import *block_A = Block()
block_A.id = 1
block_A.history = '张三想要三条鱼'block_B = Block()
block_B.id = 2
block_B.parent_id = block_A.id
block_B.history = '张三跟李四买三条鱼'block_C = Block()
block_C.id = 3
block_C.parent_id = block_B.id
block_C.history = '张三给李四一百块'block_D = Block()
block_D.id = 3
block_D.parent_id = block_B.id
block_D.history = '李四收到张三一百块'block_E = Block()
block_E.id = 3
block_E.parent_id = block_B.id
block_E.history = '李四给张三三条鱼'

从代码上看不同区块之间通过parent_id形成了前后连接关系,这就是区块链中的“链”,但现在还有一个严重问题,那就是信息可以更改,假设张三想来着,他把block_E里面的history改成李四给张三两条鱼,然后找李四算账那怎办,或者李四想赖账,把block_D中的history改成“李四收到张三五十块”,然后又找张三要钱,那怎么办。

为了确保信息不被更改,我们需要对每个区块的内容进行加密或者哈希,因此上面代码修改如下:

# This is a sample Python script.# Press ⌃R to execute it or replace it with your code.
# Press Double ⇧ to search everywhere for classes, files, tool windows, actions, and settings.from block import *
import hashlib
import jsonblock_A = Block()
block_A.id = 1
block_A.history = '张三想要三条鱼'block_B = Block()
block_B.id = 2
block_B.parent_id = block_A.id
block_B.history = '张三跟李四买三条鱼'
block_B.parent_hash = hashlib.sha256(json.dumps(block_A.__dict__).encode('utf-8')).hexdigest()block_C = Block()
block_C.id = 3
block_C.parent_id = block_B.id
block_C.history = '张三给李四一百块'
block_C.parent_hash = hashlib.sha256(json.dumps(block_B.__dict__).encode('utf-8')).hexdigest()block_D = Block()
block_D.id = 4
block_D.parent_id = block_C.id
block_D.history = '李四收到张三一百块'
block_D.parent_hash = hashlib.sha256(json.dumps(block_C.__dict__).encode('utf-8')).hexdigest()block_E = Block()
block_E.id = 5
block_E.parent_id = block_B.id
block_E.history = '李四给张三三条鱼'
block_E.parent_hash = hashlib.sha256(json.dumps(block_D__dict__).encode('utf-8')).hexdigest()

有了哈希,如何任何一个区块被修改,那么当前区块和后续区块的哈希都得修改,例如李四把block_C的history改成“张三给李四五十块”,那么我们看到李四必须要把block_C到block_E的哈希全部改了,如果这条链很长的话,李四改起来就非常吃力。同时为了确保信息的可靠性,
张三和李四需要把上面的区块链发送给其他一百个人进行存储,这样一来张三或李四想要赖账那就更加困难,因为有一百个见证者。

区块链信息记录的特点是只增不删,因此张三想要赖账的话,他只能在上面基础上再增加一个区块,也就是block_F, 里面的history写上了“张三收到李四两条鱼”,然后将这个区块发给其他100个人,为了防止随意添加区块造成信息混乱的情况,在区块链中有一个专门的角色负责将新增的区块添加到现有的区块链上,这个角色拿到区块数据后,,在不考虑parent_hash字段的情况下将数据序列化,接着找到一个特定字符串,这个字符串必须满足给定要求,那就是它与区块序列化的数据合并后,算出来的哈希值必须以5个0开头,我们从代码上看看这是什么意思:


#proof-of-work
block_F = Block()
block_F.id = 6
block_E.parent_id = block_E.id
block_E.history = '李四给张三三条鱼'
#注意我们这里没有设置parent_hash字段
block_F_serialized = json.dumps(block_F.__dict__).encode('utf-8')
print(block_F_serialized)
for i in range(10000000):proof_of_work = str(i).encode('utf-8')result = hashlib.sha256(block_F_serialized + proof_of_work).hexdigest()if result[:5] == '00000': #哈希结果只有以5个0开头才能添加区块到公链print(proof_of_work)print(result)break #找到特定字符串后获取回报,所谓挖矿就是干这个事情

上面代码运行后所得结果为:

b'{"id": 6, "history": null, "parent_id": null, "parent_hash": null}'
b'553448'
0000034ba1dabbf794212082b47a6bcc98cb33eed86d363993270ca58e243bb9

也就是说特定字符串内容为"553448",它能使得新区块内容和它结合后算出来的哈希以5个0开头,专门负责给区块查找这种字符串的角色就叫“矿工”,这个查找过程就叫挖矿,一旦找到这个特定字符串后他就能获取回报,也就是加密货币。

现在我们实现了数据的修改很困难,同时区块的添加也需要付出一定成本,但假设李四就是拼了老命也想把以前记录的信息修改掉,并为此愿意付出一切代价,假设当前区块链有1000个数据块,他想修改第一个块记录的信息,于是他修改了后面999个数据块的数据,但原始数据被其他人掌握着,因此他自己修改的数据就不会被采纳。由于区块链数据被分布存储在不同地方,于是在某项地方数据可能会被修改,这样就会出现数据不一致的情况,区块链还有一个重要任务就是在这种情况下达成共识。

同时当有新的区块需要加入公链时,我们需要将新增区块通过广播的方式通知所有人,于是就有个问题,那就是有些人较早获得通知,有些获得通知较晚,更有可能你会同时收到多个消息,假设现在公链上最后一个消息编号为5,此时你同时收到了两个消息东边发来的消息为history:王五想跟李四买一斤虾;西边发来的消息为history:李六想跟张三买两条鱼,那么我们应该将哪个消息作为编号6呢,此时的做法是先等等,如果过了一会西边发来了5条消息,同时东边只发来2条消息,那么就把消息少的抛弃,将消息多的经过处理后添加到公链。

通过选择数据多的添加到公链有个好处就是让数据的修改变得几乎不可能,例如李四辛辛苦苦花了半小时修改了999个区块,然后想要广播给其他人,但是很可能这段时间内有10000个新区块生成,于是他修改的999个区块就会被丢弃掉,这样他就无法进行任何修改。这个过程其实涉及到非常复杂的分布式计算理论,我们无法简单使用代码实现。

区块链的设计思想非常伟大,它集合了很多智慧的结晶,例如加密算法,分布式算法,心理学,经济学等,由于它跨越领域太多,这也是它特别“玄学”的原因,我们后面仅从技术的角度进行思考,看看区块链采用的算法原理,同时也逐步探讨如何基于区块链的基础上进行应用开发。

从0编写区块链:用python解释区块链最基本原理相关推荐

  1. python函数解读_通过7个Python函数来解释区块链

    我想对于那里的很多人来说,区块链就是这种现象,很难不让你头脑发热.我开始观看视频和阅读文章,但对我个人而言,直到我编写自己的简单区块链,我才真正理解它是什么以及它的潜在应用价值. 我对区块链的看法是它 ...

  2. 大势所趋——区块链(Python代码实现)

    目录 1 区块链和人工智能 2 区块链的相关概念及流程 2.1 官方定义 2.2 普通区块&创世区块 2.3  区块的工作流程 3 区块链Python代码实现 4 致谢 1 区块链和人工智能 ...

  3. 新版以太坊Ethereum库ethersV5.0配合后端Golang1.18实时链接区块链钱包(Metamask/Okc)以及验签操作

    区块链去中心化思想无处不在,比如最近使用个体抗原自检替代大规模的中心化核酸检测,就是去中心化思想的落地实践,避免了大规模聚集导致的交叉感染,提高了检测效率,本次我们使用Ethereum最新的ether ...

  4. Python之区块链简单记账本实现

    在上一篇<Python之区块链入门>中讲述了区块链的基础知识,并用Python实现了区块和区块链的结构.在本篇中,将基于上面的内容实现一个简单的记账本功能. 记账本的功能如下: 实现基本的 ...

  5. Python之区块链入门,揭秘比特币

    本文将简单介绍区块链(BlockChain)并用Python做一简单实现. 什么是区块链 简单来说,区块链就是把加密数据(区块)按照时间顺序进行叠加(链)生成的永久.不可逆向修改的记录.具体来说,它区 ...

  6. python区块链框架_20分钟,我用Python实现区块链架构!

    文章目录区块链到底多神奇 一起动手创建一个极简的区块链 为"瘦小的"区块链"增肥" 添加POW共识算法 开采新的区块测试 零基础Python实现区块链架构视频观 ...

  7. 大数据、java、python、区块链、人工智能哪个发展前景更好?

    在这个信息时代高速发展的情况下,很多人会对自己该往哪个方向发展感到迷茫,下面我就浅显的给大家介绍一下五大流行区域的发展前景. 大数据的发展前景: 当前大数据行业真的是人才稀缺吗? 学了几年后,大数据行 ...

  8. 区块链数学建模_试图通过高中数学课程来解释区块链

    区块链数学建模 by Kevin Kononenko 凯文·科诺年科(Kevin Kononenko) 试图通过高中数学课程来解释区块链 (Blockchain explained by trying ...

  9. vue如何生成公钥私钥_百行Python代码演示1私钥生成多公链公钥原理。|区块链财富指北私钥篇(2)...

    <区块链财富指北>系列文章由NOCY.COM策划,肖南飞主笔撰写. 技术选型基于BOScore公链,旨在以有趣易懂的方式传播普及区块链技术,不构成任何投资建议! 学习之前说学习 今天这篇文 ...

最新文章

  1. UltraISO软碟通U盘安装Centos7 的各种报错及解决方案
  2. K-means算法应用:压缩图片
  3. oracle19c xp安装 客户端_windows下安装oracle19c
  4. Linux生态ox版本,从折腾说Linux生态圈
  5. linux按照mysql为何如此简单_手把手教你在Linux下安装MySQL
  6. 【英语学习】【Level 07】U07 Stories of my Life L6 An experience worth remembering
  7. Unity UGUI —— 鼠标穿透UI问题(Unity官方的解决方法)
  8. 数独问题流程图_数独求解算法
  9. R语言和医学统计学(11):球形检验
  10. 计算机使用函数计算不及格门次,EXCEL计算不及格门数用什么函数
  11. 2018年春招实习面试经验总结
  12. [置顶]Ceph源码解析:PG peering
  13. 知识付费-windows+宝塔安装教程
  14. 生存分析——cox模型及相关参数求解
  15. Ubuntu16.04+RTX3090+python3+cuda11.1+ CUDNN  8.04+anaconda3+pytorch-nightly深度学习环境搭建实录
  16. 海康服务器系统装完重启转圈蓝屏,win10 1903系统重启后一直在转圈无法正常启动的解决方法...
  17. 动手深度学习笔记(四十五)8.1. 序列模型
  18. 从‘0’开始完成一个阻抗分析仪(初篇——原理讲解)
  19. 成功解决:java.util.LinkedHashMap cannot be cast to com.zyz.bookshopmanage.pojo.GoodsInfo
  20. 抖音、快手、视频号排兵布阵VR直播

热门文章

  1. 为摩尔定律续命30年,EUV究竟意味着什么?
  2. ChatGPT引发的人机交互发展历程与升级思考
  3. 武汉计算机学校中专,武汉有哪些关于计算机中专学校
  4. linux下生成nginx证书 【超简洁步骤】
  5. 2021牛年的春节一个人过
  6. 如何在免费追剧?Python制作视频解析免费追剧神器
  7. 将灰度图像变换到0-1的灰度范围
  8. 离散数学与组合数学-07命题逻辑
  9. 【考研复试】某985考研复试英语面试问题汇总(综合面试+英语口语面试)
  10. 湖北生态工程职业技术学院信息机电学院智慧林业物联网实训室竣工