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); }
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()); }
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."); }
/// <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 }); }
/// <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) }); }
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."); }