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