https://zhuanlan.zhihu.com/p/23243289
1、区块的数据结构
区块高度:每个区块的唯一ID,块高度为0的创世块,一段时间生成一个块,高度加1
头哈希:每个区块的唯一哈希值,根据父哈希+数据块哈希+随机数生成
父哈希:上一个区块的头哈希
merkle根:
区块中每一笔交易对应一个哈希,呈树状结构,生成的最终值(根),代表了该区块中的交易
难度:难度不是固定不变的,会随着网络现有算力的变化而自动调节
Nonce:挖矿所要达到的目标值
区块主体:一定时间内所生成的交易信息,即账本
2、比特币交易流程图
3、区块链、比特币相关概念及工作原理解释
---------------------------------------------------------------------------------------------------------------------------------------------------------------
https://charlesliuyx.github.io/2017/09/24/%E4%B8%80%E6%96%87%E5%BC%84%E6%87%82%E5%8C%BA%E5%9D%97%E9%93%BE-%E4%BB%A5%E6%AF%94%E7%89%B9%E5%B8%81%E4%B8%BA%E4%BE%8B/
1、中心化清算系统
产生的问题一:身份问题(无法确定交易双方是否为本人,可能出现伪造)
解决方案:使用电子签名,公钥-私钥对
S
i
g
n
(
信息
,
私
钥
)
=
电子签名
V
e
r
i
f
y
(
信息
,
电子签名
,
公钥
)
=
真/假
这个解决方案有一个小漏洞:可以
复制同一行信息
来伪造交易记录,解决的办法是添加一个
这笔交易独有的信息(比如时间戳)
产生的问题二:欠债跑路问题
解决方案:添加余额记录,此时就不可避免的需要一个中间担保人进行余额担保
2、分布式记账
1)密码学:哈希函数
哈希函数,输入可以是任意信息或者文件,输出是固定长度的比特串。例如256bit的1/0串,这个输出叫做这个信息的“哈希值”或者“摘要”(digest)
SHA256("XXXX") = "010....010"
哈希函数有几个特点
- 输入值稍微变化后,结果就会有很大的不同,完全无法预测不同输入间的规律
- 逆向计算不可行,只能使用试错法(穷举法),解空间2^256
在每一个账本后添加一个特殊数字,对整个列表使用SHA256,我们要求这个特殊数字可以使得输出值的开头有30个零。这个特殊的数字就叫做工作量证明。
2)区块链
每一个小账本被称为区块,每一个不同的区块链协议(产生不同的加密货币)都会规定每一个区块的大小(最初比特币为1M)
账本组成区块,区块构成链表,区块的头包含前一块的哈希值,这就是区块链
任何人不能随意修改其中的内容,或者交换顺序
。如果你这么做,意味着
你需要重新计算所有的特殊数字
3)51%算力-共识攻击
有一个小漏洞,因为网络的延迟或者有人在篡改区块链等因素,你作为一个收听网络广播的用户,如果同时接受到两条不同的区块链怎么办?其中的交易信息发生了冲突
解决方案:
只保留最长的且难度系数最高的,也就是包含的工作量最大的那一条
3、比特币网络节点的构成
1)节点类型和分工
一个全功能节点包含4个模块【钱包Wallet】【矿工Miner】【完整区块链full Block-chain database】【网络路由节点Network routing】
- 【网络路由节点】使得节点具有参与验证并传播交易与区块信息,发现监听并维持点对点的链接的能力
- 【完整区块链】具有此模块的节点被称为:全节点。它能够独自自主的校验所有交易,不需要任何其他信息。
- 【钱包】比特币的所有权是通过数字密钥、比特币地址和数字签名来确定的,数字密钥实际上并不是存储在网络中,而是由用户生成并存储在一个文件或简单的数据库中,称为钱包。有些节点仅仅保留区块链的一部分,通过一种”简易支付验证“(SPV Simplified Payment Verification)的方法来完成交易
- 【矿工】挖矿节点以相互竞争的方式创造新的区块。有一些挖矿节点也是全节点,可以独立挖矿;还有一些参与矿池挖矿的节点是轻量级节点,必须依赖矿池服务器维护全节点进行工作
拥有全部四个模块被称之为
核心客户端(Bitcoin Core)
2)Stratum协议原理(http://www.8btc.com/stratum_protocol)
3)如何控制区块产生速度恒定
难度系数:
对于每一种不同的加密货币来说,都有
一个值
需要在建立货币的时候时候被定义,即
每一个新区块在当前全网算力的条件被发现的【平均时间】
,这也是难度系数的由来
抛开代码算法层面来说,实现方法就是通过找前n
位是0的方法。从概率角度来说,n值越大,意味找到这个这个数的解范围越小。
随着需求0
的数目一个一个增加,需要的计算时间将会程指数增长。
难度调整方式
难度的调整实在每个完整节点中自动发生的。如果网络发现区块产生速率比10分钟要快时会增加难度。如果发现比10分钟慢时则降低难度。
例如比特币中的是这样定义的:每2016个区块后计算生成它们花费的时长,比上20160(14天)调整一次。有人可能会问,如果在这十四天内计算能力暴涨怎么办,其实这个10分钟的区块新建间隔的规定也只是一个估计要求,真实情况下,这个时间会偏离10分钟这个设定值很多,但是这种偏差并不会对整个区块链的运行产生影响
但是有人会问,这个过程是靠脚本(代码)来实现的,还是自己手动调整的呢?答案是,本地挖矿节点根据自己看到的链上信息自己调整。
问题又来了,为何我不自己降低难度,让自己更加容易新建区块呢?其实,因为链上所有节点确认新的区块(只有确认了你才能得到回报)是按照最长链并且计算难度最大来判断的,你如果用很小的难度新加的区块,是肯定跑不赢全网的其他矿工的
4)比特币总量的由来
旷工一开始新建一个区块可以得到50BTC的奖励,每210000个区块奖励减半,因此
210000×(50+25+12.5...) =
20999999980 约等于2100万
5)区块容量
区块容量在代码中定义为1M,1M的容量意味着比特币最大的处理交易数量在约2400,从代码及技术文档来看,一个区块的最大处理交易数量在2700笔,意味着在一定程度上区块利用率可以超过100%。
6)交易输入输出
一笔比特币交易是一个含有输入值和输出值的数据结构。该数据结构包含了将一笔资金从初始点(输入值)转移至目标地址(输出值)的代码信息。比特币交易的输入值和输出值与账号或者身份信息无关。可以把它理解为一种被特定秘密信息锁定的一定数量的比特币。只有拥有者或者知道这个秘密信息的人可以解锁
比特币交易的基本单位是未经使用的一个交易输出,简称UTXO(unspent transaction outputs)
对于UTXO来说,它的面值可以是一”聪“的任意倍数(1BTC等于一亿聪)但是这个有着任意面值的”人民币“不能随意打开,还被加上一道类似红包支付口令的密码,只有拥有这个密码的人才可以使用这个UTXO,UTXO包含,币值+一段代码(锁,只有有钥匙的人才能打开)
例如,你要购买3.1BTC的商品,但是你只有价值4BTC的UTXO,那么你使用4BTC时需要手动构建返还给自己的0.9BTC的UTXO,如果忘记构建,这部分BTC会被当做矿工费
每一个新建立的区块,都会有新的比特币作为奖励被产生,这个交易是一个特殊交易,被称为创币交易(Coinbase奖励)
7)Merkle树
Merkle树是一种哈希二叉树,它可以用来进行快速查找和检验大规模数据完整性。对于比特币网络来说,使用Merkle树来存储交易信息的目的是为了高效的查找和校验某笔交易的信息是否存在
叶子节点必须是偶数(平衡树),如果遇到奇数的情况,把最后一个节点自身复制一个,凑偶
Merkle应用
简单支付验证节点SPV
我们知道,每当一笔新的交易产生的时候,我们必须验证这笔交易是否真的存在,在SPV节点中,不保存区块链,仅仅保存区块头。使用认证路径或者Merkle路径来验证交易是否存在于区块中