1. 比特币是什么?
比特币是基于区块链技术的一种数字货币实现,比特币网络是历史上首个经过大规模、长时间检验的数字货币系统。
比特币网络是一个分布式的点对点网络,网络中的矿工通过“挖矿”来完成对交易记录的记账过程,维护网络的正常运作。
区块链网络提供了一个公共可见的记账本,该记账本并非记录每个账户的余额,而是用来记录发生过的交易的历史信息。
比特币网络在功能上具有如下特点:
- 去中心化:意味着没有任何独立个体可以对网络中的交易进行破坏,任何交易请求都需要大多数参与者的共识
- 匿名性:比特币网络中账户是匿名的,无法从交易信息关联到具体的个体,但也意味着很难进行审计
- 通胀预防:比特币的发行需要通过挖矿计算来进行,发行量每四年减半,总量上限2100万枚,无法被超发
比特币事件:
- 2008年10月31日,中本聪发布了比特币唯一的白皮书:(比特币:一种点对点的电子现金系统)
- 2009年1月3日。中本聪在位于芬兰的一个小型服务器上挖出第一批50个比特币。
2. 比特币如何运作?
2.1 比特币核心程序:客户端
比特币是一个软件,是软件就需要运行。
客户端的功能模块:
- 钱包
- 完整区块链:保留了完整的区块链账本数据
- 网络路由:
- 挖矿(可以独立部署)
2.2 比特币的发行:挖矿
“挖矿”是一种算法,(字面意思,投入某种工作,得到一种“宝贝”)。
挖矿在比特币软件中的用途:
- 抢夺区块打包权
- 验证交易事物
- 奖励发行新币
- 广播新区块
比特币是一个对等网络,每个节点都可以独立维护自己的数据副本,那么如何保证彼此之间的数据一致呢?
这就带有一个约定的规则,大家共同按照这个规则来竞争数据的打包权,打包完成后广播给别人,别人只要验证一下就行,没问题就存入自己的数据文件中。
比特币采用工作量证明(PoW)的一种算法。谁先计算出符合难度的数字,谁就抢到了打包权。
1. 难度值
首先,既然大家都在竞争,那计算的数字必须要符合一个难度,这个难度就是门槛。
作为难度1的目标值。在比特币诞生初期,当时全网算力,大约10分钟得到一个符合难度1要求的值,这也是每个10分钟一个区块的来源、。
- difficulty : 难度级别
- nonce:随机数
- bits:存储难度的十六进制目标值
全网 算力越强,difficulty 难度值就越大,bits 的目标值就越小。
新的难度值计算公式:新难度值 = 当前难度值 * (最近2016个区块的实际出块时间/ 20160分钟)
2. 挖矿计算
挖矿的计算公式:
1 | SHA256( SHA256(version + prev_hash + merkle_root + ntime + nbits + nonce)) < Target 难度目标值 |
名称 | 含义 |
---|---|
version | 区块的版本号 |
prev_hash | 前一个区块的哈希值 |
merkle_root | 准备打包的交易事物哈希树的根植,也就是梅克尔根 (可以改变) |
ntime | 区块时间戳 (可以改变) |
nbits | 当前难度 |
nonce | 随机值 (可以改变) |
挖矿就是重复计算区块头的哈希值,不断修改该参数,直到与难度目标值匹配的一个过程。
矿工的奖励,是作为一条交易事物包含在区块的交易事务中,相当于系统给矿工转账了一笔比特币,这种交易事物由于特殊性,通常称为 coinbase 交易。这个交易一般是位于区块中的第一条,比特币系统也是通过这种挖矿奖励的方式发行新的比特币,就像央行发行新钞一样。
3. 区块广播
矿工挖出区块后,就进行网络广播,传递给相邻的节点,节点接收到新的区块后会进行一系列的验证,比如区块数据格式是否正确;区块头的哈希值小于目标难度了区块时间戳是否在允许范围之内;区块中第一个交易(且只有第一个)是coinbase交易;区块中的交易事物是否有效等。全部通过就会把新的区块数据纳入到自己的区块链账本中。如果是挖矿接地那收到消息,就会理解停止当前的挖矿计算,转而进行下一个区块的竞争。
如果同一时间内多个矿工都计算出符合条件的值,都拥有了打包权,那以谁为准?比特币中的解决方案,就是让节点自己选择,最终传播最广、处于最长链中的区块将保留,因此到底谁的区块会被保留下来,就要看运气了。
挖矿的作用,除了发行新的比特币外,主要就是维持网络共识,让每个节点对区块链书籍保持最终一致性。
4. 挖矿方式
2.3 比特币的钱包:核心钱包和轻钱包
钱包,是属于比特币系统中的一个前端工具,最基本的功能就是用来管理用户的比特币地址、发起转账交易、查看交易记录等。
比特币地址的生成过程
- 首先使用随机数发生器生成一个私钥
- 私钥经过 SECP256K1(是一种特定的椭圆曲线算法) 算法生成公钥。 (不能通过公钥生成私钥)
- 公钥接下来先使用 SHA256 ,再使用 RIPEMD160 哈希算法,计算出公钥哈希。比特币的代码通过2次哈斯来计算地址值,进一步确保哈希后的数据的唯一性。
- 将一个地址版本号链接到公钥哈希,然后对其进行两次 SHA256 运算,将计算结果取前面4字节作为公钥哈希的校验值
- 将版本号与公钥哈希以及校验值连接起来,然后进行 BASE58 编码转换,最终得到比特币地址。
简化过程:
SPV钱包的大致过程
- 首先下载完整的区块头数据,注意是区块头,而不是所有的区块链数据,这样可以大大减少需要获取的账本数据量,区块头中包含中区块的梅克尔根,SPV方式主要就是靠它来实现的。
- 如果要验证某笔支付交易,则计算出这笔交易事物的哈希值 txHash。
- 找到txHash所在的区块,验证一下所在区块的区块头是否包含在账本数据中。
- 获得所在区块中计算梅克尔根所需要的哈希值
- 计算出梅克尔根
- 若计算结果与所在区块的梅克尔根相等,则支付交易是存在的。
- 根据该区块所处的高度位置,还可以确定该交易得到了多少个确认。
2.4 比特币的账户模型:UTXO
比特币中交易事物的数据结构,UTXO(Unspent Transaction Output,“未花费事务输出”)。
上图展示了比特币中的交易事物结构,在比特币的交易事物数据中,存储的就是这样的输入和输出,相当于仓库中的进出流水账,并且“输入”和“输出”彼此对应,或者更准确地说,“输入”就是指向之前的“输出”。
- 001号交易为 Coinbase 交易,也就是挖矿交易,这个交易中,“输入”部分没有用对应的“输出”,而是由系统直接奖励发行比特币,矿工 Alice 得到12.5个比特币的奖励,放在001号交易的“输出”部分。此时,对于Alice来说,拥有了这12.5个比特币的支配权,这个12.5个比特币的输出可以作为下一笔交易的“输入”,顾名思义,这逼“输出”就称之为是Alice的未花费输出,也就是Alice的UTXO的意思。
- 002号交易中,ALice转账6比特币到Bob的地址,Alice找到了自己的UTXO(如果Alice不止一笔UTXO,可以根据一定的规则去选用。比如将小金额的先花费掉)。由于只需要转账6比特币,可以UTXO中却有12.5个,因此需要找零6.5个到自己的地址中,由此产生了002号中的交易输出
UTXO
- 比特币的交易不是通过账户的增减来实现的,而是一笔笔关联的输入/输出交易事物。
- 每一笔的交易都要花费”输入”,然后产出”输出“,这个产生的”输出“就是所谓的”未花费过的交易输出“,也就是UTXO。每一笔交易事物都有一个唯一的标号,称为交易事物ID,这是通过哈希算法计算而来的,当需要引用某一笔交易事物中的”输出“时,主要提供交易事物ID和所处”输出“列表中的序号就可以了。
- 由于没有账户的概念,因此当“输入”部门的金额大于所需的“输出”时,必须给自己找零,这个找零也是作为交易的一部分包含在“输出”中。
怎么证明哪一条UTXO是属于谁?
在比特币中,是使用输入脚本和输出脚本程序实现的,有时候也称为“锁定脚本”和”解锁脚本”。简单地说,就是通过“锁定脚本”,利用私钥签名解锁自己的某一条UTXO(也就是之前的“输出”),然后使用对方的公钥锁定新的“输出”,成功后,这笔新的“输出”就成为了对方的UTXO。
同样,对方也可以使用“锁定脚本”和“解锁脚本”来实现转账。这个脚本程序其实本质上就可以看成是比特币的数字合约,这也是为什么比特币被称为可以变成数字货币的原因。
3. 比特币存在什么问题?
3.1 软分叉和硬分叉
软分叉:新版本接地那认为老版本节点发出的区块/交易合法
硬分叉:新版本节点认为老版本节点发出的区块/交易不合法
 
