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(); } }
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(); } } }