From 0df691e83eeab12430331a9cebe050dc69b9685b Mon Sep 17 00:00:00 2001
From: Blockchain Help <31084431+blockchainhelp@users.noreply.github.com>
Date: Tue, 18 Oct 2022 23:41:14 +0530
Subject: [PATCH] Add files via upload
---
batch.go | 74 ++++++++++++++++++++
database.go | 191 ++++++++++++++++++++++++++++++++++++++++++++++++++++
iterator.go | 61 +++++++++++++++++
snapshot.go | 41 +++++++++++
4 files changed, 367 insertions(+)
create mode 100644 batch.go
create mode 100644 database.go
create mode 100644 iterator.go
create mode 100644 snapshot.go
diff --git a/batch.go b/batch.go
new file mode 100644
index 0000000..541f40c
--- /dev/null
+++ b/batch.go
@@ -0,0 +1,74 @@
+// Copyright 2018 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it 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 go-ethereum library is distributed in the hope that it 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 .
+
+package ethdb
+
+// IdealBatchSize defines the size of the data batches should ideally add in one
+// write.
+const IdealBatchSize = 100 * 1024
+
+// Batch is a write-only database that commits changes to its host database
+// when Write is called. A batch cannot be used concurrently.
+type Batch interface {
+ KeyValueWriter
+
+ // ValueSize retrieves the amount of data queued up for writing.
+ ValueSize() int
+
+ // Write flushes any accumulated data to disk.
+ Write() error
+
+ // Reset resets the batch for reuse.
+ Reset()
+
+ // Replay replays the batch contents.
+ Replay(w KeyValueWriter) error
+}
+
+// Batcher wraps the NewBatch method of a backing data store.
+type Batcher interface {
+ // NewBatch creates a write-only database that buffers changes to its host db
+ // until a final write is called.
+ NewBatch() Batch
+
+ // NewBatchWithSize creates a write-only database batch with pre-allocated buffer.
+ NewBatchWithSize(size int) Batch
+}
+
+// HookedBatch wraps an arbitrary batch where each operation may be hooked into
+// to monitor from black box code.
+type HookedBatch struct {
+ Batch
+
+ OnPut func(key []byte, value []byte) // Callback if a key is inserted
+ OnDelete func(key []byte) // Callback if a key is deleted
+}
+
+// Put inserts the given value into the key-value data store.
+func (b HookedBatch) Put(key []byte, value []byte) error {
+ if b.OnPut != nil {
+ b.OnPut(key, value)
+ }
+ return b.Batch.Put(key, value)
+}
+
+// Delete removes the key from the key-value data store.
+func (b HookedBatch) Delete(key []byte) error {
+ if b.OnDelete != nil {
+ b.OnDelete(key)
+ }
+ return b.Batch.Delete(key)
+}
diff --git a/database.go b/database.go
new file mode 100644
index 0000000..361218f
--- /dev/null
+++ b/database.go
@@ -0,0 +1,191 @@
+// Copyright 2014 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it 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 go-ethereum library is distributed in the hope that it 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 .
+
+// Package ethdb defines the interfaces for an Ethereum data store.
+package ethdb
+
+import "io"
+
+// KeyValueReader wraps the Has and Get method of a backing data store.
+type KeyValueReader interface {
+ // Has retrieves if a key is present in the key-value data store.
+ Has(key []byte) (bool, error)
+
+ // Get retrieves the given key if it's present in the key-value data store.
+ Get(key []byte) ([]byte, error)
+}
+
+// KeyValueWriter wraps the Put method of a backing data store.
+type KeyValueWriter interface {
+ // Put inserts the given value into the key-value data store.
+ Put(key []byte, value []byte) error
+
+ // Delete removes the key from the key-value data store.
+ Delete(key []byte) error
+}
+
+// KeyValueStater wraps the Stat method of a backing data store.
+type KeyValueStater interface {
+ // Stat returns a particular internal stat of the database.
+ Stat(property string) (string, error)
+}
+
+// Compacter wraps the Compact method of a backing data store.
+type Compacter interface {
+ // Compact flattens the underlying data store for the given key range. In essence,
+ // deleted and overwritten versions are discarded, and the data is rearranged to
+ // reduce the cost of operations needed to access them.
+ //
+ // A nil start is treated as a key before all keys in the data store; a nil limit
+ // is treated as a key after all keys in the data store. If both is nil then it
+ // will compact entire data store.
+ Compact(start []byte, limit []byte) error
+}
+
+// KeyValueStore contains all the methods required to allow handling different
+// key-value data stores backing the high level database.
+type KeyValueStore interface {
+ KeyValueReader
+ KeyValueWriter
+ KeyValueStater
+ Batcher
+ Iteratee
+ Compacter
+ Snapshotter
+ io.Closer
+}
+
+// AncientReaderOp contains the methods required to read from immutable ancient data.
+type AncientReaderOp interface {
+ // HasAncient returns an indicator whether the specified data exists in the
+ // ancient store.
+ HasAncient(kind string, number uint64) (bool, error)
+
+ // Ancient retrieves an ancient binary blob from the append-only immutable files.
+ Ancient(kind string, number uint64) ([]byte, error)
+
+ // AncientRange retrieves multiple items in sequence, starting from the index 'start'.
+ // It will return
+ // - at most 'count' items,
+ // - at least 1 item (even if exceeding the maxBytes), but will otherwise
+ // return as many items as fit into maxBytes.
+ AncientRange(kind string, start, count, maxBytes uint64) ([][]byte, error)
+
+ // Ancients returns the ancient item numbers in the ancient store.
+ Ancients() (uint64, error)
+
+ // Tail returns the number of first stored item in the freezer.
+ // This number can also be interpreted as the total deleted item numbers.
+ Tail() (uint64, error)
+
+ // AncientSize returns the ancient size of the specified category.
+ AncientSize(kind string) (uint64, error)
+}
+
+// AncientReader is the extended ancient reader interface including 'batched' or 'atomic' reading.
+type AncientReader interface {
+ AncientReaderOp
+
+ // ReadAncients runs the given read operation while ensuring that no writes take place
+ // on the underlying freezer.
+ ReadAncients(fn func(AncientReaderOp) error) (err error)
+}
+
+// AncientWriter contains the methods required to write to immutable ancient data.
+type AncientWriter interface {
+ // ModifyAncients runs a write operation on the ancient store.
+ // If the function returns an error, any changes to the underlying store are reverted.
+ // The integer return value is the total size of the written data.
+ ModifyAncients(func(AncientWriteOp) error) (int64, error)
+
+ // TruncateHead discards all but the first n ancient data from the ancient store.
+ // After the truncation, the latest item can be accessed it item_n-1(start from 0).
+ TruncateHead(n uint64) error
+
+ // TruncateTail discards the first n ancient data from the ancient store. The already
+ // deleted items are ignored. After the truncation, the earliest item can be accessed
+ // is item_n(start from 0). The deleted items may not be removed from the ancient store
+ // immediately, but only when the accumulated deleted data reach the threshold then
+ // will be removed all together.
+ TruncateTail(n uint64) error
+
+ // Sync flushes all in-memory ancient store data to disk.
+ Sync() error
+
+ // MigrateTable processes and migrates entries of a given table to a new format.
+ // The second argument is a function that takes a raw entry and returns it
+ // in the newest format.
+ MigrateTable(string, func([]byte) ([]byte, error)) error
+}
+
+// AncientWriteOp is given to the function argument of ModifyAncients.
+type AncientWriteOp interface {
+ // Append adds an RLP-encoded item.
+ Append(kind string, number uint64, item interface{}) error
+
+ // AppendRaw adds an item without RLP-encoding it.
+ AppendRaw(kind string, number uint64, item []byte) error
+}
+
+// AncientStater wraps the Stat method of a backing data store.
+type AncientStater interface {
+ // AncientDatadir returns the path of root ancient directory. Empty string
+ // will be returned if ancient store is not enabled at all. The returned
+ // path can be used to construct the path of other freezers.
+ AncientDatadir() (string, error)
+}
+
+// Reader contains the methods required to read data from both key-value as well as
+// immutable ancient data.
+type Reader interface {
+ KeyValueReader
+ AncientReader
+}
+
+// Writer contains the methods required to write data to both key-value as well as
+// immutable ancient data.
+type Writer interface {
+ KeyValueWriter
+ AncientWriter
+}
+
+// Stater contains the methods required to retrieve states from both key-value as well as
+// immutable ancient data.
+type Stater interface {
+ KeyValueStater
+ AncientStater
+}
+
+// AncientStore contains all the methods required to allow handling different
+// ancient data stores backing immutable chain data store.
+type AncientStore interface {
+ AncientReader
+ AncientWriter
+ io.Closer
+}
+
+// Database contains all the methods required by the high level database to not
+// only access the key-value data store but also the chain freezer.
+type Database interface {
+ Reader
+ Writer
+ Batcher
+ Iteratee
+ Stater
+ Compacter
+ Snapshotter
+ io.Closer
+}
diff --git a/iterator.go b/iterator.go
new file mode 100644
index 0000000..2b49c93
--- /dev/null
+++ b/iterator.go
@@ -0,0 +1,61 @@
+// Copyright 2018 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it 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 go-ethereum library is distributed in the hope that it 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 .
+
+package ethdb
+
+// Iterator iterates over a database's key/value pairs in ascending key order.
+//
+// When it encounters an error any seek will return false and will yield no key/
+// value pairs. The error can be queried by calling the Error method. Calling
+// Release is still necessary.
+//
+// An iterator must be released after use, but it is not necessary to read an
+// iterator until exhaustion. An iterator is not safe for concurrent use, but it
+// is safe to use multiple iterators concurrently.
+type Iterator interface {
+ // Next moves the iterator to the next key/value pair. It returns whether the
+ // iterator is exhausted.
+ Next() bool
+
+ // Error returns any accumulated error. Exhausting all the key/value pairs
+ // is not considered to be an error.
+ Error() error
+
+ // Key returns the key of the current key/value pair, or nil if done. The caller
+ // should not modify the contents of the returned slice, and its contents may
+ // change on the next call to Next.
+ Key() []byte
+
+ // Value returns the value of the current key/value pair, or nil if done. The
+ // caller should not modify the contents of the returned slice, and its contents
+ // may change on the next call to Next.
+ Value() []byte
+
+ // Release releases associated resources. Release should always succeed and can
+ // be called multiple times without causing error.
+ Release()
+}
+
+// Iteratee wraps the NewIterator methods of a backing data store.
+type Iteratee interface {
+ // NewIterator creates a binary-alphabetical iterator over a subset
+ // of database content with a particular key prefix, starting at a particular
+ // initial key (or after, if it does not exist).
+ //
+ // Note: This method assumes that the prefix is NOT part of the start, so there's
+ // no need for the caller to prepend the prefix to the start
+ NewIterator(prefix []byte, start []byte) Iterator
+}
diff --git a/snapshot.go b/snapshot.go
new file mode 100644
index 0000000..03b7794
--- /dev/null
+++ b/snapshot.go
@@ -0,0 +1,41 @@
+// Copyright 2022 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it 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 go-ethereum library is distributed in the hope that it 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 .
+
+package ethdb
+
+type Snapshot interface {
+ // Has retrieves if a key is present in the snapshot backing by a key-value
+ // data store.
+ Has(key []byte) (bool, error)
+
+ // Get retrieves the given key if it's present in the snapshot backing by
+ // key-value data store.
+ Get(key []byte) ([]byte, error)
+
+ // Release releases associated resources. Release should always succeed and can
+ // be called multiple times without causing error.
+ Release()
+}
+
+// Snapshotter wraps the Snapshot method of a backing data store.
+type Snapshotter interface {
+ // NewSnapshot creates a database snapshot based on the current state.
+ // The created snapshot will not be affected by all following mutations
+ // happened on the database.
+ // Note don't forget to release the snapshot once it's used up, otherwise
+ // the stale data will never be cleaned up by the underlying compactor.
+ NewSnapshot() (Snapshot, error)
+}