小白能看懂,用Python实现一个区块链就是这么简单,对于我来说,除了平时努力工作之外,还需要对新技术保持一定的敏感度!每一项新技术的出现,都与未来的产业发展息息相关,蕴藏着巨大的机遇。工作之余,也要开阔眼界,对自己大有裨益!作为当下最火的语言,Python其实可以做很多事情。今天我们用Python来简单实现一个区块链。想想都爽!1、什么是区块?首先,区块链是一个去中心化的分布式账本数据库。简单的说,就是区块链的组合。那么里面的每个单元就是一个街区:图片来自天山学院。区块上有几个重要的属性:一个data数据,一个pre_hash和它自己的hash:1)。我们使用库函数hashlib来处理哈希计算操作2)。创建一个新的Block类来表示块,它包含两个属性(一个pre_hash,一个数据)3)。这个使用类属性@property装饰器去除hash值,也就是当我使用block.hash=xxx的时候,系统会自动调用这个hash函数。4).这个散列函数非常重要。我觉得你们区块链里面所有的数据都是用sha256加密的,也是一种安全性比较高的加密方式。我们将得到一个十六进制数据字符串值。其中一个区块很特别,就是创世区块!它是所有块的头部,它是父块,所以没有pre_hash#创世块#第一个块,也叫创世块,是没有父块的特殊块defcreate_genesis_block():returnBlock(data="GenesisBlock",prev_hash="")左右滑动代码2.定义一个区块链上面我们已经定义了区块,下面我们来定义一个区块链,将区块一一连接起来!我们需要再写一个类,将块一个一个地存储在列表中,形成一个列表链!1).我们声明一个BlockChain类,然后在里面设置一个区块列表数据结果来存放区块,先把父区块链放进去2)。添加一个add_block函数来添加区块:先生生成一个新的区块内存然后添加数据和它的哈希值将区块添加到区块链中3.实现区块链我们的区块和区块链已经准备好了,是不是有点小激动呢,著名的区块链,Python用几十行代码模拟。Python的快速开发确实很神奇。来看看效果:>>PrevHash:Data:GenesisBlockHash:89eb0ac031a63d2421cd05a2fbe41f3ea35f5c3712ca839cbf6b85c4ee07b7a3-----------------------------------------------------------------------------PrevHash:89eb0ac031a63d2421cd05a2fbe41f3ea35f5c3712ca839cbf6b85c4ee07b7a3Data:Jacksend1BTCtoSamHash:ad3ebab374b25e6f3d4f0f14465ff3f86020ce036b5d0b538--------c2a------------------------------------------------PrevHash:ad3ebab374b25e6f3d4f0f14465ff3f86020ce036b5b538c2a506de800dac524Data:Samsend2BTCtoliliHash:f9ba725838192731e73b8f28b33c88be9798c314ea7a538fc77e80039413b872----------------------------------------------------------------------看到我们总共创建了3个块:第一个块:它是父块,没有pre_hash,只有数据和一串哈希码第二块:是“Jacksent1bitcointoSam”其块的pre_hash指向上一个父块的哈希码第三块:是“Samsent2比特币给lili”。其区块的pre_hash指向前一个Jack区块4。区块链不可篡改。是的,那么区块链最强大的地方就是不可篡改。你为什么这么说?比如我们在中间修改了一个区块的内容,那时候它的hash会发生变化,那么后一个区块的pre_hash就会和前一个区块内部的hash不对应!看一下代码:我把第二块的数据改了,随便改一下里面的内容然后我们看看这个块中hash的变化:PrevHash:Data:GenesisBlockHash:89eb0ac031a63d2421cd05a2fbe41f3ea35f5c3712ca839cbf6b85c4ee07b7a3ValidBlock------------------------------------------------------------------------------------prevhash:89EB0AC031A63D2421CD05A2FBE41F3EA3E35C3712CA839CBF6BF6BF6BF6B85C4EE07B7A3DATA:JACKSEND1.3BTCTOALICEHASHPrevHash:ad3ebab374b25e6f3d4f0f14465ff3f86020ce036b5b538c2a506de800dac524Data:Samsend2BTCtoliliHash:f9ba725838192731e73b8f28b33c88be9798c314ea7a538fc77e80039413b872InvalidBlock-------------------------------------------------------------------------------因为修改了第二个块的内容,哈希值里面也变了,所以后面的块不能对应前面块的哈希,这就是区块链的不变性!因为是用sha256加密的,即使稍微改动一下,也不行!
