网络知识 娱乐 区块链与比特币详解

区块链与比特币详解

我们从区块链和比特币的表现形式出发,由浅入深,逐渐地了解区块链和比特币。如果有总结的不对的或者不好的地方,请在下方评论区留言。

一 区块链

以银行为例,银行是中心化的,什么是中心化的呢?请看下图
在这里插入图片描述
上图是交易的简单模拟,可以看到,Alice要向Bob支付2元钱,现实世界中要么是面对面纸币交易,要么是使用银行卡,微信,支付宝等支付软件支付,用软件或银行卡支付的过程中需要经过Bank这个中心机构进行交易记录。
那么,这种支付方式有什么问题呢?可以明显地看到,首先是单点失效:就是银行这个中心化机构的安全性对整个交易系统是十分重要的,一旦出现问题,会导致整个支付系统出现问题。其次是手续费问题,当然比特币交易也是需要手续费的,手续费的高低我没有进行比较,所以暂时不进行讨论。

区块链来了!!!
图1.2
由上图可以得出一个问题。怎样实现Alice向Bob的直接转账,而不需要经过银行这个中心化机构?当然,有些东西是必不可少的,比如转账记录,交易双方,交易金额等等,那么,怎样在没有银行的中心化机构下实现这些设想呢?
区块链概念,特点,实现技术等介绍
这里我们引用了上面这个博主总结的一些东西。

区块链技术是一种综合应用了分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的技术组合。

定义区块链
狭义区块链是一种按照时间顺序将数据区块以顺序相连的方式组合而成的一种链式数据结构,并通过密码学手段实现的不可篡改、不可伪造的分布式账本。
广义区块链技术是利用块链式数据结构来验证与存储数据、利用分布式节点共识算法来生成和更新数据、利用密码学的方式保证数据传输和数据访问的安全、利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算方式。
区块链本身并不是一种新技术,而是一揽子技术得新型组合模型,实现了数据的分布式存储和交易的去中心化

区块链分层模型图:
在这里插入图片描述
工信部. 中国区块链技术和应用发展白皮书. 2016.

上述有很多的内容可能大家不太熟悉,没有关系,下面会对所有的相关晦涩的内容进行讲解。

二 区块结构

首先,我们先引入区块。区块链,顾名思义,区块就是一个一个块,链就是把这些块链接起来。下面给出比特币上的区块链的结构图。

这是从黑盒的角度来看:区块就是一个一个存储数据的块,块与块之间有着虚拟的链接,并不是用一根实实在在的东西把它们串起来,就像糖葫芦一样,具体的方法下面会讲解到。
在这里插入图片描述
这是对区块链进一步细节化的图,但是还是相对简单的图,可以看到区块里有交易,交易里有交易记录,就是A要转给B的交易的具体信息。还有个叫上一个区块号的模块,这就是所谓的虚拟的绳子。
在这里插入图片描述
这是区块结构的详细结构图,其内容仍然不是全面的,但是较为全面。乍一看很复杂,哈哈没关系,我来给大家解剖一下。
在这里插入图片描述

区块头解释
前一区块头是前一区块所有内容的哈希值,使用的是SHA256 SHA256算法原理详解 是哈希函数,简单的说是把一个随机长的字符串映射到一个长度为256位的固定长度的二进制串,称为哈希值。作为唯一标记区块的指纹。不同的字符串映射到同一个哈希值的概率可以忽略不计。
版本号就是该区块遵循的规则,不同区块的不同的版本可能会带来一些问题,这将在以后进行讲解。
时间戳表明区块数据的写入时间,时间戳可以作为区块数据的存在性证明(Proof of existence),有助于形成不可篡改和不可伪造的区块链数据库。时间戳为未来基于区块链的互联网和大数据增加了时间维度,使得通过区块数据和时间戳来追溯数据、重现历史成为可能。
当前难度值表示生成该区块的难度,这个难度怎么理解呢?形象化的描述就是找钥匙,需要尝试很多很多钥匙,找到该钥匙的难度就是生成该区块的难度。详细的讲解将在后面展示。
Merkle根哈希Merkle Tree详解 该文章具体讲解了Merkle Tree的算法,作用等。可以看到Merkle Tree是以交易作为叶子结点,然后对交易做哈希取哈希值,然后相邻结点合并取哈希值,以此规则构建树,最后生成根哈希值,此哈希值为Merkle的根哈希。其作用是保证交易不会被篡改。
随机数Nounce,即是由矿工决定的随机数,也就是矿工要挖的矿。挖矿的目标是产生一个随机值使该区块规定内容的哈希值小于一个指定的值,其具体详解下面会讲到

其次是区块体。上图有交易数量,coinbase交易,交易列表。此处不对交易列表进行解释,详细的解释在以后会涉及到。

区块体解释
交易数量该区块所包含的交易的数量。每个区块包含的交易数量是🈶️上限的,这是由区块的最大值决定的。
Coinbase交易是系统给挖到该区块的矿工的奖励交易,奖励的规则以后会进行介绍。该规则实现了比特币生成的唯一方法,就是挖矿得到比特币奖励。
交易列表包含了该区块所包含的交易列表,具体内容以后会详细讲解。
在这里插入图片描述
每个区块所包含的交易数量图。
在这里插入图片描述
总交易数量图表。
每个区块的大小。

