区块链原理傻瓜入门

说小青、小红、小皂和小白共同租了一个房子。他们彼此之间,偶尔会存在资金的流动,例如,小红和小青一起外出,吃了一顿饭,一共花了100云,AA制,但是由小红付的钱,小青因为当时没钱,就跟小红说月底还给她。为了记账他们在客厅的白板上记录每一笔交易,例如,小青在客厅的黑板上写下了“小青需要付50元给小红”。同样的,这个月出现了几次类似的情况。

现在黑板上写有:

但是,有一天,小白的朋友恶作剧,在白板上无故的加了一条,小红需要付小青50元。幸亏后来发现这是一条虚假的记录,否则,月底小红需要多支付50元给小青。为了防止类似的情况再次发生,记账的时候需要记录的人签名表示认可。例如,下图:

但是,后来记录太多,白板上写不下,他们改成在计算机上记账,

但是,在计算机上就不能使用手写签名,一个原因是计算机上不方便手写进行签名,更主要的原因是手写的签名在计算机上会轻易地被复制。例如,小白的朋友又来恶作剧,把最后一个记录和签名复制了一下:

如果没人发现的话,月底小红无缘无故地需要向小白多支付50元。

所以,在计算机上的签名应该是针对计算机的数字签名。数字签名和手写签名一样要满足对应性的要求。也就是说别的地方的数字签名,无法用于这些记录的数字签名。而且每个签名只能用于与其对应的记录,无法用于其他的记录,例如,下图“数字签名1”就不能作为“小青需要支付50元给小皂”的数字签名,虽然两条记录的付款人都是小青,但是付款的记录不一样。数字签名必须与记录内容严格对应,如果记录改变,那么原来的数字签名会失效。

制作数字签名通常采用哈希(hash)算法,这里选用了最先进的SHA-256哈希算法,因为到目前为止,还没有公开的资料表示SHA-256有缺陷。SHA表示Secure Hash Algorirhm,安全哈希算法;256表示不论输入什么值,结果都是256位的二进制数。

例如,我们把第一条记录“小青需要付50元给小红”输入SHA-256函数【网上有现成的SHA-256在线计算工具】,会得到如下的结果:

再输入第二条记录,如下图,两条记录只差了一个字,但是计算的结果区别很大。不仅是多一个字计算结果不同,即使是多一个点或多一个空格,计算结果都会完全不同。所以,即便记录发生了微小的改变,SHA-256的结果应该发生变化,而且变化毫无规律可言。但是,值得注意的是,只要这条记录的内容不变,SHA-256的结果总是相同的。

所以,使用SHA-256作为数字签名,可以保证记录内容和SHA-256结果完全一一对应。

但是,这个还不够,因为数字签名和手写签名一样,不仅需要满足对应性这个要求,还需要满足可鉴别这个要求。可鉴别是指,比如,对于任何一个签名,例如,对于最后一条记录,我们必须能够判断出,这是小红的签名,而不是别人的签名。但是SHA-256函数是一个公开的函数,无论谁输入“小红需要付50元给小白”,都可以得到一模一样的结果。如何让这个签名体现出是小红的签名,而不是别人的签名呢?他们想出了一个办法,就是使用非对称加密法对记录的签名加密。把加密的结果作为真正的签名。

下面解释什么是加密,什么是对称加密,什么是非对称加密,以及如何用非对称加密让签名达到可鉴别:

很多人喜欢用“5201314”表达“我爱你一生一世”,将“5201314”的每个数字加上2,得到“7423536”。一般人就看不出含义了,而把“5201314”的每个数字加上2的过程称为加密,这是一种最简单的加密方法。而解密是与加密相反的过程,加密是加2,而解密是减2。加密时,使用的“2”就是密钥。可以把加密过程理解为一个算法,密钥是输入的一个参数,加密时,算法需要输入需要加密的数字和参数,得到加密的结果。如果加密的是文字,则可以先把文字转化成数字,解密的时候,再把数字转化成文字。这里,因为加密和解密使用的是相同的密钥,所以这个加密方法称为对称加密法。

而在非对称加密时,加密和解密使用不同的密钥,加密时的密钥称为私钥,私钥不能公开,只能加密的人自己知道,解密时,使用的密钥称为公钥,公钥需要公开,其目的是让别人通过公钥进行机密。例如,下图所示的那样。

