upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp163
1 files changed, 122 insertions, 41 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 7398064..0fa6b89 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -42,12 +42,30 @@ unsigned int nTransactionsUpdated = 0;
42map<COutPoint, CInPoint> mapNextTx; 42map<COutPoint, CInPoint> mapNextTx;
43 43
44map<uint256, CBlockIndex*> mapBlockIndex; 44map<uint256, CBlockIndex*> mapBlockIndex;
45// Bitflash genesis -- mined under RandomX PoW on 2026-07-22 45// Bitflash mainnet genesis -- mined under RandomX PoW for the 2026 stable
46// (nTime 1753142400, nBits 0x1f0fffff, RandomX key "Bitflash/RandomX/v1/...") 46// relaunch. Testnet gets its own resettable genesis below so block indexes,
47// Bitflash 2026 stable relaunch genesis (2-min blocks, RandomX). Mined values. 47// headers, and wallet scans cannot be accidentally mixed across networks.
48unsigned int GENESIS_NONCE = 3141; 48static const unsigned int MAINNET_GENESIS_TIME = 1753315200; // 2026-07-24 00:00:00 UTC
49uint256 hashGenesisBlock("0x5bd7cb255d814e48cebcdfb72da4dc87b34bd774227f8ceb546c5640f4bdc169"); 49static const unsigned int MAINNET_GENESIS_NONCE = 3141;
50uint256 hashGenesisMerkleRoot("0x1a45b4482532abb29b10e234d3f13132230525a339ecea91658ffa675a5b1325"); 50static const char* MAINNET_GENESIS_TIMESTAMP =
51 "Bitflash 24/Jul/2026 Fair launch: one CPU one vote, no premine";
52static const char* MAINNET_GENESIS_HASH =
53 "0x5bd7cb255d814e48cebcdfb72da4dc87b34bd774227f8ceb546c5640f4bdc169";
54static const char* MAINNET_GENESIS_MERKLE =
55 "0x1a45b4482532abb29b10e234d3f13132230525a339ecea91658ffa675a5b1325";
56
57static const unsigned int TESTNET_GENESIS_TIME = 1787184000; // 2026-08-20 00:00:00 UTC
58static const unsigned int TESTNET_GENESIS_NONCE = 3199;
59static const char* TESTNET_GENESIS_TIMESTAMP =
60 "Bitflash testnet 20/Aug/2026: resettable public test chain";
61static const char* TESTNET_GENESIS_HASH =
62 "0xa9d11c6d697bcb7aea0653bc088b12dcf9f44e732df205162cf085fd9d9963eb";
63static const char* TESTNET_GENESIS_MERKLE =
64 "0x510b293105e3ff85b8d4c3920e357f85d1a86bf199eb4e7d11f04f380030ec5c";
65
66unsigned int GENESIS_NONCE = MAINNET_GENESIS_NONCE;
67uint256 hashGenesisBlock(MAINNET_GENESIS_HASH);
68uint256 hashGenesisMerkleRoot(MAINNET_GENESIS_MERKLE);
51CBlockIndex* pindexGenesisBlock = NULL; 69CBlockIndex* pindexGenesisBlock = NULL;
52int nBestHeight = -1; 70int nBestHeight = -1;
53uint256 hashBestChain = 0; 71uint256 hashBestChain = 0;
@@ -254,6 +272,63 @@ static std::atomic<uint64> gParticipantHashRateX1000{0};
254static std::mutex gParticipantStatusMutex; 272static std::mutex gParticipantStatusMutex;
255static std::string gParticipantStatus; 273static std::string gParticipantStatus;
256 274
275void SelectGenesisParams(bool fTestNetIn)
276{
277 static bool fGenesisParamsSelected = false;
278 static bool fGenesisParamsTestNet = false;
279 if (fGenesisParamsSelected && fGenesisParamsTestNet == fTestNetIn)
280 return;
281
282 fGenesisParamsSelected = true;
283 fGenesisParamsTestNet = fTestNetIn;
284
285 if (fTestNetIn)
286 {
287 GENESIS_NONCE = TESTNET_GENESIS_NONCE;
288 hashGenesisBlock = uint256(TESTNET_GENESIS_HASH);
289 hashGenesisMerkleRoot = uint256(TESTNET_GENESIS_MERKLE);
290 }
291 else
292 {
293 GENESIS_NONCE = MAINNET_GENESIS_NONCE;
294 hashGenesisBlock = uint256(MAINNET_GENESIS_HASH);
295 hashGenesisMerkleRoot = uint256(MAINNET_GENESIS_MERKLE);
296 }
297}
298
299void SelectChainParams(bool fTestNetIn)
300{
301 SelectNetworkParams(fTestNetIn);
302 SelectGenesisParams(fTestNetIn);
303}
304
305static CBlock BuildGenesisBlock()
306{
307 const char* pszTimestamp = IsTestNet() ?
308 TESTNET_GENESIS_TIMESTAMP : MAINNET_GENESIS_TIMESTAMP;
309
310 CTransaction txNew;
311 txNew.vin.resize(1);
312 txNew.vout.resize(1);
313 txNew.vin[0].scriptSig = CScript() << 486604799 << CBigNum(4) <<
314 vector<unsigned char>((unsigned char*)pszTimestamp,
315 (unsigned char*)pszTimestamp + strlen(pszTimestamp));
316 txNew.vout[0].nValue = 50 * COIN;
317 txNew.vout[0].scriptPubKey = CScript() <<
318 CBigNum("0x5F1DF16B2B704C8A578D0BBAF74D385CDE12C11EE50455F3C438EF4C3FBCF649B6DE611FEAE06279A60939E028A8D65C10B73071A6F16719274855FEB0FD8A6704") <<
319 OP_CHECKSIG;
320
321 CBlock block;
322 block.vtx.push_back(txNew);
323 block.hashPrevBlock = 0;
324 block.hashMerkleRoot = block.BuildMerkleTree();
325 block.nVersion = 1;
326 block.nTime = IsTestNet() ? TESTNET_GENESIS_TIME : MAINNET_GENESIS_TIME;
327 block.nBits = 0x1f0fffff; // = bnProofOfWorkLimit (Bitflash RandomX floor)
328 block.nNonce = GENESIS_NONCE;
329 return block;
330}
331
257void SetParticipantMiningStatus(const std::string& status) 332void SetParticipantMiningStatus(const std::string& status)
258{ 333{
259 // Updates the GUI status string only. Logging is done at each call site 334 // Updates the GUI status string only. Logging is done at each call site
@@ -2654,11 +2729,21 @@ string GetAppDir()
2654 { 2729 {
2655 return "."; 2730 return ".";
2656 } 2731 }
2657 static bool fMkdirDone; 2732 static string strCreatedBaseDir;
2658 if (!fMkdirDone) 2733 if (strCreatedBaseDir != strDir)
2659 { 2734 {
2660 fMkdirDone = true;
2661 _mkdir(strDir.c_str()); 2735 _mkdir(strDir.c_str());
2736 strCreatedBaseDir = strDir;
2737 }
2738 if (IsTestNet())
2739 {
2740 strDir += "/testnet";
2741 static string strCreatedTestnetDir;
2742 if (strCreatedTestnetDir != strDir)
2743 {
2744 _mkdir(strDir.c_str());
2745 strCreatedTestnetDir = strDir;
2746 }
2662 } 2747 }
2663 return strDir; 2748 return strDir;
2664} 2749}
@@ -2812,38 +2897,34 @@ bool LoadBlockIndex(bool fAllowNew)
2812 2897
2813 // Bitflash genesis block -- own header (fair launch) 2898 // Bitflash genesis block -- own header (fair launch)
2814 // 2899 //
2815 // Do not change pszTimestamp, the scriptPubKey, nTime or nNonce. They 2900 // Upstream moved the construction into BuildGenesisBlock() so mainnet
2816 // are the inputs to the genesis hash, and the genesis hash is 2901 // and the isolated testnet can share it. The mainnet inputs it uses are
2817 // consensus. Changing one on its own trips the assert below, which is 2902 // byte-identical to what this block built inline before the merge --
2818 // loud and reverts cleanly; changing one and regenerating 2903 // timestamp string, nTime, nNonce, scriptPubKey, nBits and nVersion all
2819 // GENESIS_NONCE and hashGenesisBlock to match -- which is exactly what 2904 // verified equal against MAINNET_GENESIS_* -- so the mainnet genesis
2820 // the re-mining branch below prints out and invites -- gives a node 2905 // hash is unchanged. The warning below is why that was checked rather
2821 // that starts without complaint, builds its own chain from height 0, 2906 // than assumed, and it still applies to those constants:
2822 // and rejects every real peer as being on a different chain. That one 2907 //
2823 // fails silently, and the damage scales with how many people run the 2908 // Do not change MAINNET_GENESIS_TIMESTAMP, the scriptPubKey,
2824 // "fixed" build. 2909 // MAINNET_GENESIS_TIME or MAINNET_GENESIS_NONCE. They are the inputs to
2825 char* pszTimestamp = "Bitflash 24/Jul/2026 Fair launch: one CPU one vote, no premine"; 2910 // the genesis hash, and the genesis hash is consensus. Changing one on
2826 CTransaction txNew; 2911 // its own trips the assert below, which is loud and reverts cleanly;
2827 txNew.vin.resize(1); 2912 // changing one and regenerating GENESIS_NONCE and hashGenesisBlock to
2828 txNew.vout.resize(1); 2913 // match -- which is exactly what the re-mining branch below prints out
2829 txNew.vin[0].scriptSig = CScript() << 486604799 << CBigNum(4) << vector<unsigned char>((unsigned char*)pszTimestamp, (unsigned char*)pszTimestamp + strlen(pszTimestamp)); 2914 // and invites -- gives a node that starts without complaint, builds its
2830 txNew.vout[0].nValue = 50 * COIN; 2915 // own chain from height 0, and rejects every real peer as being on a
2831 txNew.vout[0].scriptPubKey = CScript() << CBigNum("0x5F1DF16B2B704C8A578D0BBAF74D385CDE12C11EE50455F3C438EF4C3FBCF649B6DE611FEAE06279A60939E028A8D65C10B73071A6F16719274855FEB0FD8A6704") << OP_CHECKSIG; 2916 // different chain. That one fails silently, and the damage scales with
2832 CBlock block; 2917 // how many people run the "fixed" build.
2833 block.vtx.push_back(txNew); 2918 //
2834 block.hashPrevBlock = 0; 2919 // MAINNET_GENESIS_TIME is 1753315200, which is 2025-07-24T00:00:00Z,
2835 block.hashMerkleRoot = block.BuildMerkleTree(); 2920 // while the headline in MAINNET_GENESIS_TIMESTAMP reads 2026 -- as does
2836 block.nVersion = 1; 2921 // the comment upstream put on that constant, which is wrong about the
2837 // 1753315200 is 2025-07-24T00:00:00Z. The headline in pszTimestamp 2922 // year. This is a known discrepancy and not a typo in the value: it is
2838 // above reads 2026 and does not match it. This is a known discrepancy 2923 // only consensus-critical as an input to the genesis hash, the block
2839 // and not a typo in the constant: the value is only consensus-critical 2924 // hashes to hashGenesisBlock with it, and every node on the network
2840 // as an input to the genesis hash, the block hashes to 2925 // agrees. The mismatch is in the launched chain and cannot be corrected
2841 // hashGenesisBlock with it, and every node on the network agrees. The 2926 // -- see the warning above before deciding otherwise.
2842 // mismatch is in the launched chain and cannot be corrected -- see the 2927 CBlock block = BuildGenesisBlock();
2843 // warning above before deciding otherwise.
2844 block.nTime = 1753315200;
2845 block.nBits = 0x1f0fffff; // = bnProofOfWorkLimit (Bitflash RandomX floor)
2846 block.nNonce = GENESIS_NONCE;
2847 2928
2848 // If the nonce has not been found yet, mine the genesis once (RandomX) 2929 // If the nonce has not been found yet, mine the genesis once (RandomX)
2849 // and print the values to be hardcoded in the constants above. 2930 // and print the values to be hardcoded in the constants above.