public async Task RecordCrossChainData() { int parentChainId = 123; var sideChainId = await InitAndCreateSideChain(parentChainId); var fakeSideChainBlockHash = Hash.FromString("sideChainBlockHash"); var fakeTxMerkleTreeRoot = Hash.FromString("txMerkleTreeRoot"); var sideChainBlockData = new SideChainBlockData { BlockHeaderHash = fakeSideChainBlockHash, SideChainHeight = 1, SideChainId = sideChainId, TransactionMerkleTreeRoot = fakeTxMerkleTreeRoot }; var parentChainBlockData = new ParentChainBlockData { Root = new ParentChainBlockRootInfo { ParentChainId = parentChainId, ParentChainHeight = 1, TransactionStatusMerkleRoot = fakeTxMerkleTreeRoot } }; var crossChainBlockData = new CrossChainBlockData { ParentChainBlockData = { parentChainBlockData }, SideChainBlockData = { sideChainBlockData } }; var txRes = await ExecuteContractWithMiningAsync(CrossChainContractAddress, CrossChainConstants.CrossChainIndexingMethodName, crossChainBlockData); Assert.True(txRes.Status == TransactionResultStatus.Mined); }
public async Task RequestCrossChainData_Test() { var chainId = ChainHelper.GetChainId(ChainHelper.ConvertBase58ToChainId("AELF") + 1); var remoteChainId = ChainOptions.ChainId; var height = 2; var port = 5000; await Server.StartAsync(port); var grpcClientInitializationContext = new GrpcClientInitializationContext { RemoteChainId = chainId, LocalChainId = ChainHelper.ConvertBase58ToChainId("AELF"), DialTimeout = 1000, UriStr = string.Concat(Host, ":", port) }; var client = new ClientForSideChain(grpcClientInitializationContext); _grpcCrossChainCommunicationTestHelper.GrpcCrossChainClients.TryAdd(remoteChainId, client); _grpcCrossChainCommunicationTestHelper.FakeSideChainBlockDataEntityCacheOnServerSide(height); await client.RequestCrossChainDataAsync(height, b => _blockCacheEntityProducer.TryAddBlockCacheEntity(b)); var clientBlockDataEntityCache = GrpcCrossChainCommunicationTestHelper.ClientBlockDataEntityCache; var sideChainBlockData = new SideChainBlockData { Height = height }; Assert.Contains(sideChainBlockData, clientBlockDataEntityCache); Dispose(); }
public void FakeSideChainBlockDataEntityCacheOnServerSide(int height) { var blockInfoCache = new SideChainBlockData { Height = height }; ServerBlockDataEntityCache.Add(blockInfoCache); }
public async Task GetChainInitializationContext_Success() { var parentChainId = 123; var lockedToken = 10L; var sideChainId = await InitAndCreateSideChain(parentChainId, lockedToken); var fakeSideChainBlockHash = Hash.FromString("sideChainBlockHash"); var fakeTxMerkleTreeRoot = Hash.FromString("txMerkleTreeRoot"); var sideChainBlockData = new SideChainBlockData { BlockHeaderHash = fakeSideChainBlockHash, SideChainHeight = 1, SideChainId = sideChainId, TransactionMerkleTreeRoot = fakeTxMerkleTreeRoot }; var crossChainBlockData = new CrossChainBlockData { SideChainBlockData = { sideChainBlockData } }; var indexingTx = await GenerateTransactionAsync(CrossChainContractAddress, CrossChainConstants.CrossChainIndexingMethodName, null, crossChainBlockData); var block = await MineAsync(new List <Transaction> { indexingTx }); var indexingRes = await Tester.GetTransactionResultAsync(indexingTx.GetHash()); Assert.True(indexingRes.Status == TransactionResultStatus.Mined); //not exsit chain id var chainInitializationContext = ChainInitializationContext.Parser.ParseFrom( await CallContractMethodAsync(CrossChainContractAddress, nameof(CrossChainContract.GetChainInitializationContext), new SInt32Value() { Value = parentChainId })); chainInitializationContext.ChainId.ShouldBe(0); chainInitializationContext.Creator.ShouldBeNull(); //valid chain id chainInitializationContext = ChainInitializationContext.Parser.ParseFrom( await CallContractMethodAsync(CrossChainContractAddress, nameof(CrossChainContract.GetChainInitializationContext), new SInt32Value() { Value = sideChainId })); chainInitializationContext.ChainId.ShouldBe(sideChainId); chainInitializationContext.Creator.ShouldBe(Address.FromPublicKey(Tester.KeyPair.PublicKey)); }
public async Task RecordSideChainData() { var parentChainId = 123; var lockedToken = 10L; var sideChainId = await InitAndCreateSideChain(parentChainId, lockedToken); var fakeSideChainBlockHash = Hash.FromString("sideChainBlockHash"); var fakeTxMerkleTreeRoot = Hash.FromString("txMerkleTreeRoot"); var sideChainBlockData = new SideChainBlockData { BlockHeaderHash = fakeSideChainBlockHash, SideChainHeight = 1, SideChainId = sideChainId, TransactionMerkleTreeRoot = fakeTxMerkleTreeRoot }; var crossChainBlockData = new CrossChainBlockData { SideChainBlockData = { sideChainBlockData } }; var indexingTx = await GenerateTransactionAsync(CrossChainContractAddress, CrossChainConstants.CrossChainIndexingMethodName, null, crossChainBlockData); var block = await MineAsync(new List <Transaction> { indexingTx }); var indexingRes = await Tester.GetTransactionResultAsync(indexingTx.GetHash()); Assert.True(indexingRes.Status == TransactionResultStatus.Mined); var balance = SInt64Value.Parser.ParseFrom(await CallContractMethodAsync(CrossChainContractAddress, nameof(CrossChainContract.LockedBalance), new SInt32Value() { Value = sideChainId })).Value; Assert.Equal(lockedToken - 1, balance); var indexedCrossChainBlockData = CrossChainBlockData.Parser.ParseFrom( await CallContractMethodAsync(CrossChainContractAddress, nameof(CrossChainContract.GetIndexedCrossChainBlockDataByHeight), new SInt64Value() { Value = block.Height })); Assert.Equal(crossChainBlockData, indexedCrossChainBlockData); }
public async Task GenerateTransactionInput_PendingProposal_Test() { var sideChainId = 123; var sideChainBlockInfoCache = new List <ICrossChainBlockEntity>(); var previousBlockHash = HashHelper.ComputeFrom("PreviousBlockHash"); var previousBlockHeight = 1; var cachingCount = 5; for (int i = 1; i < cachingCount + CrossChainConstants.DefaultBlockCacheEntityCount; i++) { var sideChainBlockData = new SideChainBlockData() { ChainId = sideChainId, Height = (i + 1), TransactionStatusMerkleTreeRoot = HashHelper.ComputeFrom((sideChainId + 1).ToString()) }; sideChainBlockInfoCache.Add(sideChainBlockData); } _crossChainTestHelper.AddFakePendingCrossChainIndexingProposal(sideChainId, new PendingChainIndexingProposalStatus()); _crossChainTestHelper.AddFakeSideChainIdHeight(sideChainId, 1); AddFakeCacheData(new Dictionary <int, List <ICrossChainBlockEntity> > { { sideChainId, sideChainBlockInfoCache } }); _crossChainTestHelper.AddFakePendingCrossChainIndexingProposal(sideChainId, CreatePendingChainIndexingProposalStatus(SampleAddress.AddressList[0], HashHelper.ComputeFrom("ProposalId"), new CrossChainBlockData())); var res = await _crossChainIndexingDataService.PrepareExtraDataForNextMiningAsync(previousBlockHash, previousBlockHeight); Assert.Empty(res); var crossChainTransactionInput = await _crossChainIndexingDataService.GetCrossChainTransactionInputForNextMiningAsync(previousBlockHash, previousBlockHeight); Assert.Equal(nameof(CrossChainContractImplContainer.CrossChainContractImplStub.ReleaseCrossChainIndexingProposal), crossChainTransactionInput.MethodName); var sideChainIdListInParam = ReleaseCrossChainIndexingProposalInput.Parser.ParseFrom(crossChainTransactionInput.Value).ChainIdList; sideChainIdListInParam.ShouldContain(sideChainId); }
public async Task GetIndexedSideChainBlockData_WithoutIndex_Test() { var chainId = _chainOptions.ChainId; var fakeSideChainBlockData = new SideChainBlockData { Height = 1, ChainId = chainId }; var fakeIndexedCrossChainBlockData = new CrossChainBlockData(); fakeIndexedCrossChainBlockData.SideChainBlockDataList.AddRange(new[] { fakeSideChainBlockData }); var res = await _crossChainIndexingDataService.GetIndexedSideChainBlockDataAsync( fakeSideChainBlockData.BlockHeaderHash, 1); Assert.True(res == null); }
public void TryTake_WrongIndex_After_RegisterNewChain() { int chainId = 123; _crossChainMemoryCacheService.RegisterNewChainCache(chainId, 1); var blockInfoCache = MultiChainBlockInfoCacheProvider.GetBlockInfoCache(chainId); Assert.NotNull(blockInfoCache); var expectedBlockInfo = new SideChainBlockData { SideChainId = chainId, SideChainHeight = 1 }; blockInfoCache.TryAdd(expectedBlockInfo); var blockInfo = _crossChainDataConsumer.TryTake <SideChainBlockData>(chainId, 2, false); Assert.Null(blockInfo); }
public async Task GenerateTransaction_PendingProposal_NotApproved_Test() { var sideChainId = 123; var sideChainBlockInfoCache = new List <ICrossChainBlockEntity>(); var previousBlockHash = HashHelper.ComputeFrom("PreviousBlockHash"); var previousBlockHeight = 1; var cachingCount = 5; for (int i = 1; i < cachingCount + CrossChainConstants.DefaultBlockCacheEntityCount; i++) { var sideChainBlockData = new SideChainBlockData() { ChainId = sideChainId, Height = (i + 1), TransactionStatusMerkleTreeRoot = HashHelper.ComputeFrom((sideChainId + 1).ToString()) }; sideChainBlockInfoCache.Add(sideChainBlockData); } _crossChainTestHelper.AddFakePendingCrossChainIndexingProposal(sideChainId, new PendingChainIndexingProposalStatus()); _crossChainTestHelper.AddFakeSideChainIdHeight(sideChainId, 1); AddFakeCacheData(new Dictionary <int, List <ICrossChainBlockEntity> > { { sideChainId, sideChainBlockInfoCache } }); _crossChainTestHelper.AddFakePendingCrossChainIndexingProposal(sideChainId, CreatePendingChainIndexingProposalStatus(SampleAddress.AddressList[0], HashHelper.ComputeFrom("ProposalId"), new CrossChainBlockData(), false)); var res = await _crossChainIndexingDataService.PrepareExtraDataForNextMiningAsync(previousBlockHash, previousBlockHeight); Assert.Empty(res); var crossChainTransactionInput = await _crossChainIndexingDataService.GetCrossChainTransactionInputForNextMiningAsync(previousBlockHash, previousBlockHeight); Assert.Null(crossChainTransactionInput); }
public async Task GetIndexedSideChainBlockData_WithIndex_Test() { var chainId = _chainOptions.ChainId; var fakeMerkleTreeRoot1 = HashHelper.ComputeFrom("fakeMerkleTreeRoot1"); var fakeSideChainBlockData = new SideChainBlockData { Height = 1, ChainId = chainId, TransactionStatusMerkleTreeRoot = fakeMerkleTreeRoot1 }; var fakeIndexedCrossChainBlockData = new CrossChainBlockData(); fakeIndexedCrossChainBlockData.SideChainBlockDataList.AddRange(new[] { fakeSideChainBlockData }); _crossChainTestHelper.AddFakeIndexedCrossChainBlockData(fakeSideChainBlockData.Height, fakeIndexedCrossChainBlockData); _crossChainTestHelper.AddFakeSideChainIdHeight(chainId, 0); AddFakeCacheData(new Dictionary <int, List <ICrossChainBlockEntity> > { { chainId, new List <ICrossChainBlockEntity> { fakeSideChainBlockData } } }); var res = await _crossChainIndexingDataService.GetIndexedSideChainBlockDataAsync( fakeSideChainBlockData.BlockHeaderHash, 1); Assert.True(res.SideChainBlockDataList[0].Height == fakeSideChainBlockData.Height); Assert.True(res.SideChainBlockDataList[0].ChainId == chainId); }
public override void ConfigureServices(ServiceConfigurationContext context) { base.ConfigureServices(context); var services = context.Services; services.AddTransient(o => { var kernelTestHelper = context.Services.GetRequiredServiceLazy <KernelTestHelper>(); var mockService = new Mock <IBlockchainService>(); mockService.Setup(m => m.GetChainAsync()) .Returns(Task.FromResult(new Chain { LastIrreversibleBlockHeight = 10 })); mockService.Setup(m => m.GetBlockHashByHeightAsync(It.IsAny <Chain>(), It.IsAny <long>(), It.IsAny <Hash>())) .Returns(Task.FromResult(Hash.FromString("hash"))); mockService.Setup(m => m.GetBlockByHashAsync(It.IsAny <Hash>())) .Returns(() => { var previousBlockHash = Hash.FromString("previousBlockHash"); return(Task.FromResult(kernelTestHelper.Value.GenerateBlock(9, previousBlockHash))); }); return(mockService.Object); }); services.AddTransient(o => { var mockCrossChainDataProvider = new Mock <ICrossChainService>(); mockCrossChainDataProvider .Setup(c => c.GetChainInitializationDataAsync(It.IsAny <int>())).Returns(async() => await Task.FromResult(new ChainInitializationData { CreationHeightOnParentChain = 1, })); return(mockCrossChainDataProvider.Object); }); services.AddTransient(o => { var mockCrossChainResponseService = new Mock <ICrossChainResponseService>(); mockCrossChainResponseService .Setup(c => c.ResponseParentChainBlockDataAsync(It.IsAny <long>(), It.IsAny <int>())).Returns <long, int>( (height, chainId) => { if (height > 100) { return(Task.FromResult <ParentChainBlockData>(null)); } var parentChanBlockData = new ParentChainBlockData { ChainId = chainId, Height = height, TransactionStatusMerkleRoot = Hash.FromString("TransactionStatusMerkleRoot") }; return(Task.FromResult(parentChanBlockData)); }); mockCrossChainResponseService .Setup(c => c.ResponseSideChainBlockDataAsync(It.IsAny <long>())).Returns( () => { var sideChanBlockData = new SideChainBlockData() { ChainId = ChainHelper.GetChainId(1), Height = 10, }; return(Task.FromResult(sideChanBlockData)); }); mockCrossChainResponseService .Setup(c => c.ResponseChainInitializationDataFromParentChainAsync(It.IsAny <int>())).Returns( () => { var chainInitializationData = new ChainInitializationData() { CreationHeightOnParentChain = 1 }; return(Task.FromResult(chainInitializationData)); }); return(mockCrossChainResponseService.Object); }); services.AddTransient(o => { var mockService = new Mock <ICrossChainCacheEntityService>(); return(mockService.Object); }); }
public async Task RecordCrossChainData_WithChainInsufficientBalance() { int parentChainId = 123; long lockedToken = 2; var sideChainId = await InitAndCreateSideChain(parentChainId, lockedToken); var fakeSideChainBlockHash = Hash.FromString("sideChainBlockHash"); var fakeTxMerkleTreeRoot = Hash.FromString("txMerkleTreeRoot"); var sideChainBlockData = new SideChainBlockData { BlockHeaderHash = fakeSideChainBlockHash, SideChainHeight = 1, SideChainId = sideChainId, TransactionMerkleTreeRoot = fakeTxMerkleTreeRoot }; var crossChainBlockData = new CrossChainBlockData { SideChainBlockData = { sideChainBlockData } }; var indexingTx = await GenerateTransactionAsync(CrossChainContractAddress, CrossChainConstants.CrossChainIndexingMethodName, null, crossChainBlockData); var block = await MineAsync(new List <Transaction> { indexingTx }); var indexingRes = await Tester.GetTransactionResultAsync(indexingTx.GetHash()); Assert.True(indexingRes.Status == TransactionResultStatus.Mined); var fakeSideChainBlockHash2 = Hash.FromString("sideChainBlockHash2"); var fakeTxMerkleTreeRoot2 = Hash.FromString("txMerkleTreeRoot2"); sideChainBlockData = new SideChainBlockData { BlockHeaderHash = fakeSideChainBlockHash2, SideChainHeight = 2, SideChainId = sideChainId, TransactionMerkleTreeRoot = fakeTxMerkleTreeRoot2 }; crossChainBlockData = new CrossChainBlockData { SideChainBlockData = { sideChainBlockData } }; var indexingTx2 = await ExecuteContractWithMiningAsync(CrossChainContractAddress, nameof(CrossChainContract.RecordCrossChainData), crossChainBlockData); Assert.True(indexingTx2.Status == TransactionResultStatus.Mined); var chainStatus = SInt32Value.Parser.ParseFrom(await CallContractMethodAsync(CrossChainContractAddress, nameof(CrossChainContract.GetChainStatus), new SInt32Value() { Value = sideChainId })).Value; Assert.Equal(3, chainStatus); }
public async Task RecordSideChainData_WithChainNotExist() { int parentChainId = 123; long lockedToken = 10; var sideChainId1 = await InitAndCreateSideChain(parentChainId, lockedToken); // create second side chain long lockedTokenAmount = 10; await ApproveBalance(lockedTokenAmount); var sideChainCreationRequest = CreateSideChainCreationRequest(1, lockedTokenAmount, ByteString.Empty); var tx1 = await GenerateTransactionAsync(CrossChainContractAddress, nameof(CrossChainContract.RequestChainCreation), null, sideChainCreationRequest); await MineAsync(new List <Transaction> { tx1 }); var sideChainId2 = ChainHelpers.GetChainId(2); var tx2 = await GenerateTransactionAsync( CrossChainContractAddress, nameof(CrossChainContract.CreateSideChain), null, new SInt32Value() { Value = sideChainId2 }); await MineAsync(new List <Transaction> { tx2 }); var fakeSideChainBlockHash = Hash.FromString("sideChainBlockHash"); var fakeTxMerkleTreeRoot = Hash.FromString("txMerkleTreeRoot"); var sideChainBlockData1 = new SideChainBlockData { BlockHeaderHash = fakeSideChainBlockHash, SideChainHeight = 1, SideChainId = sideChainId1, TransactionMerkleTreeRoot = fakeTxMerkleTreeRoot }; var sideChainBlockData2 = new SideChainBlockData { BlockHeaderHash = fakeSideChainBlockHash, SideChainHeight = 2, // wrong height SideChainId = sideChainId2, TransactionMerkleTreeRoot = fakeTxMerkleTreeRoot }; int fakeChainId = 124; var sideChainBlockData3 = new SideChainBlockData { BlockHeaderHash = fakeSideChainBlockHash, SideChainHeight = 1, SideChainId = fakeChainId, TransactionMerkleTreeRoot = fakeTxMerkleTreeRoot }; var crossChainBlockData = new CrossChainBlockData { SideChainBlockData = { sideChainBlockData1, sideChainBlockData2, sideChainBlockData3 } }; var indexingTx = await GenerateTransactionAsync(CrossChainContractAddress, CrossChainConstants.CrossChainIndexingMethodName, null, crossChainBlockData); var block = await MineAsync(new List <Transaction> { indexingTx }); var balance = SInt64Value.Parser.ParseFrom( await CallContractMethodAsync(CrossChainContractAddress, nameof(CrossChainContract.LockedBalance), new SInt32Value() { Value = sideChainId1 })).Value; Assert.Equal(lockedToken - 1, balance); var indexedCrossChainBlockData = CrossChainBlockData.Parser.ParseFrom( await CallContractMethodAsync(CrossChainContractAddress, nameof(CrossChainContract.GetIndexedCrossChainBlockDataByHeight), new SInt64Value() { Value = block.Height })); var expectedCrossChainBlocData = new CrossChainBlockData(); expectedCrossChainBlocData.SideChainBlockData.Add(sideChainBlockData1); Assert.Equal(expectedCrossChainBlocData, indexedCrossChainBlockData); }