public static Stream ToZipContainer(this BlockChain blockChain, IWorkContext context)
        {
            blockChain.Verify(nameof(blockChain)).IsNotNull();
            blockChain.IsValid().Verify().Assert(x => x == true, "Block chain is not valid");

            var writeMemoryBuffer = new MemoryStream();

            using var writer = new ZipContainerWriter(new ZipArchive(writeMemoryBuffer, ZipArchiveMode.Create, leaveOpen: true));

            try
            {
                string blockChainHash = blockChain.ToMerkleTree().BuildTree().ToString();
                writer.Write(context, _merkleTreeHash, blockChainHash);

                string json = blockChain.ToJson();
                writer.Write(context, _zipPath, json);
            }
            finally
            {
                writer.Close();
            }

            writeMemoryBuffer.Length.Verify().Assert(x => x > 0, "ZipContainer memory buffer length is zero");
            writeMemoryBuffer.Seek(0, SeekOrigin.Begin);

            return(writeMemoryBuffer);
        }
        public static void Validate(this BlockChain blockChain, IWorkContext context, IPrincipleSignatureContainer keyContainer)
        {
            blockChain.Verify(nameof(blockChain)).IsNotNull();
            keyContainer.Verify(nameof(keyContainer)).IsNotNull();

            blockChain.IsValid()
            .Verify()
            .Assert <bool, SecurityException>(x => x == true, "Block chain has linkage is invalid");

            foreach (var node in blockChain.Blocks)
            {
                // Skip header
                if (node.Index == 0)
                {
                    continue;
                }

                string?issuer = JwtTokenParser.GetIssuerFromJwtToken(node.BlockData.JwtSignature !) !
                                .Verify()
                                .Assert <string, SecurityException>(x => x != null, "Issuer is not found in JWT Signature")
                                .Value;

                PrincipleSignature principleSignature = keyContainer.Get(issuer !) !;
                principleSignature.Verify().IsNotNull("Signature for issuer {issuer} is not in container");

                node.BlockData.Validate(context, principleSignature);
            }
        }
Esempio n. 3
0
        public static string ToJson(this BlockChain blockChain)
        {
            blockChain.Verify(nameof(blockChain)).IsNotNull();
            blockChain.Blocks.Count.Verify(nameof(blockChain.Blocks.Count)).Assert <int, InvalidOperationException>(x => x > 1, "Empty block chain");

            var list = new List <BlockChainNodeModel>();

            foreach (BlockNode node in blockChain)
            {
                BlockChainNodeModel dataBlockNodeModel = node.ConvertTo();
                list.Add(dataBlockNodeModel);
            }

            var blockChainModel = new BlockChainModel()
            {
                Blocks = list,
            };

            return(JsonConvert.SerializeObject(blockChainModel));
        }