예제 #1
0
        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);
                }
            }
        }
예제 #2
0
        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);
            }
        }