区块链基本原理

课程来源:https://www.bilibili.com/video/BV11x411i72w

区块就是账本,账本就是区块

首先我们由一个账本引入,假设你和你的三个死党——爱丽丝,鲍勃,查理经常进行交易,为了方便,你们维护了一个公共的账本,你们相互之间的所有交易都记录在了这个公共的账本上:

在这里插入图片描述
而每到月底,你们就聚在一起进行结算,如果谁支出的比收入的多,就把差值上交,反之如果谁的收入大于支出,就把多余的收入收下。于是你们定下了一个账本协议(Protocal)

  • 任何人都可以在账本上添加newline
  • 每个月底你们都用真金白银结算

不过现在有一个很明显的问题,假设鲍勃未经爱丽丝同意就在账本上添加一行 “爱丽丝付给鲍勃20$” ,这显然是fraud的信息,所以你们这个公共的账本目前来说是不安全的。那么如何才能保证其安全性呢?类比现实生活我们在票据上签名的例子,你们可以使用Digital Signature(电子签名-256bits)

在这里插入图片描述
现在你们达成了共识:只有经过签名同意的条目才有效。然后的问题就是在信息几乎可以随意复制的计算机中,数字签名该如何实现:采用RSA算法(非对称加密算法):
在这里插入图片描述

RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制 。
在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。
正是基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。
RSA是被研究得最广泛的公钥算法,从提出到现在已近三十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。1983年麻省理工学院在美国为RSA算法申请了专利 。

你用Sign函数生成签名,别人用Verify函数验证你的签名的真实与否:

在这里插入图片描述
由函数的参数可以知道,生成签名需要用到文档中信息(账本)和你手中的私钥,而验证身份时需要用文档中的信息(账本),你的签名(256bits)公钥,其返回的布尔值代表身份的真实与否。

如果有人试图伪造签名,靠穷举硬猜来伪造的话,几乎无解,毕竟2^256这个数字太大了。要知道,宇宙中的原子总数才10^80不到,而这个256bit的签名的数量比宇宙中原子总数的cube还要多。

所以,言归正传,如果你用Verify函数验证结果为true,那么你可以认为这个签名就是他本人,因为这个签名只能由他自己的secret-key生成,输入到你的Verify函数才能返回true。

不过现在你们的记账方式还有一个小漏洞:即使不用破解签名,鲍勃只需要将第一行的item复制n次,就能从爱丽丝那里获得n倍的收入。解决这个问题很简单:使item带上序号,将其序列化,同时让这个序号也参与签名的生成过程:

在这里插入图片描述
OK,现在,你们记账的方式可以说已经完备了,你们将账本协议升级到现在这个版本:

  • 任何人都可以在账本上添加newline
  • 每个月底你们都用真金白银结算
  • 只有有签名的交易才是有效的

一个也跑不了

虽然你们的记账方式已经完备,但是你们的交易系统还是有bug:假设查理从别人那里得到了很多钱,然后月底要结算的时候跑路了,这该如何解决呢?一种可能的方案就是在月初你们都上交100$,并且你们约定任何人在本月的交易过程中都不能透支,一旦透支,就否认之前的交易:

在这里插入图片描述
于是你们的账本协议进一步升级:

  • 任何人都可以在账本上添加newline
  • 每个月底你们都用真金白银结算
  • 只有有签名的交易才是有效的
  • 不可透支

还用个锤子美金

Now,accord your ledger protocol,你们甚至可以不用美金或者其他任何实体法币作为金钱计量单位,因为如果全世界都采用你们这套账本交易系统,那么你们完全可以自定义一种全新的虚拟金钱单位,暂且称它为"Ledger Dollor"吧

在这里插入图片描述
为了进一步去除中心化,你们的账本是人手一份的,全世界所有人都信任且依赖于这个账本,而不像一个国家的法币那样依赖于一个中心的体系。但是这样会带来一个数据同步的问题:每当你自己产生一条交易记录,都要将这条记录广播到全世界,那么你要如何保证别人能正确的接收你的交易信息?同理,当你收到一些记录,你如何保证这些记录是可信的并且保证正确的顺序?

在这里插入图片描述

工作量证明

