From bf369ac3704c9271adb3a75b5f108b5566a55630 Mon Sep 17 00:00:00 2001 From: trestin Date: Tue, 3 Sep 2024 16:41:19 +0800 Subject: [PATCH] fix some test error --- x/avs/keeper/bls_test.go | 20 +++---- x/avs/keeper/impl_epoch_hook.go | 6 ++ x/avs/keeper/miscellaneous_test.go | 60 ++++++++++++------- .../keeper/multi_operator_submit_task_test.go | 4 +- x/avs/keeper/submit_task_test.go | 4 +- x/avs/keeper/task.go | 23 +++---- x/avs/types/types.go | 31 +++++++++- 7 files changed, 98 insertions(+), 50 deletions(-) diff --git a/x/avs/keeper/bls_test.go b/x/avs/keeper/bls_test.go index 7cc7f1436..47eddef24 100644 --- a/x/avs/keeper/bls_test.go +++ b/x/avs/keeper/bls_test.go @@ -28,27 +28,27 @@ func (suite *AVSTestSuite) TestOperator_pubkey() { suite.NoError(err) suite.Equal(publicKey.Marshal(), pub.PubKey) - taskRes := types.TaskResponse{TaskID: 1, NumberSum: big.NewInt(100)} + taskRes := types.TaskResponse{TaskID: 17, NumberSum: big.NewInt(1000)} + + hashAbi, _ := types.GetTaskResponseDigestEncodeByAbi(taskRes) + + msgBytes := hashAbi[:] + fmt.Println("ResHash:", hex.EncodeToString(msgBytes)) - msg, _ := types.GetTaskResponseDigest(taskRes) - msgBytes := msg[:] sig := privateKey.Sign(msgBytes) fmt.Println("sig:", hex.EncodeToString(sig.Marshal())) - jsonData, err := types.MarshalTaskResponse(taskRes) - hash := crypto.Keccak256Hash(jsonData) - fmt.Println("res:", hex.EncodeToString(jsonData)) - fmt.Println("hash:", hash.String()) - sig1, _ := hex.DecodeString("af22f968871395eca62fdb91bc39c2d93569b50678ed73f00c3a6e054512bdc6cb73da7972c9553931aec25bce4973cf15227d2d596492642baaaf2ac1a1a9605b5cf1312fc1e3532aa43a22460e5ce7c081d643dce806f95f26a2df84bdfc66") - fmt.Println(sig1) valid := sig.Verify(publicKey, msgBytes) suite.True(valid) - valid1, _ := blst.VerifySignature(sig.Marshal(), msg, publicKey) + valid1, _ := blst.VerifySignature(sig.Marshal(), hashAbi, publicKey) suite.NoError(err) suite.True(valid1) + jsonData, err := types.MarshalTaskResponse(taskRes) + fmt.Println("jsondata:", hex.EncodeToString(jsonData)) + } func (suite *AVSTestSuite) Test_hash() { diff --git a/x/avs/keeper/impl_epoch_hook.go b/x/avs/keeper/impl_epoch_hook.go index bbfeaa609..7bf7b7118 100644 --- a/x/avs/keeper/impl_epoch_hook.go +++ b/x/avs/keeper/impl_epoch_hook.go @@ -84,6 +84,12 @@ func (wrapper EpochsHooksWrapper) AfterEpochEnd( // Calculate actual threshold taskPowerTotal, err := wrapper.keeper.operatorKeeper.GetAVSUSDValue(ctx, avsAddr) + if err != nil || taskPowerTotal.IsZero() || operatorPowerTotal.IsZero() { + ctx.Logger().Error("Failed to update task result statistics", "task result", taskAddr, "error", err) + // Handle the error gracefully, continue to the next + continue + } + actualThreshold := taskPowerTotal.Quo(operatorPowerTotal).Mul(sdk.NewDec(100)) if err != nil { ctx.Logger().Error("Failed to update task result statistics", "task result", taskAddr, "error", err) diff --git a/x/avs/keeper/miscellaneous_test.go b/x/avs/keeper/miscellaneous_test.go index 2960a8014..a035a8f64 100644 --- a/x/avs/keeper/miscellaneous_test.go +++ b/x/avs/keeper/miscellaneous_test.go @@ -5,43 +5,59 @@ import ( utiltx "github.com/ExocoreNetwork/exocore/testutil/tx" "github.com/ExocoreNetwork/exocore/x/avs/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" "math/big" "testing" ) -var ( - structThing, _ = abi.NewType("tuple", "struct", []abi.ArgumentMarshaling{ - {Name: "field_one", Type: "uint256"}, - {Name: "field_two", Type: "address"}, - }) - - args = abi.Arguments{ - {Type: structThing, Name: "param_one"}, - } -) - func TestReceiptMarshalBinary(t *testing.T) { - record := struct { - FieldOne *big.Int - FieldTwo common.Address - }{ - big.NewInt(2e18), - common.HexToAddress("0x0002"), + task := types.TaskResponse{ + TaskID: 10, + NumberSum: big.NewInt(1000), } - packed, err := args.Pack(&record) + packed, err := types.Args.Pack(&task) if err != nil { fmt.Println("bad bad ", err) return } else { fmt.Println("abi encoded", hexutil.Encode(packed)) } - b, _ := args.Unpack(packed) - fmt.Println("unpacked", b) + + var args = make(map[string]interface{}) + + err = types.Args.UnpackIntoMap(args, packed) + result, _ := types.Args.Unpack(packed) + fmt.Println("unpacked", result[0]) + hash := crypto.Keccak256Hash(packed) + fmt.Println("hash:", hash.String()) + + key := args["TaskResponse"] + fmt.Println("key", key) + for _, elem := range result { + switch v := elem.(type) { + case uint64: + fmt.Println("Found uint64:", v) + case *big.Int: + fmt.Println("Found *big.Int:", v) + case *types.TaskResponse: + fmt.Println("types.TaskResponse type found") + default: + fmt.Println("Unknown type found") + } + } + taskNew, _ := result[0].(*types.TaskResponse) + fmt.Println("hash:", taskNew) + + var taskResponse types.TaskResponse + + if err := types.Args.Copy(&taskResponse, result); err != nil { + fmt.Println("unpacked", result) + } + fmt.Println("taskResponse", taskResponse) + } func Test_difference(t *testing.T) { diff --git a/x/avs/keeper/multi_operator_submit_task_test.go b/x/avs/keeper/multi_operator_submit_task_test.go index 27eb6897a..292b15bf4 100644 --- a/x/avs/keeper/multi_operator_submit_task_test.go +++ b/x/avs/keeper/multi_operator_submit_task_test.go @@ -176,7 +176,7 @@ func (suite *AVSTestSuite) TestSubmitTask_OnlyPhaseOne_Mul() { suite.prepareMul() for index, operatorAddress := range suite.operatorAddresses { taskRes := avstypes.TaskResponse{TaskID: 1, NumberSum: big.NewInt(100)} - msg, _ := avstypes.GetTaskResponseDigest(taskRes) + msg, _ := avstypes.GetTaskResponseDigestEncodeByAbi(taskRes) msgBytes := msg[:] sig := suite.blsKeys[index].Sign(msgBytes) @@ -205,7 +205,7 @@ func (suite *AVSTestSuite) TestSubmitTask_OnlyPhaseTwo_Mul() { hash := crypto.Keccak256Hash(jsonData) // pub, err := suite.App.AVSManagerKeeper.GetOperatorPubKey(suite.Ctx, suite.operatorAddr.String()) suite.NoError(err) - msg, _ := avstypes.GetTaskResponseDigest(taskRes) + msg, _ := avstypes.GetTaskResponseDigestEncodeByAbi(taskRes) msgBytes := msg[:] sig := suite.blsKeys[index].Sign(msgBytes) diff --git a/x/avs/keeper/submit_task_test.go b/x/avs/keeper/submit_task_test.go index a106d4868..5b588cfaa 100644 --- a/x/avs/keeper/submit_task_test.go +++ b/x/avs/keeper/submit_task_test.go @@ -167,7 +167,7 @@ func (suite *AVSTestSuite) TestSubmitTask_OnlyPhaseOne() { // pub, err := suite.App.AVSManagerKeeper.GetOperatorPubKey(suite.Ctx, suite.operatorAddr.String()) suite.NoError(err) - msg, _ := avstypes.GetTaskResponseDigest(taskRes) + msg, _ := avstypes.GetTaskResponseDigestEncodeByAbi(taskRes) msgBytes := msg[:] sig := suite.blsKey.Sign(msgBytes) @@ -197,7 +197,7 @@ func (suite *AVSTestSuite) TestSubmitTask_OnlyPhaseTwo() { // pub, err := suite.App.AVSManagerKeeper.GetOperatorPubKey(suite.Ctx, suite.operatorAddr.String()) suite.NoError(err) - msg, _ := avstypes.GetTaskResponseDigest(taskRes) + msg, _ := avstypes.GetTaskResponseDigestEncodeByAbi(taskRes) msgBytes := msg[:] sig := suite.blsKey.Sign(msgBytes) diff --git a/x/avs/keeper/task.go b/x/avs/keeper/task.go index 273ea6a60..b420beca2 100644 --- a/x/avs/keeper/task.go +++ b/x/avs/keeper/task.go @@ -3,9 +3,9 @@ package keeper import ( "bytes" "fmt" - "strconv" - "github.com/ethereum/go-ethereum/crypto" + "strconv" + "strings" errorsmod "cosmossdk.io/errors" @@ -240,20 +240,21 @@ func (k *Keeper) SetTaskResultInfo( // check hash taskResponseDigest := crypto.Keccak256Hash(info.TaskResponse) - if taskResponseDigest.String() != info.TaskResponseHash { + hashWithoutPrefix := strings.TrimPrefix(taskResponseDigest.String(), "0x") + if hashWithoutPrefix != info.TaskResponseHash { return errorsmod.Wrap( types.ErrHashValue, "SetTaskResultInfo: task response is nil", ) } - // check taskID - resp, err := types.UnmarshalTaskResponse(info.TaskResponse) - if err != nil || info.TaskId != resp.TaskID { - return errorsmod.Wrap( - types.ErrParamError, - fmt.Sprintf("SetTaskResultInfo: invalid param value:%s", info.Stage), - ) - } + // TODO :check taskID + //resp, err := types.UnmarshalTaskResponse(info.TaskResponse) + //if err != nil || info.TaskId != resp.TaskID { + // return errorsmod.Wrap( + // types.ErrParamError, + // fmt.Sprintf("SetTaskResultInfo: invalid param value:%s", info.Stage), + // ) + //} // check bls sig flag, err := blst.VerifySignature(info.BlsSignature, taskResponseDigest, pubKey) if !flag || err != nil { diff --git a/x/avs/types/types.go b/x/avs/types/types.go index 6ed669bf5..0692e63cf 100644 --- a/x/avs/types/types.go +++ b/x/avs/types/types.go @@ -1,7 +1,10 @@ package types import ( + "encoding/hex" "encoding/json" + "fmt" + "github.com/ethereum/go-ethereum/accounts/abi" "math/big" "strings" @@ -72,6 +75,17 @@ type AVSRegisterOrDeregisterParams struct { Action uint64 } +var ( + taskResponseType, _ = abi.NewType("tuple", "struct", []abi.ArgumentMarshaling{ + {Name: "TaskID", Type: "uint64"}, + {Name: "NumberSum", Type: "uint256"}, + }) + + Args = abi.Arguments{ + {Type: taskResponseType, Name: "TaskResponse"}, + } +) + // ChainIDWithoutRevision returns the chainID without the revision number. // For example, "exocoretestnet_233-1" returns "exocoretestnet_233". func ChainIDWithoutRevision(chainID string) string { @@ -100,7 +114,7 @@ type TaskResponse struct { NumberSum *big.Int } -// GetTaskResponseDigest returns the hash of the TaskResponse, which is what operators sign over +// GetTaskResponseDigestEncodeByjson returns the hash of the TaskResponse, which is what operators sign over // MarshalTaskResponse marshals the TaskResponse struct into JSON bytes. func MarshalTaskResponse(h TaskResponse) ([]byte, error) { return json.Marshal(h) @@ -113,8 +127,8 @@ func UnmarshalTaskResponse(jsonData []byte) (TaskResponse, error) { return taskResponse, err } -// GetTaskResponseDigest returns the hash of the TaskResponse, which is what operators sign over. -func GetTaskResponseDigest(h TaskResponse) ([32]byte, error) { +// GetTaskResponseDigestEncodeByjson returns the hash of the TaskResponse, which is what operators sign over. +func GetTaskResponseDigestEncodeByjson(h TaskResponse) ([32]byte, error) { jsonData, err := MarshalTaskResponse(h) if err != nil { return [32]byte{}, err @@ -123,6 +137,17 @@ func GetTaskResponseDigest(h TaskResponse) ([32]byte, error) { return taskResponseDigest, nil } +// GetTaskResponseDigestEncodeByAbi returns the hash of the TaskResponse, which is what operators sign over. +func GetTaskResponseDigestEncodeByAbi(h TaskResponse) ([32]byte, error) { + packed, err := Args.Pack(&h) + if err != nil { + return [32]byte{}, err + } + fmt.Println("Res:", hex.EncodeToString(packed)) + hashAbi := crypto.Keccak256Hash(packed) + return hashAbi, nil +} + func Difference(a, b []string) []string { var different []string //nolint:prealloc