公钥是通过私钥进过某个算式算出来的,但是无法从公钥计算出私钥。

好了,下面我们来介绍如何用非对称加密让签名达到可鉴别:

小红将“小红需要付50元给小白”输入SHA-256函数,我们将小红输入的记录称为原始记录,得到的结果我们简称哈希值。小红用自己的私钥对哈希值进行加密,获得加密后的哈希值,私钥是可以包含256位的二进制数,在计算机中,对这个哈希值进行加密可以理解为将私钥和这个哈希值输入某个函数进行很复杂的计算,获得一个数值。这个数值就是加密后的哈希值。加密后的哈希值就是小红对这条记录的签名。

小红将这条记录、自己的签名和自己的公钥公布出来,这样任何人都能通过小红的公钥对小红的签名进行验证。例如,小白利用小红的公钥对签名进行解密,获得解密后的哈希值,称为哈希值1,小白再把记录“小红需要付50元给小白”输入SHA-256函数获得哈希值,称为哈希值2,如果,哈希值1和哈希值2相等,那么说明:1.这个签名是针对这条记录的 (如果小红发出的签名不是针对这条记录的,则哈希值1不等于哈希值2)2.这个签名是小红的签名(如果不是小红的签名,那么将无法解密得到哈希值1)3.接收到的记录和原始记录相同为被篡改

 

 

类似的,付款发将各自的记录输入SHA-256函数获得哈希值,然后用自己的私钥对哈希值进行加密获得对应的数字签名

其他人根据记录的内容,付款方的公钥就可以判断出这个签名是否对应于记录内容,是否是付款方的签名,从而这个记账系统开始正常的运作起来。但是这个记账系统太原始,还有很多的漏洞,只适合小范围的使用。

2008年11月,出现了一个叫中本聪(satoshi nakamoto)的天才,他在网上发表了一篇论文,这篇文章介绍了如何使用对等网络来构建一个分布式的记账系统。peer-to-peer表示网络中所有的节点的地位都是对等的,可以履行相同的职责,不存在谁管理谁。

然后,2009年1月,比特币上线,还出现了比特币钱包的客户端软件,人们可以利用比特币钱包来接受和支付比特币。这时,我们需要对上述的记账系统做若干改进,就可以得到中本聪设计的比特币系统。下面,我们对它一步一步地改进,从而了解比特币的基本工作原理。

第一个改进把记录中的元改成比特币(BTC),比特币系统中的交易单位为比特币

第二步改进的是,把“需要付”改成“支付”,只要小青发出这个支付消息,则小青的账户上要减少50比特币,小红的账户上增加50比特币。这样可以避免月底找不到人。

第三步:需要有一种方法能够确认付款方是否有足量的比特币进行支付,付款方有足够的比特币,才能认可这次交易。银行等金融机构可以通过账户余额非常方便地进行确认

但是,中本聪发明比特币的其中一个目的就是消除银行等第三方的依赖。那如何确认付款方有足够的比特币呢?

比特币系统的方案是,每笔交易都必须把之前的交易作为基础,而不是以余额为基础,例如,“小红支付50BTC元给小白”,这笔交易的前提是在这笔交易之前,必须有人向小红支付了X个比特币,而且X必须大于等于50。且这个X个比特币没有被使用过。这里,因为“小青支付50BTC给小红”,50>=50,所以符合要求。但是,这里需要修改一下:

小白受到消息后需要进行检查:

但是,让我考虑如下的一个情况,这里消息可以看出,小青支付的50BTC并不够支付给小白60BTC。

所以,小红还需要以前的一条记录的交易来填补,例如,之前,小皂转过10BTC给小白,那么就可以改成:

但是,如果小皂转了20BTC给小红,也就是50+20>60,这个如何处理?

比特币系统的解决方案是,将多余的金额作为找零支付给自己,就变成了

第四个改进的地方:

将交易的名字改为账号,支付交易里不能再是小红、小白...了,世界上重名的人太多,支付的名字应该改为全球唯一的账号,账号一般是一个包含34个字符的字符串。例如:

真实的比特币交易的记录如下:

第五个改进的地方:转账记录的存储和维护

