初识比特币——区块链
来源:互联网 发布:算法的乐趣 pdf 网盘 编辑:程序博客网 时间:2024/06/02 01:17
区块链是比特币底层使用的数据结构,用于记录比特币网络的交易数据。它一种全新的分布式记账方式。
区块
区块链(block chain),顾名思义就是将一个个区块连接起来,是一个链表结构。每一个区块中存贮了交易的数据。若把区块链看成一个账本,那区块就是账本中一页。
区块的数据结构如下
区块头的结构如下
区块链是靠区块头中的上个区块的头来链接的。如图所示
把区块链接到一起以后,恶意节点要想修改一个区块中交易的信息,它必须要修改这个区块之后的所有节点。结果是,修改一个区块的代价随着新节点的形成而增加。而恶意节点若把这些算力用于产生新的区块,它会获得更多的收益,所以可以减少对比特币网络的攻击。
PoW
分布式网络采用各种共识算法使每个节点对某件事情达成一致性。工作量证明(Proof of work, PoW)是比特币网络采用的共识机制。PoW有两个特点:1 求解过程复杂,除了暴力尝试没有更好的方法;2 求解的结果非常容易验证,在PoW中,只要验证结果小于目标值即可。
PoW的过程可以简述如下:
1. 计算当前节点接收到交易的Merkle树,获取Merkle root;
2. 计算上个节点节点头的hash,即hash(previous block header);
3. 随机生成一个值,nonce;
4. 获取当前比特币网络中的目标值;
5. 带上当前时间的时间戳,即可获取当前欲生成区块的区块头;
6. 执行hash(current block header);
7. 若结果小于目标值,则发现一个有效的区块,并向全网广播生成的区块信息;否者重新从第一步开始执行
8. 若在生成当前区块的过程中,接收到生成其他节点广播的区块生成信息,验证通过后,加入当前区块链,立即停止当前区块的生成并开始寻找下一个区块。
为保证区块的生成速度保持在10分钟一个,比特币网络会调整难度值。每生成2016个区块,网络会用存储在区块头中的时间戳计算这2016个区块生成的时间间隔(即 第2015个区块的时间戳减去第0个区块的时间戳),理想情况下这个时间间隔应为1,209,600s。
- 若这个时间间隔小于两周,难度值会成比例的增加,目标是在全网算力不变的情况下,接下来的2016个区块生成的时间间隔为2周。
- 若这个时间间隔大于两周,难度值会成比例的减小。
(next_target = current_elapse / 1209600 * current_target)
当前比特币网络执行PoW时,使用的hash算法是执行两次SHA256,即SHA256(SHA256(blockheader))。其他改进的竞争币会采用其他hash算法,比如莱特币采用的是scrypt算法。
挖矿
根据上面的介绍,若把区块链当成一个分布式账本,矿工就可以当作记账人,而挖矿就是多个矿工竞争记账的过程。挖矿的过程就是执行PoW。现在,挖矿一般有两种方式:单独挖矿和加入矿池挖矿。
单独挖矿
单独挖矿是指矿工独自生成区块,区块奖励和交易费完全属于它自己。
在挖矿的过程中,矿工使用bitcoind 命令轮询新的交易,发现有效的区块后使用bitcoind广播区块信息。
矿池挖矿
单独挖矿对中小矿工而言,存在一个很大的问题就是:在一个区块产生过程中,若是自己挖到的,那区块奖励和交易费全属自己所有;但要是区块是别的矿工产生的,那自己就没有任何收益,这10分钟的算力全部浪费了,为了提高收益,必须增加算力,相应的成本也会增加。但加入矿池,情况就有所不同。矿池会根据你在10分钟内提交的份额来给出相应的btc,不管这个区块是否由你产生。(前提是这个区块是你加入的矿池产生的。)
矿池挖矿流程的要点:
1. 矿池将分发给矿工的目标值设置的比当前网络的目标值高几个数量级;
2. 矿池将coinbase 交易的收益地址设置为矿池的地址,然后计算出当前区块交易的Merkle 树的root;
3. 矿工向矿池请求需要区块头,然后执行PoW;
4. 矿工找到满足矿池目标值的nonce后,向矿池提交区块头;
5. 矿池验证矿工提交的区块头,有效则接受;无效则拒绝;
6. 当矿池发现矿工提交的区块头能满足比特币网络的目标值时,矿池向全网广播;
7. 矿池获得区块奖励和交易费后,根据矿工提交的有效的区块头数计算每个矿工应得的收益。
上述的第一点可以保证大部分加入矿池的矿工都有收益,第二点可以防止矿工将收益地址改成自己的地址而作弊。
- 初识比特币——区块链
- 初识区块链之父——比特币
- 比特币——区块链
- 初识比特币——比特币私钥
- 比特币、区块链
- 比特币,区块链
- 比特币区块链
- 比特币挖矿——区块链技术
- 比特币挖矿——区块链技术
- 比特币区块链学习
- 比特币&区块链&自由
- 比特币与区块链
- 区块链与比特币
- 比特币与区块链
- 区块链比特币科普
- 浅谈比特币 区块链
- 比特币和区块链
- 初识比特币——比特币地址
- 爬虫爬京东搜索页,gank->ajax
- linux驱动-USB驱动程序之USB设备驱动程序2鼠标用作键盘
- angular总结-directive指令基础
- Salesforce之Lightning学习一:Lightning与Classic对比
- IDEA 在线和本地 破解 2017 IDEA license server 激活(可用)
- 初识比特币——区块链
- Android 设置状态栏后adjustResize属性无效
- jwt 校验抛出异常改为返回false
- Mac打开jd-gui意外停止
- mysql的存储过程
- 剑指Offer--两个栈实现一个队列
- Struts2笔记11 拦截器底层原理
- c#委托
- linux分区方案