主页 > imtoken限制中国用户该咋办 > 比特币开发指南——挖矿

比特币开发指南——挖矿

如上所述,独立矿工通常使用bitcoind进行挖矿。 他们使用的挖矿软件周期性调用bitcoind并使用getblocktemplate获取新的交易。 它提供了一个新的交易列表和公钥,通常会向其发送 coinbase 交易。

独立挖矿

如上所述,独立矿工通常使用bitcoind进行挖矿。 他们使用的挖矿软件周期性调用bitcoind并使用getblocktemplate获取新的交易。 它提供了一个新的交易列表和公钥,通常将 CoinBase 交易发送到该列表和公钥。

挖矿软件使用模板构建区块并创建区块头,然后将80字节的区块头发送给挖矿硬件(如ASIC),同时发送目标阈值(难度系数)。 挖矿硬件暴力尝试每一个可能的区块头值并生成相应的哈希值。

如果所有生成的值都在阈值之上,挖矿硬件将从挖矿软件中获取一个新的区块头。 这个区块头是通过在 CoinBase 交易的 CoinBase 字段中添加额外的临时数据获得的。 另一方面,如果找到的哈希值低于阈值,则挖矿硬件将区块头和临时数据返回给挖矿软件。 后者将区块头与区块结合起来,将完整的区块发送给bitcoind,等待bitcoind广播它,并可能在不久的将来将其添加到区块链中。

矿池

挖矿除了比特币还有什么币_比特币挖矿程序源代码_比特币挖矿程序

矿池中的矿工遵循类似的工作流程,如下图所示,允许矿池所有者根据他们的工作份额向矿工支付报酬。 矿池通过bitcoind接入网络获取新的交易。 使用稍后讨论的方法之一,每个矿工的挖矿软件都连接到矿池并获取构建区块头所需的信息。

在这种中心化挖矿方式中,矿池设定了一个比网络难度大数倍的目标阈值(较低的难度)。 这将导致矿工返回许多具有合格哈希值的区块头,而不是那些不合格的区块头。 这证明(通常)矿工检测到 1/100 的哈希值出现可能性。

接下来,矿工向矿池发送一份需要验证的子目标区块头信息,Merkleroot中提到的交易区块对矿池有效(这通常意味着CoinBase交易必须支付矿池的费用)。)

矿工发送到矿池的数据称为份额,因为它证明了矿工对已完成工作的份额。 有时比特币挖矿程序,矿池会收到低于网络哈希率目标的份额——矿池会将它们添加到网络区块链中。

挖矿获得的区块奖励和产生的交易手续费支付给矿池。 矿池根据他们的工作份额向矿工支付部分费用。 例如,如果矿池的目标门槛比全网的目标门槛低100倍,即每个成功的区块平均需要产生100股,那么矿池将支付收益的1%用于每份。 基于这种基本的分配制度,不同的矿池采用不同的奖励分配制度。

挖矿除了比特币还有什么币_比特币挖矿程序源代码_比特币挖矿程序

原块

在单人和矿池挖矿中,挖矿软件都会获取必要的信息来构建区块头。 本节不能以线性方式描述这些信息是如何传播和使用的。 然而,在实际实现中,并行线程和队列用于保持 ASIChashers 以最大容量工作。

getworkRPC

最早和最简单的方法是现在已弃用的核心挖掘协议是 getworkRPC,它直接为矿工构建区块头。 由于区块头仅包含一个 4 字节的随机字符串(nonce)并且只能支持 4.0GH(gigahashes),因此现在许多矿工每秒必须进行数十或数百次 getwork 请求。 独立矿工仍然可以使用 getwork,但现在大多数矿池不推荐或不允许使用它。

获取块模板RPC

比特币挖矿程序_比特币挖矿程序源代码_挖矿除了比特币还有什么币

getblocktemplateRPC是一种改进的挖矿方法,它为挖矿软件提供了更多信息:

1、CoinBase交易需要支付给矿池或个人矿工bitcoind钱包的手续费信息。

2、需要包含bitcoind钱包提供的交易信息或矿池建议的交易信息,让挖矿软件检查交易,有选择地添加额外交易,去除不需要的交易。

3. 为下一个区块构建区块头所需的其他信息:区块版本、前一个区块哈希值和比特(目标)。

4、当前矿池入股目标门槛。 (对于单独挖矿的矿工来说比特币挖矿程序,就是全网的算力目标。)

比特币挖矿程序源代码_挖矿除了比特币还有什么币_比特币挖矿程序

使用接收到的交易,挖矿软件在 CoinBase 的额外 nonce 字段中添加一个 nonce,然后将所有交易转换成 Merkel 树,以导出区块头中使用的 Merkleroot。 每当需要更改额外的 nonce 字段时,挖矿软件都会重建 Merkle 的必要部分,并更新块头中的时间和 Merkleroot 的字段。

与所有 bitcoindRPC 一样,getblocktemplate 通过 HTTP 发送。 为了确保他们获得最新的工作,大多数矿工使用 HTTP 长轮询来始终保持 getblocktemplate 请求打开。 这意味着当P2P网络上的任何一个矿工发布一个新的区块或者矿池想要向挖矿软件发送更多的交易时,矿池可以及时向矿工发送一个新的getblocktemplate。

地层

Stratumminingprotocol 是一种广泛使用的替代 getblocktemplate 的挖矿协议。 Stratum 专注于为矿工提供他们自己构建标头所需的最少信息:

1、构建CoinBase交易需要支付矿池所需的信息。

比特币挖矿程序源代码_挖矿除了比特币还有什么币_比特币挖矿程序

2. 当使用新的附加随机数更新 CoinBase 交易时,为了创建新的 Merkleroot,需要重新哈希部分 Merkle 树。 Merkle 树的其他部分,如果存在,将不会被发送。 这有效地将需要发送的数据量(最多)限制在大约一千字节。

3. 构建下一个块的标头所需的所有其他非 Merkleroot 信息。

4、当前矿池入股目标门槛。

挖矿软件使用接收到的CoinBase交易,在CoinBase的extra nonce字段中添加一个nonce,对CoinBase交易进行哈希处理,并将Hash值添加到Merkle树的接收部分。 因为需要创建Merkleroot,所以对树进行哈希处理,将Merkleroot添加到区块头信息中。 每当需要更改额外的 nonce 字段时,挖矿软件都会更新并重新哈希 CoinBase 交易,重建 Merkleroot,并更新标头的 Merkleroot 字段。

与 getblocktemplate 不同,使用 Stratum 的矿工无法检查或向他们当前正在挖掘的区块添加交易。 此外,Stratum 协议直接使用双向 TCP 套接字,因此当新区块在 P2P 网络中发布时,矿工无需使用 HTTP longpoll 来确保来自矿池的即时更新。

资源:有关更多信息,请参阅 GPL3 许可的 BFGMiner 挖矿软件或 AGPL3 许可的 Eloipool 挖矿软件。 还有许多其他挖矿程序,但其中许多是 BFGMiner 或 Eloipool 的分支。

挖矿除了比特币还有什么币_比特币挖矿程序源代码_比特币挖矿程序