比特币区块结构详解(比特币区块结构详解视频)

币安下载

Binance币安交易所

全球最大加密货币交易所,注册100%可领取100USDT奖励!通过本站注册不仅可以享受手续费折扣同时有机会获得币安周边

点击注册 更多线路

更多交易所入口

一站式注册各大交易所、点击进入加密世界、永不失联,币安Binance/欧易OKX/GATE.IO芝麻开门/Bitget/抹茶MEXC/火币Huobi

点击进入 永不失联


比特币算法原理


                
比特币算法主要有两种,分别是椭圆曲线数字签名算法和SHA256哈希算法。

椭圆曲线数字签名算法主要运用在比特币公钥和私钥的生成过程中,该算法是构成比特币系统的基石。SHA-256哈希算法主要是运用在比特币的工作量证明机制中。

比特币产生的原理是经过复杂的运算法产生的特解,挖矿就是寻找特解的过程。不过比特币的总数量只有2100万个,而且随着比特币不断被挖掘,越往后产生比特币的难度会增加,可能获得比特币的成本要比比特币本身的价格高。

比特币的区块由区块头及该区块所包含的交易列表组成,区块头的大小为80字节,由4字节的版本号、32字节的上一个区块的散列值、32字节的 Merkle Root Hash、4字节的时间戳(当前时间)、4字节的当前难度值、4字节的随机数组成。拥有80字节固定长度的区块头,就是用于比特币工作量证明的输入字符串。不停的变更区块头中的随机数即 nonce 的数值,并对每次变更后的的区块头做双重 SHA256运算,将结果值与当前网络的目标值做对比,如果小于目标值,则解题成功,工作量证明完成。

比特币的本质其实是一堆复杂算法所生成的一组方程组的特解(该解具有唯一性)。比特币是世界上第一种分布式的虚拟货币,其没有特定的发行中心,比特币的网络由所有用户构成,因为没有中心的存在能够保证了数据的安全性。

比特币网络中什么是“blockquans (区块)”?


                
每个区块包含所有最近交易的信息,一个 Nonce (随机数) 以及上一个区块的哈希值。 在整个区块的 SHA-256 哈希值低于当前目标值时,它便被标记为“已解决” (已发布并通过多个节点验证)。通常一次哈希很难达到目标,因此 Nonce 必须增加,区块必须重新哈希上百万次,才能达到目标。
Bitcoin 比特币交易通过汇款人广播到网络中,所有采矿的节点 (客户端) 收集比特币并将其添加到他们正在工作的区块。如果交易额很大,超过了平均交易额,那么网络将会扣除少量的交易手续费。
每个区块中的第一个交易是特殊的: 它为第一个采到有效区块的人创建新的比特币。其它节点 (客户端) 在该交易额正确的情况下仅会接受该区块。每个区块产生的比特币的数量为 50,每 210000 个区块减少一半 (大约为 4 年)。
网络尝试每小时创建 6 个区块。每 2016 个区块 (大约两周时间),所有的比特币客户端都会将这个目标与实际创建的区块数量相比较,修改区块采集的难度百分比以维持这一目标。
客户端认为“最长的”区块链是有效的。整个区块链的“长度”是指难度相加最多的链,而不是拥有最多区块的链。这可以避免某人伪造并创建大量低难度的区块,欺骗网络将其接受为“最长”链。
点击这里查看当前已采集区块数目
没有最大数目。区块会不断以 10 分钟一个的速度添加到区块链的末尾
是的。区块用以证明交易在某个特定的时间存在。在所有比特币都被采集后,交易仍然会发生。因此只要有人交易比特币,区块仍然会被创建。
没有人可以准确说出。有一个采矿计算器会告诉您可能花去的时间。
没有进度增加 1% 的说法。每次运算并不会增加进度。计算 24 小时后您获得比特币的几率和您刚开始计算时是相等的。
这和您同时旋转 37 个硬币并使它们都正面朝上一样。每次您尝试,您成功的机会是相同的。

挖比特币的原理


                
比特币每个区块的数据结构,每个区块由区块头和区块体两部分组成。区块头中包含父区块的哈希,版本号,当前时间戳,难度值,随机数和上面提到的默克尔树根。区块体中包含了矿工搜集的若干交易信息,假设有8个交易被收录在区块中,所有的交易生成一颗默克尔树,默克尔树是一种数据结构,它将叶子节点两两哈希,生成上一层节点,上层节点再哈希,生成上一层,直到最后生成一个树根。

比特币区块里的各个字段含义(先写了个nonce)


                

nonce是个啥意思?根据bitcoin wiki

  

