文末有福利领取哦~
👉一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
👉二、Python必备开发工具
👉三、Python视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉 四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读者福利)
👉五、Python练习题
检查学习结果。
👉六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
但是这样会导致未来在A、B后都会增加相应的区块,那么谁长谁将作为主链延伸下去,另一个也许会渐渐被遗忘,除非哪天它变得更长。
3 区块链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改成“李四收到张三五十块”,然后又找张三要钱,那怎么办。
为了确保信息不被更改,我们需要对每个区块的内容进行加密或者哈希,因此上面代码修改如下:
这里需要一些知识储备,我已经总结好了:学习区块链的几个小知识(Python实现)
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个数据块的数据,但原始数据被其他人掌握着,因此他自己修改的数据就不会被采纳。由于区块链数据被分布存储在不同地方,于是在某项地方数据可能会被修改,这样就会出现数据不一致的情况,区块链还有一个重要任务就是在这种情况下达成共识。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!