记录不能存储在一个电脑上,应该存储在多台电脑上,这些记录是系统运行的基础,如果只存放在一台电脑上,电脑出现故障,则整个系统就崩溃了,所以在存放在多台电脑上,这些存放的记录的电脑由谁来维护呢,交给某个值得信任的人或专业公司进行管理和维护?谁能保证这个人或公司在巨大的诱惑下或者巨大的威胁下不对记录进行篡改?

比特币系统的方案是,比特币的每条交易记录都需要发布到网络上,让所有运行比特币客户端的计算机存储所有的比特币转账记录,这样每一条记录都有很多计算机存储,不用担心记录缺失。但是这样会出现3个一致性的问题:

1.如何进行同步,有的计算机可能没有运行比特币客户端,有的没有联网,有的甚至处于关机状态。他们就没有收到比特币的交易记录。这样计算机上的记录不一致,到底以谁为准?如何让他们相互进行同步,从而存储相同的记录?

2.如何防止记录被篡改?有些计算机受黑客控制,让记录和真实记录不一致,甚至存在矛盾。导致整个比特币网络无法运行。如何防止黑客篡改记录呢?

3.如何防止同一笔比特币收入被重复使用。例如,小红一共只收到过一笔转账,小红支付给小白后,马上又支付给了小皂。也就是说,小红几乎同时发送了两条支付记录。

因为在网络上,消息的传播进过的路线可能不同,就导致有的计算机先收到信息1,有的计算机先收到消息2.

比特币利用区块链来解决这3个问题。

区块链有区块串联而成,区块中存储的是进过检查的交易记录。比特币网络仅仅认可和维护同一条区块链。也就是说,区块链网络中的每个节点都存储着相同区块链,当新生成的交易记录被放入新的区块,而且这个新生成的区块被添加到区块链上后,这个新的交易记录才算得到比特币网络的确认。新区块由网络上被称为旷工的节点生成,旷工接收到网络上的各个比特币交易记录,逐个检查这些交易是否符合要求,例如,检查每条记录是否有正确的数字签名,每条记录的输入值是否使用过,每条记录的输入值是否大于输出值等等,然后将符合要求的比特币交易记录添加到自己正在制作的新区块中。

当矿工成功地制作好这个新的区块,就将这个新区块发送个网络上的各个节点,网络上的节点接收到这个新区块,检查这个新区块是否符合要求,就将这个新区块添加到自己区块链的末尾,

那么,问题来了,比特币网络上有许许多多的矿工,每个矿工都可以生成新区块,网络中可能会生成许许多多新区块,比如,同时生成100个新区块,虽然这100新区块的内容大致相同,但是检查好的近期的交易记录,但是,每个区块具体包含哪些交易记录可能略有区别,也就是说这100个新区块各不相同,而比特币网络仅仅任何和维护同一条区块链,比特币网络上的每一个节点都必须选择同一个新区块添加到现有的区块链末尾,但是,很难确定一个选择的标准,至少不能按照到达的时间的先后顺序进行选择,因为节点分布于世界各地,每个节点接收到的第一个新区块一般不同。

比特币网络的解决方案是,采用一个巧妙的方法限制单位时间内同时生成的新区块的数量,如果每隔十分钟左右的时间,整个比特币网络只有一个矿工能将自己做好的一个新区块发布到网络上,则不需要进行选择,所有的节点将这个唯一的区块放到区块链上,这样可以保证所有节点保存的区块链始终相同。

这个巧妙的方法就是,当矿工将检查好的交易记录填入新区块之后,还需要矿工做一个额外的工作,矿工额外地完成这个工作后才能把生成的新区块发布到网上去,这个额外的工作,整个比特币网络一般只有一个矿工能在10分钟左右的时间成功完成。所以,每个10分钟左右的时间,只有一个矿工能将自己做好的一个新区块发布到网络上。

这个额外的工作分为两步:

第一步:将新制作的区块所包含的内容(前一个区块的SHA-256函数值+这个新区块的基本信息+这个新区块所包含的所有交易记录)组成一个字符串。这里的前一个区块的SHA-256函数值是指前一个区块的所有内容输入SHA-256函数得到的哈希值。每一个区块和他自己的SHA-256哈希值一一对应。如下图所示,如果第B个区块中,包含第X个区块的SHA-256哈希值,那个表示第B个区块的前一个区块是第X个区块。

