diff --git a/.github/workflows/on-pr-publish.yaml b/.github/workflows/on-pr-publish.yaml index cbcbaff1..ff98f2a6 100644 --- a/.github/workflows/on-pr-publish.yaml +++ b/.github/workflows/on-pr-publish.yaml @@ -29,7 +29,7 @@ jobs: BUILD_KEY: ${{ secrets.BUILD_KEY }} with: STACK_ORCHESTRATOR_REF: "f2fd766f5400fcb9eb47b50675d2e3b1f2753702" - GO_ETHEREUM_REF: "2cea7024b4db754e43f36e39eb8d06fa42293df2" + GO_ETHEREUM_REF: "be1757b9fd884cb20c8d7faac8fa81fc49bb7216" IPLD_ETH_DB_REF: "be345e0733d2c025e4082c5154e441317ae94cf7" build: name: Run docker build diff --git a/docker-compose.yml b/docker-compose.yml index 5627f234..0a4f7da9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,7 +5,7 @@ services: restart: on-failure depends_on: - ipld-eth-db - image: vulcanize/ipld-eth-db:v4.2.0-alpha + image: vulcanize/ipld-eth-db:v4.2.1-alpha environment: DATABASE_USER: "vdbm" DATABASE_NAME: "vulcanize_testing" diff --git a/go.mod b/go.mod index 764c1d74..85fb1fbc 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( github.com/spf13/viper v1.11.0 github.com/vulcanize/eth-ipfs-state-validator/v4 v4.0.6-alpha github.com/vulcanize/gap-filler v0.4.0 - github.com/vulcanize/ipfs-ethdb/v4 v4.0.5-alpha + github.com/vulcanize/ipfs-ethdb/v4 v4.0.6-alpha gorm.io/driver/postgres v1.3.7 gorm.io/gorm v1.23.5 ) @@ -274,7 +274,7 @@ require ( go.uber.org/multierr v1.8.0 // indirect go.uber.org/zap v1.21.0 // indirect go4.org v0.0.0-20200411211856-f5505b9728dd // indirect - golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect + golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8 // indirect golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect golang.org/x/net v0.0.0-20220607020251-c690dde0001d // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect diff --git a/go.sum b/go.sum index 28cdfda6..5307c14d 100644 --- a/go.sum +++ b/go.sum @@ -1781,8 +1781,8 @@ github.com/vulcanize/gap-filler v0.4.0 h1:5VD9PG7UrjEub4rLxZmstWoHnBnVtXz9silIVd github.com/vulcanize/gap-filler v0.4.0/go.mod h1:5awUyotIoJi6AuG0JPEm7SIwFZBD7Ecg0I8x7CdxcHI= github.com/vulcanize/go-ethereum v1.10.21-statediff-4.1.2-alpha h1:ct+8FGuQnHA6SOGOQoAMINWdeexuSF40+IjF48J094A= github.com/vulcanize/go-ethereum v1.10.21-statediff-4.1.2-alpha/go.mod h1:dNJkmCSbaasX0zfQM6pm1g3rWlW3EGhLOEZMScyrRAs= -github.com/vulcanize/ipfs-ethdb/v4 v4.0.5-alpha h1:NFRwWeMB3Q+QqLM9qdcHvfvWBxOk0lPwhOqXJpkIg30= -github.com/vulcanize/ipfs-ethdb/v4 v4.0.5-alpha/go.mod h1:WvYj0m0cLPAtoytTbcbE2nZ3Hg9iuuF+lY14dBVRWZQ= +github.com/vulcanize/ipfs-ethdb/v4 v4.0.6-alpha h1:iKpv+Bvc0HScak+NiGK4NeYGLWMZ1pyLmrZecHoUGYA= +github.com/vulcanize/ipfs-ethdb/v4 v4.0.6-alpha/go.mod h1:WvYj0m0cLPAtoytTbcbE2nZ3Hg9iuuF+lY14dBVRWZQ= github.com/wI2L/jsondiff v0.2.0 h1:dE00WemBa1uCjrzQUUTE/17I6m5qAaN0EMFOg2Ynr/k= github.com/wI2L/jsondiff v0.2.0/go.mod h1:axTcwtBkY4TsKuV+RgoMhHyHKKFRI6nnjRLi8LLYQnA= github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= @@ -1953,8 +1953,8 @@ golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220518034528-6f7dac969898/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8 h1:GIAS/yBem/gq2MUqgNIzUHW7cJMmx3TGZOrnyYaNQ6c= +golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= diff --git a/pkg/eth/backend.go b/pkg/eth/backend.go index 58d156e3..265ced6f 100644 --- a/pkg/eth/backend.go +++ b/pkg/eth/backend.go @@ -39,7 +39,6 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/statediff/indexer/models" "github.com/ethereum/go-ethereum/trie" "github.com/jmoiron/sqlx" log "github.com/sirupsen/logrus" @@ -192,7 +191,23 @@ func (b *Backend) HeaderByNumber(ctx context.Context, blockNumber rpc.BlockNumbe // HeaderByHash gets the header for the provided block hash func (b *Backend) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) { - _, headerRLP, err := b.IPLDRetriever.RetrieveHeaderByHash(hash) + // Begin tx + tx, err := b.DB.Beginx() + if err != nil { + return nil, err + } + defer func() { + if p := recover(); p != nil { + shared.Rollback(tx) + panic(p) + } else if err != nil { + shared.Rollback(tx) + } else { + err = tx.Commit() + } + }() + + _, headerRLP, err := b.IPLDRetriever.RetrieveHeaderByHash(tx, hash) if err != nil { return nil, err } @@ -281,7 +296,7 @@ func (b *Backend) BlockByNumberOrHash(ctx context.Context, blockNrOrHash rpc.Blo return nil, errors.New("invalid arguments; neither block nor hash specified") } -// BlockByNumber returns the requested canonical block. +// BlockByNumber returns the requested canonical block func (b *Backend) BlockByNumber(ctx context.Context, blockNumber rpc.BlockNumber) (*types.Block, error) { var err error number := blockNumber.Int64() @@ -303,6 +318,7 @@ func (b *Backend) BlockByNumber(ctx context.Context, blockNumber rpc.BlockNumber if number < 0 { return nil, errNegativeBlockNumber } + // Get the canonical hash canonicalHash, err := b.GetCanonicalHash(uint64(number)) if err != nil { @@ -311,118 +327,12 @@ func (b *Backend) BlockByNumber(ctx context.Context, blockNumber rpc.BlockNumber } return nil, err } - // Retrieve all the CIDs for the block - // TODO: optimize this by retrieving iplds directly rather than the cids first (this is remanent from when we fetched iplds through ipfs blockservice interface) - headerCID, uncleCIDs, txCIDs, rctCIDs, err := b.Retriever.RetrieveBlockByHash(canonicalHash) - if err != nil { - if err == sql.ErrNoRows { - return nil, nil - } - return nil, err - } - // Begin tx - tx, err := b.DB.Beginx() - if err != nil { - return nil, err - } - defer func() { - if p := recover(); p != nil { - shared.Rollback(tx) - panic(p) - } else if err != nil { - shared.Rollback(tx) - } else { - err = tx.Commit() - } - }() - - // Fetch and decode the header IPLD - var headerIPLD models.IPLDModel - headerIPLD, err = b.Fetcher.FetchHeader(tx, headerCID) - if err != nil { - log.Error("error fetching header ipld", err) - if err == sql.ErrNoRows { - return nil, nil - } - return nil, err - } - var header types.Header - err = rlp.DecodeBytes(headerIPLD.Data, &header) - if err != nil { - return nil, err - } - - // Fetch and decode the uncle IPLDs - var uncleIPLDs []models.IPLDModel - uncleIPLDs, err = b.Fetcher.FetchUncles(tx, uncleCIDs) - if err != nil { - log.Error("error fetching uncle iplds", err) - return nil, err - } - var uncles []*types.Header - for _, uncleIPLD := range uncleIPLDs { - var uncle types.Header - err = rlp.DecodeBytes(uncleIPLD.Data, &uncle) - if err != nil { - return nil, err - } - uncles = append(uncles, &uncle) - } - - // Fetch and decode the transaction IPLDs - var txIPLDs []models.IPLDModel - txIPLDs, err = b.Fetcher.FetchTrxs(tx, txCIDs) - if err != nil { - log.Error("error fetching tx iplds", err) - return nil, err - } - var transactions []*types.Transaction - for _, txIPLD := range txIPLDs { - var transaction types.Transaction - err = transaction.UnmarshalBinary(txIPLD.Data) - if err != nil { - return nil, err - } - transactions = append(transactions, &transaction) - } - // Fetch and decode the receipt IPLDs - var rctIPLDs []models.IPLDModel - rctIPLDs, err = b.Fetcher.FetchRcts(tx, rctCIDs) - if err != nil { - log.Error("error fetching rct iplds", err) - return nil, err - } - var receipts []*types.Receipt - for _, rctIPLD := range rctIPLDs { - var receipt types.Receipt - nodeVal, err := DecodeLeafNode(rctIPLD.Data) - if err != nil { - return nil, err - } - - err = receipt.UnmarshalBinary(nodeVal) - if err != nil { - return nil, err - } - receipts = append(receipts, &receipt) - } - // Compose everything together into a complete block - return types.NewBlock(&header, transactions, uncles, receipts, new(trie.Trie)), err + return b.BlockByHash(ctx, canonicalHash) } -// BlockByHash returns the requested block. When fullTx is true all transactions in the block are returned in full -// detail, otherwise only the transaction hash is returned. +// BlockByHash returns the requested block func (b *Backend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { - // Retrieve all the CIDs for the block - headerCID, uncleCIDs, txCIDs, rctCIDs, err := b.Retriever.RetrieveBlockByHash(hash) - if err != nil { - if err == sql.ErrNoRows { - return nil, nil - } - return nil, err - } - // Begin tx tx, err := b.DB.Beginx() if err != nil { @@ -439,85 +349,109 @@ func (b *Backend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Blo } }() - // Fetch and decode the header IPLD - var headerIPLD models.IPLDModel - headerIPLD, err = b.Fetcher.FetchHeader(tx, headerCID) + // Fetch header + header, err := b.GetHeaderByBlockHash(tx, hash) if err != nil { - log.Error("error fetching header ipld", err) + log.Error("error fetching header: ", err) if err == sql.ErrNoRows { return nil, nil } return nil, err } - var header types.Header - err = rlp.DecodeBytes(headerIPLD.Data, &header) + + // Fetch uncles + uncles, err := b.GetUnclesByBlockHash(tx, hash) + if err != nil && err != sql.ErrNoRows { + log.Error("error fetching uncles: ", err) + return nil, err + } + + // Fetch transactions + transactions, err := b.GetTransactionsByBlockHash(tx, hash) + if err != nil && err != sql.ErrNoRows { + log.Error("error fetching transactions: ", err) + return nil, err + } + + // Fetch receipts + receipts, err := b.GetReceiptsByBlockHash(tx, hash) + if err != nil && err != sql.ErrNoRows { + log.Error("error fetching receipts: ", err) + return nil, err + } + + // Compose everything together into a complete block + return types.NewBlock(header, transactions, uncles, receipts, new(trie.Trie)), err +} + +// GetHeaderByBlockHash retrieves header for a provided block hash +func (b *Backend) GetHeaderByBlockHash(tx *sqlx.Tx, hash common.Hash) (*types.Header, error) { + _, headerRLP, err := b.IPLDRetriever.RetrieveHeaderByHash(tx, hash) if err != nil { return nil, err } - // Fetch and decode the uncle IPLDs - var uncleIPLDs []models.IPLDModel - uncleIPLDs, err = b.Fetcher.FetchUncles(tx, uncleCIDs) + + header := new(types.Header) + return header, rlp.DecodeBytes(headerRLP, header) +} + +// GetUnclesByBlockHash retrieves uncles for a provided block hash +func (b *Backend) GetUnclesByBlockHash(tx *sqlx.Tx, hash common.Hash) ([]*types.Header, error) { + _, uncleBytes, err := b.IPLDRetriever.RetrieveUnclesByBlockHash(tx, hash) if err != nil { - log.Error("error fetching uncle iplds", err) - if err == sql.ErrNoRows { - return nil, nil - } return nil, err } - var uncles []*types.Header - for _, uncleIPLD := range uncleIPLDs { + + uncles := make([]*types.Header, len(uncleBytes)) + for i, bytes := range uncleBytes { var uncle types.Header - err = rlp.DecodeBytes(uncleIPLD.Data, &uncle) - if err != nil { - return nil, err - } - uncles = append(uncles, &uncle) - } - // Fetch and decode the transaction IPLDs - var txIPLDs []models.IPLDModel - txIPLDs, err = b.Fetcher.FetchTrxs(tx, txCIDs) - if err != nil { - log.Error("error fetching tx iplds", err) - if err == sql.ErrNoRows { - return nil, nil - } - return nil, err - } - var transactions []*types.Transaction - for _, txIPLD := range txIPLDs { - var transaction types.Transaction - err = transaction.UnmarshalBinary(txIPLD.Data) - if err != nil { - return nil, err - } - transactions = append(transactions, &transaction) - } - // Fetch and decode the receipt IPLDs - var rctIPLDs []models.IPLDModel - rctIPLDs, err = b.Fetcher.FetchRcts(tx, rctCIDs) - if err != nil { - log.Error("error fetching rct iplds", err) - if err == sql.ErrNoRows { - return nil, nil - } - return nil, err - } - var receipts []*types.Receipt - for _, rctIPLD := range rctIPLDs { - var receipt types.Receipt - nodeVal, err := DecodeLeafNode(rctIPLD.Data) + err = rlp.DecodeBytes(bytes, &uncle) if err != nil { return nil, err } - err = receipt.UnmarshalBinary(nodeVal) - if err != nil { + uncles[i] = &uncle + } + + return uncles, nil +} + +// GetTransactionsByBlockHash retrieves transactions for a provided block hash +func (b *Backend) GetTransactionsByBlockHash(tx *sqlx.Tx, hash common.Hash) (types.Transactions, error) { + _, transactionBytes, err := b.IPLDRetriever.RetrieveTransactionsByBlockHash(tx, hash) + if err != nil { + return nil, err + } + + txs := make(types.Transactions, len(transactionBytes)) + for i, txBytes := range transactionBytes { + var tx types.Transaction + if err := tx.UnmarshalBinary(txBytes); err != nil { return nil, err } - receipts = append(receipts, &receipt) + + txs[i] = &tx } - // Compose everything together into a complete block - return types.NewBlock(&header, transactions, uncles, receipts, new(trie.Trie)), err + + return txs, nil +} + +// GetReceiptsByBlockHash retrieves receipts for a provided block hash +func (b *Backend) GetReceiptsByBlockHash(tx *sqlx.Tx, hash common.Hash) (types.Receipts, error) { + _, receiptBytes, txs, err := b.IPLDRetriever.RetrieveReceiptsByBlockHash(tx, hash) + if err != nil { + return nil, err + } + rcts := make(types.Receipts, len(receiptBytes)) + for i, rctBytes := range receiptBytes { + rct := new(types.Receipt) + if err := rct.UnmarshalBinary(rctBytes); err != nil { + return nil, err + } + rct.TxHash = txs[i] + rcts[i] = rct + } + return rcts, nil } // GetTransaction retrieves a tx by hash @@ -551,7 +485,23 @@ func (b *Backend) GetTransaction(ctx context.Context, txHash common.Hash) (*type // GetReceipts retrieves receipts for provided block hash func (b *Backend) GetReceipts(ctx context.Context, hash common.Hash) (types.Receipts, error) { - _, receiptBytes, txs, err := b.IPLDRetriever.RetrieveReceiptsByBlockHash(hash) + // Begin tx + tx, err := b.DB.Beginx() + if err != nil { + return nil, err + } + defer func() { + if p := recover(); p != nil { + shared.Rollback(tx) + panic(p) + } else if err != nil { + shared.Rollback(tx) + } else { + err = tx.Commit() + } + }() + + _, receiptBytes, txs, err := b.IPLDRetriever.RetrieveReceiptsByBlockHash(tx, hash) if err != nil { return nil, err } @@ -569,7 +519,23 @@ func (b *Backend) GetReceipts(ctx context.Context, hash common.Hash) (types.Rece // GetLogs returns all the logs for the given block hash func (b *Backend) GetLogs(ctx context.Context, hash common.Hash) ([][]*types.Log, error) { - _, receiptBytes, txs, err := b.IPLDRetriever.RetrieveReceiptsByBlockHash(hash) + // Begin tx + tx, err := b.DB.Beginx() + if err != nil { + return nil, err + } + defer func() { + if p := recover(); p != nil { + shared.Rollback(tx) + panic(p) + } else if err != nil { + shared.Rollback(tx) + } else { + err = tx.Commit() + } + }() + + _, receiptBytes, txs, err := b.IPLDRetriever.RetrieveReceiptsByBlockHash(tx, hash) if err != nil { return nil, err } diff --git a/pkg/eth/ipld_retriever.go b/pkg/eth/ipld_retriever.go index 6e83f7a3..5eaf6144 100644 --- a/pkg/eth/ipld_retriever.go +++ b/pkg/eth/ipld_retriever.go @@ -313,9 +313,9 @@ func (r *IPLDRetriever) RetrieveHeadersByBlockNumber(number uint64) ([]string, [ } // RetrieveHeaderByHash returns the cid and rlp bytes for the header corresponding to the provided block hash -func (r *IPLDRetriever) RetrieveHeaderByHash(hash common.Hash) (string, []byte, error) { +func (r *IPLDRetriever) RetrieveHeaderByHash(tx *sqlx.Tx, hash common.Hash) (string, []byte, error) { headerResult := new(ipldResult) - return headerResult.CID, headerResult.Data, r.db.Get(headerResult, RetrieveHeaderByHashPgStr, hash.Hex()) + return headerResult.CID, headerResult.Data, tx.Get(headerResult, RetrieveHeaderByHashPgStr, hash.Hex()) } // RetrieveUnclesByHashes returns the cids and rlp bytes for the uncles corresponding to the provided uncle hashes @@ -338,9 +338,9 @@ func (r *IPLDRetriever) RetrieveUnclesByHashes(hashes []common.Hash) ([]string, } // RetrieveUnclesByBlockHash returns the cids and rlp bytes for the uncles corresponding to the provided block hash (of non-omner root block) -func (r *IPLDRetriever) RetrieveUnclesByBlockHash(hash common.Hash) ([]string, [][]byte, error) { +func (r *IPLDRetriever) RetrieveUnclesByBlockHash(tx *sqlx.Tx, hash common.Hash) ([]string, [][]byte, error) { uncleResults := make([]ipldResult, 0) - if err := r.db.Select(&uncleResults, RetrieveUnclesByBlockHashPgStr, hash.Hex()); err != nil { + if err := tx.Select(&uncleResults, RetrieveUnclesByBlockHashPgStr, hash.Hex()); err != nil { return nil, nil, err } cids := make([]string, len(uncleResults)) @@ -393,9 +393,9 @@ func (r *IPLDRetriever) RetrieveTransactionsByHashes(hashes []common.Hash) ([]st } // RetrieveTransactionsByBlockHash returns the cids and rlp bytes for the transactions corresponding to the provided block hash -func (r *IPLDRetriever) RetrieveTransactionsByBlockHash(hash common.Hash) ([]string, [][]byte, error) { +func (r *IPLDRetriever) RetrieveTransactionsByBlockHash(tx *sqlx.Tx, hash common.Hash) ([]string, [][]byte, error) { txResults := make([]ipldResult, 0) - if err := r.db.Select(&txResults, RetrieveTransactionsByBlockHashPgStr, hash.Hex()); err != nil { + if err := tx.Select(&txResults, RetrieveTransactionsByBlockHashPgStr, hash.Hex()); err != nil { return nil, nil, err } cids := make([]string, len(txResults)) @@ -470,9 +470,9 @@ func (r *IPLDRetriever) RetrieveReceiptsByTxHashes(hashes []common.Hash) ([]stri // RetrieveReceiptsByBlockHash returns the cids and rlp bytes for the receipts corresponding to the provided block hash. // cid returned corresponds to the leaf node data which contains the receipt. -func (r *IPLDRetriever) RetrieveReceiptsByBlockHash(hash common.Hash) ([]string, [][]byte, []common.Hash, error) { +func (r *IPLDRetriever) RetrieveReceiptsByBlockHash(tx *sqlx.Tx, hash common.Hash) ([]string, [][]byte, []common.Hash, error) { rctResults := make([]rctIpldResult, 0) - if err := r.db.Select(&rctResults, RetrieveReceiptsByBlockHashPgStr, hash.Hex()); err != nil { + if err := tx.Select(&rctResults, RetrieveReceiptsByBlockHashPgStr, hash.Hex()); err != nil { return nil, nil, nil, err } cids := make([]string, len(rctResults)) diff --git a/test/README.md b/test/README.md index a3b209c0..02c21b9d 100644 --- a/test/README.md +++ b/test/README.md @@ -4,16 +4,16 @@ - Clone [stack-orchestrator](https://github.com/vulcanize/stack-orchestrator), [ipld-eth-db](https://github.com/vulcanize/ipld-eth-db) [go-ethereum](https://github.com/vulcanize/go-ethereum) repositories. -- Checkout [v4 release](https://github.com/vulcanize/ipld-eth-db/releases/tag/v4.2.0-alpha) in ipld-eth-db repo. +- Checkout [v4 release](https://github.com/vulcanize/ipld-eth-db/releases/tag/v4.2.1-alpha) in ipld-eth-db repo. ```bash # In ipld-eth-db repo. - git checkout v4.2.0-alpha + git checkout v4.2.1-alpha ``` -- Checkout [v4 release](https://github.com/vulcanize/go-ethereum/releases/tag/v1.10.19-statediff-4.1.0-alpha) in go-ethereum repo. +- Checkout [v4 release](https://github.com/vulcanize/go-ethereum/releases/tag/v1.10.21-statediff-4.1.2-alpha) in go-ethereum repo. ```bash # In go-ethereum repo. - git checkout v1.10.19-statediff-4.1.0-alpha + git checkout v1.10.21-statediff-4.1.2-alpha ``` - Checkout working commit in stack-orchestrator repo. diff --git a/version/version.go b/version/version.go index b68e4e9f..d6541595 100644 --- a/version/version.go +++ b/version/version.go @@ -19,10 +19,10 @@ package version import "fmt" const ( - Major = 2 // Major version component of the current release - Minor = 0 // Minor version component of the current release - Patch = 0 // Patch version component of the current release - Meta = "" // Version metadata to append to the version string + Major = 4 // Major version component of the current release + Minor = 1 // Minor version component of the current release + Patch = 5 // Patch version component of the current release + Meta = "alpha" // Version metadata to append to the version string ) // Version holds the textual version string.