diff --git a/cmd/kaspactl/config.go b/cmd/kaspactl/config.go index 7053d4573f..c37f8874b6 100644 --- a/cmd/kaspactl/config.go +++ b/cmd/kaspactl/config.go @@ -12,11 +12,12 @@ var ( ) type configFlags struct { - RPCServer string `short:"s" long:"rpcserver" description:"RPC server to connect to"` - Timeout uint64 `short:"t" long:"timeout" description:"Timeout for the request (in seconds)"` - RequestJSON string `short:"j" long:"json" description:"The request in JSON format"` - ListCommands bool `short:"l" long:"list-commands" description:"List all commands and exit"` - CommandAndParameters []string + RPCServer string `short:"s" long:"rpcserver" description:"RPC server to connect to"` + Timeout uint64 `short:"t" long:"timeout" description:"Timeout for the request (in seconds)"` + RequestJSON string `short:"j" long:"json" description:"The request in JSON format"` + ListCommands bool `short:"l" long:"list-commands" description:"List all commands and exit"` + AllowConnectionToDifferentVersions bool `short:"a" long:"allow-connection-to-different-versions" description:"Allow connections to versions different than kaspactl's version'"` + CommandAndParameters []string config.NetworkFlags } diff --git a/cmd/kaspactl/main.go b/cmd/kaspactl/main.go index c69db51bca..df01b794da 100644 --- a/cmd/kaspactl/main.go +++ b/cmd/kaspactl/main.go @@ -34,16 +34,18 @@ func main() { } defer client.Disconnect() - kaspadMessage, err := client.Post(&protowire.KaspadMessage{Payload: &protowire.KaspadMessage_GetInfoRequest{GetInfoRequest: &protowire.GetInfoRequestMessage{}}}) - if err != nil { - printErrorAndExit(fmt.Sprintf("Cannot post GetInfo message: %s", err)) - } - - localVersion := version.Version() - remoteVersion := kaspadMessage.GetGetInfoResponse().ServerVersion - - if localVersion != remoteVersion { - printErrorAndExit(fmt.Sprintf("Server version mismatch, expect: %s, got: %s", localVersion, remoteVersion)) + if !cfg.AllowConnectionToDifferentVersions { + kaspadMessage, err := client.Post(&protowire.KaspadMessage{Payload: &protowire.KaspadMessage_GetInfoRequest{GetInfoRequest: &protowire.GetInfoRequestMessage{}}}) + if err != nil { + printErrorAndExit(fmt.Sprintf("Cannot post GetInfo message: %s", err)) + } + + localVersion := version.Version() + remoteVersion := kaspadMessage.GetGetInfoResponse().ServerVersion + + if localVersion != remoteVersion { + printErrorAndExit(fmt.Sprintf("Server version mismatch, expect: %s, got: %s", localVersion, remoteVersion)) + } } responseChan := make(chan string) diff --git a/domain/consensus/consensus.go b/domain/consensus/consensus.go index 1edf2bc769..79f01d0ed3 100644 --- a/domain/consensus/consensus.go +++ b/domain/consensus/consensus.go @@ -190,7 +190,12 @@ func (s *consensus) ValidateTransactionAndPopulateWithConsensusData(transaction return err } - err = s.transactionValidator.ValidateTransactionInContextIgnoringUTXO(stagingArea, transaction, model.VirtualBlockHash) + virtualPastMedianTime, err := s.pastMedianTimeManager.PastMedianTime(stagingArea, model.VirtualBlockHash) + if err != nil { + return err + } + + err = s.transactionValidator.ValidateTransactionInContextIgnoringUTXO(stagingArea, transaction, model.VirtualBlockHash, virtualPastMedianTime) if err != nil { return err } diff --git a/domain/consensus/model/interface_processes_transactionvalidator.go b/domain/consensus/model/interface_processes_transactionvalidator.go index 679bf157ed..a7c8d9adda 100644 --- a/domain/consensus/model/interface_processes_transactionvalidator.go +++ b/domain/consensus/model/interface_processes_transactionvalidator.go @@ -9,7 +9,7 @@ import ( type TransactionValidator interface { ValidateTransactionInIsolation(transaction *externalapi.DomainTransaction) error ValidateTransactionInContextIgnoringUTXO(stagingArea *StagingArea, tx *externalapi.DomainTransaction, - povBlockHash *externalapi.DomainHash) error + povBlockHash *externalapi.DomainHash, povBlockPastMedianTime int64) error ValidateTransactionInContextAndPopulateFee(stagingArea *StagingArea, tx *externalapi.DomainTransaction, povBlockHash *externalapi.DomainHash) error PopulateMass(transaction *externalapi.DomainTransaction) diff --git a/domain/consensus/processes/blockbuilder/block_builder.go b/domain/consensus/processes/blockbuilder/block_builder.go index 041454abb0..fa31b1dfda 100644 --- a/domain/consensus/processes/blockbuilder/block_builder.go +++ b/domain/consensus/processes/blockbuilder/block_builder.go @@ -166,7 +166,12 @@ func (bb *blockBuilder) validateTransaction( return err } - err = bb.transactionValidator.ValidateTransactionInContextIgnoringUTXO(stagingArea, transaction, model.VirtualBlockHash) + virtualPastMedianTime, err := bb.pastMedianTimeManager.PastMedianTime(stagingArea, model.VirtualBlockHash) + if err != nil { + return err + } + + err = bb.transactionValidator.ValidateTransactionInContextIgnoringUTXO(stagingArea, transaction, model.VirtualBlockHash, virtualPastMedianTime) if err != nil { return err } diff --git a/domain/consensus/processes/blockvalidator/block_body_in_context.go b/domain/consensus/processes/blockvalidator/block_body_in_context.go index a652c8d870..f032fd96fd 100644 --- a/domain/consensus/processes/blockvalidator/block_body_in_context.go +++ b/domain/consensus/processes/blockvalidator/block_body_in_context.go @@ -136,8 +136,12 @@ func (v *blockValidator) checkBlockTransactions( } // Ensure all transactions in the block are finalized. + pastMedianTime, err := v.pastMedianTimeManager.PastMedianTime(stagingArea, blockHash) + if err != nil { + return err + } for _, tx := range block.Transactions { - if err = v.transactionValidator.ValidateTransactionInContextIgnoringUTXO(stagingArea, tx, blockHash); err != nil { + if err = v.transactionValidator.ValidateTransactionInContextIgnoringUTXO(stagingArea, tx, blockHash, pastMedianTime); err != nil { return err } } diff --git a/domain/consensus/processes/transactionvalidator/transaction_in_context.go b/domain/consensus/processes/transactionvalidator/transaction_in_context.go index ba9ee2b6db..6b4df117aa 100644 --- a/domain/consensus/processes/transactionvalidator/transaction_in_context.go +++ b/domain/consensus/processes/transactionvalidator/transaction_in_context.go @@ -48,16 +48,12 @@ func (v *transactionValidator) IsFinalizedTransaction(tx *externalapi.DomainTran // ValidateTransactionInContextIgnoringUTXO validates the transaction with consensus context but ignoring UTXO func (v *transactionValidator) ValidateTransactionInContextIgnoringUTXO(stagingArea *model.StagingArea, tx *externalapi.DomainTransaction, - povBlockHash *externalapi.DomainHash) error { + povBlockHash *externalapi.DomainHash, povBlockPastMedianTime int64) error { povBlockDAAScore, err := v.daaBlocksStore.DAAScore(v.databaseContext, stagingArea, povBlockHash) if err != nil { return err } - povBlockPastMedianTime, err := v.pastMedianTimeManager.PastMedianTime(stagingArea, povBlockHash) - if err != nil { - return err - } if isFinalized := v.IsFinalizedTransaction(tx, povBlockDAAScore, povBlockPastMedianTime); !isFinalized { return errors.Wrapf(ruleerrors.ErrUnfinalizedTx, "unfinalized transaction %v", tx) }