您的位置:首页 > 其它

初识比特币——区块链

2017-07-01 20:57 197 查看
区块链是比特币底层使用的数据结构,用于记录比特币网络的交易数据。它一种全新的分布式记账方式。

区块

区块链(block chain),顾名思义就是将一个个区块连接起来,是一个链表结构。每一个区块中存贮了交易的数据。若把区块链看成一个账本,那区块就是账本中一页。

区块的数据结构如下

FieldDescriptionSize
Magic no0xD9B4BEF94 bytes
区块大小整个区块的大小4 bytes
区块头区块头,共有6项80 bytes
交易数量正整数1-9 bytes
交易记录交易列表总共 <交易数量>个交易
区块头的结构如下

FieldPurposeUpdated when..Size
版本区块版本号更新挖矿软件时,不同的挖矿软件指定不同的版本号4 bytes
上个区块的头256位的上个区块的区块头生成区块时32 bytes
Merkle Root用当前区块所有交易数据生成的Merkle 树的root接收到新交易时32 bytes
时间戳自从 1970-01-01T00:00 UTC至现在的秒数每秒4 bytes
区块难度当前区块计算的目标,压缩格式全网难度值调整时4 bytes
随机数从0开始的32位的随机数每次执行hash4 bytes
区块链是靠区块头中的上个区块的头来链接的。如图所示



把区块链接到一起以后,恶意节点要想修改一个区块中交易的信息,它必须要修改这个区块之后的所有节点。结果是,修改一个区块的代价随着新节点的形成而增加。而恶意节点若把这些算力用于产生新的区块,它会获得更多的收益,所以可以减少对比特币网络的攻击。

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. 矿池获得区块奖励和交易费后,根据矿工提交的有效的区块头数计算每个矿工应得的收益。

上述的第一点可以保证大部分加入矿池的矿工都有收益,第二点可以防止矿工将收益地址改成自己的地址而作弊。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息