三 区块生成

接下来讲什么才更能让大家由浅入深地理解区块链呢?我觉得先给大家介绍一下挖矿和激励机制。这里先不给大家讲交易的生成,传播,交易的收集,交易的验证,共识机制等等等等,就只讲矿工在拿到准备生成区块的交易以及区块结构中的所需要的信息后如何生成区块以及获得的回报遵循什么规则。

先给大家再说一下区块,区块结构中有一个上文提到的Nonce(Prev Hash就是上一区块头的哈希值)。
在这里插入图片描述
挖矿:确保比特币系统安全,并在没有中央权力机构情况下实现全网共识。
包含在区块内且被添加到区块链上的交易称为“确认”(confirmed)交易,交易经过“确认”之后,新的拥有者才能够花费他在交易中得到的比特币。需要注意的是,不是区块生成交易就完成,具体的确认规则以后会讲解。
激励机制:新币发行和交易费的奖励是将矿工的行动与网络安全保持一致的激励计划,同时实现了货币发行。
创建新区块的新币奖励:每四年(或准确说是每210,000个块)减少一半。
区块中所含交易的交易费:每笔交易记录的输入和输出的差额。

寻找Nonce—挖矿 满足:SHA256(SHA256(Version || Previous BlockHash || Merkle Root || Timestamp || Difficulty Target || Nonce))≤ Difficulty Target (可能现在有所不同,但是对理解不影响)
挖矿就是寻找到一个Nonce满足上述的公式,SHA256包含的内容的规则是内嵌的,不是由挖矿者决定的。

激励机制:
难度值的调整是在每个完整节点自动发生的(完整结点,也就是全结点,会在以后讲解)。每四年(或准确说是每210,000个块)统一自动调整难度值,目标是控制平均10分钟产生一个区块(并不是准确的10分钟,在10分钟上下进行波动)。
在这里插入图片描述
上图为挖矿奖励的变化图,可以看到每210000个区块减半,时间为四年。
在这里插入图片描述
这张图展示的是挖矿难度的变化图。
在这里插入图片描述
上图展示了块生成的时间,可以看到区块的生成时间并不是固定的,而是在10分钟上下波动。
在这里插入图片描述
上图展示了区块链的大小,区块链的大小是只增不减的,只能向链中加入块,而不能删除块,也不能修改已有的块。

四 技术细节

哈希

比特币所用的哈希算法是SHA256,下面这篇博客详细讲解了该技术的具体细节,请大家参考SHA256。

共识机制

在讲解共识机制之前,应该讲解分叉,即区块链中各节点区块之间不一致问题。所有节点总是选择将累计了最大工作量证明的区块链(最长或最大累计难度的链)作为主链,这样整个比特币网络最终会收敛到一致的状态。分叉即在不同区块链间发生的临时差异,当更多的区块添加到了某个分叉中,这个问题便会迎刃而解。
接下来看一下分叉:
在这里插入图片描述
可以看到,在区块链上出现了分叉,分成了原链和分叉链,请注意,原链和分叉链没有正确与错误之分,都是合法的,但是,区块链最终要达到共识,意思是全网要对某一条链达成共识,舍弃(回滚)被放弃的链。那么怎样达到共识呢?

设想一下,现在出现了分叉,那么哪条链最终会被确认为合法链呢?前面说了区块的产生过程,可以看到,区块的产生依赖于算力。那么只要其中一条链的算力超过50%,该链最终会赢得胜利,成为合法链。那么显然,如果某一方掌握了超过50的算力,其就可以控制哪一条链是合法链,并可以进行分叉攻击,使得自己生成的分叉链为合法链,而回滚原链,导致其他矿工挖出的区块链无效,造成损失。

比特币共识攻击

需要具备的能力:超过维护系统算力的51%
攻击方式:影响最近的区块(最多10个),通过拒绝服务攻击影响未来区块的生成;51%攻击。

攻击方式描述
拒绝服务攻击1.粉尘攻击:大量低额,低手续费的垃圾交易,让网络拥堵。其通过自己的算力优势,这种行为导致大量优良的交易迟迟无法得到确认,导致网络中存在大量的未经确认的优良交易,造成比特币交易拥堵。2.拒绝对某个特定的比特币地址提供服务:一旦出现存在攻击者想要攻击的比特币地址的区块,攻击者就分叉,导致原链回滚,这就使得被攻击的比特币地址的交易无法写进区块链,交易无法被确认。
51%攻击下面的表格将对攻击方式进行详细的讲解
51%攻击描述
双花攻击一笔钱支付给两个不同的人(没有等6个交易后就发货的风险),当一条链大于另一条链6个区块时,该链被确认为合法链,舍弃另一条链,6个区块之前的交易才被认为是交易成功,并不是被写入区块就是交易成功,当交易双方进行交易后,卖方在该交易没有被确认时就发货,此时买方可以通过分叉攻击导致原链回滚
自私挖矿攻击拥有较大算力的情况下,可以隐藏算力挖矿,找到新块并不广播,并继续挖,直到一定长度,并且长度超过公开记账的链后,一起广播所有区块。这将导致原链全部回滚,已经被确认的交易以及合法区块将都被回滚,造成大量的损失。
难度炸弹拥有大量算力的攻击者突然调集数倍的算力挖矿,这将使出块速度迅速加快,导致下一个周期难度调整的很高。此时,攻击者突然撤出所有算力,那么留下的算力在很高的难度下,出块间隔就大幅度拉长,造成系统拥堵,达到攻击目的。
空区块攻击不打包交易,只有coinbase,由矿工提交的交易。形成威胁的空块一般是攻击者A有很大算力,能连续较长时间记出空块,这就使得大量交易长时间不能记账,产生拥堵,影响系统的正常使用。

