【入门系列】什么是区块链,如何将mysql改装成一个比特币网络

林彬 2019-05-06

在进行区块链开发之前,我们得先搞懂什么是区块链。
区块链顾名思义,是多个区块通过链式排列形成的一个链式数据,每个区块内存储多个交易信息,当然他也组合了P2P网路协议、共识算法、哈希算法、非对称加密等技术。
这样说起来可能有点晦涩,下面我们来通过一个小类比帮助我们更简单的理解一下,什么是区块链。

如何将mysql改装成一个比特币网络

1.基础结构
区块链本身其实也是一种存储技术,mysql相信大家都不陌生,我们通过简化mysql的查询和存储功能,同时加上区块链的关键技术,把他改装一下。
首先我们把mysql的复杂查询sql和备份等功能去掉,只留下基础的存储功能。在里面新建一张交易表(transactions),然后这张表设计三个字段from、to、quantity分别代表交易的发起方、接收方和交易数量。
由于交易表数据量可能会很大,我们进行一个简单的分表,把transactions分成transactions1、transactions2、transactions3……transactionsxxx,这样就形成了区块链最基本的数据结构
其中transactions1、transactions2这些表在区块链中被称之为区块,里面存的是交易数据。

2.网络协议
接下来就是网络广播了,区块链不是一个单独的服务器,比如比特币就有一万个以上的节点,每个full节点都维护着比特币全部的数据。
所以我们需要把mysql的数据文件分发到所有节点上,这里用到的技术是P2P网路协议。
我们准备把快播的点对点技术加入的我们的mysql中,让我们的mysql数据可以广播出去。
这里先说一下一个区块链的核心概念,去中心化。
要讲去中心化就要先了解一下中心化服务,我们现在所用的大部分手机软件都是中心化服务,比如说微信和淘宝,他们的所有服务都来源于腾讯阿里自己搭建的服务器,开发商对服务有着绝对的控制权。
而去中心化则是像快播这样的服务,快播上的所有影片资源理论上是都不存储在快播公司的服务器上的,而是分散的存储在所有的用户的机器上,用户在观看影片的时候接收别人提供的下载资源,同时开放已下载的资源供他人下载,迅雷电驴也是一样。

这里用到的技术主要是P2P网络协议,同样的,区块链也应用了这一技术。我们把mysql的数据文件导出,放到我们自己搭建的“快播”中,便形成了最基本的区块链网络,整个点对点网络中互通有无,各自维护一份完整的区块数据。

3.共识算法
上面的两个步骤,基本已经形成了一个简单的区块链网络。但是问题来了,如果每个人都可以随意修改区块数据,那么区块数据就没有任何价值,把比特币卖给别人,钱也收了,再给他改回来继续卖明显不符合常理。
所以我们要加上两个东西,一个是非对称加密(常见ecc椭圆算法),另外一个是pow或者pos共识算法
非对称加密主要用于交易签名,区块链的每个账号都有一个对应的私钥,私钥用于对每次发起的交易进行签名,节点在进行区块打包的时候要对所有交易进行签名验证,只有签名正确的交易才会被打包进区块。
那么区块是由谁来打包的呢,正如上面说的,区块链可能有上万个节点,但并非每个节点都可以打包数据,理论上来讲,一个区块只能由一个节点进行打包。而由谁打包便是由共识算法决定的。
现在主流的共识算法分为pow、pos和dpos,分别以比特币、以太坊、eos为代表。
pow(Proof of Work)工作量证明机制,区块链每10分钟出一次块,每个节点对上10分钟的数据进行验证打包,同时对区块进行哈希校验,谁最先校验出结果获得出块权和出块奖励,同时将出块结果广播到整个网络,其他节点验证结果后将结果存储到自己的节点。
pos(Proof of Stake)股权证明机制,一种通过持有量和持有时长进行奖励的机制,每个节点轮流出块,目前以太坊还是使用pow机制,未来会过度到pos,具体流程可以参考dpos。
dpos(Delegated Proof of Stake)授权股权证明机制, 所有的持有者选出一定数量的超级节点(eos是21个),仅有超级节点拥有出块权利。超级节点轮流打包区块并广播给所有节点(包括非超级节点),这种模式的优点是出块速度块,
目前eos每秒可处理的交易量是比特币的上千倍。

所以我们新增一个插入触发器,用于鉴定签名,若签名没有通过验证,不允许插入。再写一个定时任务定时将新数据拆分到分表中,拆表时对新表的所有数据进行哈希校验,第一个完成校验的人负责广播到P2P网络。

目前为止我们的mysql就顺利改装成了一个简易版本的比特币网络了,当然中间忽略了比如说Merkle树、SPV机制、智能合约等细节,后续会补充。
希望你有所收获。

评论列表
  1. 6
    2019-05-06

    6

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注