看一百本书学习游泳,不如下一次水。实践永远是掌握一门知识最有效的方法。
要发车为零基础小白准备了此文,如果你有一定的python基础,会获得更好的阅读体验。
python是一款简单易上手的计算机程序设计语言,本文中代码所用python版本为最新的python3.6版;用到的python库为hashlib库(用来生成哈希值),以及datetime库(用来生成时间戳)
那我们开始吧。
我们先来梳理一下。
区块链是什么?
简单说它就是一个全民参与记录的大账本,在坐的各位都能平等地参与其中。
区块链用来干什么的?
让历史记录数据的可靠程度达到最高级,因为全民参与都盯着呢,谁都无法偷偷篡改数据。
区块一般长啥样?
你脑海中浮现的第一个形象,对,就是它。我们再把它打理一下,给戴上一个哈希散列帽子、拿着本写着交易数据的红本本,胸前挂上个印有当前时间戳和员工号的工牌,是的,区块链就长这样。如果再完成一些训练,它就可以光荣上岗啦。
链是怎么形成的呢?
依然是上面那个区块小哥,它第一天到要发车上班,要和岗位上的前一个老员工交接,交接的主要工作就是用自己的哈希帽上的仪器扫描下交接的员工,包括这个老员工的红本本和哈希帽,这样老员工的所有信息都变了种形式保存在区块小哥的哈希帽里了。
如此一来,一方面可以通过区块小哥头上的哈希帽查到交接员工的身份,另一方面如果之后交接的老员工偷偷改了自己的工作数据,在区块小哥这也能查出来。这样该岗位上的坐过班的所有员工的身份及工作记录就被哈希帽连接了起来,形成一个区块链。
基于以上内容,我们来直接上手做一个发车链(fachechain),这个发车链的工作就是记录新来的员工及其工作内容。
上面我们说到的区块小哥就具有区块链的一般结构:除了自己的交易数据和当前区块产生时的时间戳,还包含前个区块的哈希值。
那么一个发车链中,区块员工在程序中的定义就是下边这样子。
接下来的部分是对代码的解说,可以左右拖动噢~
classyaofacher:#定义员工类,以后在要发车上班的区块员工们都长这样
def__init__(self, index, timestamp, data, previous_hash):
self.index = index#区块编号,可以知道每个区块在链中的位置
self.timestamp = timestamp#时间戳
self.data = data#红本本上的交易数据,可以是任意数据
self.previous_hash = previous_hash#前个区块的哈希值
self.hash =self.hash_hat()#自己的哈希值
defhash_hat(self):#生成区块自身的哈希值,也就是按照区块小哥的情况做出的专属于自己的哈希帽
sha = hasher.sha256()
sha.update(
bytes(
str(self.index) + str(self.timestamp) + str(self.data) + str(
self.previous_hash),'utf-8'))
returnsha.hexdigest()
我们刚知道区块小哥需要用哈希帽扫描老员工来完成工作交接,那么老员工之前交接时得扫描老老员工,老老员工交接时......这么一直追朔回去,那第一个员工应该扫描谁?
答案是第一个元老员工它一般是被直接手动创造出来的,所以我们也尊称它为创世区块。
那么我们接下来就设计一个创造创世区块的简单函数,如下。记得左右拖动,哈哈~
有了创世区块之后,接下来就是招募新的区块来换岗~~
我们来生成后续区块的函数,设计招募工作。(左右拖动~我的滑板鞋)
做好以上准备工作之后,我们就可以发车了。
设计让发车链运行起来的函数!
defmain():
fachechain = [create_genesis_yaofacher()]#创建发车链,并为其创造一个创世区块
previous_yaofacher = fachechain[]#创世区块变成后一个区块的‘上一个区块’
num_of_yaofacher =5#定好要在发车链上加入几个发车员工,我们先预定五个
foriinrange(, num_of_yaofacher):#用循环的形式来实现新区块员工的不断加入
yaofacher_to_add = next_yaofacher(previous_yaofacher)#在上一个区块员工的基础上,创建新的区块员工
fachechain.append(yaofacher_to_add)#把新区块员工也加入发车链上
previous_yaofacher = yaofacher_to_add
# 需要把要发车员工的工作情况广播给所有人,这里先用最简单的打印来代替广播
print("员工{} 加入了发车链!".format(yaofacher_to_add.index))
print("它的工作是: {}".format(yaofacher_to_add.data))
print("它的哈希值是: {}".format(yaofacher_to_add.hash))
print("时间戳: {}".format(yaofacher_to_add.timestamp))
print("--Y--F--C--\n")
if__name__ =="__main__":
main()
以上发车链的代码运行后输出结果是这样的
员工1 加入了发车链!
它的工作是: 发车 1
它的哈希值是: afdfad2001384f6b2e27d782e4cc12fb67d677f1a56da06065fe66176efcabe8
时间戳: 2018-03-23 07:35:09.541714
--Y--F--C--
员工2 加入了发车链!
它的工作是: 发车 2
它的哈希值是: 5a690108397e64247462ed9f9efb24f60aacf22cc7d5bea9231f9b86ace5685c
时间戳: 2018-03-23 07:35:09.541765
--Y--F--C--
员工3 加入了发车链!
它的工作是: 发车 3
它的哈希值是: 3a851e8ab43a6ffca3de9372f8cc81063d746504d6ed0275657c4be6114a235f
时间戳: 2018-03-23 07:35:09.541795
--Y--F--C--
员工4 加入了发车链!
它的工作是: 发车 4
它的哈希值是: 816680e6ae36f17ee4918cb8dd1226b6fd61ea1d85d76aec294ef831777b0b1e
时间戳: 2018-03-23 07:35:09.541825
--Y--F--C--
员工5 加入了发车链!
它的工作是: 发车 5
它的哈希值是: d0361583819228548191f969b2c49d2e2937cce2b0124c8d4f52a1d20b08da82
时间戳: 2018-03-23 07:35:09.541853
--Y--F--C--
到此我们已经完成链一个最简单的区块链——发车链的搭建。
如果同学们有兴趣进一步了解,我们可以在后续的文章中继续,在上文发车链的基础上,添加工作量证明模块、挖矿功能等,来使你的区块链更丰满。
最后附上完整的代码,同学们可以直接复制代码,在以下网站上直接粘贴运行
https://c.runoob.com/compile/9
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import hashlib as hasher
import datetime as date
classyaofacher:#定义员工类,以后在要发车上班的区块员工们都长这样
def__init__(self, index, timestamp, data, previous_hash):
self.index = index#区块编号,可以知道每个区块在链中的位置
self.timestamp = timestamp#时间戳
self.data = data#红本本上的交易数据,可以是任意数据
self.previous_hash = previous_hash#前个区块的哈希值
self.hash =self.hash_hat()#自己的哈希值
defhash_hat(self):#生成区块自身的哈希值,也就是按照区块小哥的情况做出的专属于自己的哈希帽
sha = hasher.sha256()
sha.update(
bytes(
str(self.index) + str(self.timestamp) + str(self.data) + str(
self.previous_hash),'utf-8'))
returnsha.hexdigest()
defcreate_genesis_yaofacher():
returnyaofacher(, date.datetime.now(),"创世","0")#编号为0,时间戳就是被创造时刻的时间,数据内容就为‘创世区块’,前个区块的哈希部分就可以任意填。
defnext_yaofacher(last_yaofacher):
this_index = last_yaofacher.index +1#新区块员工编号,在老员工的编号上加1
this_timestamp = date.datetime.now()#新区块员工坐班时间点
this_data ="发车 "+ str(this_index)
this_hash = last_yaofacher.hash
returnyaofacher(this_index, this_timestamp, this_data, this_hash)#表示引用这个函数后就会得到一个后续的区块
defmain():
fachechain = [create_genesis_yaofacher()]#创建发车链,并为其创造一个创世区块
previous_yaofacher = fachechain[]#创世区块变成后一个区块的‘上一个区块’
num_of_yaofacher =5#定好要在发车链上加入几个发车员工,我们先预定五个
foriinrange(, num_of_yaofacher):#用循环的形式来实现新区块员工的不断加入
yaofacher_to_add = next_yaofacher(previous_yaofacher)#在上一个区块员工的基础上,创建新的区块员工
fachechain.append(yaofacher_to_add)#把新区块员工也加入发车链上
previous_yaofacher = yaofacher_to_add
# 需要把要发车员工的工作情况广播给所有人,这里先用最简单的打印来代替广播
print("员工{} 加入了发车链!".format(yaofacher_to_add.index))
print("它的工作是: {}".format(yaofacher_to_add.data))
print("它的哈希值是: {}".format(yaofacher_to_add.hash))
print("时间戳: {}".format(yaofacher_to_add.timestamp))
print("--Y--F--C--\n")
if__name__=="__main__":
main()
交流行业可加作者微信:
吴嗷:wfshan。我…...我是一个区块!嗷~~呜!
往期原创精选
领取专属 10元无门槛券
私享最新 技术干货