Пример #1
0
        public async Task UpdateContract_Attach_After_ReadOnly_Transaction()
        {
            var chain = await _blockchainService.GetChainAsync();

            var blockHeight = chain.BestChainHeight;
            var blockHash   = chain.BestChainHash;

            var input = new Acs0.ContractUpdateInput
            {
                Address = BasicFunctionContractAddress,
                Code    = ByteString.CopyFrom(Codes.Single(kv => kv.Key.EndsWith("BasicUpdate")).Value)
            }.ToByteString();
            var transaction = CreateTransaction(DefaultSender, ContractZeroAddress,
                                                nameof(BasicContractZeroStub.UpdateSmartContract), input, blockHeight, blockHash);
            var block = await ExecuteAsync(transaction, blockHeight, blockHash);

            var transactionResult =
                await _transactionResultManager.GetTransactionResultAsync(transaction.GetHash(),
                                                                          block.Header.GetPreMiningHash());

            var basicFunctionContractStub = GetTestBasicFunctionContractStub(DefaultSenderKeyPair);
            await basicFunctionContractStub.QueryWinMoney.CallAsync(new Empty());

            await _blockAttachService.AttachBlockAsync(block);

            var basic11ContractStub = GetTestBasicUpdateContractStub(DefaultSenderKeyPair);
//            //execute new action method
            var transactionResult1 = (await basic11ContractStub.UpdateStopBet.SendAsync(
                                          new Empty())).TransactionResult;

            transactionResult1.Status.ShouldBe(TransactionResultStatus.Mined);

            //call new view method
            var result = (await basic11ContractStub.QueryBetStatus.CallAsync(
                              new Empty())).BoolValue;

            result.ShouldBeTrue();

            await _blockchainService.SetIrreversibleBlockAsync(chain, block.Height, block.GetHash());
        }
