哈喽大家好!我是小麦。继上一篇文章,我总结了比特币的原理。那么这篇文章就会对比特币的安全问题进行研究,探讨比特币在所有记录是公开而且匿名的情况下怎么保证数据的安全。

在文章开始前,可以点击菜单的登录按钮,注册我们的官网账号。未来会有很多福利回馈给各位读者!谢谢各位支持!

哦对了!还有参考视频:

  1. 李永乐老师的Youtube:https://www.youtube.com/watch?v=pbAVauYsqP0
  2. 李永乐老师的BiliBili:https://www.bilibili.com/video/BV12b411q7ku

传统的身份认证

我们在现实社会里用的身份认证有人脸识别、签名、指纹。这些是银行或者电子钱包证明“你是你”的手段。那在虚拟世界里,传统签名是不能被使用的。因为人脸、签名、指纹都能被电脑所储存并复制,是不安全的。

传统加密手段

电子签名

比特币的用户在注册的时候,系统会生成一个随机数。通过随机数,产生私钥(Private Key);再通过私钥产生公钥(Public Key)和地址(Address)。其中,每个钥匙的重要性是不同的。私钥是保密的,就相当于你的密码,他是必须保密的,而且一旦私钥丢了(忘记了),那你的比特币就丢了。而公钥和地址是公开的。

当你要别人给你钱的时候,你只要知道他的地址;当你要给别人钱的时候,你需要发送你的公钥和地址给他。你不用担心私钥被泄露等问题。因为通过公钥是反算不回私钥的。

私钥和公钥的作用在于,私钥可以把一段字符串进行加密;而公钥则是把加密之后的数据进行解密。加密和解密的方法钥匙不一样,这种方法称之为非对称加密(Asymmetric cryptography

案例

假如 A 需要付款给 B 10 个比特币,那么 A 就需要先制作一个记录,说明 A → 10BTC → B;然后通过 SHA256 算法将这段信息算出数字摘要。然后摘要再通过私钥进行加密,产生密码。

然后 A 对全网进行广播,广播内容为 A → 10BTC → B ,公钥和密码。

当公众收到 A 的广播之后,先对 A → 10BTC → B 这个信息进行哈希运算,得出摘要。然后使用公钥和密码进行解密(上面说了,私钥进行加密,公钥可以解密),得出摘要。然后将两个摘要进行对比,如果两个摘要相等,说明密码是符合要求的。解释:因为你有唯一的私钥,私钥加密摘要之后产生密码。

当满足这些条件后,交易才算成立。


假设 A 只有 10 个比特币,那么他几乎同时转账给 B 和 C 10 个比特币,那怎么去解决这个问题呢?

余额检查

首先要知道比特币是怎么查询余额的。区块链是将很多的信息一块一块打包之后再串起来。每个人在使用比特币的时候,都需要下载整个区块链的数据(从比特币第一个块开始,一直到最新的块都需要下载)。所以当 A 准备支付 10BTC 给 B 时,他将信息广播出去后,收到这个信息的人会检查 A 是否在区块链的记录里有没有这笔余额。我们上一篇文章说到区块链保存的是从比特币创世纪开始一直到最新的账单信息,所以每一笔账目的来龙去脉都清清楚楚。

区块链示意图

当检查 A 的余额充足时,本次交易成立;反之失败。

支付信息被确认的前提是:别人接受你的交易信息(余额足够),且打包连接上区块链。否则就算你发出广播,这笔交易依然没有作用。

对付双重支付

当 A 只有 10BTC 却执行两个 10BTC 的交易给不同的人时,他会发送两个广播,一个是 A → B,另一个是 A → C。那么根据网络延迟等因素,其余用户在接到这两条广播的时间是不一样的。有的人先得到 B 的交易信息、有的人却得到 C 的交易信息。

这时候两伙人都会对这两个账单进行处理,不论是先付给 B 或 C 的交易,第一笔交易的余额检查肯定是通关的。而第二笔就不被接受。那么怎么取决谁的交易记录是正确的呢?就是当两伙人中的其中一个人(假设这个人是处理 C 交易的)做好数学题,打包了区块并连接起来,那么当其他人见区块链已经被更新之后,他们就会放弃自己的块,接着最新的块进行计算。自然的,B 交易就被丢弃了。

说仔细一点就是:当区块被连上 C 交易成立,这时候 A 的余额就为 0 了。那么就算 A → B 的这笔交易被带到下一个区块去,他也会因为余额不足而无法被通过。

所以当有人用比特币给我们付款的时候,我们不能当时就认为钱已经到账了。我们得等到下一个区块被创建这个事情才算是事实。

防篡改

比特币不可能伪造别人的记录。因为电子签名是绝对安全的(只要你不泄露自己的私钥)。但是可以删除某一条记录。比如 A 给 B 10BTC,然后 A 删掉了这个记录,这项交易就算取消。那怎么去防止这件事情的发生?

比特币有个原则叫最长链原则,意思就是当最新的区块链有两个区块被同时链接上去。那么其他矿工这时候会产生两拨人。一拨是先看到 A 区块的,另一拨是先看到 B 区块的。那这两拨人都会以自己接收到的第一个新区块为准,继续往下算。那么当某个矿工找到下一个新的块(比如 A 区块的那个矿工),那么他就会把新的区块连接上 A 链。这个时候 A 链就会成为最长链。那么其他矿工看到这条最长链,就会自然的舍弃短的 B 链,然后继续去接上 A 链。那么 B 链所链接上去的 B 块就算失败了。

一般情况下,其中一条链产出 6 个以内的区块就会分出胜负,那么另外一条链上的交易将会被撤回,重新放回交易池等待打包。

那么如果有人执意要继续算 B 链呢?也可以。但是全网的基本原则是最长链原则,所以绝大部分的矿工都会找最长的链继续接下去。那么你自己一个人挖是不可能对抗的了全网的算力的。

51攻击

为了防止账本(区块链)被篡改,每个新加入的区块必须在区块头上写上上一个区块的哈希值,称为哈希指针(Hash Pointer)。因为只要改变任何一个区块的其中一个字符,都会影响他的哈希值,进而使新的区块断开连接。那就必须修改下一区块的随机值才能连上,一直修改到最新的区块。这是不可能完成的。

既然有了最长链原则,那么当一个人的电脑性能(算力)大于 51% 他就能算出最长链,控制账本。所以比特币的矿工算力越强,所需要算出的 0 就越多以保证谁都不能控制记账权。

在用户基数不多的虚拟货币系统就容易遭到 51% 攻击。比如比特黄金 Bitcoin Gold,在 2018 年 5 月 18 日就遭过一次。攻击者先吧自己价值 1000万 的比特黄金转给交易所。这笔转账被记录在区块 A 上,同时交易者秘密准备了没有发生此交易的区块 B 并继续计算后续的区块。等 A 链上的交易被确定之后,攻击者就可以把在交易所的比特黄金提现。

但是攻击者的算力大于 51% B 链的长度始终大于 A 链,这时只要向全网发布更长的 B 链,B 链将会取代 A 链,而区块 A 里的交易转账也会被撤回。攻击者白赚 1000 万。

为什么比特币不怕 51% 攻击

当你是一个有钱人,你能拥有世界上 51% 的电脑的时候。你压根就不会去通过这种方式就为了抹掉自己的一条记录。他只会在主链上继续去挖更多的块,赚取更多的钱。

那本期有关比特币的分享到这里结束,接下来我也准备了几个主题进行研究。喜欢这篇文章的朋友可以把文章分享出去。也可以加入我们的 Discord 服务器进行更多交流。