欢迎来到懒区块公众号,本文由懒区块整理撰写,不经过允许,切勿转载。本系列有十二篇文章,这十二篇文章介绍了区块链技术的简史、应用、预测和展望。您的每一次关注、转发、收藏都是我们更新优质内容的源动力。
各位小伙伴们晚上好,懒区块的前四篇文章中,我们将区块链的起源、优缺点和如何挖矿介绍清楚了。面对市面上数千种山寨币,我们今天来简单实现一个丑陋无比的山寨币系统来作为区块链技术的一个简单应用。好吧,既然要制作山寨币了,我们首先来起一个名字吧,就叫做“懒币”吧。名字无所谓,开始我们的旅途吧,了解下众多山寨币是如何被收割的。
市面上众多的山寨币
首先我们先简单地来了解下“懒币”系统中的块结构,为了保证本次教程中山寨币系统足够简单易懂,我们只选择了必要的这些部分:index(索引)、hash(长度为256位的随机数,是区块的唯一标志)、previous_hash(上一个区块的唯一标志)、timestamp(用于记录该区块的诞生时间)、difficulty(直接体现创造该区块的难度)、nonce(随机数,主要用户产生下一个区块)和data(存储交易信息,只有这个存在去块体中),我们可以来用一张图片简单描述下。
区块链结构
看了上面的结构,我们大概可以看得出区块之间是如何链接的,并且是如何存储数据的。在这里我们提出几个小问题:一个是为什么产生新区块,不能讲所有信息写到一个区块中么,第二个是怎么产生新的区块。首先来解释第一个问题,为什么要产生新的区块,在之前的文章中,我们讲到,一个区块记录就对应着一条记录,账单中存在着若干条交易记录这是双方交易的最好证明,记录是每天在增长的,不可能存放在同个区块中,这样就跟中心化存储没有什么区别了。在前两篇文章中,我们讲到了挖矿,其实挖矿的过程就是产生新区块的过程。开始我们的教程吧,感谢知乎BmwGaara提供简易思路,我们接下来几天里,会在这个程序的基础上打造一个真正的山寨币系统(懒币)。首先我们来创建一个区块链的类,本文所用代码为Python,版本为2.3,首先我们创建一个区块链类:
创建一个类表示区块链
其中chain表示存储的所有区块,在这里为了方便,我们将chain存储在内存中,而在真正的区块链系统中,区块是被写入到硬盘中并且加密的,miner表示当前系统所有挖矿的矿工,results表示每次挖矿所有矿工的结果,generate_block方法表示生成新的区块,如果区块index=0表示创世区块。last_block方法表示返回当前区块链系统的最后一块:
last_block方法
generate_block方法用来生成交易信息,在这里我们使用python的random随机简单模拟,在真正的区块链系统中,交易生成的数据是真实存在的,并非随机模拟的。
generate_trans方法
接下来我们来处理生成新块的方法,方法名为generate_block,生成块的方法需要区别是否是创世块,在此,我们传入init_hash参数来判断是否是创世块,并且引入多线程来模拟矿工进行同步挖矿,最后通过计算挖矿的时间哪个矿工最少来判断谁是第一个挖矿的,在第一版系统中,只需要矿工计算出哈希值,并且其最后一位是0就算挖到了区块,这里的挖矿规则可以来设置不同,并且我们设置6个矿工,同时进行挖矿来做对比(当然在比特币系统中,矿工是进行大量计算模拟解,只要有一个矿工将解计算出来即通知全网,也就是快着优先,与我们这里的思路存在少量差异,不过小伙伴们不用担心,后面我们会慢慢完善)。
generate_block方法
接下来我们用一个简单的类表示区块存储的数据,并且有一个get_block方法可以获取到该区块的数据。
Block类
接下来就是区块链系统中最核心的部分——矿工,矿工作为区块链系统的生产者和推进者,在矿工类中,只有简单的两个方法,一个是mine表示挖矿,一个是generate_hash表示推理哈希值的过程(该算法为计算哈希值最后一位是否为0,为0的话就是计算出区块成功)
Miner类
程序基本就到这里,在这里我们可以来简单的看下这6个矿工挖的第一个区块(创世块被称为第0块):
第一个区块挖矿结果
我们在这里可以看到6个矿工挖矿的时间结果是不一样的,第一个矿工最快。在这里我们为了简化流程,简单将矿工计算时间最短的记为挖矿成功,并且将其结果写入到主链中(在比特币中,挖矿成功与这个思路存在差异),我们来看下最后整个懒币区块链的全部结果(总共6个区块):
懒币系统所有区块
领取专属 10元无门槛券
私享最新 技术干货