From 54301aedd81f4aaab714a25a584138a5f593e254 Mon Sep 17 00:00:00 2001 From: KonradStaniec Date: Wed, 21 Aug 2024 13:07:42 +0200 Subject: [PATCH] Impove check transaction command --- cmd/stakercli/transaction/transactions.go | 49 +++++++++++++------ .../transaction/transactions_test.go | 16 +++--- 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/cmd/stakercli/transaction/transactions.go b/cmd/stakercli/transaction/transactions.go index c4b194b..a338b14 100644 --- a/cmd/stakercli/transaction/transactions.go +++ b/cmd/stakercli/transaction/transactions.go @@ -76,14 +76,17 @@ type StakingTxData struct { FinalityProviderPublicKeyHex string `json:"finality_provider_public_key_hex"` StakingAmount int64 `json:"staking_amount"` StakingTimeBlocks int64 `json:"staking_time_blocks"` - // ParamsVersion is the version of the global parameters aginst which is valid - ParamsVersion int64 `json:"params_version"` +} + +type ValidityInfo struct { + ParametersVersion uint64 `json:"parameters_version"` + IsValid bool `json:"is_valid"` + ErrMsg string `json:"err_msg,omitempty"` + StakingData *StakingTxData `json:"staking_data,omitempty"` } type CheckPhase1StakingTxResponse struct { - IsValid bool `json:"is_valid"` - // StakingData will only be populated if the transaction is valid - StakingData *StakingTxData `json:"staking_data"` + ValidityInfo []*ValidityInfo `json:"validity_info"` } func validateTxAgainstParams( @@ -91,6 +94,8 @@ func validateTxAgainstParams( globalParams *parser.ParsedGlobalParams, net *chaincfg.Params) *CheckPhase1StakingTxResponse { + var info []*ValidityInfo + for i := len(globalParams.Versions) - 1; i >= 0; i-- { params := globalParams.Versions[i] @@ -102,32 +107,48 @@ func validateTxAgainstParams( net, ) if err != nil { + info = append(info, &ValidityInfo{ + ParametersVersion: params.Version, + IsValid: false, + ErrMsg: fmt.Sprintf("error parsing tx: %s", err.Error()), + }) continue } if parsed.OpReturnData.StakingTime < params.MinStakingTime || parsed.OpReturnData.StakingTime > params.MaxStakingTime { + info = append(info, &ValidityInfo{ + ParametersVersion: params.Version, + IsValid: false, + ErrMsg: fmt.Sprintf("staking time %d is out of bounds", parsed.OpReturnData.StakingTime), + }) continue } if btcutil.Amount(parsed.StakingOutput.Value) < params.MinStakingAmount || btcutil.Amount(parsed.StakingOutput.Value) > params.MaxStakingAmount { + info = append(info, &ValidityInfo{ + ParametersVersion: params.Version, + IsValid: false, + ErrMsg: fmt.Sprintf("staking amount %d is out of bounds", parsed.StakingOutput.Value), + }) continue } - // At this point we know staking transaction is valid against this version of global params - return &CheckPhase1StakingTxResponse{ - IsValid: true, + info = append(info, &ValidityInfo{ + ParametersVersion: params.Version, + IsValid: true, StakingData: &StakingTxData{ - StakerPublicKeyHex: hex.EncodeToString(parsed.OpReturnData.StakerPublicKey.Marshall()), - FinalityProviderPublicKeyHex: hex.EncodeToString(parsed.OpReturnData.FinalityProviderPublicKey.Marshall()), + StakerPublicKeyHex: hex.EncodeToString(schnorr.SerializePubKey(parsed.OpReturnData.StakerPublicKey.PubKey)), + FinalityProviderPublicKeyHex: hex.EncodeToString(schnorr.SerializePubKey(parsed.OpReturnData.FinalityProviderPublicKey.PubKey)), StakingAmount: parsed.StakingOutput.Value, StakingTimeBlocks: int64(parsed.OpReturnData.StakingTime), - ParamsVersion: int64(params.Version), - }, - } + }}) + + // We found latest valid version, no need to check further + break } return &CheckPhase1StakingTxResponse{ - IsValid: false, + ValidityInfo: info, } } diff --git a/cmd/stakercli/transaction/transactions_test.go b/cmd/stakercli/transaction/transactions_test.go index 954c88b..fe9b265 100644 --- a/cmd/stakercli/transaction/transactions_test.go +++ b/cmd/stakercli/transaction/transactions_test.go @@ -434,13 +434,15 @@ func FuzzCheckPhase1Tx(f *testing.F) { r, t, app, checkArgs, ) require.NotNil(t, resCheck) - require.True(t, resCheck.IsValid) - require.NotNil(t, resCheck.StakingData) - require.Equal(t, globalParams.Versions[0].Version, uint64(resCheck.StakingData.ParamsVersion)) - require.Equal(t, stakerParams.StakingAmount, btcutil.Amount(resCheck.StakingData.StakingAmount)) - require.Equal(t, stakerParams.StakingTime, uint16(resCheck.StakingData.StakingTimeBlocks)) - require.Equal(t, keyToSchnorrHex(stakerParams.StakerPk), resCheck.StakingData.StakerPublicKeyHex) - require.Equal(t, keyToSchnorrHex(stakerParams.FinalityProviderPk), resCheck.StakingData.FinalityProviderPublicKeyHex) + require.Len(t, resCheck.ValidityInfo, 1) + + require.True(t, resCheck.ValidityInfo[0].IsValid) + require.NotNil(t, resCheck.ValidityInfo[0].StakingData) + require.Equal(t, globalParams.Versions[0].Version, resCheck.ValidityInfo[0].ParametersVersion) + require.Equal(t, stakerParams.StakingAmount, btcutil.Amount(resCheck.ValidityInfo[0].StakingData.StakingAmount)) + require.Equal(t, stakerParams.StakingTime, uint16(resCheck.ValidityInfo[0].StakingData.StakingTimeBlocks)) + require.Equal(t, keyToSchnorrHex(stakerParams.StakerPk), resCheck.ValidityInfo[0].StakingData.StakerPublicKeyHex) + require.Equal(t, keyToSchnorrHex(stakerParams.FinalityProviderPk), resCheck.ValidityInfo[0].StakingData.FinalityProviderPublicKeyHex) }) }