比特币采取的方案是:哪个账本的计算量(密码哈希函数)最大,就信任哪个账本。

如果我们把计算量作为信任的基础,那么我们就可以让交易欺诈和账本不一致的情形的计算成本高到不行

提到计算量,就该SHA256算法出场了:

SHA256简介:
SHA256是SHA-2下细分出的一种算法。SHA-2,名称来自于安全散列算法2(英语:Secure Hash Algorithm 2)的缩写,一种密码散列函数算法标准,由美国国家安全局研发,属于SHA算法之一,是SHA-1的后继者。
SHA-2下又可再分为六个不同的算法标准,包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。这些变体除了生成摘要的长度 、循环运行的次数等一些微小差异外,算法的基本结构是一致的。
回到SHA256上,说白了,它就是一个哈希函数。
哈希函数,又称散列算法,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(或哈希值)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。
对于任意长度的消息,SHA256都会产生一个256bit长的哈希值,称作消息摘要。这个摘要相当于是个长度为32个字节的数组,通常用一个长度为64的十六进制字符串来表示。
来看一个例子:
干他100天成为区块链程序员,红军大叔带领着我们,fighting!
这句话,经过哈希函数SHA256后得到的哈希值为:
A7FCFC6B5269BDCCE571798D618EA219A68B96CB87A0E21080C2E758D23E4CE9

在这里插入图片描述
SHA256算法可以将任意信息内容“哈希”成256bits的比特串,而且保证不可能逆向破解,就是不能从这个256bits的比特串复原出原始信息内容。不过有趣的是“逆向不可破解”这一点并没有严格的数学证明,但是它却是一大批现代信息安全应用的基础。

比特币系统将SHA256应用到工作量证明

我们设想一种情况:对于一个账本,如果你找到了一个数字,把他放到账本里,哈希后得到的256bits串的前30位正好是0,可以想见,这个概率是非常小的,你要尝试上亿次才能得到这个特殊的数字,而这就是你的工作量。虽然你算起来很费力,但是验证你的工作量却很简单:带入哈希一下就行了,这就是你的Proof of Work

进一步地,我们将账本中的item打包成一个个block(区块),并附加上那个特殊的数字(工作量证明):

在这里插入图片描述
然后将这些区块串成链表一样的东西,每个节点都附加上前一块的哈希值,这样,如果整个区块链中任何一个区块中的任何一个条目发生了轻微的改变,由于连锁反应,会导致所有的“工作量证明”都失效(带入哈希函数前面n位不再为0),这时就需要重新算一波了:
在这里插入图片描述
我们允许世界上所有人都参与建造区块,他们收集交易的广播,将之打包成区块,然后去找那个特殊的数字(玩命的算),使前n bits为0:

在这里插入图片描述
一旦他们找到了那个特殊的数字,就将这个区块广播给全世界。

算这些前导零有什么用吗?设想如果鲍勃想篡改这个账本,加上了 “爱丽丝付给鲍勃100$” ,那么为了骗取其他所有人的信任,他需要为篡改后的错误账本提供工作量证明,也就是要算出那个特殊的数字,使哈希后前n bits为0。但是别忘了,区块创造者还有很多,他们都提供了正确的区块(账本),即使鲍勃骗过了当前这个区块,还有后面新产生的区块呢?他也要一直算下去以保证之前的伪造记录有效吗(当两个区块链发生冲突,用户选择信任最长的那一条)?关键是他也干不过其他所有人的算力总和啊。所以,没人能够篡改账本。

可见,那些区块创造者,为维护账本安全做出了突出的贡献,所以为了奖励那些发现那个特殊的数字的人们,比特币系统允许他们在账本上为自己记上一笔无中生有的奖励(block reword),这样,每产生一个新区块,都会为这个虚拟货币经济体系统增加一些新的货币(比特币系统10min一个),不过完全不用担心通货膨胀的问题,奖励是按照几何级数递减的,所以总会有奖励完的那一天。这个建造区块的过程,就被称为mining(挖矿)

而对于绝大多数的普通用户,他们只需要信任矿工的创造出来的区块(链)就好了,因为比特币的规则就是:哪个账本的计算量(密码哈希函数)最大,就信任哪个账本

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值