目录

背景

比特币从诞生到现在已经10年了,最近一段时间因为工作原因接触到了区块链相关的技术,为了揭开其背后的神秘面纱,我们就从头开始构建一个简单的区块链。在行动之前我们先看一下比特币的整体结构.

比特币内部结构

可以看到比特币主要有四个部分

previous hash(前一个区块的hash)

merkle root(默克尔树根节点,内部存储交易数据)

timestamp(当前区块生成的时间)

nonce(旷工计算hash值次数)

transaction_structure.png

我们实现的区块链数据结构(简单实现并不完整)

index 当前第几个区块

timestamp 该区块创建时的时间戳

data 交易信息

previousHash 前一个区块的hash

hash 当前区块的hash

注意点

第一个区块叫做创世区块(genesis block),区块链创建的时候默认生产的

这里用的是单纯的链表,不是用默克尔树存储

coding

from hashlib import sha256

//区块schema

class Block:

def __init__(self,index,timestamp,data,previousHash=""):

self.index = index

self.timestamp = timestamp

self.data = data

self.previousHash = previousHash

self.hash = self.calculateHash()

//计算当前区块的hash值

def calculateHash(self):

plainData = str(self.index)+str(self.timestamp)+str(self.data)

return sha256(plainData.encode('utf-8')).hexdigest()

def __str__(self):

return str(self.__dict__)

//区块链schema

class BlockChain:

//初始化的时候 创建 创世区块

def __init__(self):

self.chain = [self.createGenesisBlock()]

//构建创世区块

def createGenesisBlock(self):

return Block(0,"01/01/2018","genesis block","0")

//获取最后一个区块

def getLatestBlock(self):

return self.chain[len(self.chain)-1]

//往区块链里面添加区块

def addBlock(self,newBlock):

newBlock.previousHash = self.getLatestBlock().hash

newBlock.hash = newBlock.calculateHash()

self.chain.append(newBlock)

def __str__(self):

return str(self.__dict__)

//校验区块链是不是有效的 有没有人被篡改

def chainIsValid(self):

for index in range(1,len(self.chain)):

currentBlock = self.chain[index]

previousBlock = self.chain[index-1]

if (currentBlock.hash != currentBlock.calculateHash()):

return False

if previousBlock.hash != currentBlock.previousHash:

return False

return True

myCoin = BlockChain()

myCoin.addBlock(Block(1,"02/01/2018","{amount:4}"))

myCoin.addBlock(Block(2,"03/01/2018","{amount:5}"))

#print block info 打印区块链信息

print("print block info ####:")

for block in myCoin.chain:

print(block)

#check blockchain is valid 检查区块链是不是有效的

print("before tamper block,blockchain is valid ###")

print(myCoin.chainIsValid())

#tamper the blockinfo 篡改区块2的数据

myCoin.chain[1].data = "{amount:1002}"

print("after tamper block,blockchain is valid ###")

print(myCoin.chainIsValid())

输出结果

print block info ####:

{'index': 0, 'timestamp': '01/01/2018', 'data': 'genesis block', 'previousHash': '0', 'hash': 'd8d21e5ba33780d5eb77d09d3b407ceb8ade4e5545ef951de1997b209d91e264'}

{'index': 1, 'timestamp': '02/01/2018', 'data': '{amount:4}', 'previousHash': 'd8d21e5ba33780d5eb77d09d3b407ceb8ade4e5545ef951de1997b209d91e264', 'hash': '15426e32db30f4b26aa719ba5e573f372f41e27e4728eb9e9ab0bea8eae63a9d'}

{'index': 2, 'timestamp': '03/01/2018', 'data': '{amount:5}', 'previousHash': '15426e32db30f4b26aa719ba5e573f372f41e27e4728eb9e9ab0bea8eae63a9d', 'hash': '75119e897f21c769acee6e32abcefc5e88e250a1f35cc95946379436050ac2f0'}

before tamper block,blockchain is valid ###

True

after tamper block,blockchain is valid ###

False

