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

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

到此这篇关于从0编写区块链之用python解释区块链最基本原理的文章就介绍到这了,更多相关python解释区块链内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python实现简单区块链结构

    区块链 比特币从诞生到现在已经10年了,最近接触到了区块链相关的技术,为了揭开其背后的神秘面纱,我就从头开始构建一个简单的区块链. 从技术上来看:区块是一种记录交易的数据结构,反映了一笔交易的资金流向.系统中已经达成的交易的区块连接在一起形成了一条主链,所有参与计算的节点都记录了主链或主链的一部分. 一.比特币内部结构 比特币内部结构有四部分: previous hash: 上一个区块的hash data:交易数据 time stamp:区块生成的时间戳 nonce:挖矿计算次数 二.实现的比特

  • python简单区块链模拟详解

    最近学习了一点python,那就试着做一做简单的编程练习. 首先是这个编程的指导图,如下: 对的,类似一个简单区块链的模拟. 代码如下: class DaDaBlockCoin: #index 索引,timestamp 时间戳,data 交易记录,self_hash交易hash,last_hash,上个hash def __init__(self,idex,timestamp,data,last_hash): self.idex = idex self.timestamp = timestamp

  • 如何用用Python制作NFT区块链作品

    目录 什么是 NFT? ERC20 与 ERC721 NFT 有什么用? NFT 的价值 如何制作 NFT 如何进行无限定制的 NFT 快速上手 ERC721 代币标准 什么是 NFT 元数据和 TokenURI? TokenURI 链下元数据与链上元数据 什么是 NFT? NFT英文全称为Non-Fungible Token,翻译成中文就是:非同质化代币,具有不可分割.不可替代.独一无二等特点.NFT由于其非同质化.不可拆分的特性,使得它可以和现实世界中的一些商品绑定.换言之,其实就是发行在区

  • Python实现基于POS算法的区块链

    区块链中的共识算法 在比特币公链架构解析中,就曾提到过为了实现去中介化的设计,比特币设计了一套共识协议,并通过此协议来保证系统的稳定性和防攻击性. 并且我们知道,截止目前使用最广泛,也是最被大家接受的共识算法,是我们先前介绍过的POW(proof of work)工作量证明算法.目前市值排名前二的比特币和以太坊也是采用的此算法. 虽然POW共识算法取得了巨大的成功,但对它的质疑也从来未曾停止过. 其中最主要的一个原因就是电力消耗.据不完全统计,基于POW的挖矿机制所消耗的电量是非常巨大的,甚至比

  • python区块及区块链的开发详解

    接着上一篇交易记录整合交易类,这里描述区块的开发. 首先我们要明白一个区块,需要的内容,包括交易记录集合,时间戳,哈希,上一个区块的哈希.明白了这个,下面就容易代码开发了. import datetime import hashlib from Message import DaDaMessage, InvalidMessage from Transaction import Transaction class Block: #不定参数,*args,区块集合 def __init__(self,

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

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

  • Python解释执行原理分析

    本文较为详细的分析了Python解释执行的原理,对于深入理解Python可以起到一定的帮助作用.具体分析如下: 首先,这里的解释执行是相对于编译执行而言的.我们都知道,使用C/C++之类的编译性语言编写的程序,是需要从源文件转换成计算机使用的机器语言,经过链接器链接之后形成了二进制的可执行文件.运行该程序的时候,就可以把二进制程序从硬盘载入到内存中并运行. 但是对于Python而言,python源码不需要编译成二进制代码,它可以直接从源代码运行程序.当我们运行python文件程序的时候,pyth

  • python解释模型库Shap实现机器学习模型输出可视化

    目录 安装所需的库 导入所需库 创建模型 创建可视化 1.Bar Plot 2.队列图 3.热图 4.瀑布图 5.力图 6.决策图 解释一个机器学习模型是一个困难的任务,因为我们不知道这个模型在那个黑匣子里是如何工作的.解释是必需的,这样我们可以选择最佳的模型,同时也使其健壮. 我们开始吧- 安装所需的库 使用pip安装Shap开始.下面给出的命令可以做到这一点. pip install shap 导入所需库 在这一步中,我们将导入加载数据.创建模型和创建该模型的可视化所需的库. df = pd

  • python爬取链家二手房的数据

    一.查找数据所在位置: 打开链家官网,进入二手房页面,选取某个城市,可以看到该城市房源总数以及房源列表数据. 二.确定数据存放位置: 某些网站的数据是存放在html中,而有些却api接口,甚至有些加密在js中,还好链家的房源数据是存放到html中: 三.获取html数据: 通过requests请求页面,获取每页的html数据 # 爬取的url,默认爬取的南京的链家房产信息 url = 'https://nj.lianjia.com/ershoufang/pg{}/'.format(page) #

  • python+selenium行为链登录12306(滑动验证码滑块)

    使用python网络爬虫登录12306,网站界面如下.因为网站的反爬是不断升级的,以下代码虽然当前可用,但早晚必将会不再能满足登录需求.但是知识的价值,是不容置疑的. from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains import time from selenium.webdriver import ChromeOptions # 去除浏览器识别 opt

  • Python编写车票订购系统 Python实现快递收费系统

    本文实例为大家分享了Python编写车票订购系统,Python实现快递收费系统的具体代码,供大家参考,具体内容如下 要求: 1.上网查询郑州到北京,西安,石家庄,济南,太原,武汉的距离及票价,用数据库保存车次信息2.要求输入目的地,能够查询到里程和票价3.用数据库存储每一次售票记录,包括售票流水号,起点站,终点站,里程,金额等数据,并统计所有存储记录的总售票金额及各站的旅客流量(进站流量+出站流量)4.能够打印票据信息,包括订票人信息,票价,票据号,车次等信息 import sqlite3 im

  • python交易记录链的实现过程详解

    接着上篇的内容,这里实现一个交易记录链,废话不多说,先看图: 跟之前的逻辑类似,但也有少许不同,这里多了一个payloadhash,以及对payloadhash和prehash的hash,下面看代码实现: import hashlib import datetime # 交易记录类 class DaDaMessage: def __init__(self, data): self.hash = None # 自身hash self.preHash = None # 上一个区块hash self.

  • 基于python爬取链家二手房信息代码示例

    基本环境配置 python 3.6 pycharm requests parsel time 相关模块pip安装即可 确定目标网页数据 哦豁,这个价格..................看到都觉得脑阔疼 通过开发者工具,可以直接找到网页返回的数据~ 每一个二手房的数据,都在网页的 li 标签里面,咱们可以获取网页返回的数据,然后通过解析,就可以获取到自己想要的数据了~ 获取网页数据 import requests headers = { 'User-Agent': 'Mozilla/5.0 (W

  • Python从零开始创建区块链

    作者认为最快的学习区块链的方式是自己创建一个,本文就跟随作者用Python来创建一个区块链. 对数字货币的崛起感到新奇的我们,并且想知道其背后的技术--区块链是怎样实现的. 但是完全搞懂区块链并非易事,我喜欢在实践中学习,通过写代码来学习技术会掌握得更牢固.通过构建一个区块链可以加深对区块链的理解. 准备工作 本文要求读者对Python有基本的理解,能读写基本的Python,并且需要对HTTP请求有基本的了解. 我们知道区块链是由区块的记录构成的不可变.有序的链结构,记录可以是交易.文件或任何你

随机推荐