3.2 51%的攻击
当打包权在自己手中能干什么:
- 修改自己的交易记录,从而实现双花
- 阻止区块确认部分或者全部交易
- 阻止其他矿工开采到区块
51%攻击实现不了的:
- 修改他人的交易记录(没有他人的密钥)
- 凭空产生比特币((其他节点不会通过确认,达不成网络共识)
- 改版每区块的比特币发行数量
- 把不属于自己的比特币发给别人或自己
- 修改历史区块数据
3.3 轻钱包的易攻击性
SPV,用户只需要保存所有的区块头,由于只保留区块头,因此用户自己不能验证交易,需要从区块链某处找到相符的交易,才能得知认可情况。
3.4 私钥丢失
3.5 重放攻击:交易延展性
在自然界,改变某些材料的形状,但是本质不会改变,就叫延展性。
延展性攻击后,会产生新的事物ID,会导致以下后果:
- 接收方无法通过原始的事物ID来查询这笔转账
- 被修改过的交易会与其余在网络中传播的原始交易争抢进入区块,一旦抢先进入新的区块,原始交易就会被网络中的节点拒绝
- 阻止原始的交易进入区块
3.6 网络拥堵:大量交易的确认延迟
3.7 不断增长的区块数据
原文链接: https://adeng-wc.github.io/2020/02/24/理解比特币/
版权声明: 转载请注明出处.