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

这篇具有很好参考价值的文章主要介绍了从0编写区块链:用python解释区块链最基本原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

class Block:
    def __init__(self):
        self.id = None
        self.history = None
        self.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 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个区块就会被丢弃掉,这样他就无法进行任何修改。这个过程其实涉及到非常复杂的分布式计算理论,我们无法简单使用代码实现。

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

到了这里,关于从0编写区块链:用python解释区块链最基本原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 区块链实战:用python编写最简单的比特币区块链本地测试框架

    比特币本身并不是特别复杂,中本聪的白皮书只有十页左右。 可从该链接下载(有各种语言版本):Bitcoin: A Peer-to-Peer Electronic Cash System 但是,真正投入使用的比特币系统实际上非常复杂,包含诸多因素,涉及诸多细节,甚至对一个手续费机制研究几天还云里雾里。 如何有效地

    2024年02月05日
    浏览(46)
  • 如何用Rust语言构建一个基本的区块链应用,并用实际案例来演示区块链的工作原理和应用

    作者:禅与计算机程序设计艺术 在区块链领域,已经出现了很多种不同的方案,从最原始的比特币到现如今的基于分布式数据库的各类公链系统等等。这些方案都采用了区块链技术,用来解决“去中心化”、“可追溯”和“安全”的问题。虽然各有千秋,但是作为一名合格的

    2024年02月10日
    浏览(60)
  • 《区块链原理与技术》学习笔记(四) ——以太坊的基本架构、账户模型和智能合约

    《区块链原理与技术》学习笔记 第四部分 三、以太坊 1. 以太坊简介 1.1 以太坊发展的阶段 1.2 以太坊与比特币对比 2. 以太坊的基本架构及原理 2.1 基本概念 2.2 状态转移 2.3 基本架构 3. 账户模型与转账 3.1 账户模型 4. 智能合约 4.1 合约账户与数据存储 4.2 驱动智能合约 以太坊

    2024年02月13日
    浏览(48)
  • 区块链行业名词解释大全

    区块链(Blockchain):是一种去中心化的账本,所有交易都被记录在区块中,这些区块按顺序连接在一起,形成一个不可篡改的链条。 加密货币(Cryptocurrency):是一种数字资产,使用加密技术来保护其安全性和匿名性。比特币和以太坊是最著名的加密货币。 智能合约(Smart Co

    2024年02月08日
    浏览(55)
  • 又一个基于 GPT-4 编写、解释代码的工具,诞生了!

    作者:JackTian 来源:公众号「杰哥的IT之旅」 ID:Jake_Internet 链接:又一个基于 GPT-4 编写、解释代码的工具,诞生了! 上周,Open AI 团队正式宣布:GPT-4 来了! GPT-4 的出现,随后 Microsoft 的多个产品就集成了 GPT-4。 紧接着基于 Open AI 公司发布的 GPT-4 编写、编辑和讨论代码新一

    2023年04月18日
    浏览(35)
  • 用最清晰的语言解释区块链

    我去翻阅区块链相关资源时,发现我是如此的笨拙,在那些高深莫测的词根下我竟然练字都不认了,经过不懈的努力我想吧我总结出关于区块链相关的最基础知识跟大家用最直白的话语翻译出来,希望能帮到大家 中心化和去中心化的解释: 举个栗子,大家大多数都有银行卡

    2024年02月12日
    浏览(34)
  • 解释区块链技术的应用场景和优势

    区块链技术是一种分布式数据库技术,用于存储和传输数字资产(如加密货币)的信息。它通过将交易记录分散保存到节点网络中的多个节点上,从而保证了数据的安全性和透明度。区块链技术的核心是基于密码学技术的算法,通过这些算法保证了数据的完整性和安全性。除

    2024年02月03日
    浏览(41)
  • 解释区块链技术的应用场景和优势。

    区块链技术是一种分布式账本技术,其应用场景和优势如下: 应用场景: 金融和银行业:区块链可以用于货币交易、借贷和金融结算等方面,从而提高交易速度和安全性。 物流和供应链管理:区块链可以帮助实现物流信息的全程跟踪和验证,从而提高供应链的透明度和可追

    2024年02月04日
    浏览(44)
  • 〖Python网络爬虫实战㉜〗- 协程基本原理

    订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000+                 python项目实战                  Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,订阅本专栏前必读关于专栏〖Python网络爬虫实战〗转为付费专栏的订阅说明 作者

    2024年02月16日
    浏览(39)
  • 〖Python网络爬虫实战④〗- 代理的基本原理

    订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000+                 python项目实战                  Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本专栏的,可以免费订阅付费专栏,

    2023年04月08日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包