那么第1个区块呢,第一个区块中包含第0个区块的所有内容的SHA-256哈希值。

区块链就是依靠各个区块的SHA-256函数值将这些区块有序地串联起来。

第二步:找一个随机数。在上面的字符串后面加上这个随机数,组成新的字符串,将这个新的字符串输入到SHA-256函数,如果找到了这个随机数能使得这个256的二进制数的前72位都为0,才算完成这个额外的工作。

这个额外的工作的难度非常的高,高到这个比特币网络只有一个矿工能够在10分钟左右的时间成功地找到这个随机数,原因在于SHA-256函数的特点是:虽然每个输入值对应一个输出值,而且每个输出值都是一个256位的二进制数,但是每次运算的输出值具体是什么完全是随机的,而且无法预测,找到符合要求的随机数的唯一方法就是以最快的速度输入不同的随机数,不停地试,SHA-256函数的输出结果是这样的一个256位的二进制数,前72位全为0的概率为1/2^72

也就是说平均要试2的72次方个不同的随机数,才能找到一个符合要求的随机数,也就是平均要进行2的72次方次SHA-256函数计算,才能找到一个符合要求的随机数。整个比特币网络上的所有矿工节点的所有计算设备一起运算,平均每10分钟才能做2的72次方SHA-256函数计算,也就是说,整个比特币网络所有的矿工节点上所有计算机设备一起这个随机数,平均每10分钟才能找到一个满足要求的随机数。因为找到这个随机数完全靠运气,有时运气好一些3、4分钟就可以找到这个随机数,有时运气差一些,可能要10几分钟才能找到这个随机数,但一般平均10分钟才能找到一个满足要求的随机数,因为完全靠运气,所以到底是哪个矿工的计算设备找到这个数也是随机的,有点类似于买彩票,中奖号码是随机的,中奖者是随机的,当某个矿工找到符合要求的随机数后,马上把这个随机数添加到新区块中,马上把这个新区块发布到网络上,网络上的节点收到这个新区块后,将这个区块的所有内容,也就是前一个区域的SHA-256函数值+这个新区块的基本信息+这个新区块所包含的所有交易记录+找到的随机数组合成字符串,并将这个字符串,输入SHA-256函数,如果计算结果是符合要求的二进制数,即前72个数字都为0,则说明制作这个区块的矿工确实成功完成了这个额外的工作。然后,在检查区块的其他方面是否符合要求,以及区块中的记录是否符合要求,一切都没有问题的话,就把这个区块添加到自己的区块链的末尾,网络上接受到这个新区块的所有节点都做相同的操作:检查区块,符合要求就添加到自己区块的末尾,因为只有一个新区块,从而避免了从很多区块中进行选择。

找到这个随机数完全靠运气,但是矿工的计算能力越强,则运气会越好。矿工的运算能力越强,则进行SHA-256函数运算的速度越快,单位时间内能试的随机数就越多,也就越可能最快地找到这个随机数,这个寻找符合要求的随机数的过程称为挖矿。

挖矿拼的是运算速度,拼运算速度就是拼运算设备的运算速度。为了提高速度,矿工们不断提高自己的挖矿设备。普通计算机每秒只能够进行60万次SHA-256函数计算,配备了好的显卡的计算机可以每秒进行几亿次的SHA-256函数计算。因为显卡运算的速度比cpu快的多。为什么矿工会乐此不疲地做这样的工作,而且不断地去升级自己的设备?

因为矿工每找到一个随机数,矿工将获得12.5个比特币(2017年)作为奖励,除此之外,这个这个新区块的所有比特币交易的交易费也归这个矿工所有,平均是2个比特币。为此,一般平均可以获得14.5个比特币作为奖励,在2017年,大约价值26万美元,即170万人民币。

巨大的经济利益驱使了挖矿设备的升级,导致整个网络的计算能力提高。原来整个网络大约需要10分钟就能找到一个符合要求的随机数,现在可能大约只要5分钟。

比特币网络为了维持平均10分生成一个区块的速度,每两个星期调整一次工作的难度。例如,要求前73位全是0。

