区块链从零开始完全明白
写这篇博文是以一个大三学生的角度,以一些通俗一点的语言给大家普及一下什么是区块链,可能文章中很多说法存在错误以及问题,希望能包含并且提出,以便尽快改正。
简介
首先我们要了解什么是区块链以及为何需要区块链这个东西。
为了方便大家理解,这里先说用途,很简单,就是用来记账,也就是账本。为什么用区块链记账呢,好处是什么呢?好处是这个账本人手一个,且大家都一样并且无法被改变,并且每一笔账都能被找到。无法被改变就是其最厉害的地方。具体怎么实现的呢,我们后面会说到,大家先有个印象,不要将区块链想得太复杂,就是一个无法被改变的且无限大可以溯源的账本而已。
然后是什么是区块链,顾名思义,由区块组成的链。为什么能够记账呢,就是将交易的记录放在区块里罢了,然后再把区块用链连起来,就形成了区块链。
区块链还有一些好处,也就是分布式、去中心化。就如同不让一个人保存账本,要是这个人私自改了也没人知道,也就形成了麻烦。使用区块链就能避免这个问题。
加密
在详细了解区块链的知识之前,我们需要先了解一些加密相关的知识。
加密分为两类,对称加密和非对称加密。
什么是对称加密呢,通俗来讲就是一把锁,开锁和解锁是同一把钥匙,这就是对称加密。
那什么是非对称加密呢,加锁和解锁的钥匙不同,且需要成对使用,这就是非对称加密,同时,非对称加密加锁的钥匙称为公钥而解锁的钥匙称为私钥。公钥可以公开给所有人,但私钥需要自己保存。
这两种加密方式各有优缺点,对称加密,速度快,但是存在一个密钥如何传输的问题,我这上锁了,我要怎么把密钥安全的给你呢?而对于非对称加密则是安全性非常高但速度很慢。
所以区块链则将这两种技术结合起来,用非对称加密进行密钥的分发而对称加密用于数据传输。将传输的数据使用对称加密,然后将对称加密的密钥用交易的人提供的非对称加密的公钥加密,然后再传输给交易的人,然后交易的人拿到后通过自己的私钥解密获得密钥后,再解密得到相应的数据。从而结合两者优势,安全也迅速的完成数据的传输。
还有一个需要说明的地方,非对称加密中公钥和私钥除了用于加锁和解锁外,还有一个功能。即私钥用于签名,公钥用于验证。什么是签名呢,即表明这个东西是你提供的,你签了名,且这个签名被验证成功了,就表示这个东西就是你提供的。比如你要向你的老板给一份数据,但老板不知道这份数据是你给的,因为可能你把数据给你老板的中途被调换之类的,所以你就用你的私钥在这份数据上进行签名(签名不会暴露自己的私钥),然后将公钥给你的老板,你的老板用公钥来验证这份数据上的签名,验证成功后,就能放心打开数据了。所以在区块链交易中,签名也是必不可少的一部分。
最后很重要的一部分就是加密的算法,我们这里就介绍哈希加密算法,常见的有MD5和SHA256/512,MD5已经比较过时了,现在用的基本是后者,256和512代表的是加密后的比特位,任何数据经过SHA256/512哈希算法加密后,都会形成256或者512位数据,且无法反推,且任何两个不同的数据会经过hash后得到的肯定是两个不同的256/512位的数据(哈希冲突在该算法中可以认为不存在)。然后这里再提一下签名,签名是将数据的哈希值通过一些算法进行签名,即和数据本身无关,因为签名只用证明发送方即可,和具体的数据无关。
区块具体实现
我们这里就开始正题说一下区块到底是什么。一个区块就可以看作一个矩形,分为两个部分,头部和身体部分,前面说到过区块里存交易记录,这个记录就存放在区块的身体部分里,存着一条又一条的记录。如下图
那头部存什么东西呢,首先需要存这些所有交易记录的哈希值,即保证如果有一条记录发生任何改变,哈希值肯定发生变化,所以这就保证了交易记录的不可更改。其次需要存一个区块高度,什么是区块高度呢,也就是区块的编号,我们说过区块链是将区块一个个链起来,所以就存在前后顺序,即存在编号,所以还需要存一个编号。然后还需要存一个版本号,这个就不是很重要。同时交易记录的哈希值具体怎么得出的,我们后面还会具体说到和一个merkle tree相关。其次头部里还要存一个值,前面所有区块的总哈希值,即保证如果一个想要改变一个区块的记录,需要将其前面所有区块记录都改变,因为哈希值是唯一的,所以这也保证了所有区块中记录的不可改变且可溯源。最后头部里还要存一个很关键的值,nounce值,一个随机值,具体用来干嘛我们后面会一一道来。
所以区块链就可以简单看作下图
比特币
将区块链肯定离不开比特币这个东西,也正是这个东西推动区块链的发展。
首先我们从一笔交易开始,假设这样一个场景,A从B处买了一台电脑,3500元,A付给B5000元,B找给A1400元,还剩下100元作为小费。(小费可以这样理解,你这笔交易想要尽快完成即想尽快A拿货B拿钱,就需要付小费,这笔小费是给矿工的),这就是一次交易,但这样的交易在区块链中形成的交易记录是这样的,如下图
我们可以看到,其中小费的部分没有在其中体现出来,为什么呢,这就牵扯到下一个重要的点——矿工。
我们经常听到挖矿挖矿,所以到底什么是挖矿,什么又是矿呢?
首先我们需要明确,我们的交易,不是立马就完成的,只有当这笔交易记录在区块链上,也就是存在于某一个区块上,这笔交易才算完成。那区块是如何形成的呢,是算出来的,谁来算呢?怎么算呢?
矿工来算。矿工可以选择一些交易记录来形成区块,形成区块后,小费就归矿工了,所以矿工肯定会选择小费高的交易记录了,这也解释了为何A一定要给一部分小费。
那怎么形成区块呢,我们前面说过,区块头部里存了该区块所有交易的哈希值,以及前面所有区块的总哈希值,所以这两部分是无法改变的,也是现成的,要形成区块,这两部分是必须的,因为保证了交易的不可改变且可溯源。然后除了这两部分,还有一个东西,就是前面说到的nounce值,这三者结合再哈希得到的值,满足前多少多少位为0,则代表成功,就代表算对了,这个区块就能形成了。所以矿工是干嘛的,就是耗费电力、算力来随机生成这个nounce值,来使得三者的哈希值满足条件,进而形成区块。这个过程,就叫做挖矿,也可以用POW(工作量证明)来表示,表示你浪费了电力、物力来算这个nounce值,有资格获得小费,也就是比特币。
交易广播
前面比较笼统的说了相关交易和比特币以及挖矿的问题,这里我们就具体说下其实现问题。
一笔交易,形成后(还没有进入区块,只是A付了钱),会向全网进行广播,也就是所有节点都收到了这笔交易的记录,节点对这个记录进行验证,也就是验证A是不是付了钱、B的账户地址等等问题,验证成功后,节点就将这个记录,放进交易缓存池,这个池子里放了很多的交易记录,但还没有形成区块,等着矿工去里面选呢,选小费高的记录去形成区块。这就是广播的第一个使用的地方。让这笔交易进入全网。
因为矿工是很多的,所以当几个矿工同时在计算该链上下一个区块时,就存在先后顺序了。我们用下图来表示
可以看到,ABC同时计算一个区块,此时A先算出来了,他就会立刻进行广播表示自己算出来了,然后BC收到广播后,就会停止计算并验证A是否计算正确,正确了的话,就将这个区块上链了,然后大家重新去缓存池里拿交易上链。这就是一个竞争的过程。
还有一种情况,就是两个人一起完成了计算,因为只要保证算出来前几位为0即可,情况是很多的,所以可能两个不一样的区块但都满足条件。我们考虑AB同时计算出来,此时,又会如何呢,我们看下图
区块链会将两个区块都上链,然后让大家继续计算,因为两个区块后面的区块大家也都能进行计算,所以会存在某个链上(A和B链)先生成下一个区块C的情况,例如A后先计算出来一个区块C,此时C就会进行广播了,广播后,B就被抛弃了,A+C作为主链了。当然如果B上先生成也是同理。此时另一个区块被抛弃后,里面的交易记录就重新回到了缓存池,那矿工的小费呢,下面继续说。
这就牵扯到区块验证问题了,因为存在这种同时计算出区块的问题,所以区块链中规定了,当前区块形成后,在该区块后再追加6个区块后,这个区块里的交易才算真正完成,矿工才能拿到钱,即保证这个区块不会被抛弃。那为何是6个区块呢,因为根据相关计算,在领先6个区块的情况下,不可能存在一个新的链(从那个区块开始)替代该链,即不会存在一个比该链更长的链来替代。进而保证交易的完成,小费也能成功进入矿工手里。
merkle tree
然后这里再说一下前面提到的merkle tree,这是可以看作一个数据结构,也就是一个二叉树,但这个树是一棵完美二叉树。
这棵树是怎么形成的呢,所有的交易作为叶节点,然后两两进行哈希形成父节点,如果是奇数个叶节点,则会复制一个叶节点,使其自身和自身哈希,然后父节点也同样两两哈希,一直到形成一个根节点。而区块头部信息里,就存的是该根节点的值。
具体的实现可以参考这篇博文merkle tree
然后这棵树有什么用呢,可以用来验证,验证什么呢,验证某一笔交易是否存在于区块链中,具体的验证方法,也就是和merkle tree原理相关。参考上面博文。
总结
希望这篇博文能对大家有所帮助。