algorithm-base/animation-simulation/一些分享/区块链详解.md
2021-03-20 12:38:26 +08:00

173 lines
16 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

最近总是能在一些网站上看到比特币大涨的消息这不都涨破20000美元啦
最近比特币涨势喜人牵动着每一位股民的心持有的老哥后悔说当时我咋就没多买点呢不然明天早饭又能多加个鸡蛋啦没持有的呢就在懊恼后悔当时为啥就没买入呢这不我女朋友也看到新闻了说比特币最近涨那么厉害咱们要不买两个呀然后这个总是听到的比特币到底是什么东西呀
你说那个比特币呀我也不是很懂知道一点点我给你讲一下我知道的吧
**本文和股票无关单纯的介绍一下比特币原理投资有风险入场需谨慎**
> 关键词 比特币去中心化挖矿区块链双重支付最长链原则工作量证明
我先给你说一下比特币的历史吧
> 2008年爆发全球金融危机同年11月1日一个自称中本聪Satoshi Nakamoto的人在P2P foundation网站上发布了比特币白皮书比特币一种点对点的电子现金系统 陈述了他对电子货币的新设想比特币就此面世2009年1月3日比特币创世区块诞生
你平时不是会把每天的收入和支出记在自己的小本本上我们称之为记账我们平常在消费的时候银行也会为我们记录这条交易记录及交易后银行卡里的余额然后我们会通过银行卡里数字来评估自己拥有的财富所以我们拥有多少财富都通过银行的记账本来决定的
**中本聪****2008**年提出其实我们可以不需要一个**中心化**的记账系统不需要以某个人或者机构为中心来帮我们记账我们可以**去中心化**每一个人的账本都是透明公开的这就叫做**去中心化电子记账系统**下面我们通过一个例子来进行描述
![区块](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/区块.3wdvlln33q60.png)
### 1.那你说的那个区块链到底是什么东西呀我不是很懂哎
我们对上图进行解析A,B,C,D四个小伙伴进行交易首先 A 支付 5 个比特币给 B那么他需要将这条交易信息发送给每位小伙伴同理 B CC D的交易也要传送给所有的小伙伴用户会将这些交易信息记录下来并打包成块我们称之为**区块**区块大小约为1M约4000条左右交易记录当块存满时我们将这个块接到以前的交易记录上形成一条链过一段时间再把新的块接到它后面我们称这条链为**区块链**如下图
![区块链](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/区块链.2s1tuiwa4ba0.png)
好啦我们大概了解什么是区块链了
### 2.好啦我知道什么是区块链了但是那些用户为什么要记录交易信息呢
记账奖励每个用户都可以去记账如果某个用户进行记帐则会奖励他一些手续费比如A B 交易 10 个比特币A 就需要多支出一点点给为其记录的人其实现实生活中我们使用银行卡时也会有手续费,这里的手续费是支付给银行
打包将交易记录打包成块奖励打包者只能有一位完成打包的那一位能够获得**打包奖励**
### 3.知道了那打包一次能获得多少奖励呢
2008年刚提出这个系统时奖励方案如下
每十分钟打一个包最开始的时候每打一个包会奖励打包者 50 个比特币过了四年之后每打一个包奖励 25 个比特币再过四年的则奖励 12.5个比特币以此类推
### 4.那么多那世界上一共有多少个比特币呢
一个包奖励 50 个比特币一个小时 6 个包一天 24 小时一年 365天 每隔四年减半则计算公式如下
![微信图片_20201218150122](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/微信图片_20201218150122.1hx8euiaa9uo.png)
总数大概为 2100万个比特币
### 5.因为我们有手续费和打包费的奖励机制所以大家都抢着打包但是打包者只能有一个人那么我们应该让谁打包呢
中本聪提出了一个**工作量证明**的办法说白了就是想打包的用户都要去做一个很难的数学题谁先做出来谁就能获得这个打包的权力打包者就能够获得奖励但是这个题目很特别就是我们任何人都不能用脑子把他做出来我们只能一个数一个数的去尝试直到你把这个数尝试出来那么你就获得了奖励这个过程就是我们经常说的挖矿
### 6.你说的那个挖矿的原理是怎样的呢我想不通
刚才我们说挖矿的原理其实是让我们做一道数学题谁先做出来算谁的这个题目还不拼智商需要我们一个一个的试取决于咱们CPU的运行速度那么具体原理是什么呢
**这里可以选择性阅读不感兴趣可以直接跳到第 8 个问题**
介绍原理之前我们先来了解一下哈希函数大家可以去看一下我之前之前的文章[学生物的女朋友都能看懂的哈希表总结](http://mp.weixin.qq.com/s?__biz=Mzg3NDQ2NDY3MA==&mid=2247486429&idx=1&sn=449b0482f89a4b2778cbd5c5d6dcc67f&chksm=ced11f2cf9a6963ab9ce6331c4bec69775e347ef03e4bae46e93113f6e99d18c83f45359a04c&scene=21#wechat_redirect)》,里面对哈希函数做出了简要描述。下面我们再来了解一下数字摘要。
数字摘要就是采用**单向 Hash 函数**将需要加密的明文摘要成一串固定长度的密文这一串密文又称为数字指纹它有固定的长度而且不同的明文摘要成密文其结果总是不同的而同样的明文其摘要必定一致
通俗点说就是一个字符串我们通过 hash 函数计算得到一个固定长度的密文不同的字符串得到的密文不同哪怕仅仅是两个字符串相差一个 0 最后的得到的密文也可能完全不同相同的字符串会得到相同的密文通过明文得到密文很容易我们通过特定的哈希函数就可以但是反过来是极其难的
下面我们简单描述一下 著名的哈希函数 SHA256 的生成摘要的过程
![sha256](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/sha256.5veoxktednk0.png)
我们已经了解了生成摘要的过程那么挖矿的具体原理是什么样呢
刚才我们说到区块链其实是一大堆交易信息其实我们的区块里面不只有交易信息还有头部目前有很多人记录了系统的交易信息然后想把自己记录的交易信息打包成块并连接到区块链上获得打包费那么多人想打包但是只能有一个人可以获得打包权那么具体是解决了怎样的数学问题获得打包权的呢
刚才我们描述了生成密文过程那么我们的明文也就是输入字符串在这里主要由什么组成呢
字符串 **前块头部 + 账单的信息 + 时间 + 随机数**
主要有以上信息组成前块的头部你所记录的账单信息时间戳随机数组成那么我们看这里的组成部分对于所用用户来说只有前块头部是固定的账单信息因为每个人记录顺序不同也是不固定的每个人开始的时间不一样那么时间也是不固定的随机数也不固定那么既然我们的输入都是不固定的那这个题应该怎么答呀那怎么保证公平呢主要通过以下方法
刚才我们也说了经过 SHA256 加密之后会得到一个 256位的二进制数
获得打包权的那个难题就是让我们把字符串经过两次 SHA256 运算之后得到一个哈希值哈希值要求** n **为0意思就是谁先算出那个前 n 位为 0 的哈希值谁就能获得打包权
因为每个人的输入是不固定的但是对于个人来说他开始运算的时间是固定的头部也是固定的他所记录内容也是固定的所以他只能依靠调整**随机数**来修改最后的哈希值只能挨个试但是如果人品爆发可能试的第一个数就能得到符合要求的哈希值但是总的来说还是一个考察算力的题目
![两次哈希函数](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/两次哈希函数.3dv6ep2rqh00.png)
### 7.那哈希值前 n 位为 0 这个 n 是依据什么决定的呢
这个 n 越大计算难度就越大因为我们不能反算只能挨个去试每一位上出现 0 1 的概率都为 1/2那么我们获得前 n 位为 0 的哈希值概率也就是 1/2 n 次方
当时中本聪在设计时为了保证每十分钟出一个块所以就会适当的调整 n, 比特币系统每过2016个区块之后就会自动调整一次难度目标如果上一个难度目标调整周期也就是之前2016个区块平均出块时间大于10分钟说明挖矿难度偏高需要降低挖矿难度反之前一个难度目标调整周期平均出块时间小于10分钟说明挖矿难度偏低需要提高挖矿难度难度目标上调和下调的范围都有4倍的限制
所以这个 n 是根据挖矿难度算力进行调整的也就是我们矿机的算力和矿机数量等进行调整
### 8.我懂了那如果有人冒充咱们咋办偷偷花咱们的比特币
这个问题问的好
说到防止假冒我们先来说一下身份认证身份验证又称验证鉴权是指通过一定的手段完成对用户身份的确认指纹人脸签名等都是传统的认证手段另外我们说一下比特币系统的电子签名
比特币用户在注册时会生成一个随机数通过随机数会产生一个私钥的字符串这个私钥又可以产生一个公钥字符串和地址私钥和公钥是对应的并且私钥是保密的别人向你交易时你只需要把你的地址发过去即可如果你给别人交易时则需要将你的公钥和地址一起发过去流程图如下
![公钥私钥](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/公钥私钥.1z7tkrhr4q4g.png)
我们在传输记录时通过私钥加密然后通过公钥解密加密和解密的钥匙不一样所以我们称之为非对称加密
具体交易流程如下 A支付 5 个比特币给 B
![广播](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/广播.3y66ai91qa00.png)
我们其他用户接收到了这个支付消息那其他用户怎么判断这条信息是不是A发出的呢不是他人冒充 A 发的呢具体流程如下
![广播对比](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/广播对比.76soh60sm2s0.png)
其他用户进行对比如果一致则认可这条消息是A发的不一致则认为是别人冒充所有用户则会拒绝这条消息这里可能会不明白了公钥和私钥你都发出来了解密肯定的呀刚才我们说公钥的公开的但是公钥是由私钥加密得到的私钥是私密的唯一的只有 A 用户知道自己的私钥
### 9.好神奇啊我知道了那要是我只有 5 个比特币同时支付给两个人咋办每个人五个那我岂不是赚了呀
厉害呀这你都能想到但是你想多啦
比如A只有五个比特币他同时发了两个消息分别是给 B 五个比特币 C 五个比特币但是他总数只有 5 这样显然是不行的我们称之为**双重支付**
那么我们如何解决呢
##### 余额检查
![追溯](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/追溯.4lbdktlb5re0.png)追溯
用户在接收到这个消息时会先从区块链里进行查询A的交易记录得出A的余额是否大于交易数额如果大于则接收反之则拒绝
##### 解决双重支付
首先我们来了解下什么是双重支付打个比方哈袁记菜馆第963家分店因为店长经营不善要进行出售出售的时候店长将这个房子同时卖给了两个人但是只有一个房子这就是**双重支付**
![双重支付](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/双重支付.2ff4ejsp3esk.png)双重支付
在比特币系统中是如何解决双重支付问题的呢我们 A 用户只有 5 个比特币但是他几乎同时发布了两条广播此时有些用户会先接收到第一条广播然后进行追溯发现 A 只有5个比特币则会拒绝第二条同理先接收到第二条广播的用户也会如此就好比形成了两个阵营然后两个阵营的用户进行答题然后获得了打包权则会将自己打的包接到区块链上那么他所接收到的那条消息则会被整个系统认可另一条则会放弃
比如用户 D 先接收到了第二条广播 A 支付给 C然后 D 用户获得了打包权 D 将包接到链上那么其余用户则会放弃自己的包全部都认可 D 所记录的交易信息所以此时 C 收入 5 个比特币B 没有收入所以我们接收到别人交易消息时不能认为当时已经到账要等新的块已经形成消息被记录到主链上才可以
### 10.那如果有人偷偷篡改交易信息那他不就成比特币最多的人了吗
想的挺全面呀厉害呀你
我们考虑一下这种情况A 已经支付给了 B 五个比特币但是他想把这个记录删掉伪造一下记录有这种可能吗
说之前我们先来描述一下比特币系统遵循的**最长链原则**那什么是最长链原则呢
![最长链](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/最长链.608rywpq68g0.png)最长链
比如上图我们同时有两个块接到了链上那么会有两拨人他们都会以第一个接收到的块为准然后两拨人继续运算当某一拨中的某个人获得打包权之后则会将新块接到他接收的块后面那么此时他的这个链是整个系统最长的链则会被所有人认可另一拨人也会来到这个最长链下面继续打包之前的那个分支则会废弃如果说某个人他就不想转移阵容非得死守那个相对短的链这样也是可以的只要你一己之力可以对抗所有人把你这个链变成最长链大家则会都认可你这条链
那么我们来说一下如何防止篡改
![红色块分支](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/红色块分支.72gt7kf4gzo0.png)
A 此时想要修改红色块里的交易记录 A 需要重新计算重新打包创造出一个支链来但是大家不会承认你这个支链因为这个支链不是最长的所以不会承认你伪造的信息如果你非要继续往下算什么时候你自己创造的支链长度大于世界上所有人的打包的链的长度那么恭喜你你伪造成功了大家都认可你的伪造信息了所以说理论上是可以篡改的但是你改了之后不会被大家承认除非你的计算能力超过了世界上其余所有的人大家试想一下一个掌握全世界一半以上算力的人会去干这种无聊的事吗
这下我全都懂了那咱们快去买两个吧
你看看现在一个多少钱啦买不起呀咱们
<u></u>
另外给大家建了一个寒假刷题互相监督群需要的可以联系我公众号内点击一起刷题即可为了防止广告党进入大家记得备注刷题目前人数大概有200来人大家可以自行组成小队也可以一起商量题目多个人一起走才能走得更远