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);
        }
Пример #2
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
        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);
        }
Пример #9
0
        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);
        }
Пример #10
0
        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);
        }