public async Task CrossChain_Verification()
        {
            int  parentChainId = 123;
            long lockedToken   = 10;
            var  sideChainId   = await InitAndCreateSideChain(parentChainId, lockedToken);

            var txId             = Hash.FromString("sideChainBlockHash");
            var binaryMerkleTree = new BinaryMerkleTree();
            var fakeHash1        = Hash.FromString("fake1");
            var fakeHash2        = Hash.FromString("fake2");

            var rawBytes = txId.DumpByteArray().Concat(EncodingHelper.GetBytesFromUtf8String(TransactionResultStatus.Mined.ToString()))
                           .ToArray();
            var hash = Hash.FromRawBytes(rawBytes);

            binaryMerkleTree.AddNodes(new[] { hash, fakeHash1, fakeHash2 });
            var  merkleTreeRoot    = binaryMerkleTree.ComputeRootHash();
            var  merklePath        = binaryMerkleTree.GenerateMerklePath(0);
            var  parentChainHeight = 1;
            Hash fakeTransactionStatusMerkleRoot = Hash.FromString("TransactionStatusMerkleRoot");
            var  parentChainBlockData            = new ParentChainBlockData
            {
                Root = new ParentChainBlockRootInfo
                {
                    ParentChainHeight   = parentChainHeight,
                    ParentChainId       = parentChainId,
                    CrossChainExtraData = new CrossChainExtraData
                    {
                        SideChainTransactionsRoot = merkleTreeRoot
                    },
                    TransactionStatusMerkleRoot = fakeTransactionStatusMerkleRoot
                }
            };
            var crossChainBlockData = new CrossChainBlockData
            {
                ParentChainBlockData = { parentChainBlockData }
            };

            var indexingTx = await GenerateTransactionAsync(CrossChainContractAddress,
                                                            CrossChainConstants.CrossChainIndexingMethodName, null, crossChainBlockData);

            var block = await MineAsync(new List <Transaction> {
                indexingTx
            });

            var verificationInput = new VerifyTransactionInput()
            {
                TransactionId     = txId,
                ParentChainHeight = parentChainHeight
            };

            verificationInput.Path.AddRange(merklePath.Path);
            var txRes = await ExecuteContractWithMiningAsync(
                CrossChainContractAddress,
                nameof(CrossChainContract.VerifyTransaction), verificationInput);

            var verified = BoolValue.Parser.ParseFrom(txRes.ReturnValue).Value;

            Assert.True(verified);
        }
Пример #2
0
        public override Empty CrossChainReceiveToken(CrossChainReceiveTokenInput input)
        {
            var transferTransaction     = Transaction.Parser.ParseFrom(input.TransferTransactionBytes);
            var transferTransactionHash = transferTransaction.GetHash();

            Context.LogDebug(() => $"transferTransactionHash == {transferTransactionHash}");
            Assert(State.VerifiedCrossChainTransferTransaction[transferTransactionHash] == null,
                   "Token already claimed.");

            var crossChainTransferInput =
                CrossChainTransferInput.Parser.ParseFrom(transferTransaction.Params.ToByteArray());
            var symbol           = crossChainTransferInput.TokenInfo.Symbol;
            var amount           = crossChainTransferInput.Amount;
            var receivingAddress = crossChainTransferInput.To;
            var targetChainId    = crossChainTransferInput.ToChainId;

            Context.LogDebug(() =>
                             $"symbol == {symbol}, amount == {amount}, receivingAddress == {receivingAddress}, targetChainId == {targetChainId}");

            Assert(receivingAddress.Equals(Context.Sender) && targetChainId == Context.ChainId,
                   "Unable to receive cross chain token.");
            if (State.CrossChainContractReferenceState.Value == null)
            {
                State.CrossChainContractReferenceState.Value =
                    State.BasicContractZero.GetContractAddressByName.Call(State.CrossChainContractSystemName.Value);
            }
            var verificationInput = new VerifyTransactionInput
            {
                TransactionId     = transferTransactionHash,
                ParentChainHeight = input.ParentChainHeight,
                VerifiedChainId   = input.FromChainId
            };

            verificationInput.Path.AddRange(input.MerklePath);
            if (State.CrossChainContractReferenceState.Value == null)
            {
                State.CrossChainContractReferenceState.Value =
                    State.BasicContractZero.GetContractAddressByName.Call(State.CrossChainContractSystemName.Value);
            }
            var verificationResult =
                State.CrossChainContractReferenceState.VerifyTransaction.Call(verificationInput);

            Assert(verificationResult.Value, "Verification failed.");

            // Create token if it doesnt exist.
            var existing = State.TokenInfos[symbol];

            if (existing == null)
            {
                RegisterTokenInfo(crossChainTransferInput.TokenInfo);
            }

            State.VerifiedCrossChainTransferTransaction[transferTransactionHash] = input;
            var balanceOfReceiver = State.Balances[receivingAddress][symbol];

            State.Balances[receivingAddress][symbol] = balanceOfReceiver.Add(amount);
            return(new Empty());
        }