双花和重组一般认为需要51%的算力,实际上结合一些策略,有可能更低一些。而空块攻击和难度炸弹如果要产生明显的危害,往往需要51%以上的算力。

公私钥和地址

比特币的所有权是通过密钥、比特币地址和数字签名来确立的。
密钥:由一个成对的公钥(类似于银⾏帐号)和私钥(类似于控制账户的PIN码或支票的签名)组成,存储于比特币钱包。
比特币地址:由公钥生成,但并非所有比特币地址都是公钥,也可以代表其他支付对象,譬如脚本。
数字签名:由私钥产生,决定对应地址下存储的比特币所有权和控制权。

密钥描述
私钥是一个数字,通常是随机选出的
公钥由椭圆曲线乘法加密函数(secp256k1)产生。
比特币地址由一个单向加密哈希函数生成。

在这里插入图片描述
可以看到由私钥生成公钥,由公钥生成比特币地址是单向的,意思是不能由公钥推出私钥,也不能由比特币地址推出公钥。

Base58编码

Base58是一种基于文本的二进制编码格式,实现数据压缩、保持易读性,还具有错误诊断功能。
Base58编码是Base64编码格式的子集
使用大小写字母(A-Z和a-z)和10个数字(0-9),但舍弃了一些容易错读和在特定字体中容易混淆的字符,如0,O,l,I以及“+”和“/”。
Base58Check是用于比特币中的一种Base58编码格式,增加了错误校验码来检查数据在转录中出现的错误。

编码表如下:
在这里插入图片描述
Base58Check编码中的“版本”前缀使得编码之后的数据显示了易于辨识的属性,直观的反映了数据的类型及如何使用它们。WIF指压缩
在这里插入图片描述

WIF(压缩)私钥生成算法

在这里插入图片描述

 生成私钥: 
 0:用户随意输入一串字符串。
 1:通过SHA256生成一个256位的随机数。
 2:在头部添加版本号,为一个字节(8位)
 3:在尾部添加压缩标志,为一个字节。
 4:附加校验,通过两次SHA-256取前4字节作为校验码
 5:Base58编码,此过程可逆
 生成公钥:
 256位私钥(第一步生成的)通过椭圆曲线算法得到公钥,其是椭圆曲线上的一个点,具有x,y坐标。
公钥的作用

公钥生成地址,验证发送交易的地址是否和该公钥生成的地址一致。
公钥验证私钥的签名,用来验证该交易是否使用了正确的私钥签名。
私钥生成公钥是成对出现,公钥可以生成对应的唯一地址,这样就能确认了该地址发送的交易是否使用了对应的私钥。

压缩公私钥与非压缩公私钥

在这里插入图片描述
同一个私钥压缩前后在数值上相等,写法不同,可以互相转换。
压缩私钥对应的地址与非压缩私钥对应的地址没有关系,不能相互推导。
在这里插入图片描述
压缩的意思是取x,不取y。

比特币地址

比特币地址由公钥经过SHA256和RIPEMD160计算并编码得到,解决公钥长、隐私保护等问题。
在这里插入图片描述
一个私钥可以生成两种不同格式的公钥(压缩格式和非压缩格式),而这两种格式的公钥可以生成两个不同的、合法的、可被私钥签名的比特币地址;但这两个不同的比特币地址的私钥是一样的

隐私与安全

首先,先向大家科普一下RSA
在比特币中,创建一个用户就是创建一个公私钥对的过程,所以创建用户是很简单的。公钥向全网广播,即该用户的身份,用户收款时的身份;私钥,顾名思义,只能是用户自己知道,如果其他人知道了一个账户的私钥,也就是获得了这个账户,即可以花费这个用户的比特币。
那么比特币的隐私性是真正做到完全隐私吗?
1.现实中的ip地址与交易的关联:如果ip地址与某一个交易相关联,完全可以通过ip地址查到进行该交易的人。
2.多个公钥地址相关联:当多个公钥地址作为交易的输入时,可以认为这多个公钥地址出自一个人。由于找零,输出地址中的可能的一个也可以与输入地址相关联。
3.当想要将比特币兑换成现实中的钱币的话,必然涉及到现实中的身份与公钥相关联。

五 问题

为什么挖矿要进行两次SHA256