示例#1
0
 public void SerializeHeader(BlockSerializeContext context)
 {
     context.bw.Write(context.Version);                  // Version
     context.bw.WriteBuffer(PreviousHash);               // PreviousHash
     context.bw.Write(Timestamp);                        // Timestamp
     context.bw.Write(Difficulty);                       // Difficulty
     context.bw.Write(Nonce);                            // Nonce
 }
示例#2
0
 public static void Serialize(IBlockDescriptor descriptor, BlockSerializeContext context)
 {
     context.bw.Write(context.Version);                                 // Version
     context.bw.WriteBuffer(descriptor.PreviousHash);                   // PreviousHash
     context.bw.WriteBuffer(descriptor.MerkleRootHash);                 // MerkleRootHash
     context.bw.Write(descriptor.Timestamp);                            // Timestamp
     context.bw.Write(descriptor.Difficulty);                           // Difficulty
     context.bw.Write(descriptor.Nonce);                                // Nonce
 }
示例#3
0
        public void Serialize(BlockSerializeContext context)
        {
            context.bw.WriteNullableString(Id);
            context.bw.Write((byte)Type);

            if (context.bw.WriteBoolean(Data != null))
            {
                Debug.Assert(Data != null);
                SerializeTransactionItems(context, Data.Inputs);
                SerializeTransactionItems(context, Data.Outputs);
            }
        }
示例#4
0
        public void SerializeObjects(BlockSerializeContext context)
        {
            var count = Objects?.Count ?? 0;

            context.bw.Write(count);
            if (Objects != null)
            {
                foreach (var @object in Objects)
                {
                    @object.Serialize(context);
                }
            }
        }
示例#5
0
        public void Serialize(BlockSerializeContext context)
        {
            Type = context.typeProvider.Get(Data?.GetType());

            context.bw.WriteNullableLong(Type);                  // Type
            context.bw.Write(Version);                           // Version
            context.bw.Write(Timestamp);                         // Timestamp
            context.bw.WriteBuffer(Hash);                        // Hash

            if (context.bw.WriteBoolean(Data != null) && Type.HasValue)
            {
                Data?.Serialize(context);
            }
        }
 private byte[] SerializeObjects(Block block)
 {
     byte[] data;
     using (var ms = new MemoryStream())
     {
         using (var bw = new BinaryWriter(ms, Encoding.UTF8))
         {
             var context = new BlockSerializeContext(bw, _typeProvider);
             block.SerializeObjects(context);
         }
         data = ms.ToArray();
     }
     return(data);
 }
示例#7
0
 private static void SerializeTransactionItems(BlockSerializeContext context, ICollection <TransactionItem> items)
 {
     if (context.bw.WriteBoolean(items != null))
     {
         Debug.Assert(items != null);
         context.bw.Write(items.Count);
         foreach (var input in items)
         {
             context.bw.Write(input.Index);
             context.bw.Write(input.TransactionId);
             context.bw.Write((byte)input.Type);
             context.bw.WriteBuffer(input.Address);
             context.bw.Write(input.Amount);
             context.bw.WriteBuffer(input.Signature);
         }
     }
 }
示例#8
0
        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);
        }
示例#9
0
        private byte[] SerializeObjects(Block block)
        {
            byte[] data;
            using (var ms = new MemoryStream())
            {
                using (var bw = new BinaryWriter(ms, Encoding.UTF8))
                {
                    // Version:
                    var context = new BlockSerializeContext(bw, _typeProvider);

                    if (context.typeProvider.SecretKey != null)
                    {
                        // Nonce:
                        var nonce = StreamEncryption.GenerateNonceChaCha20();
                        context.bw.WriteBuffer(nonce);

                        // Data:
                        using (var ems = new MemoryStream())
                        {
                            using (var ebw = new BinaryWriter(ems, Encoding.UTF8))
                            {
                                var ec = new BlockSerializeContext(ebw, _typeProvider, context.Version);
                                block.SerializeObjects(ec);
                                context.bw.WriteBuffer(StreamEncryption.EncryptChaCha20(ems.ToArray(), nonce, ec.typeProvider.SecretKey));
                            }
                        }
                    }
                    else
                    {
                        // Data:
                        context.bw.Write(false);
                        block.SerializeObjects(context);
                    }

                    data = ms.ToArray();
                }
            }

            return(data);
        }
示例#10
0
 public void Serialize(BlockSerializeContext context)
 {
     context.bw.Write(Text);
 }
示例#11
0
        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);
                    }
                }
            }
        }
示例#12
0
 public void SerializeHeader(BlockSerializeContext context)
 {
     BlockHeader.Serialize(this, context);
 }
示例#13
0
 public void Serialize(BlockSerializeContext context)
 {
     SerializeHeader(context);
     context.bw.WriteBuffer(Hash);
     SerializeObjects(context);
 }
示例#14
0
 public void Serialize(BlockSerializeContext context)
 {
     SerializeHeader(context);
     SerializeObjects(context);
 }
示例#15
0
 public void Serialize(BlockSerializeContext context)
 {
     Serialize(this, context);
 }