plugeth/core/rawdb/plugin_hooks.go
2022-08-22 10:48:40 -07:00

121 lines
3.1 KiB
Go

package rawdb
import (
"github.com/ethereum/go-ethereum/plugins"
"github.com/ethereum/go-ethereum/log"
// "github.com/ethereum/go-ethereum/rlp"
"sync"
)
var (
freezerUpdates map[uint64]map[string]interface{}
lock sync.Mutex
)
func PluginTrackUpdate(num uint64, kind string, value interface{}) {
lock.Lock()
defer lock.Unlock()
if freezerUpdates == nil { freezerUpdates = make(map[uint64]map[string]interface{}) }
update, ok := freezerUpdates[num]
if !ok {
update = make(map[string]interface{})
freezerUpdates[num] = update
}
update[kind] = value
}
func pluginCommitUpdate(num uint64) {
if plugins.DefaultPluginLoader == nil {
log.Warn("Attempting CommitUpdate, but default PluginLoader has not been initialized")
return
}
PluginCommitUpdate(plugins.DefaultPluginLoader, num)
}
func PluginCommitUpdate(pl *plugins.PluginLoader, num uint64) {
lock.Lock()
defer lock.Unlock()
if freezerUpdates == nil { freezerUpdates = make(map[uint64]map[string]interface{}) }
min := ^uint64(0)
for i := range freezerUpdates{
if min > i { min = i }
}
for i := min ; i < num; i++ {
update, ok := freezerUpdates[i]
defer func(i uint64) { delete(freezerUpdates, i) }(i)
if !ok {
log.Warn("Attempting to commit untracked block", "num", i)
continue
}
fnList := pl.Lookup("ModifyAncients", func(item interface{}) bool {
_, ok := item.(func(uint64, map[string]interface{}))
return ok
})
for _, fni := range fnList {
if fn, ok := fni.(func(uint64, map[string]interface{})); ok {
fn(i, update)
}
}
_ = pl.Lookup("AppendAncient", func(item interface{}) bool {
_, ok := item.(func(number uint64, hash, header, body, receipts, td []byte))
if ok { log.Warn("PlugEth's AppendAncient is deprecated. Please update to ModifyAncients.") }
return ok
})
// if len(appendAncientFnList) > 0 {
// var (
// hash []byte
// header []byte
// body []byte
// receipts []byte
// td []byte
// )
// if hashi, ok := update[freezerHashTable]; ok {
// switch v := hashi.(type) {
// case []byte:
// hash = v
// default:
// hash, _ = rlp.EncodeToBytes(v)
// }
// }
// if headeri, ok := update[freezerHeaderTable]; ok {
// switch v := headeri.(type) {
// case []byte:
// header = v
// default:
// header, _ = rlp.EncodeToBytes(v)
// }
// }
// if bodyi, ok := update[freezerBodiesTable]; ok {
// switch v := bodyi.(type) {
// case []byte:
// body = v
// default:
// body, _ = rlp.EncodeToBytes(v)
// }
// }
// if receiptsi, ok := update[freezerReceiptTable]; ok {
// switch v := receiptsi.(type) {
// case []byte:
// receipts = v
// default:
// receipts, _ = rlp.EncodeToBytes(v)
// }
// }
// if tdi, ok := update[freezerDifficultyTable]; ok {
// switch v := tdi.(type) {
// case []byte:
// td = v
// default:
// td, _ = rlp.EncodeToBytes(v)
// }
// }
// for _, fni := range appendAncientFnList {
// if fn, ok := fni.(func(number uint64, hash, header, body, receipts, td []byte)); ok {
// fn(i, hash, header, body, receipts, td)
// }
// }
// }
}
}