private async Task <IResponseIndexingMessage> CreateResponseForSideChain(Block block, int remoteSideChainId, long parentChainHeightOfCreation) { var responseParentChainBlockData = new ResponseParentChainBlockData { Success = true, BlockData = new ParentChainBlockData { Root = new ParentChainBlockRootInfo { ParentChainHeight = block.Height, ParentChainId = block.Header.ChainId } } }; responseParentChainBlockData = FillExtraDataInResponse(responseParentChainBlockData, block.Header, block.Height >= parentChainHeightOfCreation); if (responseParentChainBlockData.BlockData.Root.CrossChainExtraData == null) { return(responseParentChainBlockData); } var indexedSideChainBlockDataResult = await GetIndexedSideChainBlockInfoResult(block); var enumerableMerklePath = GetEnumerableMerklePath(indexedSideChainBlockDataResult, remoteSideChainId); foreach (var(sideChainHeight, merklePath) in enumerableMerklePath) { responseParentChainBlockData.BlockData.IndexedMerklePath.Add(sideChainHeight, merklePath); } return(responseParentChainBlockData); }
private ResponseParentChainBlockData FillExtraDataInResponse(ResponseParentChainBlockData responseParentChainBlockData, BlockHeader blockHeader, bool needOtherExtraData) { var transactionStatusMerkleRoot = _crossChainExtraDataExtractor.ExtractTransactionStatusMerkleTreeRoot(blockHeader); responseParentChainBlockData.BlockData.Root.TransactionStatusMerkleRoot = transactionStatusMerkleRoot; var crossChainExtra = _crossChainExtraDataExtractor.ExtractCrossChainData(blockHeader); responseParentChainBlockData.BlockData.Root.CrossChainExtraData = crossChainExtra; if (needOtherExtraData) { // only pack extra information after side chain creation // but the problem of communication data size still exists responseParentChainBlockData.BlockData.ExtraData.Add(_crossChainExtraDataExtractor.ExtractCommonExtraDataForExchange(blockHeader)); } return(responseParentChainBlockData); }