Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Block info tree optimizations2 #820

Merged
merged 4 commits into from
Jul 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions core/genesis_write.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,12 @@ import (
"sync"

"github.com/c2h5oh/datasize"
"github.com/holiman/uint256"
erigonchain "github.com/gateway-fm/cdk-erigon-lib/chain"
libcommon "github.com/gateway-fm/cdk-erigon-lib/common"
"github.com/gateway-fm/cdk-erigon-lib/kv"
"github.com/gateway-fm/cdk-erigon-lib/kv/mdbx"
"github.com/gateway-fm/cdk-erigon-lib/kv/rawdbv3"
"github.com/holiman/uint256"
"github.com/ledgerwatch/erigon/chain"
"github.com/ledgerwatch/log/v3"

Expand All @@ -49,8 +49,8 @@ import (
"github.com/ledgerwatch/erigon/eth/ethconfig"
"github.com/ledgerwatch/erigon/params"
"github.com/ledgerwatch/erigon/params/networkname"
"github.com/ledgerwatch/erigon/smt/pkg/smt"
eridb "github.com/ledgerwatch/erigon/smt/pkg/db"
"github.com/ledgerwatch/erigon/smt/pkg/smt"
"golang.org/x/exp/slices"
)

Expand Down Expand Up @@ -525,7 +525,7 @@ func GenesisToBlock(g *types.Genesis, tmpDir string) (*types.Block, *state.Intra
wg.Add(1)
var err error
sparseDb := eridb.NewMemDb()
sparseTree := smt.NewSMT(sparseDb)
sparseTree := smt.NewSMT(sparseDb, false)
go func() { // we may run inside write tx, can't open 2nd write tx in same goroutine
// TODO(yperbasis): use memdb.MemoryMutation instead
defer wg.Done()
Expand Down
48 changes: 9 additions & 39 deletions smt/pkg/blockinfo/block_info.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ type BlockInfoTree struct {

func NewBlockInfoTree() *BlockInfoTree {
return &BlockInfoTree{
smt: smt.NewSMT(nil),
smt: smt.NewSMT(nil, true),
}
}
func (b *BlockInfoTree) GetRoot() *big.Int {
Expand Down Expand Up @@ -147,83 +147,56 @@ func (b *BlockInfoTree) GenerateBlockHeader(oldBlockHash *common.Hash, coinbase
}

func generateL2BlockHash(blockHash *common.Hash) (key *utils.NodeKey, value *utils.NodeValue8, err error) {
if key, err = KeyBlockHeaderParams(big.NewInt(IndexBlockHeaderParamBlockHash)); err != nil {
return nil, nil, err
}
if value, err = bigInt2NodeVal8(blockHash.Big()); err != nil {
return nil, nil, err
}
return key, value, nil
return &BlockHeaderBlockHashKey, value, nil
}

func generateCoinbase(coinbase *common.Address) (key *utils.NodeKey, value *utils.NodeValue8, err error) {
if key, err = KeyBlockHeaderParams(big.NewInt(IndexBlockHeaderParamCoinbase)); err != nil {
return nil, nil, err
}

if value, err = bigInt2NodeVal8(coinbase.Hash().Big()); err != nil {
return nil, nil, err
}

return key, value, nil
return &BlockHeaderCoinbaseKey, value, nil
}

func generateGasLimit(gasLimit uint64) (key *utils.NodeKey, value *utils.NodeValue8, err error) {
if key, err = KeyBlockHeaderParams(big.NewInt(IndexBlockHeaderParamGasLimit)); err != nil {
return nil, nil, err
}

if value, err = bigInt2NodeVal8(big.NewInt(0).SetUint64(gasLimit)); err != nil {
return nil, nil, err
}
return key, value, nil
return &BlockHeaderGasLimitKey, value, nil
}

func generateBlockNumber(blockNumber uint64) (key *utils.NodeKey, value *utils.NodeValue8, err error) {
if key, err = KeyBlockHeaderParams(big.NewInt(IndexBlockHeaderParamNumber)); err != nil {
return nil, nil, err
}

if value, err = bigInt2NodeVal8(big.NewInt(0).SetUint64(blockNumber)); err != nil {
return nil, nil, err
}
return key, value, nil
return &BlockHeaderNumberKey, value, nil
}

func generateTimestamp(timestamp uint64) (key *utils.NodeKey, value *utils.NodeValue8, err error) {
if key, err = KeyBlockHeaderParams(big.NewInt(IndexBlockHeaderParamTimestamp)); err != nil {
return nil, nil, err
}

if value, err = bigInt2NodeVal8(big.NewInt(0).SetUint64(timestamp)); err != nil {
return nil, nil, err
}

return key, value, nil
return &BlockHeaderTimestampKey, value, nil
}

func generateGer(ger *common.Hash) (key *utils.NodeKey, value *utils.NodeValue8, err error) {
if key, err = KeyBlockHeaderParams(big.NewInt(IndexBlockHeaderParamGer)); err != nil {
return nil, nil, err
}

if value, err = bigInt2NodeVal8(ger.Big()); err != nil {
return nil, nil, err
}

return key, value, nil
return &BlockHeaderGerKey, value, nil
}

func generateL1BlockHash(blockHash *common.Hash) (key *utils.NodeKey, value *utils.NodeValue8, err error) {
if key, err = KeyBlockHeaderParams(big.NewInt(IndexBlockHeaderParamBlockHashL1)); err != nil {
return nil, nil, err
}

if value, err = bigInt2NodeVal8(blockHash.Big()); err != nil {
return nil, nil, err
}

return key, value, nil
return &BlockHeaderBlockHashL1Key, value, nil
}

func bigInt2NodeVal8(val *big.Int) (*utils.NodeValue8, error) {
Expand Down Expand Up @@ -291,15 +264,12 @@ func generateTxEffectivePercentage(txIndex, effectivePercentage *big.Int) (key *
}

func generateBlockGasUsed(gasUsed uint64) (key *utils.NodeKey, value *utils.NodeValue8, err error) {
if key, err = KeyBlockHeaderParams(big.NewInt(IndexBlockHeaderParamGasUsed)); err != nil {
return nil, nil, err
}
gasUsedBig := big.NewInt(0).SetUint64(gasUsed)
if value, err = bigInt2NodeVal8(gasUsedBig); err != nil {
return nil, nil, err
}

return key, value, nil
return &BlockHeaderGasUsedKey, value, nil
}

func (b *BlockInfoTree) GenerateBlockTxKeysVals(
Expand Down
24 changes: 12 additions & 12 deletions smt/pkg/blockinfo/block_info_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ func TestSetL2BlockHash(t *testing.T) {
if err != nil {
t.Fatal(err)
}
smt := smt.NewSMT(nil)
smt := smt.NewSMT(nil, true)

root, err2 := smt.InsertKA(*key, smtutils.NodeValue8ToBigInt(val))
if err2 != nil {
Expand All @@ -314,7 +314,7 @@ func TestSetCoinbase(t *testing.T) {
}

for i, test := range tests {
smt := smt.NewSMT(nil)
smt := smt.NewSMT(nil, true)
coinbaseAddress := common.HexToAddress(test.coinbaseAddress)

key, val, err := generateCoinbase(&coinbaseAddress)
Expand Down Expand Up @@ -348,7 +348,7 @@ func TestSetBlockNumber(t *testing.T) {
}

for i, test := range tests {
smt := smt.NewSMT(nil)
smt := smt.NewSMT(nil, true)

key, val, err := generateBlockNumber(test.blockNum)
if err != nil {
Expand Down Expand Up @@ -379,7 +379,7 @@ func TestSetGasLimit(t *testing.T) {
}

for i, test := range tests {
smt := smt.NewSMT(nil)
smt := smt.NewSMT(nil, true)

key, val, err := generateGasLimit(test.gasLimit)
if err != nil {
Expand Down Expand Up @@ -410,7 +410,7 @@ func TestSetTimestamp(t *testing.T) {
}

for i, test := range tests {
smt := smt.NewSMT(nil)
smt := smt.NewSMT(nil, true)

key, val, err := generateTimestamp(test.timestamp)
if err != nil {
Expand Down Expand Up @@ -447,7 +447,7 @@ func TestSetGer(t *testing.T) {
}

for i, test := range tests {
smt := smt.NewSMT(nil)
smt := smt.NewSMT(nil, true)
ger := common.HexToHash(test.ger)

key, val, err := generateGer(&ger)
Expand Down Expand Up @@ -485,7 +485,7 @@ func TestSetL1BlockHash(t *testing.T) {
}

for i, test := range tests {
smt := smt.NewSMT(nil)
smt := smt.NewSMT(nil, true)
l1BlockHash := common.HexToHash(test.l1BlockHash)

key, val, err := generateL1BlockHash(&l1BlockHash)
Expand All @@ -506,7 +506,7 @@ func TestSetL1BlockHash(t *testing.T) {
}

func TestSetL2TxHash(t *testing.T) {
smt := smt.NewSMT(nil)
smt := smt.NewSMT(nil, true)
txIndex := big.NewInt(1)
l2TxHash := common.HexToHash("0x000000000000000000000000000000005Ca1aB1E").Big()

Expand All @@ -529,7 +529,7 @@ func TestSetL2TxHash(t *testing.T) {
}

func TestSetTxStatus(t *testing.T) {
smt := smt.NewSMT(nil)
smt := smt.NewSMT(nil, true)
txIndex := big.NewInt(1)
status := common.HexToHash("0x000000000000000000000000000000005Ca1aB1E").Big()

Expand All @@ -552,7 +552,7 @@ func TestSetTxStatus(t *testing.T) {
}

func TestSetCumulativeGasUsed(t *testing.T) {
smt := smt.NewSMT(nil)
smt := smt.NewSMT(nil, true)
txIndex := big.NewInt(1)
cgu := common.HexToHash("0x000000000000000000000000000000005Ca1aB1E").Big()

Expand All @@ -576,7 +576,7 @@ func TestSetCumulativeGasUsed(t *testing.T) {
}

func TestSetTxEffectivePercentage(t *testing.T) {
smt := smt.NewSMT(nil)
smt := smt.NewSMT(nil, true)
txIndex := big.NewInt(1)
egp := common.HexToHash("0x000000000000000000000000000000005Ca1aB1E").Big()

Expand All @@ -600,7 +600,7 @@ func TestSetTxEffectivePercentage(t *testing.T) {
}

func TestSetTxLogs(t *testing.T) {
smt := smt.NewSMT(nil)
smt := smt.NewSMT(nil, true)
txIndex := big.NewInt(1)
logIndex := big.NewInt(1)
log := common.HexToHash("0x000000000000000000000000000000005Ca1aB1E").Big()
Expand Down
12 changes: 12 additions & 0 deletions smt/pkg/blockinfo/keys.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,18 @@ const IndexBlockHeaderParamGer = 5
const IndexBlockHeaderParamBlockHashL1 = 6
const IndexBlockHeaderParamGasUsed = 7

// generated by KeyBlockHeaderParams so we don't calculate them every time
var (
BlockHeaderBlockHashKey = utils.NodeKey{17540094328570681229, 15492539097581145461, 7686481670809850401, 16577991319572125169}
BlockHeaderCoinbaseKey = utils.NodeKey{13866806033333411216, 11510953292839890698, 8274877395843603978, 9372332419316597113}
BlockHeaderNumberKey = utils.NodeKey{6024064788222257862, 13049342112699253445, 12127984136733687200, 8398043461199794462}
BlockHeaderGasLimitKey = utils.NodeKey{5319681466197319121, 14057433120745733551, 5638531288094714593, 17204828339478940337}
BlockHeaderTimestampKey = utils.NodeKey{7890158832167317866, 11032486557242372179, 9653801891436451408, 2062577087515942703}
BlockHeaderGerKey = utils.NodeKey{16031278424721309229, 4132999715765882778, 6388713709192801251, 10826219431775251904}
BlockHeaderBlockHashL1Key = utils.NodeKey{5354929451503733866, 3129555839551084896, 2132809659008379950, 8230742270813566472}
BlockHeaderGasUsedKey = utils.NodeKey{8577769200631379655, 8682051454686970557, 5016656739138242322, 16717481432904730287}
)

// SMT block header constant keys
const IndexBlockHeaderParam = 7
const IndexBlockHeaderTransactionHash = 8
Expand Down
15 changes: 15 additions & 0 deletions smt/pkg/blockinfo/keys_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,44 +11,58 @@ import (
func TestKeyBlockHeaderParams(t *testing.T) {
scenarios := map[string]struct {
param *big.Int
constKey utils.NodeKey
expected utils.NodeKey
shouldFail bool
}{
"KeyBlockHash": {
param: big.NewInt(IndexBlockHeaderParamBlockHash),
constKey: BlockHeaderBlockHashKey,
expected: utils.NodeKey{17540094328570681229, 15492539097581145461, 7686481670809850401, 16577991319572125169},
shouldFail: false,
},
"KeyCoinbase": {
param: big.NewInt(IndexBlockHeaderParamCoinbase),
constKey: BlockHeaderCoinbaseKey,
expected: utils.NodeKey{13866806033333411216, 11510953292839890698, 8274877395843603978, 9372332419316597113},
shouldFail: false,
},
"KeyBlockNumber": {
param: big.NewInt(IndexBlockHeaderParamNumber),
constKey: BlockHeaderNumberKey,
expected: utils.NodeKey{6024064788222257862, 13049342112699253445, 12127984136733687200, 8398043461199794462},
shouldFail: false,
},
"KeyGasLimit": {
param: big.NewInt(IndexBlockHeaderParamGasLimit),
constKey: BlockHeaderGasLimitKey,
expected: utils.NodeKey{5319681466197319121, 14057433120745733551, 5638531288094714593, 17204828339478940337},
shouldFail: false,
},
"KeyTimestamp": {
param: big.NewInt(IndexBlockHeaderParamTimestamp),
constKey: BlockHeaderTimestampKey,
expected: utils.NodeKey{7890158832167317866, 11032486557242372179, 9653801891436451408, 2062577087515942703},
shouldFail: false,
},
"KeyGer": {
param: big.NewInt(IndexBlockHeaderParamGer),
constKey: BlockHeaderGerKey,
expected: utils.NodeKey{16031278424721309229, 4132999715765882778, 6388713709192801251, 10826219431775251904},
shouldFail: false,
},
"KeyBlockHashL1": {
param: big.NewInt(IndexBlockHeaderParamBlockHashL1),
constKey: BlockHeaderBlockHashL1Key,
expected: utils.NodeKey{5354929451503733866, 3129555839551084896, 2132809659008379950, 8230742270813566472},
shouldFail: false,
},
"KeyGasUsed": {
param: big.NewInt(IndexBlockHeaderParamGasUsed),
constKey: BlockHeaderGasUsedKey,
expected: utils.NodeKey{8577769200631379655, 8682051454686970557, 5016656739138242322, 16717481432904730287},
shouldFail: false,
},
"NilKey": {
param: nil,
expected: utils.NodeKey{},
Expand All @@ -64,6 +78,7 @@ func TestKeyBlockHeaderParams(t *testing.T) {
} else {
assert.NoError(t, err)
assert.Equal(t, scenario.expected, *val)
assert.Equal(t, scenario.constKey, *val)
}
})
}
Expand Down
12 changes: 6 additions & 6 deletions smt/pkg/smt/entity_storage_mdbx_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ func TestSMT_Mdbx_AddRemove1Element(t *testing.T) {
}
//defer dbi.Close()

s := NewSMT(sdb)
s := NewSMT(sdb, false)

r, _ := s.InsertBI(big.NewInt(1), big.NewInt(2))
if r.Mode != "insertNotFound" {
Expand All @@ -50,7 +50,7 @@ func TestSMT_Mdbx_AddRemove3Elements(t *testing.T) {
t.Errorf("Failed to create temp db: %v", err)
}

s := NewSMT(sdb)
s := NewSMT(sdb, false)
N := 3
var r *SMTResponse

Expand Down Expand Up @@ -82,7 +82,7 @@ func TestSMT_Mdbx_AddRemove128Elements(t *testing.T) {
t.Errorf("Failed to create temp db: %v", err)
}

s := NewSMT(sdb)
s := NewSMT(sdb, false)
N := 128
var r *SMTResponse

Expand Down Expand Up @@ -163,7 +163,7 @@ func TestSMT_Mdbx_MultipleInsert(t *testing.T) {
tr = x
}

s := NewSMT(sdb)
s := NewSMT(sdb, false)

s.SetLastRoot(tr)
r, err := s.InsertBI(testCase.key, testCase.value)
Expand Down Expand Up @@ -217,7 +217,7 @@ func runGenesisTestMdbx(tb testing.TB, filename string) {
tb.Fatal("Failed to create db buckets: ", err)
}

smt := NewSMT(sdb)
smt := NewSMT(sdb, false)

for _, addr := range genesis.Genesis {
fmt.Println(addr.ContractName)
Expand Down Expand Up @@ -275,7 +275,7 @@ func runTestVectorsMdbx(t *testing.T, filename string) {

for k, tc := range testCases {
t.Run(strconv.Itoa(k), func(t *testing.T) {
smt := NewSMT(nil)
smt := NewSMT(nil, false)
for _, addr := range tc.Addresses {

bal, _ := new(big.Int).SetString(addr.Balance, 10)
Expand Down
Loading
Loading