aboutsummaryrefslogtreecommitdiffstats
path: root/core/rawdb
diff options
context:
space:
mode:
authorSonic <sonic@dexon.org>2019-04-24 16:24:20 +0800
committerWei-Ning Huang <w@dexon.org>2019-04-24 16:24:20 +0800
commit32567bdc508391842c97b62abf446987d9827152 (patch)
tree24bfd6f39640a14e833df8170a173fde7c3ee17c /core/rawdb
parente4485257292734e22b3844089a3e03393f9eec7f (diff)
downloaddexon-32567bdc508391842c97b62abf446987d9827152.tar
dexon-32567bdc508391842c97b62abf446987d9827152.tar.gz
dexon-32567bdc508391842c97b62abf446987d9827152.tar.bz2
dexon-32567bdc508391842c97b62abf446987d9827152.tar.lz
dexon-32567bdc508391842c97b62abf446987d9827152.tar.xz
dexon-32567bdc508391842c97b62abf446987d9827152.tar.zst
dexon-32567bdc508391842c97b62abf446987d9827152.zip
core, rawdb, dex: improve gov state for syncing (#393)
* core, rawdb, dex: improve gov state for syncing
Diffstat (limited to 'core/rawdb')
-rw-r--r--core/rawdb/accessors_chain.go47
-rw-r--r--core/rawdb/schema.go6
2 files changed, 53 insertions, 0 deletions
diff --git a/core/rawdb/accessors_chain.go b/core/rawdb/accessors_chain.go
index 801ad9362..41a79b21d 100644
--- a/core/rawdb/accessors_chain.go
+++ b/core/rawdb/accessors_chain.go
@@ -20,6 +20,7 @@ import (
"bytes"
"encoding/binary"
"math/big"
+ "time"
"github.com/dexon-foundation/dexon/common"
"github.com/dexon-foundation/dexon/core/types"
@@ -382,3 +383,49 @@ func FindCommonAncestor(db DatabaseReader, a, b *types.Header) *types.Header {
}
return a
}
+
+// ReadGovStateRLP retrieves
+func ReadGovStateRLP(db DatabaseReader, hash common.Hash) rlp.RawValue {
+ data, _ := db.Get(govStateKey(hash))
+ return data
+}
+
+// WriteGovStateRLP
+func WriteGovStateRLP(db DatabaseWriter, hash common.Hash, rlp rlp.RawValue) {
+ if err := db.Put(govStateKey(hash), rlp); err != nil {
+ log.Crit("Failed to store gov state", "err", err)
+ }
+}
+
+// ReadGovState
+func ReadGovState(db DatabaseReader, hash common.Hash) *types.GovState {
+ data := ReadGovStateRLP(db, hash)
+ if len(data) == 0 {
+ return nil
+ }
+ govState := new(types.GovState)
+ if err := rlp.Decode(bytes.NewReader(data), govState); err != nil {
+ log.Error("Invalid gov state RLP", "hash", hash, "err", err)
+ return nil
+ }
+ return govState
+}
+
+// WriteGovState
+func WriteGovState(db DatabaseWriter, hash common.Hash, govState *types.GovState) {
+ t := time.Now()
+ log.Debug("Rawdb WriteGovState", "t", t)
+ data, err := rlp.EncodeToBytes(govState)
+ if err != nil {
+ log.Crit("Failed to RLP encode gov state", "err", err)
+ }
+ log.Debug("Rawdb WriteGovState", "len", len(data), "elapsed", time.Since(t))
+ WriteGovStateRLP(db, hash, data)
+}
+
+// DeleteGovState
+func DeleteGovState(db DatabaseDeleter, hash common.Hash) {
+ if err := db.Delete(govStateKey(hash)); err != nil {
+ log.Crit("Failed to delete gov satate", "err", err)
+ }
+}
diff --git a/core/rawdb/schema.go b/core/rawdb/schema.go
index 8ca47676d..5b92891df 100644
--- a/core/rawdb/schema.go
+++ b/core/rawdb/schema.go
@@ -50,6 +50,8 @@ var (
blockBodyPrefix = []byte("b") // blockBodyPrefix + num (uint64 big endian) + hash -> block body
blockReceiptsPrefix = []byte("r") // blockReceiptsPrefix + num (uint64 big endian) + hash -> block receipts
+ govStatePrefix = []byte("g")
+
txLookupPrefix = []byte("l") // txLookupPrefix + hash -> transaction/receipt lookup metadata
bloomBitsPrefix = []byte("B") // bloomBitsPrefix + bit (uint16 big endian) + section (uint64 big endian) + hash -> bloom bits
@@ -118,6 +120,10 @@ func txLookupKey(hash common.Hash) []byte {
return append(txLookupPrefix, hash.Bytes()...)
}
+func govStateKey(hash common.Hash) []byte {
+ return append(govStatePrefix, hash.Bytes()...)
+}
+
// coreBlockKey = coreBlockPrefix + hash
func coreBlockKey(hash common.Hash) []byte {
return append(coreBlockPrefix, hash.Bytes()...)