From e06075cf98741a84c317398b448981c203ee68cb Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Thu, 26 Jun 2025 21:43:54 +0200 Subject: [PATCH 1/4] refactor: simplify getting abci block --- pkg/rpc/core/blocks.go | 57 ------------------------------------------ 1 file changed, 57 deletions(-) diff --git a/pkg/rpc/core/blocks.go b/pkg/rpc/core/blocks.go index c422eac..9f487bd 100644 --- a/pkg/rpc/core/blocks.go +++ b/pkg/rpc/core/blocks.go @@ -8,7 +8,6 @@ import ( cmbytes "github.com/cometbft/cometbft/libs/bytes" cmquery "github.com/cometbft/cometbft/libs/pubsub/query" - cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" ctypes "github.com/cometbft/cometbft/rpc/core/types" rpctypes "github.com/cometbft/cometbft/rpc/jsonrpc/types" cmttypes "github.com/cometbft/cometbft/types" @@ -141,35 +140,6 @@ func Block(ctx *rpctypes.Context, heightPtr *int64) (*ctypes.ResultBlock, error) return nil, err } - // Then re-sign the final ABCI header if we have a signer - if env.Signer != nil { - // Create a vote for the final ABCI header - vote := cmtproto.Vote{ - Type: cmtproto.PrecommitType, - Height: int64(header.Height()), //nolint:gosec - Round: 0, - BlockID: cmtproto.BlockID{ - Hash: abciBlock.Header.Hash(), - PartSetHeader: cmtproto.PartSetHeader{}, - }, - Timestamp: abciBlock.Time, - ValidatorAddress: header.ProposerAddress, - ValidatorIndex: 0, - } - chainID := header.ChainID() - finalSignBytes := cmttypes.VoteSignBytes(chainID, &vote) - - newSignature, err := env.Signer.Sign(finalSignBytes) - if err != nil { - return nil, fmt.Errorf("failed to sign final ABCI header: %w", err) - } - - // Update the signature in the block - if len(abciBlock.LastCommit.Signatures) > 0 { - abciBlock.LastCommit.Signatures[0].Signature = newSignature - } - } - return &ctypes.ResultBlock{ BlockID: cmttypes.BlockID{Hash: abciBlock.Hash()}, Block: abciBlock, @@ -242,33 +212,6 @@ func Commit(ctx *rpctypes.Context, heightPtr *int64) (*ctypes.ResultCommit, erro return nil, err } - // Then re-sign the final ABCI header if we have a signer - if env.Signer != nil { - // Create a vote for the final ABCI header - vote := cmtproto.Vote{ - Type: cmtproto.PrecommitType, - Height: int64(header.Height()), //nolint:gosec - Round: 0, - BlockID: cmtproto.BlockID{ - Hash: abciBlock.Header.Hash(), - PartSetHeader: cmtproto.PartSetHeader{}, - }, - Timestamp: abciBlock.Time, - ValidatorAddress: header.ProposerAddress, - ValidatorIndex: 0, - } - chainID := header.ChainID() - finalSignBytes := cmttypes.VoteSignBytes(chainID, &vote) - - newSignature, err := env.Signer.Sign(finalSignBytes) - if err != nil { - return nil, fmt.Errorf("failed to sign final ABCI header: %w", err) - } - - // Update the commit with the new signature - abciBlock.LastCommit.Signatures[0].Signature = newSignature - } - // Update the commit's BlockID to match the final ABCI block hash abciBlock.LastCommit.BlockID.Hash = abciBlock.Header.Hash() From db27487d97de9bdc675a9f18045547435457ab77 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Thu, 26 Jun 2025 23:00:59 +0200 Subject: [PATCH 2/4] updates --- go.mod | 8 +++--- go.sum | 16 +++++------ pkg/adapter/adapter.go | 7 +++-- pkg/cometcompat/convert.go | 54 +++++++++++++------------------------- pkg/cometcompat/signer.go | 16 ++++------- 5 files changed, 38 insertions(+), 63 deletions(-) diff --git a/go.mod b/go.mod index 8ac420d..e6041c4 100644 --- a/go.mod +++ b/go.mod @@ -30,10 +30,10 @@ require ( github.com/libp2p/go-libp2p-pubsub v0.14.0 github.com/multiformats/go-multiaddr v0.16.0 github.com/prometheus/client_golang v1.22.0 - github.com/rollkit/rollkit v0.14.2-0.20250625130707-6ad581a97a16 - github.com/rollkit/rollkit/core v0.0.0-20250625130707-6ad581a97a16 - github.com/rollkit/rollkit/da v0.0.0-20250625130707-6ad581a97a16 - github.com/rollkit/rollkit/sequencers/single v0.0.0-20250625130707-6ad581a97a16 + github.com/rollkit/rollkit v0.14.2-0.20250626144401-cca03fc1a32a + github.com/rollkit/rollkit/core v0.0.0-20250626144401-cca03fc1a32a + github.com/rollkit/rollkit/da v0.0.0-20250626144401-cca03fc1a32a + github.com/rollkit/rollkit/sequencers/single v0.0.0-20250626144401-cca03fc1a32a github.com/rs/cors v1.11.1 github.com/spf13/cobra v1.9.1 github.com/stretchr/testify v1.10.0 diff --git a/go.sum b/go.sum index e1039dd..9f8d6ca 100644 --- a/go.sum +++ b/go.sum @@ -1002,14 +1002,14 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= -github.com/rollkit/rollkit v0.14.2-0.20250625130707-6ad581a97a16 h1:U7pjrPP0Gr6wgV4pP+dMzE0M5Uk+QZPq23L5BfRbGmU= -github.com/rollkit/rollkit v0.14.2-0.20250625130707-6ad581a97a16/go.mod h1:rYx3rVsrwdov/JbOn9wiEOQfafYuSRy8mYJodQKYxNc= -github.com/rollkit/rollkit/core v0.0.0-20250625130707-6ad581a97a16 h1:0Ra7zohG55GfvRSjPum6UKTiIeNCCs/dR5RabqEdU/k= -github.com/rollkit/rollkit/core v0.0.0-20250625130707-6ad581a97a16/go.mod h1:0RhbqC8Is970KRhr6zPUQOZkmKt6/WqPRDQWfd2P7P0= -github.com/rollkit/rollkit/da v0.0.0-20250625130707-6ad581a97a16 h1:veLa/YIzFZpU83DhTlgsalqelfqyvG8qcu2ROz8rU4Q= -github.com/rollkit/rollkit/da v0.0.0-20250625130707-6ad581a97a16/go.mod h1:MqbHTMhjb1PGbGaZ7bVddCm5OJg1+GMVEPpERdsO058= -github.com/rollkit/rollkit/sequencers/single v0.0.0-20250625130707-6ad581a97a16 h1:NCZ8XRx5ZiTLlDQb8ZeCWIYYmukZer3vxPdTS1iIdU8= -github.com/rollkit/rollkit/sequencers/single v0.0.0-20250625130707-6ad581a97a16/go.mod h1:SSo4Igeqjz2zTPFUZLh4JlOUFBWdmk3fRxEnviVcBBs= +github.com/rollkit/rollkit v0.14.2-0.20250626144401-cca03fc1a32a h1:2guJfSj7jTRlE+AH9HQt+NYn4gXUb31csgU5RFSmiZc= +github.com/rollkit/rollkit v0.14.2-0.20250626144401-cca03fc1a32a/go.mod h1:rYx3rVsrwdov/JbOn9wiEOQfafYuSRy8mYJodQKYxNc= +github.com/rollkit/rollkit/core v0.0.0-20250626144401-cca03fc1a32a h1:hHftciGegoEtjrUpy6vXsjxcKyeLQpcSa+MLR9XqbSs= +github.com/rollkit/rollkit/core v0.0.0-20250626144401-cca03fc1a32a/go.mod h1:0RhbqC8Is970KRhr6zPUQOZkmKt6/WqPRDQWfd2P7P0= +github.com/rollkit/rollkit/da v0.0.0-20250626144401-cca03fc1a32a h1:co4xeq95WhjrbJd1kyViOWLtH/Vf9Vrol/mdENGCxAM= +github.com/rollkit/rollkit/da v0.0.0-20250626144401-cca03fc1a32a/go.mod h1:MqbHTMhjb1PGbGaZ7bVddCm5OJg1+GMVEPpERdsO058= +github.com/rollkit/rollkit/sequencers/single v0.0.0-20250626144401-cca03fc1a32a h1:3xeIDdrh6ZWDvvFOWvaw6UDCpvlopZM/kZDTwujKfak= +github.com/rollkit/rollkit/sequencers/single v0.0.0-20250626144401-cca03fc1a32a/go.mod h1:SSo4Igeqjz2zTPFUZLh4JlOUFBWdmk3fRxEnviVcBBs= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= diff --git a/pkg/adapter/adapter.go b/pkg/adapter/adapter.go index cd80f1c..14ed801 100644 --- a/pkg/adapter/adapter.go +++ b/pkg/adapter/adapter.go @@ -9,7 +9,6 @@ import ( "cosmossdk.io/log" abci "github.com/cometbft/cometbft/abci/types" cmtcfg "github.com/cometbft/cometbft/config" - "github.com/cometbft/cometbft/libs/bytes" "github.com/cometbft/cometbft/mempool" corep2p "github.com/cometbft/cometbft/p2p" cmtprototypes "github.com/cometbft/cometbft/proto/tendermint/types" @@ -528,7 +527,7 @@ func fireEvents( func (a *Adapter) getLastCommit(ctx context.Context, blockHeight uint64) (*cmttypes.Commit, error) { if blockHeight > 1 { - header, data, err := a.RollkitStore.GetBlockData(ctx, blockHeight-1) + header, _, err := a.RollkitStore.GetBlockData(ctx, blockHeight-1) if err != nil { return nil, fmt.Errorf("failed to get previous block data: %w", err) } @@ -536,7 +535,7 @@ func (a *Adapter) getLastCommit(ctx context.Context, blockHeight uint64) (*cmtty commitForPrevBlock := &cmttypes.Commit{ Height: int64(header.Height()), Round: 0, - BlockID: cmttypes.BlockID{Hash: bytes.HexBytes(header.Hash()), PartSetHeader: cmttypes.PartSetHeader{Total: 1, Hash: bytes.HexBytes(data.Hash())}}, + BlockID: cmttypes.BlockID{}, Signatures: []cmttypes.CommitSig{ { BlockIDFlag: cmttypes.BlockIDFlagCommit, @@ -571,7 +570,7 @@ func cometCommitToABCICommitInfo(commit *cmttypes.Commit) abci.CommitInfo { votes[i] = abci.VoteInfo{ Validator: abci.Validator{ Address: sig.ValidatorAddress, - Power: 0, + Power: 1, }, BlockIdFlag: cmtprototypes.BlockIDFlag(sig.BlockIDFlag), } diff --git a/pkg/cometcompat/convert.go b/pkg/cometcompat/convert.go index 47e2272..a164745 100644 --- a/pkg/cometcompat/convert.go +++ b/pkg/cometcompat/convert.go @@ -14,18 +14,28 @@ import ( // ToABCIBlock converts Rolkit block into block format defined by ABCI. func ToABCIBlock(header *rlktypes.SignedHeader, data *rlktypes.Data, lastCommit *cmttypes.Commit) (*cmttypes.Block, error) { - abciHeader, err := ToABCIHeader(&header.Header) - if err != nil { - return nil, err - } - // validate have one validator if len(header.ProposerAddress) == 0 { return nil, errors.New("proposer address is not set") } - // set commit hash - abciHeader.LastCommitHash = lastCommit.Hash() + abciHeader := cmttypes.Header{ + Version: cmprotoversion.Consensus{ + Block: cmtversion.BlockProtocol, + App: header.Version.App, + }, + Height: int64(header.Height()), //nolint:gosec + Time: header.Time(), + LastBlockID: lastCommit.BlockID, + LastCommitHash: lastCommit.Hash(), + DataHash: cmbytes.HexBytes(header.DataHash), + ConsensusHash: cmbytes.HexBytes(header.ConsensusHash), + AppHash: cmbytes.HexBytes(header.AppHash), + LastResultsHash: cmbytes.HexBytes(header.LastResultsHash), + EvidenceHash: new(cmttypes.EvidenceData).Hash(), + ProposerAddress: header.ProposerAddress, + ChainID: header.ChainID(), + } // set validator hash if header.Signer.Address != nil { @@ -44,6 +54,7 @@ func ToABCIBlock(header *rlktypes.SignedHeader, data *rlktypes.Data, lastCommit }, LastCommit: lastCommit, } + abciBlock.Txs = make([]cmttypes.Tx, len(data.Txs)) for i := range data.Txs { abciBlock.Txs[i] = cmttypes.Tx(data.Txs[i]) @@ -68,32 +79,3 @@ func ToABCIBlockMeta(header *rlktypes.SignedHeader, data *rlktypes.Data, lastCom NumTxs: len(cmblock.Txs), }, nil } - -// ToABCIHeader converts Rollkit header to Header format defined in ABCI. -func ToABCIHeader(header *rlktypes.Header) (cmttypes.Header, error) { - return cmttypes.Header{ - Version: cmprotoversion.Consensus{ - Block: cmtversion.BlockProtocol, - App: header.Version.App, - }, - Height: int64(header.Height()), //nolint:gosec - Time: header.Time(), - LastBlockID: cmttypes.BlockID{ - Hash: cmbytes.HexBytes(header.LastHeaderHash), - PartSetHeader: cmttypes.PartSetHeader{ - Total: 0, - Hash: nil, - }, - }, - LastCommitHash: cmbytes.HexBytes(header.LastCommitHash), - DataHash: cmbytes.HexBytes(header.DataHash), - ConsensusHash: cmbytes.HexBytes(header.ConsensusHash), - AppHash: cmbytes.HexBytes(header.AppHash), - LastResultsHash: cmbytes.HexBytes(header.LastResultsHash), - EvidenceHash: new(cmttypes.EvidenceData).Hash(), - ProposerAddress: header.ProposerAddress, - ChainID: header.ChainID(), - // validator hash and next validator hash are not set here - // they are set later (in ToABCIBlock) - }, nil -} diff --git a/pkg/cometcompat/signer.go b/pkg/cometcompat/signer.go index 1f03f6a..20573ce 100644 --- a/pkg/cometcompat/signer.go +++ b/pkg/cometcompat/signer.go @@ -9,22 +9,16 @@ import ( func PayloadProvider() types.SignaturePayloadProvider { return func(header *types.Header) ([]byte, error) { - abciHeaderForSigning, err := ToABCIHeader(header) - if err != nil { - return nil, err - } vote := cmtproto.Vote{ - Type: cmtproto.PrecommitType, - Height: int64(header.Height()), //nolint:gosec - Round: 0, - BlockID: cmtproto.BlockID{ - Hash: abciHeaderForSigning.Hash(), - PartSetHeader: cmtproto.PartSetHeader{}, - }, + Type: cmtproto.PrecommitType, + Height: int64(header.Height()), //nolint:gosec + Round: 0, + BlockID: cmtproto.BlockID{}, Timestamp: header.Time(), ValidatorAddress: header.ProposerAddress, ValidatorIndex: 0, } + chainID := header.ChainID() consensusVoteBytes := cmttypes.VoteSignBytes(chainID, &vote) From c0ce00f9198b869ce2ff49453d8832429dcf1a4d Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Thu, 26 Jun 2025 23:29:05 +0200 Subject: [PATCH 3/4] attempt --- pkg/rpc/core/blocks.go | 3 +++ pkg/rpc/core/blocks_test.go | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/pkg/rpc/core/blocks.go b/pkg/rpc/core/blocks.go index 9f487bd..346c5ea 100644 --- a/pkg/rpc/core/blocks.go +++ b/pkg/rpc/core/blocks.go @@ -140,6 +140,8 @@ func Block(ctx *rpctypes.Context, heightPtr *int64) (*ctypes.ResultBlock, error) return nil, err } + abciBlock.LastCommit.Signatures[0].Signature = header.Signature + return &ctypes.ResultBlock{ BlockID: cmttypes.BlockID{Hash: abciBlock.Hash()}, Block: abciBlock, @@ -214,6 +216,7 @@ func Commit(ctx *rpctypes.Context, heightPtr *int64) (*ctypes.ResultCommit, erro // Update the commit's BlockID to match the final ABCI block hash abciBlock.LastCommit.BlockID.Hash = abciBlock.Header.Hash() + abciBlock.LastCommit.Signatures[0].Signature = header.Signature return &ctypes.ResultCommit{ SignedHeader: cmttypes.SignedHeader{ diff --git a/pkg/rpc/core/blocks_test.go b/pkg/rpc/core/blocks_test.go index 125267d..635c4d3 100644 --- a/pkg/rpc/core/blocks_test.go +++ b/pkg/rpc/core/blocks_test.go @@ -181,7 +181,7 @@ func TestCommit_VerifyCometBFTLightClientCompatibility_MultipleBlocks(t *testing } var trustedHeader cmttypes.SignedHeader - var isFirstBlock = true + isFirstBlock := true // Test multiple blocks for i := 1; i <= 3; i++ { @@ -206,7 +206,7 @@ func TestCommit_VerifyCometBFTLightClientCompatibility_MultipleBlocks(t *testing verifyFirstBlock(t, fixedValSet, chainID, trustedHeader) isFirstBlock = false } else { - verifySubsequentBlock(t, fixedValSet, &trustedHeader, &commitResult.SignedHeader, rollkitHeader, realSignature) + verifySubsequentBlock(t, fixedValSet, &trustedHeader, &commitResult.SignedHeader, rollkitHeader) trustedHeader = commitResult.SignedHeader } } @@ -311,7 +311,7 @@ func verifyFirstBlock(t *testing.T, valSet *cmttypes.ValidatorSet, chainID strin } } -func verifySubsequentBlock(t *testing.T, valSet *cmttypes.ValidatorSet, trustedHeader, newHeader *cmttypes.SignedHeader, rollkitHeader types.Header, realSignature []byte) { +func verifySubsequentBlock(t *testing.T, valSet *cmttypes.ValidatorSet, trustedHeader, newHeader *cmttypes.SignedHeader, rollkitHeader types.Header) { require := require.New(t) trustingPeriod := 3 * time.Hour From 19552a626aaca1dbb1b2aec9417302a72280e021 Mon Sep 17 00:00:00 2001 From: Julien Robert Date: Fri, 27 Jun 2025 15:26:04 +0200 Subject: [PATCH 4/4] updates --- pkg/rpc/core/blocks.go | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/pkg/rpc/core/blocks.go b/pkg/rpc/core/blocks.go index 346c5ea..f5eae8e 100644 --- a/pkg/rpc/core/blocks.go +++ b/pkg/rpc/core/blocks.go @@ -140,8 +140,6 @@ func Block(ctx *rpctypes.Context, heightPtr *int64) (*ctypes.ResultBlock, error) return nil, err } - abciBlock.LastCommit.Signatures[0].Signature = header.Signature - return &ctypes.ResultBlock{ BlockID: cmttypes.BlockID{Hash: abciBlock.Hash()}, Block: abciBlock, @@ -208,20 +206,15 @@ func Commit(ctx *rpctypes.Context, heightPtr *int64) (*ctypes.ResultCommit, erro }}, } - // First apply ToABCIBlock to get the final header with all transformations abciBlock, err := cometcompat.ToABCIBlock(header, rollkitData, abciCommit) if err != nil { return nil, err } - // Update the commit's BlockID to match the final ABCI block hash - abciBlock.LastCommit.BlockID.Hash = abciBlock.Header.Hash() - abciBlock.LastCommit.Signatures[0].Signature = header.Signature - return &ctypes.ResultCommit{ SignedHeader: cmttypes.SignedHeader{ Header: &abciBlock.Header, - Commit: abciBlock.LastCommit, + Commit: abciCommit, }, CanonicalCommit: true, }, nil