tutus-chain/pkg/config/ledger_config.go

98 lines
3.1 KiB
Go
Executable File

package config
import (
"errors"
"fmt"
"git.marketally.com/tutus-one/tutus-chain/pkg/util"
"gopkg.in/yaml.v3"
)
// Ledger contains core node-specific settings that are not
// a part of the ProtocolConfiguration (which is common for every node on the
// network).
type Ledger struct {
// GarbageCollectionPeriod sets the number of blocks to wait before
// starting the next MPT garbage collection cycle when RemoveUntraceableBlocks
// option is used.
GarbageCollectionPeriod uint32 `yaml:"GarbageCollectionPeriod"`
// KeepOnlyLatestState specifies if MPT should only store the latest state.
// If true, DB size will be smaller, but older roots won't be accessible.
// This value should remain the same for the same database.
KeepOnlyLatestState bool `yaml:"KeepOnlyLatestState"`
// RemoveUntraceableBlocks specifies if old data (blocks, headers,
// transactions, execution results, transfer logs and MPT data) should be
// removed.
RemoveUntraceableBlocks bool `yaml:"RemoveUntraceableBlocks"`
// SaveStorageBatch enables storage batch saving before every persist.
SaveStorageBatch bool `yaml:"SaveStorageBatch"`
// SkipBlockVerification allows to disable verification of received
// blocks (including cryptographic checks).
SkipBlockVerification bool `yaml:"SkipBlockVerification"`
// SaveInvocations enables smart contract invocation data saving.
SaveInvocations bool `yaml:"SaveInvocations"`
// TrustedHeader is an index/hash of header that can be used to start
// light node headers synchronisation from (without additional verification).
// It's valid iff RemoveUntraceableBlocks is enabled along with one of
// P2PStateExchangeExtensions or NeoFSStateSyncExtensions.
TrustedHeader HashIndex `yaml:"TrustedHeader"`
}
// HashIndex is a structure representing hash and index of block/header.
type HashIndex struct {
Hash util.Uint256
Index uint32
}
// Blockchain is a set of settings for core.Blockchain to use, it includes protocol
// settings and local node-specific ones.
type Blockchain struct {
ProtocolConfiguration
Ledger
NeoFSBlockFetcher
NeoFSStateFetcher
MempoolSubscriptionsEnabled bool
}
// Validate checks Ledger for internal consistency and returns an error if any
// invalid settings are found.
func (l Ledger) Validate() error {
if l.TrustedHeader.Index != 0 && !l.RemoveUntraceableBlocks {
return errors.New("TrustedHeader is set, but RemoveUntraceableBlocks is disabled")
}
return nil
}
// MarshalYAML implements the YAML marshaller interface.
func (h HashIndex) MarshalYAML() (any, error) {
var startSyncFrom = make(map[uint32]util.Uint256)
if h.Index != 0 {
startSyncFrom[h.Index] = h.Hash
}
return startSyncFrom, nil
}
// UnmarshalYAML implements the YAML Unmarshaler interface.
func (h *HashIndex) UnmarshalYAML(node *yaml.Node) error {
var aux map[uint32]util.Uint256
err := node.Decode(&aux)
if err != nil {
return err
}
if len(aux) > 1 {
return fmt.Errorf("only one trusted height is supported, got %d entries", len(aux))
}
if len(aux) > 0 {
for i, hh := range aux {
*h = HashIndex{
Hash: hh,
Index: i,
}
}
}
return nil
}