PoW挖矿算法原理及其在比特币、以太坊中的实现荐

  PoW,全称Proof of Work,即工作量证明,又称挖矿。大部分公有链或虚拟货币,如比特币以太坊,均基于PoW算法,来实现其共识机制挖矿挣钱是什么原理。即根据挖矿贡献的有效工作,来决定货币的分配。

比特币区块

  比特币区块由区块头和该区块所包含的交易列表组成。区块头大小为80字节,其构成包括:

   4字节:版本号
  32字节:上一个区块的哈希以太坊是什么东西
  32字节:交易列表的Merkle根哈希算法的有穷性是指
   4字节:当前时间戳
   4字节:当前难度值
   4字节:随机数原理Nonce值

  此80字节长度的区块头,即为比特币Pow算法的输入字符串。
  交易列表附加在区块头之后,其中第一笔交易为矿工获得奖励和手续费的特殊交易。

  bitcoin-0.15.1源码中区块头和区块定义:

class CBlockHeader
{
public:
//版本号
in挖矿t32_t nVersion;
//上一个区块的哈希值
uint256 hashPrevBlock;
//交易列表的Merk原理图用什么软件画le根哈希值
uint25以太坊价格今日行情6 hashMerkleRoot比特币怎么买;
//当前时间戳
uint32_t nTime;
//当前挖矿难度,nBits越小难度越大
uint32_t nBits;
//随机数Nonce值
uint32_t nNonce;
//其它代码略
};
class CBlock : public CBlockHeader
{
public:
//交易列表
std::vector<CTransactionRef> vtx;
//其它代码略
};
//代码位置原理图src/primitives/block.h

比特币Pow算法原理

  Pow的过程,即为不断调整Nonce挖矿app十大排名值,对区块头做双重SHA256哈希运算,使得结果满足给定数量前导0的哈希值的过程。
  以太坊浏览器其中前导0的个数,取决于挖矿难度,前导0的个数越多,挖矿难度越大。

  具体如下:

  1、生成铸币交易,并挖矿是什么意思与其挖矿app十大排名它所有准备打包进区块的交易组成交易列表,生成Me原理图和电路图区别rkl比特币图片e根哈希值。
  2、将Merkle根哈希值,与区块头其它字段组成区块原理图怎么生成pcb头,80字节长以太坊价格走势度的区块原理图头作为Pow算法的输入。
  3、不断变更区块头中以太坊价格今日行情的随机数Nonce,对变更后的区块头做双重SHA256哈希运算,与当前难度的目标值做比对,如果小于目标难度,即Pow完成原理图怎么画

  Pow完成的区块向全挖矿网广播,其他节点将验证其是否符比特币价格今日行情合规则,如果验证有效,其他节点将接收此区块,并附加在已有区块链之后以太坊价格走势。之后将进入下一轮挖矿。

  bitcoin-0.15.1源码中Pow算法实现:

UniValue gener挖矿机ateBlocks(std:以太坊浏览器:shared_ptr<CReserveScript> coinbaseScript比特币, int nGenerate, uint64_t nMaxTries, bool keepScript)
{
static const int nInnerLoopCount = 0x10000;
int nHeightEnd = 0;
int nHeight = 0;
{   // Don't keep cs_main locked
LOCK(cs_main);
nHeight = chainActive.Height();
nHeightEnd = nHeight+nGenerate;
}
u挖矿一天能赚多少钱nsigned int nExt挖矿软件appraNonce = 0;
UniValue blockH原理图怎么看的懂ashes(UniValue::VARR);
whil以太坊怎么挖矿e (nHeight < nHe比特币是什么东西ightEnd)
{
std::unique_ptr<CBlockTemplate> pblocktem以太坊是什么东西plate(BlockAssem比特币价格今日行情bler(Params()).CreateNewBlock(coinbaseScript->reserveScript));
if (!pblocktemplate.以太坊价格走势get())
throw JSONRPCError(RPC_INTERNAL_ERROR, "Couldn't cr挖矿挣钱是什么原理eate new block");
CBlock *pblock = &pblocktemplate->b原理图设计lock;
{
LOCK(cs_main);
IncrementEx挖矿是什么意思traNonce(pblock,算法的五个特性 chainActi挖矿机ve.Tip(), nExtraNonce);
}
//不断变更区块头中的随机数Nonce
//对变更算法导论后的区块头做双重SHA256哈希运算
//与当前难度的目标值做比对,如果小于目标难度,即Pow完成
//ui以太坊挖矿一天赚多少nt64_t nMaxTries = 1000000;即重试100万次
while (nMaxTries > 0 &am算法工程师p;&以太坊是什么东西amp; pblock->nNonce < nInnerLoopCount && !CheckProofOfWork(pblock->GetHash(), pblock->n算法导论Bits, Params().GetConsensus())) {
++pblock->nNonce;
--n算法工程师MaxT以太坊挖矿一天赚多少ries;
}
if (nMaxTries == 0) {
break;
}
if (pblock->nNon以太坊价格今日行情ce == nInnerLoopCount) {
continue;
}
std::shared_ptr<const CBlock> shared_pblock = std::make_shared&算法分析的目的是lt原理是什么意思;const CBlock>(*pblock);
if (!ProcessNewBlo以太坊浏览器ck(Params(), share挖矿app排行d_pblock, true, nullpt以太坊是什么东西r))
thro算法w JSONRPCErr算法的时间复杂度是指什么or(RPC_INTERNAL_ERROR, "ProcessNewBlock, block not accepted");
++nHeight;
blockHashes.push_back(pblock->GetHash().挖矿GetHex());
//mark script as important because it was used at挖矿软件app least for one coinbase output if the script came from the wallet
if (keepScript)
{
coinbaseScript->KeepScript();
}
}
return blockHashes;
}
//代码位置src/rpc/mining.原理图怎么看的懂cpp

  另附bitcoin-0.15.1源码中生成铸币交易和创建新块:

std::uni以太坊浏览器que_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& scriptPubK原理图和电路图区别eyIn, bool fMineWitnessTx)
{
int64_t nTimeStart = GetTimeMicros()算法分析的两个主要方面是;
resetBlock();
pblock原理template.reset(new CBlockTemplate());
i以太坊挖矿一天赚多少f(!pbl比特币根本卖不出去啊ocktemplate.挖矿挣钱appget())
return nullpt比特币怎么买r;
pblock = &pblocktemplate->block; // pointer for conve原理图和电路图区别nience
pb以太坊是什么东西lock->vtx.emplace_back();
pblocktemplate->vTxFees.push_back(-1); // updated at end
pblocktemplate->vTxSigOpsCost.push_back(-1); // updated at end
LOCK2(cs_ma以太坊价格走势in, mempool.cs);
C原理是什么意思BlockInd算法的时间复杂度是指什么ex* pindexPrev = chainActive.Tip();
nHeight = pindexPrev->nHeight + 1;
//版本号
pblock->nVersion = ComputeBlockVersion(pindexPrev, chainparams.GetConsensus());
if (chainparams.MineBlocksOnDemand())
pblock->nVersion = gArgs.GetArg("-blockversion", pblock->nVer挖矿挣钱是什么原理sion);
//当前时间戳
pblock->nTime = Ge挖矿是什么意思tAdjustedTime();
const int64_t nMedianTimePast = pin原理图dexPrev-原理英文>GetM以太坊是什么东西edian原理图怎么画TimePast();
nLockTimeCutoff = (STANDARD_LOCKTIME_VERIFY_FLAGS & LOCKTIM原理图怎么看的懂E_MEDIAN_TIME_PAST)
? nMedianTimePast
: pblo原理图怎么画ck->GetBlockTime();
fIncludeWitness = IsWitnes比特币图片sEnabled(pindexPrev, chainparams.GetConsensus()) && fMineWitnessTx;
int nPackagesSelected = 0;
int nDescendantsUpdated = 0;
addPackageT算法导论xs(nPackagesSelected,原理图怎么画 nDescendantsUpdated);
int64_t nTim算法工程师e1 = GetTimeMicros();
nLastBlockTx = nBlockTx;
nLastBlockWeight = nBlockWeight;
//创建铸币交易
CMutableTransaction coinbaseTx;
coinbaseTx.vin.resi原理图设计ze(1);
coinbaseTx.vin[0].prevout.SetNull();
co原理inbaseTx.vout.res比特币挖矿ize(1);
//挖矿奖励和手续费
coinbaseTx.vout[0].scriptPubKey = scriptPubKeyIn;
coinbaseTx.比特币挖矿vout[0].nValue = nFees + Ge挖矿tBlockSubsidy(nHeig原理图怎么画ht, chainparams.GetConsensus());
co挖矿软件appinbaseTx.vin算法分析的目的是[0].scriptSig = CScr算法的时间复杂度取决于ipt() << nHeight << OP_0;
//第一笔交易即为矿工获得奖励和手续费的特殊交易
pblock->vtx[0] = MakeTransactionRef(std::move(coinbaseTx));
pblocktemp原理late->vchCoinbaseCommitment = GenerateCoinbas原理图用什么软件画eCommitment(*pblock, pindexPrev, chainparams.GetConsensus());
pblocktemplate->vTxFees[0] = -nFees;
LogPrintf("CreateN以太坊是骗局吗ewB挖矿机lock(): block weight: %u txs: %u比特币价格 fees: %ld si算法设计与分析gops %dn", GetBlockWeight(*pblock), nBlockTx, nFees, nBlockSigO挖矿psCost);
//上一个区块的哈希值
pblock->hashPrevBlock  = p原理indexPrev->GetBlockHash();
UpdateTime(pblock, chainparams.GetConsensus(), pindexPrev);
//当前挖矿难度
pblock->nBits          = GetNextWorkRequir以太坊价格走势ed(pindexPrev, pblock, chainparams.G算法的有穷性是指etConsensus());
//随机数Nonce值
pbloc挖矿一天能赚多少钱k->挖矿app排行nNonce         = 0;
pblo挖矿赚钱cktemplate->vTxSigOpsCost[0] = WITNESS_SCALE_FACTOR * GetLeg比特币价格今日行情acySigOpCount(*pblock->vtx[0]);
CValidationState state;
if (!TestB算法工程师lockValidity(state, chainparams, *pblock, pindexPrev, false, false)) {
throw std::runtime_error(str比特币再次暴跌或正沦为仙币printf("%s: TestBlockVal算法导论idity failed: %s", __func__, FormatStateMessage(state)));
}
int64_t nTime2 = GetTimeMicros();
LogPrint(BCLog::BENCH, "CreateNewBlock() packages: %.2原理图设计fms (%d packages, %d updated descendants), valid挖矿软件ity: %.2fms (t以太坊otal %.2fms)n", 0.001 * (nTime1 - nTimeSt比特币交易平台art), nPackagesSelected, nDesce以太坊怎么挖矿ndantsUpd原理图用什么软件画ated, 0.001 * (nTime2 - nTime1), 0.001 * (nTime2 - nTimeStart));
return std::move(pblock挖矿app排行template);
}
//代码位置src/miner.cpp

比特币挖矿难度计算

  每创建2016个块后将计原理效应有哪些算新的难度,此后的2016个块使用新的难度。计算步骤如下:

  1、找到前2016个块的第一个块,计算生成这2016个块花费的时间。
即最后一个块的时间与第一个块的时间差。时间差不小于3.比特币5天,不大于56天。
  2、计算前2016个块的难度总和,即单个块的难度x总时间。
  3、计算新的难度,即2016个块的难度总和/14天的比特币根本卖不出去啊秒数,得到每秒的难度值。
  4、要求新的难度,难度不低于参数定义的最小难度。

  bitcoin-0.15.1源码中计算挖矿难度代码如下:

//nFirstBlockTime即前2016个块的第一个块的时间戳
unsigned int CalculateNextWorkRequired(const CBlockIndex* pindex原理图和电路图区别Last, int64_t nFirstBlockTime, const C挖矿app排行onsensus::Params& params)
{
if (pa以太坊是骗局吗rams.fPowNoRetargeting)
return pindexLast-&g原理t;nBits;
//计算生成这2016个块花费的时间
int64_t nActualTimespan = pindexLast->GetBloc挖矿app十大排名kTime() - nFirstBlockTime;
//不小于3比特币最新价格.5天
if (nActualTimespan < params.nPowTargetTimespan/4)
nActualTimespan = params.nPowTargetTimespan/4;
//不大于56天
if (nActualTimespan > params.n比特币怎么买PowTargetTimes原理效应有哪些pan*4)
nActualTimespan = params.nPowTargetTim算法工程师espan*4算法导论;
// Retarget
const arith_uint256 bnPowLimit = UintToArith256(params.powLi挖矿app十大排名mit);
arith_uint256 bnNew;
bnNew.SetCompact(pindexLast->nBits);
//计算前2016个块的难度总和
//即单个块的挖矿软件难度*总时间
bnNew *= nActualTimespan;
//计算新的难度
//即2016个块的难度原理效应有哪些总和/14天的秒数
bnNew /= params.nPowTargetTimespan;
//bnNew越小,难以太坊价格度越大
//bn算法分析的两个主要方面是New越大,难度越小
//要求新的难度,难度不低于参数定义的最小难度
if (bnNew > bnPowLi比特币价格今日行情mit)
bnNew = bnPowLimit;
retur挖矿机n bnN算法的有穷性是指ew.GetCompact();
}
//代码位以太坊是骗局吗置src/pow.cpp

以太坊区块

  以太坊区块由Header和Body两部以太坊怎么挖矿分组成。

  其中Header部分成员如挖矿机下:
  ParentHash,父区块哈希
  UncleHash,叔区块哈希,具体为Body中Uncles数组的RLP哈希值。RLP哈希,即某类型对象RLP编码后做SHA3哈希运算。
  C挖矿app排行oinbase,矿工地址。
  Root,StateDB中state Trie根节点RLP哈希值。
  TxHash,Bl挖矿app排行ock中tx T比特币再次暴跌或正沦为仙币rie根节点RLP哈希值。
  ReceiptHash,Block中Receipt Trie根节点的挖矿机RLP哈希值。
  Difficulty,区块难度,即当前挖矿难度。
  比特币是什么东西Number,区块序号,比特币交易平台即父区块Number+1。
  GasLimit,区块内所有Gas消耗的理论上限,创建时指定,由父原理图区块GasUsed和GasLimit计算得出。
  GasUs挖矿是什么意思ed,区块内所以太坊价格今日行情有Transaction执行时消耗的Gas总和。
  Time,当算法前时间原理戳。
  Nonce,随机数Nonce值。

  有关叔区块:
  叔区算法分析的两个主要方面是块,即孤立的块。以太坊成比特币再次暴跌或正沦为仙币块速度较快,导致产生孤块。
  以太坊会给发现孤块的矿工以回报,激励矿工在新块中引用孤块,引用孤块使主链更重。在以太坊中,主链是指最重的链。

  有关state Trie、tx Trie和Receipt Trie:
  state Trie,所有账户对象原理图和电路图区别可以逐个插入一个Merkle-PatricaTrie(MPT)结构中,形成sta比特币价格te Trie。
  tx Trie:Block中Transactions中所有tx对象,逐个插入MPT结构中,形成tx Trie。
  Receipt Trie:Bl原理ock中所有Transaction执行后生成Receipt数组,所有Receipt逐个插入MPT结构中,形成Receipt Trie。

  Body成员如下:
  Transactions,交易列表。
  Uncles,引用的叔区块列表。

  go-eth原理是什么意思ereum-1.7.3源码中区块头和区块定义:

type Header struct {
//父区块哈希
ParentHash  common.Hash
//叔区块哈希
UncleHash   common.Hash
//矿工地址
Coinbase    common.Address
//StateD挖矿软件appB中state Trie比特币怎么买根节点RLP哈比特币再次暴跌或正沦为仙币希值
Ro挖矿挣钱appot        commo比特币怎么买n.Hash
//Block中tx Trie根节点RLP哈希值
TxHa比特币挖矿sh      common.Hash
//Block中Receipt Trie根节点的RLP哈希值
ReceiptHash common.Hash
Bloom       Bloom
//区块难度
Difficulty  *big.Int
//区块序挖矿机号
N以太坊是骗局吗umber      *big.Int
//区块内所有Gas消耗的理论上限
GasL原理图怎么看的懂imit    *big.Int
//区块内所有Transaction执行时消耗的Gas总和
GasUsed     *big.Int
//当前时间戳
Time        *big.Int
Extra       []byte
MixDigest   common.Hash
//随机数Nonce值
Nonce       BlockNonce
}
type Body struct {
//交易列表
Tra原理图nsactions []*Transaction
//引用的叔区块列表
Uncles       []*比特币根本卖不出去啊Heade以太坊r
}
//代码位置core/types/block.go

以太坊Pow算法原理

  以太坊Pow算法可以表算法工程师示为如下公式:
  RAND(h, n) &lt挖矿一天能赚多少钱;= M / d

  其中RAND()表示以太坊挖矿一天赚多少一个概念函数,代表以太坊价格一系列的复杂运算。
 原理图设计 其中h和n为输入,即区块Header的哈希、以及Header中原理图设计的Nonce。
  M表示一个极大的算法导论数,此处使用2^2比特币挖矿56-1。
  d,为区块难度,即Header中的Difficulty。

  因此在h和n确定的情况下,d越大,挖矿难度越大,即为Difficulty本义。
  即不断变原理效应有哪些更Nonce,使RAND(h, n)满足RAND(h, n) <= M / d,即完成Pow。

  go-ethereum-1.7.3源码中原理图怎么生成pcbPow算法实现:

func (ethash *Ethash) mine(block *types.Block, id int, seed uint64, ab算法ort chan struct{}, found chan *types.Block) {
// E原理是什么意思xtract some data from the header
var (
header = block.Header()
hash   = header.Has比特币交易平台hNoNonce(算法分析的两个主要方面是).Bytes()
//target以太坊价格,即M / d,即(2^256-1)算法的时间复杂度是指什么/Difficulty
target = new(big.Int).D以太坊挖矿一天赚多少iv(maxUint256, header.D算法设计与分析ifficulty)
number  = header.Number.挖矿挣钱appUint64()
dataset = ethash.dataset(number)
)
// Start generatin原理图和电路图区别g random nonces until we abort or find a good one
var (
attempts = int64(0)
nonc以太坊价格走势e    = seed
)
logger := log.New("miner", id)
logger.Trace("Started ethash search原理图 for new nonces", "seed", seed)
for {
select {
case <-abort:算法的有穷性是指
// Mining terminated, update stats and abort
log以太坊是骗局吗ger.Trace("Ethas算法h no原理效应有哪些nce search aborted", "attempt算法分析的两个主要方面是s", nonce-seed)
ethash.hash比特币挖矿ra比特币最新价格te.Mark(attempts)
return
default:
// We don't have to update hash rate on every nonce, so update after after 2^X nonces
attem比特币最新价格pts++
if (attempts % (1 << 15)) == 0 {
ethash.hashrate.Mark(attempts)
a比特币价格ttempt挖矿是什么意思s = 0
}
//hashimotoFull即RAND(h, n)所代表的一系列的复杂运算
digest, result := hashimo比特币最新价格toFull原理图怎么生成pcb(dat原理图怎么看的懂aset, hash, nonce)
//res算法设计与分析ult满足RAND(h, n)  <=  M / d
if new(big.Int).SetBytes(r以太坊价格今日行情esult).Cmp(target) <= 0 {
// Correct nonce found, create a new head原理图怎么看的懂er with it
header = types.CopyHeader(header)
header.Nonce = types.EncodeNonce(nonce)
header.MixDigest = common.BytesToHash(dig算法的时间复杂度取决于est)
// Seal and return a block (if still needed)
select {
case fo原理und <- bl算法ock.Wi比特币再次暴跌或正沦为仙币thSeal(header):
logger.Trace("Ethash nonce挖矿挣钱app found and挖矿软件app reported", "attempts", nonce-seed, "nonce", non原理是什么意思ce)
case <-abort:
logger.Trace("Ethash nonce found bu比特币再次暴跌或正沦为仙币t discarded", "attempts", nonce-seed, "nonce", nonce)
}
retu算法的时间复杂度是指什么rn
}
//不比特币价格断变更Nonce原理
nonce++
}
}
}
//代码位置consensus/ethash/sealer.go

以太坊原理图怎么画挖矿难度计算

  以太坊每次挖矿均需计算当前区块难度。
  按版本不同有三种计算难度的规则,分别为:calcDifficultyByzantium(Byzantium版)、calcDifficultyHomestead(Homestead版)、calcDifficultyFrontier(Frontier版)。此处以calcDifficultyHomestead为例。

  计算难度时输入有:
  parent_timestamp:父区块时间戳
  parent_diff:父区块难度
  bl比特币交易平台ock_timestamp:当前区块时间戳
  block_number:当前区块的序号

  比特币挖矿当前区块难度计算公式,即:

block_diff = parent_diff
+ (parent_diff / 2048 * max(1 - (block_tim算法estamp - parent_timestamp) // 10, -9比特币9)
+ 2^((block_以太坊怎么挖矿number // 100000) - 2)

  其中//为整数除法运算符,a//b,即先计算a/b,然后取不大于a/b的最大整数。

  调整难度的目的,即为使挖矿时间保持在10-19s期间内,如果低于10s增大挖矿难度,如果大于19s将减小难度。另外,计算出比特币再次暴跌或正沦为仙币的当前区块难度不应低于以太坊创世区块难度,即131072。

  go-ethereum-1.7.3源码中计算挖矿难度代码如下:

func calcDifficultyHomestead(time uint以太坊64, parent *types.Header) *算法的时间复杂度是指什么big.Int {
// https://github.com/e以太坊怎么挖矿thereum/EIPs/blob/master/EIPS/eip-2.mediawiki
// algorithm:
// diff = (parent_diff +
//         (parent_diff / 2048 * ma以太坊挖矿一天赚多少x(1 - (b原理图l比特币价格ock_timestamp -以太坊 parent_timestam以太坊p) // 10, -99))
//        ) + 2^(periodCount - 2)
bigTime := new(big.Int).SetUint64(time)
bigParentT比特币价格今日行情ime := new(big.Int).Set(parent.Time)
// holds intermediate values to make the algo比特币是什么东西 easier to read & audit
x := new(big.Int)
y := new(big.Int)
// 1 - (block_timestamp - parent_t比特币图片imestamp) // 10
x.Sub(bigTime, bigParentTime)
x.Div(x, big10)
x.Sub(big1, x)
// max(1 - (block_timestamp - parent_timestamp) // 10, -99)
if x.Cmp(bigMinus99) < 0 {
x.Set(bigMinus99)
}
// (parent_diff + parent_diff // 2048 * max(1 - (block_timestamp - parent_timesta原理效应有哪些mp) // 10, -99))
y.Div(parent.Difficulty, params.Difficult挖矿yBoundDivisor)
x.Mul(y, x)
x.Add(parent.Difficulty, x)
// minimum difficulty can ever be (before exponent原理英文ial factor)
if x.Cmp(params.MinimumDifficulty) < 0 {
x.Set(params.MinimumDifficulty)
}原理图设计
// for the exponential factor
perio以太坊价格dCount := ne挖矿挣钱appw(big.Int).Add(parent.Number, big1)
periodCount.Div(periodCount, expDiffPerio算法d)
// the exponential factor, commonly referred to as "the bomb"
// diff = diff + 2^(periodCount - 2)
if per以太坊挖矿一天赚多少iodCount.Cmp(big1) > 0 {
y.S原理图设计ub(periodCount, big2)
y.Exp(big2, y, nil)
x.Add(x, y)
}
return x
}
//代码位置consensus/ethash/consensus.go

后记

  Pow算法概念简单,即工作端提交难以计算但易于验证比特币价格的计比特币价格算结果,其他节点通过验证这个结果来确信工作端完成了相比特币当的工作量。
  但其缺陷也很明显:1、随着节点将CPU挖以太坊价格今日行情矿升以太坊价格今日行情级为GPU、甚至矿机挖矿,节点数和算力已渐渐失衡;2、比特币等网络每秒需完成数百万亿次哈希计算,资源大量浪费。
  为此,业内提出了Pow的替代者如PoS原理图设计权益证明算法,即要求用户拥有一定数量的货币,才有权参与确定下一个合法区块。另外,相对拥有51%算力,购买超过半数以上的货币难度更大,也使得恶意*原理**更加困难原理图怎么生成pcb