Пример #1
0
        internal void AppendAll(List <Block> blocks, bool ignoreCheckPointing = false)
        {
            lock (Flock)
            {
                var blockHeight = GetLastBlock().BlockNumber;
                var f           = File.Open(Node.NetParams.BlockChainFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                var fi          = File.Open(Node.NetParams.BlockChainFileName + ".index", FileMode.OpenOrCreate, FileAccess.ReadWrite);
                using (var br = new BinaryReader(fi))
                {
                    int count;
                    var size = 0;
                    if (fi.Length == 0)
                    {
                        count = 0;
                    }
                    else
                    {
                        count = br.ReadInt32();
                        size  = br.ReadInt32();
                        br.ReadUInt64(); // Padding
                    }

                    using (var iw = new BinaryWriter(fi, Encoding.Default, true))
                    {
                        fi.Position = 0;
                        iw.Write(count);
                        iw.Write(size);
                        iw.Write((ulong)0);
                        foreach (var block in blocks)
                        {
                            if (block.BlockNumber != 0 || blockHeight > 0)
                            {
                                if (block.BlockNumber <= blockHeight)
                                {
                                    continue;
                                }
                            }
                            if (!block.BlockIsValid())
                            {
                                return;
                            }
                            f.Position  = f.Length;
                            fi.Position = fi.Length;
                            var pos = f.Position;
                            block.SaveToStream(f);
                            iw.Write(block.BlockNumber);
                            iw.Write(pos);
                            iw.Write((uint)(f.Position - pos));
                            iw.BaseStream.Position = 0;
                            count++;
                            iw.Write(count);
                            iw.Write(fi.Length);
                            if (!ignoreCheckPointing)
                            {
                                CheckPoints.AppendBlock(block);
                            }
                        }
                    }
                }

                f.Dispose();
            }
        }
Пример #2
0
        internal bool Append(Block t)
        {
            lock (Flock)
            {
                var blockHeight = GetLastBlock().BlockNumber + 1;
                var fi          = File.Open(Node.NetParams.BlockChainFileName + ".index", FileMode.OpenOrCreate, FileAccess.ReadWrite);
                try
                {
                    var f = File.Open(Node.NetParams.BlockChainFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                    try
                    {
                        using (var br = new BinaryReader(fi, Encoding.Default, true))
                        {
                            int count;
                            if (fi.Length == 0)
                            {
                                count = 0;
                            }
                            else
                            {
                                count = br.ReadInt32();
                                var size = br.ReadInt64();
                            }
                            if (HasBlockChain(fi))
                            {
                                if (blockHeight < t.BlockNumber - 1)
                                {
                                    return(false);
                                }
                                else if (blockHeight > t.BlockNumber)
                                {
                                    return(true);
                                }
                            }
                            using (var iw = new BinaryWriter(fi, Encoding.Default, true))
                            {
                                iw.BaseStream.Position = iw.BaseStream.Length;
                                fi.Position            = 0;
                                if (HasBlockChain(fi))
                                {
                                    iw.Write(count + 1);
                                }
                                else
                                {
                                    iw.Write(0);
                                }
                                f.Position  = f.Length;
                                fi.Position = fi.Length;
                                var pos = f.Position;
                                t.SaveToStream(f);
                                if (HasBlockChain(fi))
                                {
                                    iw.Write(t.BlockNumber);
                                }
                                else
                                {
                                    iw.Write(0);
                                }
                                iw.Write(pos);
                                iw.Write((uint)(f.Position - pos));
                            }

                            CheckPoints.AppendBlock(t);
                            return(true);
                        }
                    }
                    finally
                    {
                        f.Dispose();
                    }
                }
                finally
                {
                    fi.Dispose();
                }
            }
        }