diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f406c6a209..b3718926f6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,6 +9,7 @@ on: branches: - master - develop + - integration jobs: test: @@ -126,7 +127,10 @@ jobs: run: ./scripts/build-brotli.sh -w -d - name: Build - run: make build test-go-deps -j + run: make build -j + + - name: test-go-deps + run: make --debug test-go-deps - name: Build all lint dependencies run: make -j build-node-deps @@ -169,7 +173,7 @@ jobs: if: matrix.test-mode == 'challenge' run: | packages=`go list ./...` - gotestsum --format short-verbose --packages="$packages" --rerun-fails=1 -- ./... -coverprofile=coverage.txt -covermode=atomic -coverpkg=./...,./go-ethereum/... -tags=challengetest -run=TestChallenge + gotestsum --format short-verbose --packages="$packages" --rerun-fails=1 -- -timeout 20m ./... -coverprofile=coverage.txt -covermode=atomic -coverpkg=./...,./go-ethereum/... -tags=challengetest -run=TestChallenge - name: Upload coverage to Codecov uses: codecov/codecov-action@v2 diff --git a/arbos/block_processor.go b/arbos/block_processor.go index 9147066eca..5d0c70f3f1 100644 --- a/arbos/block_processor.go +++ b/arbos/block_processor.go @@ -159,8 +159,32 @@ func ProduceBlock( } hooks := NoopSequencingHooks() + + // Espresso-specific validation + // TODO test: https://github.com/EspressoSystems/espresso-sequencer/issues/772 + if chainConfig.Espresso { + jst := message.Header.BlockJustification + if jst == nil { + return nil, nil, errors.New("batch missing espresso justification") + + } + hotshotHeader := jst.Header + if *lastHotShotCommitment != hotshotHeader.Commit() { + return nil, nil, errors.New("invalid hotshot header") + } + var roots = []*espresso.NmtRoot{&hotshotHeader.TransactionsRoot} + var proofs = []*espresso.NmtProof{&message.Header.BlockJustification.Proof} + // If the validation function below were not mocked, we would need to serialize the transactions + // in the batch here. To avoid the unnecessary overhead, we provide an empty array instead. + var txs []espresso.Bytes + err := espresso.ValidateBatchTransactions(chainConfig.ChainID.Uint64(), roots, proofs, txs) + if err != nil { + return nil, nil, errors.New("failed to validate namespace proof)") + } + } + return ProduceBlockAdvanced( - message.Header, txes, delayedMessagesRead, lastBlockHeader, lastHotShotCommitment, statedb, chainContext, chainConfig, hooks, + message.Header, txes, delayedMessagesRead, lastBlockHeader, statedb, chainContext, chainConfig, hooks, ) } @@ -170,7 +194,6 @@ func ProduceBlockAdvanced( txes types.Transactions, delayedMessagesRead uint64, lastBlockHeader *types.Header, - lastHotShotCommitment *espresso.Commitment, statedb *state.StateDB, chainContext core.ChainContext, chainConfig *params.ChainConfig, @@ -194,31 +217,6 @@ func ProduceBlockAdvanced( l1Timestamp: l1Header.Timestamp, } - // Espresso-specific validation - // TODO test: https://github.com/EspressoSystems/espresso-sequencer/issues/772 - var defaultCommitment espresso.Commitment - - if lastHotShotCommitment != nil && !lastHotShotCommitment.Equals(defaultCommitment) { - jst := l1Header.BlockJustification - if jst == nil { - return nil, nil, fmt.Errorf("batch missing espresso justification, provided commitment: %v", lastHotShotCommitment) - - } - hotshotHeader := jst.Header - if *lastHotShotCommitment != hotshotHeader.Commit() { - return nil, nil, errors.New("invalid hotshot header") - } - var roots = []*espresso.NmtRoot{&hotshotHeader.TransactionsRoot} - var proofs = []*espresso.NmtProof{&l1Header.BlockJustification.Proof} - // If the validation function below were not mocked, we would need to serialize the transactions - // in the batch here. To avoid the unnecessary overhead, we provide an empty array instead. - var txs []espresso.Bytes - err := espresso.ValidateBatchTransactions(chainConfig.ChainID.Uint64(), roots, proofs, txs) - if err != nil { - return nil, nil, errors.New("failed to validate namespace proof)") - } - } - header := createNewHeader(lastBlockHeader, l1Info, state, chainConfig) signer := types.MakeSigner(chainConfig, header.Number, header.Time) // Note: blockGasLeft will diverge from the actual gas left during execution in the event of invalid txs, diff --git a/arbos/parse_l2.go b/arbos/parse_l2.go index 88018fdfcf..f13fc6ad3f 100644 --- a/arbos/parse_l2.go +++ b/arbos/parse_l2.go @@ -20,6 +20,7 @@ import ( type InfallibleBatchFetcher func(batchNum uint64, batchHash common.Hash) []byte +// TODO: parse espresso justification https://github.com/EspressoSystems/nitro-espresso-integration/pull/14/files func ParseL2Transactions(msg *arbostypes.L1IncomingMessage, chainId *big.Int, batchFetcher InfallibleBatchFetcher) (types.Transactions, error) { if len(msg.L2msg) > arbostypes.MaxL2MessageSize { // ignore the message if l2msg is too large diff --git a/execution/gethexec/executionengine.go b/execution/gethexec/executionengine.go index 5d099cee00..d4570870e0 100644 --- a/execution/gethexec/executionengine.go +++ b/execution/gethexec/executionengine.go @@ -294,7 +294,6 @@ func (s *ExecutionEngine) sequenceTransactionsWithBlockMutex(header *arbostypes. txes, delayedMessagesRead, lastBlockHeader, - nil, statedb, s.bc, s.bc.Config(),