Пример #3
0
        private void CrossChainVerify(Hash transactionId, long parentChainHeight, int chainId, MerklePath merklePath)
        {
            var verificationInput = new VerifyTransactionInput
            {
                TransactionId     = transactionId,
                ParentChainHeight = parentChainHeight,
                VerifiedChainId   = chainId,
                Path = merklePath
            };
            var verificationResult = GetValidCrossChainContractReferenceState().VerifyTransaction.Call(verificationInput);

            Assert(verificationResult.Value, "Cross chain verification failed.");
        }
Пример #4
0
        /// <summary>
        /// Cross chain txn verification.
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public override BoolValue VerifyTransaction(VerifyTransactionInput input)
        {
            var parentChainHeight = input.ParentChainHeight;
            var merkleTreeRoot    = GetMerkleTreeRoot(input.VerifiedChainId, parentChainHeight);

            Assert(merkleTreeRoot != null,
                   $"Parent chain block at height {parentChainHeight} is not recorded.");
            var rootCalculated = ComputeRootWithTransactionStatusMerklePath(input.TransactionId, input.Path);

            return(new BoolValue {
                Value = merkleTreeRoot == rootCalculated
            });
        }
Пример #5
0
        /// <summary>
        /// Cross chain txn verification.
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public override BoolValue VerifyTransaction(VerifyTransactionInput input)
        {
            var parentChainHeight = input.ParentChainHeight;
            var merkleTreeRoot    = GetMerkleTreeRoot(input.VerifiedChainId, parentChainHeight);

            Assert(merkleTreeRoot != null,
                   $"Parent chain block at height {parentChainHeight} is not recorded.");
            var rootCalculated = ComputeRootWithTransactionStatusMerklePath(input.TransactionId, input.Path);

            //Api.Assert((parentRoot??Hash.Empty).Equals(rootCalculated), "Transaction verification Failed");
            return(new BoolValue {
                Value = merkleTreeRoot.Equals(rootCalculated)
            });
        }
Пример #6
0
        public async Task CrossChain_Verification()
        {
            int parentChainId = 123;
            long lockedToken = 10;
            long parentChainHeightOfCreation = 10;
            var sideChainId =
                await InitAndCreateSideChainAsync(parentChainHeightOfCreation, parentChainId, lockedToken);
            var txId = Hash.FromString("sideChainBlockHash");
            
            var fakeHash1 = Hash.FromString("fake1");
            var fakeHash2 = Hash.FromString("fake2");

            var rawBytes = txId.ToByteArray()
                .Concat(EncodingHelper.GetBytesFromUtf8String(TransactionResultStatus.Mined.ToString()))
                .ToArray();
            var hash = Hash.FromRawBytes(rawBytes);

            var binaryMerkleTree = BinaryMerkleTree.FromLeafNodes(new[] {hash, fakeHash1, fakeHash2});
            var merkleTreeRoot = binaryMerkleTree.Root;
            var merklePath = binaryMerkleTree.GenerateMerklePath(0);
            Hash fakeTransactionStatusMerkleRoot = Hash.FromString("TransactionStatusMerkleRoot");
            var parentChainBlockData = CreateParentChainBlockData(parentChainHeightOfCreation, parentChainId,
                fakeTransactionStatusMerkleRoot);
            parentChainBlockData.CrossChainExtraData = new CrossChainExtraData
            {
                TransactionStatusMerkleTreeRoot = merkleTreeRoot
            };
            var crossChainBlockData = new CrossChainBlockData
            {
                ParentChainBlockData = {parentChainBlockData}
            };

            await BlockMiningService.MineBlockAsync(new List<Transaction>
            {
                CrossChainContractStub.RecordCrossChainData.GetTransaction(crossChainBlockData)
            });

            var verificationInput = new VerifyTransactionInput()
            {
                TransactionId = txId,
                ParentChainHeight = parentChainHeightOfCreation,
                Path = merklePath
            };

            var txRes = await CrossChainContractStub.VerifyTransaction.SendAsync(verificationInput);
            var verified = BoolValue.Parser.ParseFrom(txRes.TransactionResult.ReturnValue).Value;
            Assert.True(verified);
        }
        private void CrossChainVerify(Hash transactionId, long parentChainHeight, int chainId, MerklePath merklePath)
        {
            var verificationInput = new VerifyTransactionInput
            {
                TransactionId     = transactionId,
                ParentChainHeight = parentChainHeight,
                VerifiedChainId   = chainId,
                Path = merklePath
            };
            var address = Context.GetContractAddressByName(SmartContractConstants.CrossChainContractSystemName);

            var verificationResult = Context.Call <BoolValue>(address,
                                                              nameof(ACS7Container.ACS7ReferenceState.VerifyTransaction), verificationInput);

            Assert(verificationResult.Value, "Cross chain verification failed.");
        }