Пример #2
0
        public async Task UpdateContract_With_Two_Different_Contract_Code()
        {
            var blockHeader = await _blockchainService.GetBestChainLastBlockHeaderAsync();

            var startBlockHeight = blockHeader.Height;
            var startBlockHash   = blockHeader.GetHash();

            var basic11ContractStub = GetTestBasicUpdateContractStub(DefaultSenderKeyPair);
            //First branch
            {
                var transactionResult = (await BasicContractZeroStub.UpdateSmartContract.SendAsync(
                                             new Acs0.ContractUpdateInput
                {
                    Address = BasicFunctionContractAddress,
                    Code = ByteString.CopyFrom(Codes.Single(kv => kv.Key.EndsWith("BasicUpdate")).Value)
                }
                                             )).TransactionResult;
                transactionResult.Status.ShouldBe(TransactionResultStatus.Mined);

                transactionResult = (await basic11ContractStub.UpdateStopBet.SendAsync(
                                         new Empty())).TransactionResult;
                transactionResult.Status.ShouldBe(TransactionResultStatus.Mined);
            }

            //Second branch
            {
                var input = new Acs0.ContractUpdateInput
                {
                    Address = BasicFunctionContractAddress,
                    Code    = ByteString.CopyFrom(Codes.Single(kv => kv.Key.EndsWith("BasicFunctionWithParallel")).Value)
                }.ToByteString();
                var transaction = CreateTransaction(DefaultSender, ContractZeroAddress,
                                                    nameof(BasicContractZeroStub.UpdateSmartContract), input, startBlockHeight, startBlockHash);
                var branchTwoBlock = await ExecuteAsync(transaction, startBlockHeight, startBlockHash);

                await _blockAttachService.AttachBlockAsync(branchTwoBlock);

                var basicFunctionContractStub = GetTestBasicFunctionContractStub(DefaultSenderKeyPair);
                await basicFunctionContractStub.QueryWinMoney.CallAsync(new Empty());

                _smartContractExecutiveService.ClearContractInfoCache(100);

                var queryTwoUserWinMoneyInput = new QueryTwoUserWinMoneyInput
                {
                    First  = SampleAddress.AddressList[0],
                    Second = SampleAddress.AddressList[1]
                }.ToByteString();
                var queryTwoUserWinMoneyTransaction = CreateTransaction(DefaultSender, BasicFunctionContractAddress,
                                                                        "QueryTwoUserWinMoney", queryTwoUserWinMoneyInput, branchTwoBlock.Height, branchTwoBlock.GetHash());
                branchTwoBlock = await ExecuteAsync(queryTwoUserWinMoneyTransaction, branchTwoBlock.Height,
                                                    branchTwoBlock.GetHash());

                await _blockAttachService.AttachBlockAsync(branchTwoBlock);

                var queryTwoUserWinMoneyTransactionResult =
                    await _transactionResultManager.GetTransactionResultAsync(queryTwoUserWinMoneyTransaction.GetHash(),
                                                                              branchTwoBlock.Header.GetPreMiningHash());

                queryTwoUserWinMoneyTransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                queryTwoUserWinMoneyTransactionResult.Error.ShouldContain("Failed to find handler for QueryTwoUserWinMoney");

                await _smartContractExecutiveService.InitContractInfoCacheAsync();

                queryTwoUserWinMoneyInput = new QueryTwoUserWinMoneyInput
                {
                    First  = SampleAddress.AddressList[0],
                    Second = SampleAddress.AddressList[1]
                }.ToByteString();
                queryTwoUserWinMoneyTransaction = CreateTransaction(DefaultSender, BasicFunctionContractAddress,
                                                                    "QueryTwoUserWinMoney", queryTwoUserWinMoneyInput, branchTwoBlock.Height, branchTwoBlock.GetHash());
                branchTwoBlock = await ExecuteAsync(queryTwoUserWinMoneyTransaction, branchTwoBlock.Height,
                                                    branchTwoBlock.GetHash());

                await _blockAttachService.AttachBlockAsync(branchTwoBlock);

                queryTwoUserWinMoneyTransactionResult =
                    await _transactionResultManager.GetTransactionResultAsync(queryTwoUserWinMoneyTransaction
                                                                              .GetHash(), branchTwoBlock.Header.GetPreMiningHash());

                queryTwoUserWinMoneyTransactionResult.Status.ShouldBe(TransactionResultStatus.Mined);
            }

            //Third branch
            {
                var updateStopBetTransaction = CreateTransaction(DefaultSender, BasicFunctionContractAddress,
                                                                 nameof(basic11ContractStub.UpdateStopBet), new Empty().ToByteString(), startBlockHeight, startBlockHash);
                var branchThreeBlock = await ExecuteAsync(updateStopBetTransaction, startBlockHeight, startBlockHash);

                await _blockAttachService.AttachBlockAsync(branchThreeBlock);

                var updateStopBetTransactionResult =
                    await _transactionResultManager.GetTransactionResultAsync(updateStopBetTransaction.GetHash(),
                                                                              branchThreeBlock.Header.GetPreMiningHash());

                updateStopBetTransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                updateStopBetTransactionResult.Error.ShouldContain("Failed to find handler for UpdateStopBet.");

                var queryTwoUserWinMoneyInput = new QueryTwoUserWinMoneyInput
                {
                    First  = SampleAddress.AddressList[0],
                    Second = SampleAddress.AddressList[1]
                }.ToByteString();
                var queryTwoUserWinMoneyTransaction = CreateTransaction(DefaultSender, BasicFunctionContractAddress,
                                                                        "QueryTwoUserWinMoney", queryTwoUserWinMoneyInput, branchThreeBlock.Height, branchThreeBlock.GetHash());
                branchThreeBlock = await ExecuteAsync(queryTwoUserWinMoneyTransaction, branchThreeBlock.Height,
                                                      branchThreeBlock.GetHash());

                await _blockAttachService.AttachBlockAsync(branchThreeBlock);

                var queryTwoUserWinMoneyTransactionResult =
                    await _transactionResultManager.GetTransactionResultAsync(queryTwoUserWinMoneyTransaction.GetHash(),
                                                                              branchThreeBlock.Header.GetPreMiningHash());

                queryTwoUserWinMoneyTransactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
                queryTwoUserWinMoneyTransactionResult.Error.ShouldContain("Failed to find handler for QueryTwoUserWinMoney.");
            }
        }
