Bitcoin-Core

GetBlockChecked 總是返回創世塊?

  • July 12, 2020

目前我正在探索比特幣原始碼,並嘗試getblockvalue在 blockchain.cpp 中添加自定義函式。

函式的目的是根據給定的高度作為參數返回塊內所有交易輸出的總和。

static UniValue getblockvalue(const JSONRPCRequest& request)
{
   int blockHeight = request.params[0].get_int();
   if (blockHeight < 0 || blockHeight > ::ChainActive().Height())
   {
       throw JSONRPCError(RPC_INVALID_PARAMETER, "Block height out of range");
   }
       
   CBlockIndex* pBlockIndex = ::ChainActive()[blockHeight];
   if(pBlockIndex == nullptr)
   {
       throw JSONRPCError(RPC_INVALID_PARAMETER, "Block index is NULL");
   
   }
   const CBlock block = GetBlockChecked(pBlockIndex);
   UniValue resultObject(UniValue::VOBJ);
   double blockValue = 0;
   int numberOfTransactions = 0;
   
   for(const auto &transaction : block.vtx)
   {
       for (unsigned int i = 0; i < transaction->vout.size(); ++i)
       {
           blockValue+= transaction->vout[i].nValue;
       }
       ++numberOfTransactions;
   }
   
   resultObject.pushKV("blockHeight",          (int)blockHeight);
   resultObject.pushKV("numberOfTransactions", (int)numberOfTransactions);
   resultObject.pushKV("blockValue",           ValueFromAmount(blockValue));
   
   return resultObject;
}

我做了所有必要的更改:我添加了參數vRPCConvertParams[]並擴展了CRPCCommand commands[].

所以,我嘗試呼叫 bitcoin-cli -testnet getblockvalue 25; 結果是:

{
"blockHeight" : 25,
"numberOfTransactions" : 1,
"blockValue" : 50.00000000
}

對於每個給定的塊高度,結果都是相同的。它總是給我有關創世塊的資訊。你能幫我在這裡做錯什麼嗎?

好的,所以程式碼就像 Andrew 假設的那樣很好。

我很奇怪前幾個街區是一樣的。它們都有一筆交易和相同的 50BTC 輸出值,但根據網站<https://blockstream.info/testnet/>,您只需在搜尋欄中輸入塊高度,您就可以看到結果塊內的所有交易,這個是正確的。

引用自:https://bitcoin.stackexchange.com/questions/96954