python构建区块链_用python构建区块链(1)---基本结构相关推荐

  1. python画交互式地图_使用Python构建交互式地图-入门指南

    python画交互式地图 Welcome to The Beginner's Guide to Building Interactive Maps in Python 欢迎使用Python构建交互式地 ...

  2. keras构建卷积神经网络_在python中使用tensorflow s keras api构建卷积神经网络的初学者指南...

    keras构建卷积神经网络 初学者的深度学习 (DEEP LEARNING FOR BEGINNERS) Welcome to Part 2 of the Neural Network series! ...

  3. python爬房源信息_用python爬取链家网的二手房信息

    题外话:这几天用python做题,算是有头有尾地完成了.这两天会抽空把我的思路和方法,还有代码贴出来,供python的初学者参考.我python的实战经历不多,所以代码也是简单易懂的那种.当然过程中还 ...

  4. python之禅 中文_《Python之禅》中对于Python编程过程中的一些建议

    <Python之禅>中对于Python编程过程中的一些建议 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  <Python之禅>中对于Pyt ...

  5. 基于python的房地产数据分析_基于Python的数据分析

    转载 | CSDN 编辑 | 雷课小雷 下面来介绍一下基于Python的数据分析,主要介绍数据分析的概念.数据分析流程.Python优势.常用模块的用途以及使用Python进行数据分析的学习方法及步骤 ...

  6. python大数据免费_用python做大数据

    不学Python迟早会被淘汰?Python真有这么好的前景? 最近几年Python编程语言在国内引起不小的轰动,有超越Java之势,本来在美国这个编程语言就是最火的,应用的非常非常的广泛,而Pytho ...

  7. python大牛 关东升_《Python从小白到大牛》第4章 Python语法基础

    本章主要为大家介绍Python的一些语法,其中包括标识符.关键字.常量.变量.表达式.语句.注释.模块和包等内容. 标识符和关键字 任何一种计算机语言都离不开标识符和关键字,因此下面将详细介绍Pyth ...

  8. python库开源网站_开源Python库

    开源Python库 Python 一个很受人欢迎的原因之一是其有很丰富的第三方库,到本文开始写的时候已经在 PyPI 上有108298个第三方包提供.有人还对第三方库做了很好的总结 Awesome P ...

  9. python 预编译加速_让Python代码运行更快的最佳方式

    Python因其强大.灵活且易于使用等特性,而赢得了声誉.这些优点使其在各种各样的应用程序.工作流程和领域中得到了广泛应用.但是就语言的设计,也就是它天然的解释能力还有它的运行时的动态性而言,Pyth ...

  10. python做股票分析_利用Python进行股票投资组合分析(调试)

    pythonsp500-robo-advisor-edition Python for Financial Analyses 需要的镜像文件和数据--Robo Advisor edition. 小结 ...

最新文章

  1. 2020职场人裸辞三大原因:不开心、工资低、没有盼头
  2. XLS封装成EXE制作全攻略
  3. python如何移动文件却不覆盖现有文件_解决python不能覆盖文件内容的方法
  4. vsftpd 的配置项目
  5. ( 转)Hibernate常用API
  6. 利用Gulp实现JSDoc 3的文档编写过程中的实时解析和效果预览
  7. mysql语句获取当前时间,系列篇
  8. asp.net web.config连接mysql数据库_ASP.NET中使用web.config配置数据库连接
  9. Android界面布局基本属性
  10. java调用第三方短信接口 本地能发送短信,服务器却发不了,直到超时
  11. 此加载项为计算机上的所有用户安装但只能,win7系统控件无法安装的解决方法...
  12. 如何解决--Mac的磁盘工具无法对移动硬盘分区,分区按钮是灰色的?
  13. 生成对抗网络 Generative Adversarial Nets(GAN)详解
  14. python报KeyError: ('Age', 'occurred at index PassengerId')错误
  15. unity之使用FPS第一人称后鼠标消失
  16. java里面的scanner怎么关闭_作业。scanner怎么不能关闭
  17. 机器学习笔记(九)聚类算法Birch和层次聚类Hierarchical clustering
  18. 不买新电脑不能升级Win 11 ?旧版PC被踢出Win 11预览计划
  19. ui设计移动端字体适配_移动端UI设计尺寸规范(示例代码)
  20. 北方民族大学计算机科学与技术硕士,2014年北方民族大学计算机科学与技术考研调剂信息(第二批)...

热门文章

  1. 魔幻的“净醛产品”:宜家被罚“亡羊”,欧派用视频“补牢”?
  2. 那些赞助世界杯的金主,正在变成赌徒
  3. aspen plus大小_AspenPlus
  4. 数据库能承受多少并发量_在工业应用中,高温套管能承受多少度?
  5. 微波炉定时c语言程序,微波炉控制系统c语言编程.doc
  6. 组件skype服务器,Skype for Business Server 中的中介服务器组件
  7. php根据指定时间日历,php学习笔记(十三)时间处理与日历的实现
  8. Java oracle查询语句无法赋值给_java.sql.SQLException: 无法转换为内部表示 -〉java 查询oracle数据库返回错误信息...
  9. 5种Python统计次数的方法
  10. python如何判断两个数组完全相等?