Пример #3
0
        public async Task UpdateContract_With_Two_Branch()
        {
            var blockHeader = await _blockchainService.GetBestChainLastBlockHeaderAsync();

            var startBlockHeight = blockHeader.Height;
            var startBlockHash   = blockHeader.GetHash();

            var transactionResult = (await BasicContractZeroStub.UpdateSmartContract.SendAsync(
                                         new Acs0.ContractUpdateInput
            {
                Address = BasicFunctionContractAddress,
                Code = ByteString.CopyFrom(Codes.Single(kv => kv.Key.EndsWith("BasicUpdate")).Value)
            }
                                         )).TransactionResult;

            transactionResult.Status.ShouldBe(TransactionResultStatus.Mined);

            var basic11ContractStub = GetTestBasicUpdateContractStub(DefaultSenderKeyPair);
//            //execute new action method
            var transactionResult1 = (await basic11ContractStub.UpdateStopBet.SendAsync(
                                          new Empty())).TransactionResult;

            transactionResult1.Status.ShouldBe(TransactionResultStatus.Mined);

            var transaction = CreateTransaction(DefaultSender, BasicFunctionContractAddress,
                                                nameof(TestBasicFunctionContractStub.QueryWinMoney), new Empty().ToByteString(), startBlockHeight, startBlockHash);
            var block = await ExecuteAsync(transaction, startBlockHeight, startBlockHash);

            await _blockAttachService.AttachBlockAsync(block);

            transaction = CreateTransaction(DefaultSender, BasicFunctionContractAddress,
                                            nameof(TestBasicFunctionContractStub.QueryWinMoney), new Empty().ToByteString(), block.Height,
                                            block.GetHash());
            block = await ExecuteAsync(transaction, block.Height, block.GetHash());

            await _blockAttachService.AttachBlockAsync(block);

            var input             = new Empty().ToByteString();
            var failedTransaction = CreateTransaction(DefaultSender, BasicFunctionContractAddress,
                                                      nameof(basic11ContractStub.UpdateStopBet), input, block.Height, block.GetHash());

            block = await ExecuteAsync(failedTransaction, block.Height, block.GetHash());

            await _blockAttachService.AttachBlockAsync(block);

            transactionResult =
                await _transactionResultManager.GetTransactionResultAsync(failedTransaction.GetHash(),
                                                                          block.Header.GetPreMiningHash());

            transactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
            transactionResult.Error.ShouldContain("Failed to find handler for UpdateStopBet.");

            input = new Acs0.ContractUpdateInput
            {
                Address = BasicFunctionContractAddress,
                Code    = ByteString.CopyFrom(Codes.Single(kv => kv.Key.EndsWith("BasicFunction")).Value)
            }.ToByteString();
            var updateTransaction = CreateTransaction(DefaultSender, ContractZeroAddress,
                                                      nameof(BasicContractZeroStub.UpdateSmartContract), input, block.Height, block.GetHash());
            var updateBlock = await ExecuteAsync(updateTransaction, block.Height, block.GetHash());

            await _blockAttachService.AttachBlockAsync(updateBlock);

//
            transactionResult =
                await _transactionResultManager.GetTransactionResultAsync(updateTransaction.GetHash(),
                                                                          updateBlock.Header.GetPreMiningHash());

            transactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
            transactionResult.Error.Contains("Code is not changed").ShouldBeTrue();

            input = new Acs0.ContractUpdateInput
            {
                Address = BasicFunctionContractAddress,
                Code    = ByteString.CopyFrom(Codes.Single(kv => kv.Key.EndsWith("BasicUpdate")).Value)
            }.ToByteString();
            updateTransaction = CreateTransaction(DefaultSender, ContractZeroAddress,
                                                  nameof(BasicContractZeroStub.UpdateSmartContract), input, updateBlock.Height, updateBlock.GetHash());
            updateBlock = await ExecuteAsync(updateTransaction, updateBlock.Height, updateBlock.GetHash());

            await _blockAttachService.AttachBlockAsync(updateBlock);

            transactionResult =
                await _transactionResultManager.GetTransactionResultAsync(updateTransaction.GetHash(),
                                                                          updateBlock.Header.GetPreMiningHash());

            transactionResult.Status.ShouldBe(TransactionResultStatus.Mined);

            basic11ContractStub = GetTestBasicUpdateContractStub(DefaultSenderKeyPair);
            //execute new action method
            transactionResult = (await basic11ContractStub.UpdateStopBet.SendAsync(
                                     new Empty())).TransactionResult;
            transactionResult.Status.ShouldBe(TransactionResultStatus.Mined);

            //call new view method
            var result = (await basic11ContractStub.QueryBetStatus.CallAsync(
                              new Empty())).BoolValue;

            result.ShouldBeTrue();
        }