public void GivenBlockChain_WhenContainerIsMemory_ShouldRoundTrip() { const string issuer = "*****@*****.**"; const string issuer2 = "*****@*****.**"; const string zipPath = "$block"; var date = DateTime.UtcNow; var issuerSignature = new PrincipalSignature(issuer, issuer, "*****@*****.**"); var issuerSignature2 = new PrincipalSignature(issuer2, issuer2, "*****@*****.**"); BlockChain blockChain = new BlockChainBuilder() .SetPrincipleId(issuer) .Build() .Sign(x => issuerSignature); var payload = new Payload { Name = "Name1", Value = 2, Price = 10.5f }; var payload2 = new Payload2 { Last = "Last", Current = date, Author = "test" }; blockChain.Add(payload, issuer); blockChain.Add(payload2, issuer); var getSignature = (string kid) => { return(kid switch { issuer => issuerSignature, issuer2 => issuerSignature2, _ => throw new ArgumentException($"Invalid kid={kid}"), });
// //////////////////////////////////////////////////////////////////////////////////////////// // Contract support public async Task <bool> Create(BlkHeader blkHeader, CancellationToken token) { var documentId = new DocumentId(blkHeader.DocumentId); BlockChainModel?model = await Get(documentId, token); if (model != null) { return(false); } BlockChain blockChain = new BlockChainBuilder() .SetPrincipleId(blkHeader.PrincipalId) .Build(); blockChain.Add(blkHeader, blkHeader.PrincipalId); blockChain = await Sign(blockChain, token); if (!blockChain.IsValid()) { throw new InvalidOperationException("Blockchain is invalid"); } await Set(documentId, blockChain.ToBlockChainModel(), token); return(true); }
public void GivenBlockChain_TwoTypes_ShouldVerify() { const string issuer = "*****@*****.**"; const string issuer2 = "*****@*****.**"; var now = UnixDate.UtcNow; var date = DateTime.UtcNow; var issuerSignature = new PrincipalSignature(issuer, issuer, "*****@*****.**"); var issuerSignature2 = new PrincipalSignature(issuer2, issuer2, "*****@*****.**"); BlockChain blockChain = new BlockChainBuilder() .SetPrincipleId(issuer) .Build(); var payload = new Payload { Name = "Name1", Value = 2, Price = 10.5f }; var payload2 = new Payload2 { Last = "Last", Current = date, Author = "test" }; blockChain.Add(payload, issuer); blockChain.Add(payload2, issuer2); var getSignature = (string kid) => kid switch { issuer => issuerSignature, issuer2 => issuerSignature2, _ => throw new ArgumentException($"Invalid kid={kid}"), }; blockChain = blockChain.Sign(getSignature); blockChain.Validate(getSignature); // Get payload of data block blockChain.Blocks.Count.Should().Be(3); DataBlock receiveBlock = blockChain.Blocks[1].DataBlock; TestBlockNode(receiveBlock, "Payload", "1"); Payload p1 = receiveBlock.Data.ToObject <Payload>().VerifyNotNull("payload failed"); (payload == p1).Should().BeTrue(); DataBlock receiveBlock2 = blockChain.Blocks[2].DataBlock; TestBlockNode(receiveBlock2, "Payload2", "2"); Payload2 p2 = receiveBlock2.Data.ToObject <Payload2>().VerifyNotNull("payload2 failed"); (payload2 == p2).Should().BeTrue(); }
public void GivenEmptyBlockChain_ShouldVerify() { const string issuer = "*****@*****.**"; var now = UnixDate.UtcNow; IPrincipalSignature principleSignature = new PrincipalSignature(issuer, issuer, "*****@*****.**"); BlockChain blockChain = new BlockChainBuilder() .SetPrincipleId(issuer) .Build() .Sign(x => principleSignature); blockChain.Validate(x => principleSignature); }
public void GivenBlockChain_AppendSingleNode_ShouldVerify() { const string issuer = "*****@*****.**"; var now = DateTime.UtcNow; IPrincipalSignature principleSignature = new PrincipalSignature(issuer, issuer, "*****@*****.**"); var dataPayload = new { Name = "Name", Type = "Type", Author = "Author", Data = "Data" }; string payloadJson = dataPayload.ToJson(); DataBlock data = new DataBlockBuilder() .SetTimeStamp(now) .SetBlockType("blockType") .SetBlockId("blockId") .SetData(payloadJson) .SetPrincipleId(issuer) .Build(); BlockChain blockChain = new BlockChainBuilder() .SetPrincipleId(issuer) .Build() .Add(data) .Sign(x => principleSignature); blockChain.Validate(x => principleSignature); // Get payload of data block blockChain.Blocks.Count.Should().Be(2); DataBlock receiveBlock = blockChain.Blocks[1].DataBlock; TestBlockNode(receiveBlock, "blockType", "blockId"); Dictionary <string, string> receivedPayload = receiveBlock.Data.ToObject <Dictionary <string, string> >().VerifyNotNull("payload failed"); (receivedPayload["name"] == "Name").Should().BeTrue(); (receivedPayload["type"] == "Type").Should().BeTrue(); (receivedPayload["author"] == "Author").Should().BeTrue(); (receivedPayload["data"] == "Data").Should().BeTrue(); }
public async Task GivenBlockChain_WhenFile_WillRoundTrip() { ContractClient client = TestApplication.GetContractClient(); var documentId = new DocumentId("test/unit-tests-smart/contract1"); await Delete(documentId, false); var blkHeader = new BlkHeader { PrincipalId = "dev/user/[email protected]", DocumentId = (string)documentId, Creator = "test", Description = "test description", }; BlockChain blockChain = new BlockChainBuilder() .SetPrincipleId(blkHeader.PrincipalId) .Build() .Add(blkHeader, blkHeader.PrincipalId); BlockChainModel signedBlockChainModel = await client.Sign(blockChain.ToBlockChainModel()); signedBlockChainModel.Should().NotBeNull(); await client.Set(documentId, signedBlockChainModel); BlockChainModel readBlockChainModel = await client.Get(documentId); readBlockChainModel.Should().NotBeNull(); readBlockChainModel.Blocks.Count.Should().Be(signedBlockChainModel.Blocks.Count); readBlockChainModel.Blocks .Zip(signedBlockChainModel.Blocks) .All(x => x.First == x.Second) .Should().BeTrue(); bool isValid = await client.Validate(documentId); isValid.Should().BeTrue(); isValid = await client.Validate(readBlockChainModel); isValid.Should().BeTrue(); await Delete(documentId, true); }
public async Task GivenBlockChain_WhenSigned_FailedWithWrongSignature() { ContractClient client = TestApplication.GetContractClient(); var documentId = new DocumentId("test/unit-tests-smart/contract1"); var blkHeader = new BlkHeader { PrincipalId = "dev/user/[email protected]", DocumentId = (string)documentId, Creator = "test", Description = "test description", }; BlockChain blockChain = new BlockChainBuilder() .SetPrincipleId(blkHeader.PrincipalId) .Build() .Add(blkHeader, blkHeader.PrincipalId); BlockChainModel signedBlockChainModel = await client.Sign(blockChain.ToBlockChainModel()); signedBlockChainModel.Should().NotBeNull(); bool isValid = await client.Validate(signedBlockChainModel); // Modify signature signedBlockChainModel.Blocks[1] = signedBlockChainModel.Blocks[1] with { DataBlock = signedBlockChainModel.Blocks[1].DataBlock with { JwtSignature = "junk" } }; isValid = await client.Validate(signedBlockChainModel); isValid.Should().BeFalse(); }