区块链基础 - 挖矿任务
您可能已经了解过,挖矿任务是从矿池发送到矿工端,或者您可能再矿机的控制台中看到挖矿任务被接受。在这篇文章中,我们将解释什么是挖矿任务(Mining job)。
什么是挖矿任务(mining job)?
简而言之,挖矿任务(mining job)是从矿池发送到矿机的消息(message),该消息包含矿池目标难度、extranonce1、extranonce2信息以及区块中包含的其他区块链细节信息。
您可以阅读这篇关于矿池挖矿的文章,您可以了解到矿池为什么必须让矿工知道要猜测什么数字,以便将工作分配给所有矿工。
矿池与矿机之间会一直保持通讯,矿池将发送需要解决的任务数据给矿机,而矿机将返回问题的运算答案,挖矿任务是矿池与矿机之间相互发送的消息。
矿机如果根据矿池提供的数据找到了相应的运算结果,则矿机将向矿池返回一个挖矿任务运算结果,也称为已接受的算力份额(accepted share)。
挖矿任务包含了哪些数据?
这取决于区块链的种类,不同的代币或不同的算法使用不同的信息,下面是挖矿任务中包含的数据:
- Job ID(任务ID): 即任务ID,矿工(矿机)在提交由任务ID生成的算力份额时使用该ID。
- Previous Block Hash(此前的区块Hash): 前一区块的Hash输出值。
- Coinbase1: 矿工在交易数据之后插入ExtraNonce1和ExtraNonce2值。
- Coinbase2: 矿工追加该数值到交易数据的第一部分以及两个ExtraNonce值之后。
- Merkle_Branch: 针对Merkle分支对coinbase交易进行hash处理,以构建最终的markle root。
- Version(版本): Bitcoin区块版本。
- nBits: 编码的网络难度。
- nTime: 当前时间。
- Clean_Job: 当该值为true时,矿机将停止在此前的作业工作,并开始在从矿池中接收到的新作业开始工作。
从矿池发送到矿工的挖矿作业的示例
矿工与矿池之间的有效负载被编码为JSON-RPC消息。
"id":null,"method":"mining.notify","params":["0000000053c411aa","b87d45785c4cc00150867971b7233c4446dfb4bd0003cb690000000000000000","01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff5103539f0b082f5669614254432f2cfabe6d6d138e19afd289f4e1bcc69389a865ede0bd9d642189026485bd4bde3e062686b3100000000000000012734e8daaaa0f6280bf91","ffffffff03e44e2826000000001976a914536ffa992491508dca0354e52f32a3a7a679a53a88ac00000000000000002b6a2952534b424c4f434b3a51115f17d525a3952237430d78f5f4b2f4bc63148fd82f364f77c5260048d97e0000000000000000266a24aa21a9edfcfe2c5bd8a7df958c20d29cd5457ef6565a30ae10bf137602d4b838288908a500000000",["93cbc2abc1128cc9569a4ecbba4188b25ce7c9c8b5e5c9a2810cf0973d82f717","322139a87a09d3037d340f393a1d89ad34b163a07a9a7012fd58d92ca5e038c5","34cfc928a8bb978ab345d66c4940f566b5a36a1b6f7f5c2a617f68acc4f0a1e8","e4cc101b5df77d48d7abeb9a52d1a4bd8768a5cab4b568f804849d793eb8c432","ef14da7b3a470fdd3074633f711a0dcf003c91f4b6b02074d64e51878aafbd37","5ddd66513381c05cb479bfd062daa043295ee608f7bb22082f7c9c2d7f0aac40","bfc4e8f1e80ae3697bccfea631520e2907c7ad9ae5f5e3385aa4c8472ad39624","e6edd6c37b6924f4d5ab9350b33d5c7912d6df8a77be4d2d432d91134c0e83da","7aac970301559306792b9d017e54012ac3b1711c10d2c147fb9cbc32d1f1c63a","40329f69e3152d4537fa6e84e62e2f0830a18e3089455a78d58a54efd9479005","9a9f5af30e3bbc67e282fda897531337ab7d87e1da95d79f4831e8867b888c92","415bb76a0d8183657e0a5ac2bab8676e6ffa27ee3b2565ba1769af7503e9efad"],"20000000","1707a429","6364e9cf",false]}
上面的信息看起来非常晦涩难懂,所以这里有一种更容易理解的格式:
"id":null,"method":"mining.notify","params":["JobID","PreviousBlockHash","Coinbase1","Coinbase2",[MerkleBranch],"Version","nBits","nTime",false]}
从矿机发送到矿池的挖矿任务运算结果的示例
{"id":15866,"method":"mining.submit","params":["3HJ4xQWjAsKuTwL1QBg4b5875hNcYRrtAr.workerName","0000000053c411aa","0446000000","6364e9cf","75a22825"]}
mining.submit的释义:
{"id":15866,"method":"mining.submit","params":["username","JobID","Extranonce2","nTime","nonce"]}
如您所见,两个任务上的任务id是相同的。