Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }