private void Serialize(BitcoinStream stream) { var fAllowWitness = stream.TransactionOptions.HasFlag(TransactionOptions.Witness) && stream.ProtocolCapabilities.SupportWitness; // Detect dynamic federation block serialization using "HF bit", // or the signed bit which is invalid in Bitcoin var isDynamic = false; int nVersion = this.nVersion; if (!DynaFedParams.IsNull) { nVersion |= DYNAFED_HF_MASK; isDynamic = true; } stream.ReadWrite(ref nVersion); if (isDynamic) { stream.ReadWrite(ref hashPrevBlock); stream.ReadWrite(ref hashMerkleRoot); stream.ReadWrite(ref nTime); stream.ReadWrite(ref _nHeight); stream.ReadWrite(ref DynaFedParams); // We do not serialize witness for hashes, or weight calculation if (stream.Type != SerializationType.Hash && fAllowWitness) { SignBlockWitness.WriteToStream(stream); } } else { stream.ReadWrite(ref hashPrevBlock); stream.ReadWrite(ref hashMerkleRoot); stream.ReadWrite(ref nTime); if (ElementsParams <TNetwork> .BlockHeightInHeader) { stream.ReadWrite(ref _nHeight); } if (ElementsParams <TNetwork> .SignedBlocks) { stream.ReadWrite(ref _Proof); } else { stream.ReadWrite(ref nBits); stream.ReadWrite(ref nNonce); } } }
public override void ReadWrite(BitcoinStream stream) { var fAllowWitness = stream.TransactionOptions.HasFlag(TransactionOptions.Witness) && stream.ProtocolCapabilities.SupportWitness; // Detect dynamic federation block serialization using "HF bit", // or the signed bit which is invalid in Bitcoin var isDynamic = false; int version = 0; if (!stream.Serializing) { stream.ReadWrite(ref version); isDynamic = version < 0; nVersion = ~DYNAFED_HF_MASK & version; } else { version = nVersion; if (!DynaFedParams.IsNull) { version |= DYNAFED_HF_MASK; isDynamic = true; } stream.ReadWrite(ref version); } if (isDynamic) { stream.ReadWrite(ref hashPrevBlock); stream.ReadWrite(ref hashMerkleRoot); stream.ReadWrite(ref nTime); stream.ReadWrite(ref _nHeight); stream.ReadWrite(ref DynaFedParams); if (stream.Type != SerializationType.Hash && fAllowWitness) { if (stream.Serializing) { SignBlockWitness.WriteToStream(stream); } else { SignBlockWitness = WitScript.Load(stream); } } stream.ReadWrite(ref hashMerkleRoot); stream.ReadWrite(ref nTime); if (ElementsParams <TNetwork> .BlockHeightInHeader) { stream.ReadWrite(ref _nHeight); } if (ElementsParams <TNetwork> .SignedBlocks) { stream.ReadWrite(ref _Proof); } else { stream.ReadWrite(ref nBits); stream.ReadWrite(ref nNonce); } } else { stream.ReadWrite(ref hashPrevBlock); stream.ReadWrite(ref hashMerkleRoot); stream.ReadWrite(ref nTime); stream.ReadWrite(ref _nHeight); stream.ReadWrite(ref _Proof); } }