2018年最火的科技是什么?毫无疑问,就是区块链。区块链诞生于今年年初。其实对于我们码农来说,除了努力工作,还要对新技术保持敏感!每一项新技术的出现,都与未来的产业发展息息相关,蕴藏着巨大的机遇。工作之余,也要开阔眼界,对自己大有裨益!作为当下最火的语言,Python其实可以做很多事情。今天我们用Python来简单实现一个区块链。想想都爽!01.什么是区块?首先,区块链是一个去中心化的分布式账本数据库。简单的说,就是区块链的组合。那么其中的每一个单元就是一个区块:区块上有几个重要的属性:一个data,一个pre_hash和它自己的hash:1.我们使用库函数hashlib来处理hash计算操作2.新建一个Block类,表示block,有两个属性(一个pre_hash,一个data)3.这个是为了方便,类属性@property装饰器用来去掉hash的值,也就是我用block.hash=xxx的时候,系统会自动调用这个哈希函数。4.这个hash函数很重要。我觉得你们区块链里面所有的数据都是用sha256加密的,也是比较安全的一种加密方式。我们最终会得到一个十六进制的数据字符串值。其中一个区块很特别,就是创世区块!它是所有区块的头部,他是父区块,所以没有pre_hash02。定义区块链上面我们已经定义了区块,下面我们来定义一个区块链,将区块一一连接起来!我们需要再写一个类,将块一个一个地存储在列表中,形成一个列表链!1).我们声明一个BlockChain类,然后在里面设置一个区块列表数据结果来存放区块,先把父区块链放进去2)。添加一个add_block函数来添加块:先生生成一个新的块内存然后添加数据和它的哈希值***将块添加到区块链03.实现区块链我们的块和区块链已经准备好了,是不是有点激动人心,大名鼎鼎的区块链,模拟了几十行Python代码,Python的快速开发确实厉害。来看看效果:>>PrevHash:Data:GenesisBlockHash:89eb0ac031a63d2421cd05a2fbe41f3ea35f5c3712ca839cbf6b85c4ee07b7a3------------------------------------------------------------------------------PrevHash:89eb0ac031a63d2421cd05a2fbe41f3ea35f5c3712ca839cbf6b85c4ee07b7a3Data:Jacksend1BTCtoSamHash:ad3ebab374b25e6f3d4f0f14465ff3f86020ce036b5d0ac5368c2a--------4------------------------------------------------------------prevhash:AD3EBAB374B25E6F3D4F0F1465FF3F86020CE036B5B5B538C2A52A524DAC524DAC524DATA:SAMSSEND2BTCTOLILILILILILILILILILILILILILILILILILILILILILILILILILILILILILILILILILILILIHIHHBE:F9BA7258838819288128128BBBBBER------------------------------------------------------看到我们一共创建了3个区块:第一个区块:是父区块,没有pre_hash,只有数据和一串哈希码第二个区块:是“Jack”所在区块的pre_hash发送1个比特币给Sam的是指上一个父块的哈希码第三个块:它是“Samsent2bitcoinstolili”其块的pre_hash是指上一个TheJackblock04。区块链不可篡改。如果修改了中间一个块的内容,此时它的hash会发生变化,那么后面块的pre_hash就不会对应上一个块的hash了!我们看代码:第二块,随便改里面的内容然后我们看看这个块中hash的变化:PrevHash:Data:GenesisBlockHash:89eb0ac031a63d2421cd05a2fbe41f3ea35f5c3712ca839cbf6b85c4ee07b7a3ValidBlock------------------------------------------------------------------------------------prevhash:89EB0AC031A63D2421CD05A2FBE41F3EA3E35C3712CA839CBF6BF6BF6BF6B85C4EE07B7A3DATA:JACKSEND1.3BTCTOALICEHASHPrevHash:ad3ebab374b25e6f3d4f0f14465ff3f86020ce036b5b538c2a506de800dac524Data:Samsend2BTCtoliliHash:f9ba725838192731e73b8f28b33c88be9798c314ea7a538fc77e80039413b872InvalidBlock-------------------------------------------------------------------------------因为修改了第二个块的内容,哈希值里面也变了,所以后面的块不能对应前面块的哈希,这就是区块链的不变性!因为是用sha256加密的,即使稍微改动一下,也不行!好了,以上就是用Python对区块链的简单介绍,挖矿(proofofwork)的环节就不多说了。这一次,我将通过Python语言本身来理解区块链。我不知道你感觉如何。欢迎留言讨论!文末知识点总结:99%的编程误区都会掉进去。前天有读者在微信上问我这样一个问题。这样的问题可以推导出,在学习编程的过程中,我们需要如何去学习那些难懂的编程概念。每一种编程语言都会有自己的特点,比如C++有指针操作,Java有类的概念,Python有字典数据结构。这些语言独有的特点也是它们的魅力所在。大家在学习一门编程语言的时候,都是从最基础的语法开始学起的。比如Python,很多教程简单介绍了Python的一些语言特性,然后开始固有的章节“WriteyourfirstXXXcode”,也就是写一个输出“helloworld”。随着进一步的学习,你会遇到更高级的语法。比如Python的多线程、正则表达式、匿名函数、装饰器等,掌握这些高级语法可以让你的代码更加优雅。但是相应的就比较难理解了。大多数人在学习高级语法时,都是一头雾水。看了很多资料,还是把握不住。概念学习这时候,你就陷入了“概念学习”的误区。我觉得必须先把概念学好,理解了,才能用好。以至于到了最后,就像当初的读者一样,越学越抽象,越学越不知所措。编程本来就是一门注重实战的学科,用学到的知识去解决实际的项目。在项目中,磨练你所学到的东西。但是大多数人本末倒置,认为我必须把所有的编程语法都学好,一个都不能掉队。但是这样的学习效率很低,而且越学越迷茫,越学越对编程失去兴趣,最后放弃编程。项目驱动学习不要盲目陷入编程语法,要了解项目驱动学习。你只需要学习一点编程的基础知识,然后尽可能多地做项目。在做项目的过程中,肯定会遇到很多困难,也会遇到很多不懂的语法。但是在项目中遇到的语法会让你确切地知道这个语法可以做什么。这就好比,你在玩游戏的时候,买了一件装备,知道这件装备很厉害。这个时候你再回去看看装备的介绍,你就会明白为什么装备这么厉害了。在项目中学习也是如此。当遇到难以理解的东西时,这时候可以回头查找相关资料,学习效率会大大提高。那些晦涩的概念很容易理解。