nonce是一个4-byte大小的区域,nonce的值设定使得该块的hash是以一串0开头的。
   对于块数据的一点点改变(比如nonce)都会引起blockquan hash的巨大变化。由于逆向预测hash值相对应的一组bit值(hash原文)是不可行的,在尝试足够多的nonce值且计算每个nonce值相对应的blockquan hash之后可以找到一个满足有指定数量 0 bits (0比特位) 的hash值。而 0 bits的数量值是由difficult设定的。最终产生的hash须得是一个小于当前difficulty值。
   因为这个迭代的计算耗费时间和资源,块的出现也就是得到了正确的nonce值,这构成了 proof of work

  

关于以太坊里的nonce 网上很多解释,很多一上来就是 交易计数器 , 然而却把跟POW有关的丢了吗?事实上以太坊里的nonce有两种意思,一个是proof of work nonce,一个是account nonce。

  

那智能合约呢?合约也算是Account的一种,那也有nonce吗?

  

是的,而且合约里面的nonce也差不多,也是一个counter。在智能合约里,nonce的值代表的是该合约创建的合约数量。只有当一个合约创建另一个合约的时候才会增加nonce的值。但是当一个合约调用另一个合约中的method时  nonce的值是不变的。

  

在以太坊中nonce的值可以这样来获取(其实也就是属于一个账户的交易数量):

  

但是这个方法只能获取交易once的值。目前是没有内置方法来访问contract中的nonce值的,除了自己定义一个counter来计数...

  

那好,再来看一下Ethereum blockquan中的nonce:
   以太坊和比特币区块链一样,也需要proof of work(计划转移到股份证明也早已在做了)。在比特币区块链中,pow应该是要算出一个符合难度要求的值,通常是以一串0开头的。这个难度一直在变化。可以查看 比特币区块链的POW难度变化 。


bitcoin mining详解


                
mining总共可以分为两种,一种是: Solo Mining ;一种是: Pool Mining
  
如下图所示,solo miner 使用 bibtcoind 来从网络上面来拿到新的交易。 通过使用 getblockquantemplate  这个RPC命令去定期轮询 bitcoind 来获取新的交易。
                                          
挖矿的时候,首先去构造一个80字节的块头结构。 之后遍历块头中的nonce字段来生成与其对应的hash值。
  
挖矿的时候,我们需要两个点,一个是去构造coinbase,另一个是回填块头结构的nonce值。当块头结构构造好之后,就会返回给client端。
  
上述过程也就是去折腾80字节的块头结构:
                                          
这种挖矿的形式就是我每一个人贡献我自己的算力,然后大家的算力加起来,合成一个矿池,现在由我矿池统一挖矿,挖到块之后,按照大家算力的百分比分成。
  
上面我们提到了,挖矿就是折腾那80字节,现在我们具体看看怎么折腾。
  
4 字节的nVersion字段,这个我们可以认为它是不变的,为什么这么说,因为这个字段只有在进行升级时候才会改变,平时没事也不升级啊。
  
32字节的hashPrevblockquan字段,这个是不变的,它是由前一个区块确定的,你没办法改变它。
  
4字节的nBits字段,这个也基本是不变的,它由全网的算力决定,每2016个块才会进行一次难度调整,调整的算法是固定的。
  
上述三个字段我们基本认为不会变,也就是在构造80字节的块头的时候,和你们没什么大的关系。
  
4字节的nTime,这个字段是可变的,但悲哀的是,蹦跶的范围不大,理论上是允许后一个区块的区块时间略早于前一个区块时间,所以看到你的“父亲”出生的比你晚不必要惊讶,全网太大了,网络稍微有点延迟,这个东西也没办法避免,一般来说,矿工会直接使用机器当前时间戳。
  
4字节的nNonce,这个字段好好唠唠,一个字节8位,4字节32位,所以,它能提供2的32次方的寻址范围。在CPU和GPU的挖矿时代,这个字段也就足够用了,所以当时候都是去迭代遍历这个nNonce字段,算出来复合要求的值,回去填充块头。但是随着算力的提升,4GB的寻址肯定不够用了,怎么办呢?
  
32自己的hashMerkleRoot字段,merkle tree具体的作用就不在这里展开说明了,该字段是矿工构造的coinbase加上这个块打包进来的所有交易,算出来的一个32字节的hash‘值,只要包括coinbase字段在内的所有交易有任何风吹草动,该字段都会不一样。32字节啊,也就是说提供了2的256次方的寻址可能,目前世界上现存的所有算力全部加起来也算不完吧,如果量子计算落地,另当别论。
  
综上所述,挖矿流程我们可以简单总结如下:

目录[+]