mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-06-22 14:44:30 +00:00
## Why this should be merged Allows for a drop-in replacement of `snapshot.Tree` (i.e. one that uses block hashes instead of state roots). This is intended as a temporary solution while we investigate having the state root affected by the block hash to remove path ambiguity. ## How this works Introduction of: 1. `state.SnapshotTree` interface to match methods required on `snapshot.Tree` as used by `state.StateDB`; and 2. `stateconf` package for variadic options plumbed by `StateDB.Commit()` through to `SnapshotTree.Update()`. Although variadic (to maintain function call-signature compatibility) only the `stateconf.WithUpdatePayload(any)` is expected to be used. Recipients of the options can access the payload with `stateconf.ExtractUpdatePayload()`. ## How this was tested Unit test demonstrating propagation of `stateconf.UpdateOption` payload.
45 lines
1.8 KiB
Go
45 lines
1.8 KiB
Go
// Copyright 2024 the libevm authors.
|
|
//
|
|
// The libevm additions to go-ethereum are free software: you can redistribute
|
|
// them and/or modify them under the terms of the GNU Lesser General Public License
|
|
// as published by the Free Software Foundation, either version 3 of the License,
|
|
// or (at your option) any later version.
|
|
//
|
|
// The libevm additions are distributed in the hope that they will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
|
|
// General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
// along with the go-ethereum library. If not, see
|
|
// <http://www.gnu.org/licenses/>.
|
|
|
|
// Package stateconf configures state management.
|
|
package stateconf
|
|
|
|
import "github.com/ava-labs/libevm/libevm/options"
|
|
|
|
// A SnapshotUpdateOption configures the behaviour of
|
|
// state.SnapshotTree.Update() implementations. This will be removed along with
|
|
// state.SnapshotTree.
|
|
type SnapshotUpdateOption = options.Option[snapshotUpdateConfig]
|
|
|
|
type snapshotUpdateConfig struct {
|
|
payload any
|
|
}
|
|
|
|
// WithUpdatePayload returns a SnapshotUpdateOption carrying an arbitrary
|
|
// payload. It acts only as a carrier to exploit existing function plumbing and
|
|
// the effect on behaviour is left to the implementation receiving it.
|
|
func WithUpdatePayload(p any) SnapshotUpdateOption {
|
|
return options.Func[snapshotUpdateConfig](func(c *snapshotUpdateConfig) {
|
|
c.payload = p
|
|
})
|
|
}
|
|
|
|
// ExtractUpdatePayload returns the payload carried by a [WithUpdatePayload]
|
|
// option. Only one such option can be used at once; behaviour is otherwise
|
|
// undefined.
|
|
func ExtractUpdatePayload(opts ...SnapshotUpdateOption) any {
|
|
return options.As(opts...).payload
|
|
}
|