protected EmptyBlockRepositoryFixture(string subDirectory, IHashProvider hashProvider, IBlockObjectTypeProvider typeProvider) { var factory = new LoggerFactory(); var genesisBlock = new Block { Index = 0L, PreviousHash = new byte[] { 0 }, MerkleRootHash = new byte[] { 0 }, Timestamp = 1465154705U, Nonce = 0L, Objects = new BlockObject[] { }, }; var baseDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); Value = new SqliteBlockRepository( baseDirectory, subDirectory, "blockchain", genesisBlock, typeProvider, factory.CreateLogger <SqliteBlockRepository>()); genesisBlock.Index = 1; genesisBlock.Hash = genesisBlock.ToHashBytes(hashProvider); Value.AddAsync(genesisBlock).ConfigureAwait(false).GetAwaiter().GetResult(); GenesisBlock = genesisBlock; TypeProvider = typeProvider; }
public BlockSerializeContext(BinaryWriter bw, IBlockObjectTypeProvider typeProvider, int version = formatVersion) { this.bw = bw; this.typeProvider = typeProvider; if (Version > formatVersion) { throw new Exception("Tried to save block with a version that is too new"); } Version = version; bw.Write(Version); }
public BlockDeserializeContext(BinaryReader br, IBlockObjectTypeProvider typeProvider) { this.br = br; this.typeProvider = typeProvider; Version = br.ReadInt32(); if (Version > BlockSerializeContext.formatVersion) { throw new Exception("Tried to load block with a version that is too new"); } }
public SqliteBlockStore( string baseDirectory, string subDirectory, string databaseName, Block genesisBlock, IBlockObjectTypeProvider typeProvider, ILogger <SqliteBlockStore> logger) : base(baseDirectory, subDirectory, databaseName, logger) { _genesisBlock = genesisBlock; _typeProvider = typeProvider; _logger = logger; }
public void RoundTripCheck(IHashProvider hashProvider, IBlockObjectTypeProvider typeProvider) { // Serialize a first time var firstMemoryStream = new MemoryStream(); var firstSerializeContext = new BlockSerializeContext(new BinaryWriter(firstMemoryStream), typeProvider); Serialize(firstSerializeContext); var originalData = firstMemoryStream.ToArray(); // Then deserialize that data var br = new BinaryReader(new MemoryStream(originalData)); var deserializeContext = new BlockDeserializeContext(br, typeProvider); var deserialized = new Block(deserializeContext, hashProvider); // Then serialize that deserialized data and see if it matches var secondMemoryStream = new MemoryCompareStream(originalData); var secondSerializeContext = new BlockSerializeContext(new BinaryWriter(secondMemoryStream), typeProvider); deserialized.Serialize(secondSerializeContext); }
public void RoundTripCheck(IHashProvider hashProvider, IBlockObjectTypeProvider typeProvider) { // Serialize a first time var firstMemoryStream = new MemoryStream(); var firstSerializeContext = new BlockSerializeContext(new BinaryWriter(firstMemoryStream), typeProvider); byte[] nonce; if (typeProvider.SecretKey != null) { nonce = StreamEncryption.GenerateNonceChaCha20(); firstSerializeContext.bw.WriteBuffer(nonce); using (var ems = new MemoryStream()) { using (var ebw = new BinaryWriter(ems)) { var ec = new BlockSerializeContext(ebw, typeProvider, firstSerializeContext.Version); Serialize(ec); firstSerializeContext.bw.WriteBuffer(StreamEncryption.EncryptChaCha20(ems.ToArray(), nonce, ec.typeProvider.SecretKey)); } } } else { firstSerializeContext.bw.Write(false); Serialize(firstSerializeContext); } byte[] originalData = firstMemoryStream.ToArray(); // Then deserialize that data { var br = new BinaryReader(new MemoryStream(originalData)); var deserializeContext = new BlockDeserializeContext(br, typeProvider); nonce = deserializeContext.br.ReadBuffer(); Block deserialized; if (nonce != null) { using (var dms = new MemoryStream(StreamEncryption.DecryptChaCha20(deserializeContext.br.ReadBuffer(), nonce, typeProvider.SecretKey))) { using (var dbr = new BinaryReader(dms)) { var dc = new BlockDeserializeContext(dbr, typeProvider); deserialized = new Block(dc); } } } else { deserialized = new Block(deserializeContext); } // Then serialize that deserialized data and see if it matches { var secondMemoryStream = new MemoryCompareStream(originalData); var secondSerializeContext = new BlockSerializeContext(new BinaryWriter(secondMemoryStream), typeProvider); if (typeProvider.SecretKey != null) { secondSerializeContext.bw.WriteBuffer(nonce); using (var ems = new MemoryStream()) { using (var ebw = new BinaryWriter(ems)) { var ec = new BlockSerializeContext(ebw, typeProvider, secondSerializeContext.Version); deserialized.Serialize(ec); secondSerializeContext.bw.WriteBuffer(StreamEncryption.EncryptChaCha20(ems.ToArray(), nonce, ec.typeProvider.SecretKey)); } } } else { secondSerializeContext.bw.Write(false); deserialized.Serialize(secondSerializeContext); } } } }
public BlockObjectProjection(IBlockRepository source, IBlockObjectTypeProvider typeProvider) { _source = source; _typeProvider = typeProvider; }
public BlockObjectProjection(IBlockStore source, IBlockObjectTypeProvider typeProvider) { _source = source; _typeProvider = typeProvider; }