| 321 | } |
| 322 | |
| 323 | static std::string BlockToString(CBlockIndex* pBlock) |
| 324 | { |
| 325 | if (!pBlock) |
| 326 | return ""; |
| 327 | |
| 328 | CBlock block; |
| 329 | ReadBlockFromDisk(block, pBlock, Params().GetConsensus()); |
| 330 | |
| 331 | std::string TxLabels[] = {_("Hash"), _("From"), _("Amount"), _("To"), _("Amount")}; |
| 332 | std::string TxContent = table + "<thead>" + makeHTMLTableRow(TxLabels, sizeof(TxLabels) / sizeof(std::string)) + "</thead>"; |
| 333 | TxContent += "<tbody class=\"b\">"; |
| 334 | |
| 335 | CAmount InVolume = 0, OutVolume = 0; |
| 336 | for (size_t i = 0; i < block.vtx.size(); i++) { |
| 337 | const CTransaction& tx = block.vtx[i]; |
| 338 | if (!tx.IsCoinBase()) { |
| 339 | InVolume += getTxIn(tx); |
| 340 | OutVolume += tx.GetValueOut(); |
| 341 | } |
| 342 | TxContent += TxToRow(tx, &block); |
| 343 | } |
| 344 | TxContent += "</tbody></table>"; |
| 345 | |
| 346 | CAmount Fees = InVolume - OutVolume; |
| 347 | CAmount Generated; |
| 348 | if (pBlock->nHeight == 0) |
| 349 | Generated = OutVolume; |
| 350 | else if (pBlock->IsProofOfStake()) |
| 351 | Generated = GetProofOfStakeReward(0, pBlock->nHeight); |
| 352 | else |
| 353 | Generated = GetProofOfWorkReward(0, pBlock->nHeight); |
| 354 | |
| 355 | std::string BlockContentCells[] = { |
| 356 | _("Type"), pBlock->IsProofOfStake() ? "PoS" : "PoW", |
| 357 | _("Timestamp"), TimeToString(block.nTime), |
| 358 | _("Generated"), ValueToString(Generated), |
| 359 | //_("Value Out"), ValueToString(OutVolume), |
| 360 | _("Value In"), ValueToString(InVolume), |
| 361 | _("Fees"), Fees > 0 ? ValueToString(Fees) : "-", |
| 362 | _("Size"), itostr(GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION)), |
| 363 | _("Difficulty"), strprintf("%.4f", GetDifficulty(pBlock)), |
| 364 | _("Bits"), "<tt>" + strprintf("%08x", block.nBits) + "</tt>", |
| 365 | _("Nonce"), "<tt>" + strprintf("%08x", block.nNonce) + "</tt>", |
| 366 | _("Version"), "<tt>" + strprintf("%08x", block.nVersion) + "</tt>", |
| 367 | _("Hash"), "<tt>" + block.GetHash(pBlock->nHeight).GetHex() + "</tt>", |
| 368 | _("Merkle Root"), "<tt>" + block.hashMerkleRoot.GetHex() + "</tt>", |
| 369 | _("State Root"), "<tt>" + block.hashStateRoot.GetHex() + "</tt>", |
| 370 | _("UTXO Root"), "<tt>" + block.hashUTXORoot.GetHex() + "</tt>", |
| 371 | _("Number of Transactions"), itostr(block.vtx.size()) |
| 372 | //_("Miner Signature"), "<tt>" + block.MinerSignature.ToString() + "</tt>" |
| 373 | }; |
| 374 | |
| 375 | std::string BlockContent = makeHTMLTable(BlockContentCells, sizeof(BlockContentCells) / (2 * sizeof(std::string)), 2); |
| 376 | |
| 377 | std::string Content; |
| 378 | Content += "<h2><a class=\"nav\" href="; |
| 379 | Content += itostr(pBlock->nHeight - 1); |
| 380 | Content += ">◄ </a>"; |
no test coverage detected