@@ -192,10 +192,51 @@ class CBlockIndex
192
192
uint32_t nTime{0 };
193
193
uint32_t nBits{0 };
194
194
uint32_t nNonce{0 };
195
- CProof proof{};
195
+
196
+ protected:
197
+ std::optional<CProof> proof{};
196
198
// Dynamic federation fields
197
- DynaFedParams dynafed_params{};
198
- CScriptWitness m_signblock_witness{};
199
+ std::optional<DynaFedParams> m_dynafed_params{};
200
+ std::optional<CScriptWitness> m_signblock_witness{};
201
+
202
+ bool m_trimmed{false };
203
+
204
+ friend class CBlockTreeDB ;
205
+
206
+ public:
207
+
208
+ // Irrevocably remove blocksigning and dynafed-related stuff from this
209
+ // in-memory copy of the block header.
210
+ void trim () {
211
+ assert_untrimmed ();
212
+ m_trimmed = true ;
213
+ proof = std::nullopt;
214
+ m_dynafed_params = std::nullopt;
215
+ m_signblock_witness = std::nullopt;
216
+ }
217
+
218
+ bool trimmed () const {
219
+ return m_trimmed;
220
+ }
221
+
222
+ void assert_untrimmed () const {
223
+ assert (!m_trimmed);
224
+ }
225
+
226
+ const CProof& get_proof () const {
227
+ assert_untrimmed ();
228
+ return proof.value ();
229
+ }
230
+
231
+ const DynaFedParams& dynafed_params () const {
232
+ assert_untrimmed ();
233
+ return m_dynafed_params.value ();
234
+ }
235
+
236
+ const CScriptWitness& signblock_witness () const {
237
+ assert_untrimmed ();
238
+ return m_signblock_witness.value ();
239
+ }
199
240
200
241
// ! (memory only) Sequential id assigned to distinguish order in which blocks are received.
201
242
int32_t nSequenceId{0 };
@@ -214,7 +255,7 @@ class CBlockIndex
214
255
nBits{block.nBits },
215
256
nNonce{block.nNonce },
216
257
proof{block.proof },
217
- dynafed_params {block.m_dynafed_params },
258
+ m_dynafed_params {block.m_dynafed_params },
218
259
m_signblock_witness{block.m_signblock_witness }
219
260
{
220
261
}
@@ -239,6 +280,7 @@ class CBlockIndex
239
280
240
281
CBlockHeader GetBlockHeader () const
241
282
{
283
+ assert_untrimmed ();
242
284
CBlockHeader block;
243
285
block.nVersion = nVersion;
244
286
if (pprev)
@@ -250,9 +292,9 @@ class CBlockIndex
250
292
}
251
293
block.nBits = nBits;
252
294
block.nNonce = nNonce;
253
- block.proof = proof;
254
- block.m_dynafed_params = dynafed_params ;
255
- block.m_signblock_witness = m_signblock_witness;
295
+ block.proof = proof. value () ;
296
+ block.m_dynafed_params = m_dynafed_params. value () ;
297
+ block.m_signblock_witness = m_signblock_witness. value () ;
256
298
return block;
257
299
}
258
300
@@ -366,12 +408,12 @@ class CDiskBlockIndex : public CBlockIndex
366
408
nVersion = ~CBlockHeader::DYNAFED_HF_MASK & nVersion;
367
409
return is_dyna;
368
410
} else {
369
- return !dynafed_params.IsNull ();
411
+ return !dynafed_params () .IsNull ();
370
412
}
371
413
}
372
414
bool RemoveDynaFedMaskOnSerialize (bool for_read) const {
373
415
assert (!for_read);
374
- return !dynafed_params.IsNull ();
416
+ return !dynafed_params () .IsNull ();
375
417
}
376
418
377
419
SERIALIZE_METHODS (CDiskBlockIndex, obj)
@@ -394,7 +436,7 @@ class CDiskBlockIndex : public CBlockIndex
394
436
READWRITE (obj.nVersion );
395
437
} else {
396
438
int32_t nVersion = obj.nVersion ;
397
- if (!obj.dynafed_params .IsNull ()) {
439
+ if (!obj.dynafed_params () .IsNull ()) {
398
440
nVersion |= CBlockHeader::DYNAFED_HF_MASK;
399
441
}
400
442
READWRITE (nVersion);
@@ -404,13 +446,19 @@ class CDiskBlockIndex : public CBlockIndex
404
446
READWRITE (obj.hashPrev );
405
447
READWRITE (obj.hashMerkleRoot );
406
448
READWRITE (obj.nTime );
449
+
450
+ // Allocate objects in the optional<> fields when reading, since READWRITE will not do this
451
+ SER_READ (obj, obj.m_dynafed_params = DynaFedParams ());
452
+ SER_READ (obj, obj.m_signblock_witness = CScriptWitness ());
453
+ SER_READ (obj, obj.proof = CProof ());
454
+
407
455
// For compatibility with elements 0.14 based chains
408
456
if (g_signed_blocks) {
409
457
if (is_dyna) {
410
- READWRITE (obj.dynafed_params );
411
- READWRITE (obj.m_signblock_witness .stack );
458
+ READWRITE (obj.m_dynafed_params . value () );
459
+ READWRITE (obj.m_signblock_witness .value (). stack );
412
460
} else {
413
- READWRITE (obj.proof );
461
+ READWRITE (obj.proof . value () );
414
462
}
415
463
} else {
416
464
READWRITE (obj.nBits );
@@ -420,6 +468,7 @@ class CDiskBlockIndex : public CBlockIndex
420
468
421
469
uint256 GetBlockHash () const
422
470
{
471
+ assert_untrimmed ();
423
472
CBlockHeader block;
424
473
block.nVersion = nVersion;
425
474
block.hashPrevBlock = hashPrev;
@@ -430,8 +479,8 @@ class CDiskBlockIndex : public CBlockIndex
430
479
}
431
480
block.nBits = nBits;
432
481
block.nNonce = nNonce;
433
- block.proof = proof;
434
- block.m_dynafed_params = dynafed_params ;
482
+ block.proof = proof. value () ;
483
+ block.m_dynafed_params = m_dynafed_params. value () ;
435
484
return block.GetHash ();
436
485
}
437
486
0 commit comments