比特币从诞生到现在已经10年了,最近接触到了区块链相关的技术,为了揭开其背后的神秘面纱,我就从头开始构建一个简单的区块链。
从技术上来看:区块是一种记录交易的数据结构,反映了一笔交易的资金流向。系统中已经达成的交易的区块连接在一起形成了一条主链,所有参与计算的节点都记录了主链或主链的一部分。
比特币内部结构有四部分:
注意:当前实现了一个简单的区块链结构,并不完整。
代码如下:
"""
区块设计
"""
import time
import hashlib
class Block:
# 初始化一个区块
def \_\_init\_\_(self,previous\_hash,data):
self.index = 0
self.nonce = ''
self.previous\_hash = previous\_hash
self.time\_stamp = time.time()
self.data = data
self.hash = self.get\_hash()
# 获取区块的hash
def get\_hash(self):
msg = hashlib.sha256()
msg.update(str(self.previous\_hash).encode('utf-8'))
msg.update(str(self.data).encode('utf-8'))
msg.update(str(self.time\_stamp).encode('utf-8'))
msg.update(str(self.index).encode('utf-8'))
return msg.hexdigest()
# 修改区块的hash值
def set\_hash(self,hash):
self.hash = hash
创世区块:没有前一个区块,这里的previous_hash
和data
是自己写死的。
\# 生成创世区块,这是第一个区块,没有前一个区块
def creat\_genesis\_block():
block = Block(previous\_hash= '0000',data='Genesis block')
nonce,digest = mime(block=block)
block.nonce = nonce
block.set\_hash(digest)
return block
这里的mime()
函数是后面的挖矿函数.
代码如下:
def mime(block):
"""
挖矿函数——更新区块结构,加入nonce值
block:挖矿区块
"""
i = 0
prefix = '0000'
while True:
nonce = str(i)
msg = hashlib.sha256()
msg.update(str(block.previous\_hash).encode('utf-8'))
msg.update(str(block.data).encode('utf-8'))
msg.update(str(block.time\_stamp).encode('utf-8'))
msg.update(str(block.index).encode('utf-8'))
msg.update(nonce.encode('utf-8'))
digest = msg.hexdigest()
if digest.startswith(prefix):
return nonce,digest
i+=1
代码如下:
"""
区块链设计
"""
from Block import \*
# 区块链
class BlockChain:
def \_\_init\_\_(self):
self.blocks = \[creat\_genesis\_block()\]
# 添加区块到区块链上
def add\_block(self,data):
pre\_block = self.blocks\[len(self.blocks)-1\]
new\_block = Block(pre\_block.hash,data)
new\_block.index = len(self.blocks)
nonce,digest = mime(block=new\_block)
new\_block.nonce = nonce
new\_block.set\_hash(digest)
self.blocks.append(new\_block)
return new\_block
在添加新区块到区块链时,先挖矿在将新区块加入区块链。
测试代码:
from BlockChain import \*
# 创建一个区块链
bc = BlockChain()
# 添加区块
bc.add\_block(data='second block')
bc.add\_block(data='third block')
bc.add\_block(data='fourth block')
for bl in bc.blocks:
print("Index:{}".format(bl.index))
print("Nonce:{}".format(bl.nonce))
print("Hash:{}".format(bl.hash))
print("Pre\_Hash:{}".format(bl.previous\_hash))
print("Time:{}".format(bl.time\_stamp))
print("Data:{}".format(bl.data))
print('\\n')
运行结果:
这里添加了4个区块(包括创世区块),处了创世区块,每个区块的pre_hash
都与前一个区块的hash
值相等,这代表区块没有被篡改,数据有效。
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
保存图片微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
② 路线对应学习视频
还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述
③练习题
每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
因篇幅有限,仅展示部分资料
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以保存图片微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】