// Init list of block items
foreach (var item in blockTreeItems)
{
+ item.nStakeModifierChecksum = StakeModifier.GetModifierChecksum(item);
+
blockMap.TryAdd(item.Hash, item);
if (item.IsProofOfStake)
}
itemTemplate.SetStakeModifier(nStakeModifier, fGeneratedStakeModifier);
+ itemTemplate.nStakeModifierChecksum = StakeModifier.GetModifierChecksum(itemTemplate);
- var nChecksum = StakeModifier.GetModifierChecksum(ref itemTemplate);
- if (!ModifierCheckpoints.Verify(itemTemplate.nHeight, nChecksum))
+ if (!ModifierCheckpoints.Verify(itemTemplate.nHeight, itemTemplate.nStakeModifierChecksum))
{
return false; // Stake modifier checkpoints mismatch
}
var prevBlockHeader = prevBlockCursor.BlockHeader;
- // TODO: proof-of-work/proof-of-stake verification
uint nHeight = prevBlockCursor.nHeight + 1;
// Check timestamp against prev
return false; // rejected by checkpoint lock-in
}
- // TODO: Enforce rule that the coinbase starts with serialized block height
+ // Enforce rule that the coinbase starts with serialized block height
+ var expect = new CScript();
+ expect.AddNumber((int)nHeight);
+
+ byte[] expectBytes = expect;
+ byte[] scriptSig = block.vtx[0].vin[0].scriptSig;
+
+ if (!expectBytes.SequenceEqual(scriptSig.Take(expectBytes.Length)))
+ {
+ return false; // coinbase doesn't start with serialized height.
+ }
// Write block to file.
var itemTemplate = new CBlockStoreItem()
if (block.IsProofOfStake)
{
- // TODO: proof-of-stake validation
-
uint256 hashProofOfStake = 0, targetProofOfStake = 0;
if (!StakeModifier.CheckProofOfStake(block.vtx[1], block.header.nBits, out hashProofOfStake, out targetProofOfStake))
{