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