因为找到随机数完全靠运气,那么有没有可能两个矿工同时找到,并各自制作了一个新区块,有这个可能,也经常发生,那如何处理呢?

当网络节点几乎同时接收到2个都符合要求的新区块,我们用紫色区块和绿色区块来表示两个新区块:

网络节点不知道比特币网络最终会采纳哪一个区块,就暂时把两个区块都保留下来,并把这2个区块都添加都新区块的后面,从而区块链形成了2个支链,矿工也会保留这两个新区块。

但是,制作下一个新区块时,每个矿工都是在自己先接收到的按个区块的基础上,创建新区块。一般情况下,在下一个10分钟,不会那么凑巧又几乎同时产生2个新区块,一般只产生一个新区块,如果只产生一个新区块,如果这个新区块是在紫色区块的基础上创建的,则接受到这个区块的节点将它添加在紫色区块的后面,同时放弃绿色的区块。

同理,

也就是说,如果存在分叉的情况,网络上只认可最长的那个支链,这样保证了区块链的唯一性。如果非常非常偶然地,又同时产生两个新区块,如果是在紫色区块上继续的,那个把个区块都添加到紫色区块的后面:

同理,这里省略绿色的节点。

被放弃的支链上的区块中的记录如果没有被添加到主链上,则会被确认为未确认交易。等待被加入新的区块中,这里大家要注意的是,进行比特币转账交易时,交易记录虽然被发在区块中,但是这个区块可能是支链上的区块,如果这个支链不能成为主链的话,交易很有可能重新变成未被确认的交易,重新等待确认,所以保险起见,当交易记录所在的区块后面又添加了若干新区块后,才可以稳妥地认为自己的交易记录真正地得到比特币网络的确认。那若干个到底是几个?对于小额交易,一般是1到2个,对于大额交易,为了更稳妥,一般是3-6个。

现在我们来看看区块链如何解决3个一致性方面的问题:

1.如何进行同步?

因为比特币网络仅仅维护唯一一个区块链,所以大家都以这个区块链为准进行同步,无论是第一次安装比特币客户端软件,还是中途有很长时间未联网,比特币客户端软件连接到网络上后,会自动想周围的网络节点请求自己没有的区块,检查无误后逐一添加到自己存储的区块链上,请注意是检查无误后,才逐一添加到自己的区块链上。包括检查区块中的每一笔交易记录是否符合要求,检查区块是否符合要求

2.如何防止篡改?

当交易记录被输入到区块链中,而且区块被加入到区块链中,则区块中的任何记录都不能进行修改,即使是微小的改变也是不允许的,对区块的任何修改,都会改变这个区块的SHA-256函数值,导致后面一个区块所包含的SHA-256函数值与这个区块修改后的SHA-256函数值不相同,从而导致这个链断裂,那这条链就不是网络中最长的区块链,而比特币网络只认可和维护最长的一条区块链。那么篡改者有没有可能自己不断制造新区块,并添加在这个断裂的区块链的后面,让这个断裂的区块链生长为最长的区块链?因为制造新区块需要完成难度很高的额外工作,只有篡改者所拥有的计算能力超过整个网络中其他所有节点的计算能力总和时,篡改者所制作的区块链的生长速度才有可能超过现有的完整的区块链的生长速度,篡改者制作的区块链才有可能成长为最长的区块链。但是,经过比特币网络8年的发展,这种可能性微乎其微。

3.如何防止同一笔比特币收入被重复使用

矿工在制作新区块时,会检查放入新区块的每个交易记录中的输入值是否在前面的区块所包含的交易记录中使用过,如果被使用过,则认为这个交易无效,不会被放入新区块中,如果在制作新区块时,发现有两个交易记录的输入值中出现相同的先前交易,则矿工则只认可其中一个交易记录有效,并只将其加入到新区块中,而只有被放入区块的交易记录才是比特币网络认可的交易记录,才是被认为是成功的交易记录,从而防止同一笔比特币收入被重复转账给别人。

最后,还有几个关键的问题。

1.比特币是怎么发行的?

2.比特币存在什么地方?

3.刚才说总量是2100万,如果有人把数据文件弄丢了,是不是总量就减少了?

是的。

4.比特币转账和支付宝转账有什么区别?

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值