python开发区块链,区块链python教程

  python开发区块链,区块链python教程

  人工智能和区块链的诞生已经十多年了。这些技术出现的时候,人们都说要改变世界,但时至今日,这两种技术对现实的影响还是有限的。接下来,本文介绍如何从0开始编写区块链,并讲解python中区块链的最基本原理。有需要的朋友可以参考一下。

  人工智能和区块链的诞生已经十多年了。这些技术出现的时候,人们都说要改变世界,但到目前为止,这两种技术对现实的影响还是有限的。从技术上来说,人工智能的原理其实是从大量的数据中寻找规则或模式,但区块链的技术原理是什么呢?在我看来,区块链的原理一直是稀里糊涂的,有许多解释接近于形而上学。有人从经济学角度解释,有人从社会学角度解释,而区块链从“人文主义”角度解释总是被夸大了。这些说法往往包含不良意图。

  因此,我想保持真实。我们不必关心区块链如何“改变世界”,所以我们将从纯技术的角度来讨论它。事实上,区块链和人工智能一样,从技术角度来看有着极其奇妙的设计理念。这些设计的美就像唐诗宋词,就像毕加索的字。如果我们不欣赏它的美,岂不是很可惜?相比人工智能,我觉得区块链在技术上更容易被普通人接触到,因为前者需要大量的数据和计算能力,而后者只要我们掌握它的技术原理就可以参与其中,不需要太高的硬件门槛。

  事不宜迟,让我们看看如何用python代码编写最基本的区块链原理。首先,让我们看看区块链的数据结构,它包含三部分信息。一个用来标记你的id,是整数,另一个用来记录上一个块的id,也是整数。由于块是用来记录信息的,所以它还包含一个字段,用历史来表示。该字段用于记录当前信息。区块链最大的作用就是让这些信息可以验证,不可更改。我们先来看看数据结构的定义。

  类别块:

  def __init__(self):

  self.id=无

  self.history=无

  self.parent_id=None

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

  从块导入*

  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

  块_C .父_id=块_B.id

  Block_C.history= 100给张三和李四

  block_D=Block()

  block_D.id=3

  块_D .父_id=块_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里的历史改成李四改成张三亮,然后找李四算账。或者李四想默认,把block_D里的历史改成“李四收了张三还是五十块。”

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

  #这是一个示例Python脚本。

  #按R执行它或用您的代码替换它。

  #按两次在任何地方搜索类、文件、工具窗口、操作和设置。

  从块导入*

  导入hashlib

  导入json

  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_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解释区块链最基本原理的文章就介绍到这了,更多相关python解释区块链内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: