欢迎来到 wabc.cc 官方网站!

Pow挖矿APP系统制作开发

来源:推荐文章 / 时间:2025-12-21

  Pow挖矿分享系统开发搭建方案,(李生183-1824-5680电=微)。Pow挖矿APP系统制作开发,Pow挖矿类型系统专业定制开发,Pow挖矿系统区块链平台设计开发,Pow挖矿系统程序设计开发,Pow挖矿系统小程序定制开发



  Pow挖矿系统——如一个矿池按下面的过程来工作:拿到区块头,就开始组装一个新的“50W+1”高度的区块,但因为无法确认这个“50W”高度区块里的交易和整个区块是否合法,所以这个“50W+1”高度的区块,矿池并不对区块体填充额外的交易,只填充一个Coinbase奖励交易。



  这个“50W+1”高度的区块,只有区块头,外加一个Coinbase奖励交易——这就是一个空块——然后就直接开始挖矿。这样操作,在全网出现一个新块时,矿池也只需要等待拿到区块头和组装空块的时间,就可以开始挖矿。这个时间就非常短了,平均时间不到0.5秒。这样就比10.6秒,节省了10秒多的时间。



  而按上述过程挖矿,矿池在收到完整“50W”高度区块体和验证完“50W”高度区块,这个过程是10.6秒。在上述0.5秒到10.6秒的时间里,矿机如果计算出了一个随机数小于目标值,那矿池就成功挖到了一个空块。

  Pow算法实现:

  UniValue generateBlocks(std::shared_ptr 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;

  }

  unsigned int nExtraNonce = 0;

  UniValue blockHashes(UniValue::VARR);

  while (nHeight < nHeightEnd)

  {

  std::unique_ptr pblocktemplate(BlockAssembler(Params()).CreateNewBlock(coinbaseScript->reserveScript));

  if (!pblocktemplate.get())

  throw JSONRPCError(RPC_INTERNAL_ERROR, "Couldn't create new block");

  CBlock *pblock = &pblocktemplate->block;

  {

  LOCK(cs_main);

  IncrementExtraNonce(pblock, chainActive.Tip(), nExtraNonce);

  }

  //不断变更区块头中的随机数Nonce

  //对变更后的区块头做双重SHA256哈希运算



  //与当前难度的目标值做比对,如果小于目标难度,即Pow完成

  //uint64_t nMaxTries = 1000000;即重试100万次

  while (nMaxTries > 0 && pblock->nNonce < nInnerLoopCount && !CheckProofOfWork(pblock->GetHash(), pblock->nBits, Params().GetConsensus())) {

  ++pblock->nNonce;

  --nMaxTries;

  }

  if (nMaxTries == 0) {

  break;

  }

  if (pblock->nNonce == nInnerLoopCount) {

  continue;

  }

  std::shared_ptr shared_pblock = std::make_shared(*pblock);

  if (!ProcessNewBlock(Params(), shared_pblock, true, nullptr))

  throw JSONRPCError(RPC_INTERNAL_ERROR, "ProcessNewBlock, block not accepted");

  ++nHeight;

  blockHashes.push_back(pblock->GetHash().GetHex());

  //mark script as important because it was used at least for one coinbase output if the script came from the wallet

  if (keepScript)

  {

  coinbaseScript->KeepScript();

  }

  }

  return blockHashes;

  }//代码位置src/rpc/mining.cpp




  如果矿机没有计算出小于目标值的随机数,那矿池就会放弃这10.1秒的挖矿时间,然后改成组装一个填充了交易的“50W+1”高度的最新高度区块进行挖矿。



  一种方法是矿池和交易所合作,用户在交易所发起的提现交易,交易所不去广播,而是通过IP到IP的方式,以加密的方法直接发给矿池,这些交易绝对不会被“50W”高度区块打包,可以100%没有冲突的打包进“50W+1”高度。



  如果有交易所和矿池是同一个公司主体,那这种方法就非常好执行了。不是同一个主体,矿池还是怕被交易所坑,万一交易所塞一个经过广播的交易就可能被浪费掉一个空块的区块奖励。



  但这种方法会让交易所的用户体验有所下降,因为打空块的概率低啊,这些交易得到猴年马月才能被打包,虽然矿池可以在挖非空块中打包,但用户也得等这个矿池出块才有确认,这和全网有出块是差好长时间的。




  另一种方法是让交易所给矿池提交的保密交易不是用户的提现交易,而是一些零散UTXO拼凑成大UTXO的交易。这种交易是对整个UTXO体积有很大的优化的,而且这些交易都没有非常强烈的时间要求,适合被空块打包。




相关产品

在线客服
微信联系
客服
扫码加微信(手机同号)
电话咨询
返回顶部