关于区块链从去年4月份开始进行全面了解,并且带着资金入场投资比特币以太坊后,对区块链去中心化去信任化和分布式账本的特性和思想迷住,当然同时感谢笑来老师,看了他写的几本书和付费跟随他的专栏一年,受到他的影响才一步步了解比特币和区块链。
如果说不懂编程不懂代码,完全可以用大众熟知的类比去认识新事物,要理解区块链的去中心化分布式账本,就想象一个古老村庄共同维护一本记账账本;要理解区块链的不可篡改历史记录,就想象在人民广场求婚被许多观众当证人一样;要理解区块链的区块(高度)与链(表),就好比书籍的页码与依次翻过的扉页。
相必去认识区块链的技术,也只能这样去类比、感知和想象,被不懂技术不懂编程这一道门槛拦住了进一步深入探索的去路从而失去深入思考和求证(别人口中的区块链)。当然笔者也不例外,虽懂点编程会开发写点代码,但比特币的源码一看头痛就没敢碰。所谓术业有专攻,编程也分很多种语言,笔者是前端网页开发攻城狮,对于底层编程语言如C/C++是望而却步。
不过好在随着区块链开发的教学视频出来后,就可以站在前人的肩膀上即便不懂那门编程语言,也可以愉快地被手把手教会,算是前人栽树后人乘凉,当然事实上是收费。
废话少说,直接贴代码,然后讲解笔者通过一个字一个字敲代码的心得体会。
import hashlib #加密模块
import datetime #时间模块
class DaDaBlockCoin:#区块链的类型
def __init__(self,
index, #数据的索引
data, #交易数据
prev_hash #上一个区块的哈希
):#初始化函数
self.index =index #数据的索引
self.timestamp=datetime.datetime.now() #交易时间
self.data =data #交易数据
self.hash=self.hash_DaDaBlockCoin() #当前的哈希
self.pre_hash=prev_hash #上一个区块的哈希
def hash_DaDaBlockCoin(self): #自身的哈希
sha = hashlib.md5() # 加密算法,
sha.update(( str(self.index )+str(self.timestamp)+ str(self.data)).encode("utf-8")) # 传递加密字符串
return sha.hexdigest() #十六进制的哈希值
def create_first_DadaBlock():#区块链的第一块
return DaDaBlockCoin(0,"liumaohua make dadacoin 100","0")
def create_money_DadaBlock(last_block): #根据上一块创建下一块
this_index=last_block.index+1 #索引
this_data="lovadada" +str(this_index) #交易数据
this_hash=last_block.hash #保存上一个哈希地址
return DaDaBlockCoin(this_index, this_data, this_hash) #创建区块
dadablockcoins=[create_first_DadaBlock()] #区块链第一个列表,仅有一个区块
nums=20
head_block=dadablockcoins[0] #存储第一个
print(head_block.index, # 打印区块链
head_block.hash,
head_block.pre_hash,
head_block.data,
head_block.timestamp
)
for i in range(nums):
dadablock_add=create_money_DadaBlock(head_block) #创建一个区块
dadablockcoins.append(dadablock_add)#加入区块
head_block=dadablock_add #循环
print(dadablock_add.index, #打印区块链
dadablock_add.hash,
dadablock_add.pre_hash,
dadablock_add.data,
dadablock_add.timestamp
)
这几十行代码简单实现了区块链的区块和链,知道了区块和链在代码中的含义。区块链在我看来更像是每个家庭的家族谱:
区块是家谱的那一页页纸,区块的本质是数组和对象,简单理解是家谱上的一页页纸和纸上要写的一代代人,也就是每一页是一个数组是一个区块,页纸上记录的人是一个对象具有人的属性,这里说明区块或页纸不重要,重要的是记录的人或者说记录的信息,这才是我们看重的部分。至于链的概念,也是把区块加上时间顺序的概念,如同家谱会每年周期性更新(注意不是更改)如谁家新生了一个孩子要上谱谁家女儿出嫁了要上谱。
理解了区块和链,接着理解区块链的不可篡改性,因为不可篡改是安全性、去信任化防止双花防止攻击的重要特征和预设,一旦有被篡改的现象发生说明预设被打破,区块链的安全性也就被诟病,进而区块链的意义就不复存在。那么不可篡改如何理解,要理解并不难,重点明白一个词——哈希,哈希简单来说是固定长度的字符串,不同的加密算法会生成不一样长度的字符串,为了大家直观感受哈希的魅力,这里贴出一个在线生成哈希的工具网站:
http://www.fileformat.info/tool/hash.htm
感兴趣的读者可以尝试输入不同的文本,可以输入数字、字母和中文,相应地会生成各种长度的哈希值,然后请注意重点,每当你改变输入的数字、字母或中文,哪怕是微小的改变比如数字1改成大写字母I,生成的哈希也会发生很大的改变,用肉眼也能感知到哈希的变化,当你感受到变化的那一刻,你就能感受到哈希的魅力所在。而且哈希在区块链中无所不在,你的数字货币每一笔充值、提现和转账都会有一个交易id,而这个id值就是哈希;每一笔交易哈希会存放在区块中,区块和区块之间也就是上一个区块链和下一个区块,也是通过哈希链接🔗的,根据交易哈希和时间点再次生成哈希,进而广播出去被见证后就不能再修改了,所以到此才明白区块链的不可篡改性。
小结
通过代码再次温习区块链的知识好像通过触摸感受到了温度一样那么暖心,即使区块链的行情冷冰冰。当然区块链的魅力不仅在于以上提到的点,还包括没有提及的点如分布式网络、共识机制、节点矿工和加密算法。后续有机会深入学习会再次输出并分享自己对区块链的认知。
网友评论