示例#1
0
 public void Load(Stream stream, Network network, ChainSerializationFormat format)
 {
     if (network == null)
     {
         throw new ArgumentNullException(nameof(network));
     }
     Load(stream, network.Consensus.ConsensusFactory, format);
 }
示例#2
0
 public void Load(Stream stream, Consensus consensus, ChainSerializationFormat format)
 {
     if (consensus == null)
     {
         throw new ArgumentNullException(nameof(consensus));
     }
     Load(stream, consensus.ConsensusFactory, format);
 }
示例#3
0
        public void Load(BitcoinStream stream, ChainSerializationFormat format)
        {
            format = format ?? new ChainSerializationFormat();
            format.AssertCoherent();
            var genesis = Genesis;

            using (_lock.LockWrite())
            {
                try
                {
                    var height = 0;
                    while (true)
                    {
                        uint256.MutableUint256 id = null;
                        if (format.SerializePrecomputedBlockHash)
                        {
                            stream.ReadWrite(ref id);
                        }

                        BlockHeader header = null;
                        if (format.SerializeBlockHeader)
                        {
                            stream.ReadWrite(ref header);
                        }

                        if (height == 0)
                        {
                            _blocksByHeight.Clear();
                            _blocksById.Clear();
                            _tip = null;
                            if (header != null && genesis != null && header.GetHash() != genesis.HashBlock)
                            {
                                throw new InvalidOperationException("Unexpected genesis block");
                            }

                            SetTipNoLock(new ChainedBlock(genesis?.Header ?? header, 0));
                        }
                        else if (!format.SerializeBlockHeader ||
                                 _tip.HashBlock == header.HashPrevBlock && !(header.IsNull && header.Nonce == 0))
                        {
                            SetTipNoLock(new ChainedBlock(header, id?.Value, Tip));
                        }
                        else
                        {
                            break;
                        }

                        height++;
                    }
                }
                catch (EndOfStreamException)
                {
                }
            }
        }
示例#4
0
 public void Load(Stream stream, ConsensusFactory consensusFactory, ChainSerializationFormat format)
 {
     if (consensusFactory == null)
     {
         throw new ArgumentNullException(nameof(consensusFactory));
     }
     Load(new BitcoinStream(stream, false)
     {
         ConsensusFactory = consensusFactory
     }, format);
 }
示例#5
0
 public void WriteTo(BitcoinStream stream, ChainSerializationFormat format)
 {
     format = format ?? new ChainSerializationFormat();
     format.AssertCoherent();
     using (@lock.LockRead())
     {
         for (int i = 0; i < Tip.Height + 1; i++)
         {
             var block = GetBlockNoLock(i);
             if (format.SerializePrecomputedBlockHash)
             {
                 stream.ReadWrite(block.HashBlock.AsBitcoinSerializable());
             }
             if (format.SerializeBlockHeader)
             {
                 stream.ReadWrite(block.Header);
             }
         }
     }
 }
示例#6
0
 public void Load(byte[] chain, Network network, ChainSerializationFormat format)
 {
     Load(new MemoryStream(chain), network, format);
 }
示例#7
0
 public ConcurrentChain(byte[] bytes, ChainSerializationFormat format)
 {
     Load(bytes, Consensus.Main.ConsensusFactory, format);
 }
示例#8
0
 public ConcurrentChain(byte[] bytes, Network network, ChainSerializationFormat format)
 {
     Load(bytes, network, format);
 }
示例#9
0
 public ConcurrentChain(byte[] bytes, Consensus consensus, ChainSerializationFormat format)
 {
     Load(bytes, consensus, format);
 }
示例#10
0
 public void WriteTo(Stream stream, ChainSerializationFormat format)
 {
     WriteTo(new BitcoinStream(stream, true), format);
 }
示例#11
0
 public void Load(Stream stream, ChainSerializationFormat format)
 {
     Load(stream, Consensus.Main.ConsensusFactory, format);
 }
示例#12
0
 public void Load(byte[] chain, ChainSerializationFormat format)
 {
     Load(new MemoryStream(chain), Consensus.Main.ConsensusFactory, format);
 }
示例#13
0
 public void Load(byte[] chain, Consensus consensus, ChainSerializationFormat format)
 {
     Load(new MemoryStream(chain), consensus, format);
 }
示例#14
0
 public void Load(Stream stream, ChainSerializationFormat format)
 {
     Load(new BitcoinStream(stream, false), format);
 }