diff --git a/cmd/hack/hack.go b/cmd/hack/hack.go index af60221cd0fa962bd61420497bce5a306be8f20d..cd39804299ca30d2d5b47516ff2276b3ef145eb6 100644 --- a/cmd/hack/hack.go +++ b/cmd/hack/hack.go @@ -1076,7 +1076,7 @@ func readAccount(chaindata string, account common.Address, block uint64, rewind if v != nil { err = changeset.StorageChangeSetBytes(v).Walk(func(key, value []byte) error { if bytes.HasPrefix(key, secKey) { - incarnation := ^binary.BigEndian.Uint64(key[common.HashLength : common.HashLength+common.IncarnationLength]) + incarnation := binary.BigEndian.Uint64(key[common.HashLength : common.HashLength+common.IncarnationLength]) if !printed { fmt.Printf("Changes for block %d\n", timestamp) printed = true @@ -1123,7 +1123,7 @@ func nextIncarnation(chaindata string, addrHash common.Hash) { return } if found { - fmt.Printf("Incarnation: %d\n", (^binary.BigEndian.Uint64(incarnationBytes[:]))+1) + fmt.Printf("Incarnation: %d\n", (binary.BigEndian.Uint64(incarnationBytes[:]))+1) return } fmt.Printf("Incarnation(f): %d\n", state.FirstContractIncarnation) diff --git a/cmd/rpcdaemon/commands/state_reader.go b/cmd/rpcdaemon/commands/state_reader.go index d589c201aea5e9028d497c8f2b29a987a24f5ea3..d28f416f6d89a0a79ac9f73ac99bf53098d559c4 100644 --- a/cmd/rpcdaemon/commands/state_reader.go +++ b/cmd/rpcdaemon/commands/state_reader.go @@ -175,7 +175,7 @@ func (r *StateReader) ForEachStorage(addr common.Address, start []byte, cb func( if err := acc.DecodeForStorage(accData); err != nil { return fmt.Errorf("decoding account %x: %w", addr, err) } - binary.BigEndian.PutUint64(s[common.AddressLength:], ^acc.Incarnation) + binary.BigEndian.PutUint64(s[common.AddressLength:], acc.Incarnation) copy(s[common.AddressLength+common.IncarnationLength:], start) var lastKey common.Hash overrideCounter := 0 diff --git a/cmd/rpctest/proofs.go b/cmd/rpctest/proofs.go index 3796b3c78a13fc8c6f9dc92122d7d11ee9c6b86b..c54f04f284e63b95ef5e58a88e5cef2385de1944 100644 --- a/cmd/rpctest/proofs.go +++ b/cmd/rpctest/proofs.go @@ -214,7 +214,7 @@ func fixState(chaindata string, url string) { sl := trie.NewSubTrieLoader(blockNum) contractPrefix := make([]byte, common.HashLength+common.IncarnationLength) copy(contractPrefix, addrHash[:]) - binary.BigEndian.PutUint64(contractPrefix[common.HashLength:], ^account.Incarnation) + binary.BigEndian.PutUint64(contractPrefix[common.HashLength:], account.Incarnation) rl := trie.NewRetainList(0) subTries, err1 := sl.LoadSubTries(stateDb, blockNum, rl, nil /* HashCollector */, [][]byte{contractPrefix}, []int{8 * len(contractPrefix)}, false) if err1 != nil || subTries.Hashes[0] != account.Root { @@ -244,7 +244,7 @@ func fixState(chaindata string, url string) { for key, entry := range sm { var cKey [common.HashLength + common.IncarnationLength + common.HashLength]byte copy(cKey[:], addrHash[:]) - binary.BigEndian.PutUint64(cKey[common.HashLength:], ^account.Incarnation) + binary.BigEndian.PutUint64(cKey[common.HashLength:], account.Incarnation) copy(cKey[common.HashLength+common.IncarnationLength:], key[:]) dbValue, _ := stateDb.Get(dbutils.CurrentStateBucket, cKey[:]) value := bytes.TrimLeft(entry.Value[:], "\x00") @@ -257,7 +257,7 @@ func fixState(chaindata string, url string) { } var cKey [common.HashLength + common.IncarnationLength + common.HashLength]byte copy(cKey[:], addrHash[:]) - binary.BigEndian.PutUint64(cKey[common.HashLength:], ^account.Incarnation) + binary.BigEndian.PutUint64(cKey[common.HashLength:], account.Incarnation) if err := stateDb.Walk(dbutils.CurrentStateBucket, cKey[:], 8*(common.HashLength+common.IncarnationLength), func(k, v []byte) (bool, error) { var kh common.Hash copy(kh[:], k[common.HashLength+common.IncarnationLength:]) diff --git a/cmd/state/stateless/state_snapshot.go b/cmd/state/stateless/state_snapshot.go index dcc92c60af6cdaf2b8bc337b22f8119bb072fd0d..a7315dc425a4034a10319e3c2a502c14920c923a 100644 --- a/cmd/state/stateless/state_snapshot.go +++ b/cmd/state/stateless/state_snapshot.go @@ -291,7 +291,7 @@ func checkRoots(stateDb ethdb.Database, rootHash common.Hash, blockNum uint64) { sl := trie.NewSubTrieLoader(blockNum) contractPrefix := make([]byte, common.HashLength+common.IncarnationLength) copy(contractPrefix, addrHash[:]) - binary.BigEndian.PutUint64(contractPrefix[common.HashLength:], ^account.Incarnation) + binary.BigEndian.PutUint64(contractPrefix[common.HashLength:], account.Incarnation) rl := trie.NewRetainList(0) subTries, err := sl.LoadSubTries(stateDb, blockNum, rl, nil /* HashCollector */, [][]byte{contractPrefix}, []int{8 * len(contractPrefix)}, false) if err != nil { diff --git a/common/changeset/storage_changeset_utils.go b/common/changeset/storage_changeset_utils.go index 941e1bd27cd04bb195cf9bd5f3f794e7ea42fb5c..cce2b02e992c84275570e48974077aeeb021f267 100644 --- a/common/changeset/storage_changeset_utils.go +++ b/common/changeset/storage_changeset_utils.go @@ -58,7 +58,7 @@ func encodeStorage(s *ChangeSet, keyPrefixLen uint32) ([]byte, error) { currentKey := -1 for i, change := range s.Changes { addrBytes := change.Key[0:keyPrefixLen] // hash or raw address - incarnation := ^binary.BigEndian.Uint64(change.Key[keyPrefixLen:]) + incarnation := binary.BigEndian.Uint64(change.Key[keyPrefixLen:]) keyBytes := change.Key[keyPrefixLen+common.IncarnationLength : keyPrefixLen+common.HashLength+common.IncarnationLength] // hash or raw key //found new contract address if i == 0 || !bytes.Equal(currentContract.AddrBytes, addrBytes) || currentContract.Incarnation != incarnation { @@ -68,7 +68,7 @@ func encodeStorage(s *ChangeSet, keyPrefixLen uint32) ([]byte, error) { //add to incarnations part only if it's not default if incarnation != DefaultIncarnation { binary.BigEndian.PutUint32(b[0:], uint32(currentKey)) - binary.BigEndian.PutUint64(b[4:], ^incarnation) + binary.BigEndian.PutUint64(b[4:], incarnation) notDefaultIncarnationsBytes = append(notDefaultIncarnationsBytes, b...) nonDefaultIncarnationCounter++ } @@ -203,7 +203,7 @@ func decodeStorage(b []byte, keyPrefixLen int, cs *ChangeSet) error { if numOfNotDefaultIncarnations > 0 { for i := 0; i < numOfNotDefaultIncarnations; i++ { id := binary.BigEndian.Uint32(b[incarnationsStart+i*12:]) - keys[id].Incarnation = ^binary.BigEndian.Uint64(b[incarnationsStart+i*12+4:]) + keys[id].Incarnation = binary.BigEndian.Uint64(b[incarnationsStart+i*12+4:]) } } @@ -223,7 +223,7 @@ func decodeStorage(b []byte, keyPrefixLen int, cs *ChangeSet) error { for i := range v.Keys { k := make([]byte, keyPrefixLen+common.IncarnationLength+common.HashLength) copy(k[:keyPrefixLen], v.AddrBytes) - binary.BigEndian.PutUint64(k[keyPrefixLen:], ^v.Incarnation) + binary.BigEndian.PutUint64(k[keyPrefixLen:], v.Incarnation) copy(k[keyPrefixLen+common.IncarnationLength:keyPrefixLen+common.HashLength+common.IncarnationLength], v.Keys[i]) val, innerErr := findValue(b[valsInfoStart:], id) if innerErr != nil { @@ -304,7 +304,7 @@ func walkStorageChangeSet(b []byte, keyPrefixLen int, f func(k, v []byte) error) notDefaultIncarnations := make(map[uint32]uint64, numOfNotDefaultIncarnations) if numOfNotDefaultIncarnations > 0 { for i := 0; i < numOfNotDefaultIncarnations; i++ { - notDefaultIncarnations[binary.BigEndian.Uint32(b[incarnatonsStart+i*12:])] = ^binary.BigEndian.Uint64(b[incarnatonsStart+i*12+4:]) + notDefaultIncarnations[binary.BigEndian.Uint32(b[incarnatonsStart+i*12:])] = binary.BigEndian.Uint64(b[incarnatonsStart+i*12+4:]) } } @@ -333,7 +333,7 @@ func walkStorageChangeSet(b []byte, keyPrefixLen int, f func(k, v []byte) error) for j := startKeys; j < endKeys; j++ { copy(k[:keyPrefixLen], addrBytes[:keyPrefixLen]) - binary.BigEndian.PutUint64(k[keyPrefixLen:], ^incarnation) + binary.BigEndian.PutUint64(k[keyPrefixLen:], incarnation) copy(k[keyPrefixLen+common.IncarnationLength:keyPrefixLen+common.HashLength+common.IncarnationLength], b[keysStart+j*common.HashLength:]) val, innerErr := findValue(b[valsInfoStart:], id) if innerErr != nil { @@ -357,7 +357,7 @@ func findInStorageChangeSet(b []byte, keyPrefixLen int, k []byte) ([]byte, error keyPrefixLen, k[0:keyPrefixLen], k[keyPrefixLen+common.IncarnationLength:keyPrefixLen+common.HashLength+common.IncarnationLength], - ^binary.BigEndian.Uint64(k[keyPrefixLen:]), /* incarnation */ + binary.BigEndian.Uint64(k[keyPrefixLen:]), /* incarnation */ ) } @@ -429,7 +429,7 @@ func doSearch( }) var foundIncarnation uint64 = DefaultIncarnation if incIndex < numOfNotDefaultIncarnations && int(binary.BigEndian.Uint32(b[incarnationsStart+12*incIndex:])) == addrID { - foundIncarnation = ^binary.BigEndian.Uint64(b[incarnationsStart+12*incIndex+4:]) + foundIncarnation = binary.BigEndian.Uint64(b[incarnationsStart+12*incIndex+4:]) } if foundIncarnation == incarnation { diff --git a/common/dbutils/composite_keys.go b/common/dbutils/composite_keys.go index e6df205f57abeee5b49003300feaefac76e38980..9a1bd3bff6eeb7ed9afb9ce5a01bc11c09eb057e 100644 --- a/common/dbutils/composite_keys.go +++ b/common/dbutils/composite_keys.go @@ -104,7 +104,7 @@ func GenerateCompositeTrieKey(addressHash common.Hash, seckey common.Hash) []byt // AddrHash + incarnation + KeyHash // For contract storage func GenerateCompositeStorageKey(addressHash common.Hash, incarnation uint64, seckey common.Hash) []byte { - compositeKey := make([]byte, 0, common.HashLength+8+common.HashLength) + compositeKey := make([]byte, 0, common.HashLength+common.IncarnationLength+common.HashLength) compositeKey = append(compositeKey, GenerateStoragePrefix(addressHash[:], incarnation)...) compositeKey = append(compositeKey, seckey[:]...) return compositeKey @@ -121,10 +121,10 @@ func ParseCompositeStorageKey(compositeKey []byte) (common.Hash, uint64, common. // AddrHash + incarnation + KeyHash // For contract storage (for plain state) func PlainGenerateCompositeStorageKey(address common.Address, incarnation uint64, key common.Hash) []byte { - compositeKey := make([]byte, common.AddressLength+8+common.HashLength) + compositeKey := make([]byte, common.AddressLength+common.IncarnationLength+common.HashLength) copy(compositeKey, address[:]) - binary.BigEndian.PutUint64(compositeKey[common.AddressLength:], ^incarnation) - copy(compositeKey[common.AddressLength+8:], key[:]) + binary.BigEndian.PutUint64(compositeKey[common.AddressLength:], incarnation) + copy(compositeKey[common.AddressLength+common.IncarnationLength:], key[:]) return compositeKey } @@ -138,10 +138,10 @@ func PlainParseCompositeStorageKey(compositeKey []byte) (common.Address, uint64, // AddrHash + incarnation + StorageHashPrefix func GenerateCompositeStoragePrefix(addressHash []byte, incarnation uint64, storageHashPrefix []byte) []byte { - key := make([]byte, common.HashLength+8+len(storageHashPrefix)) + key := make([]byte, common.HashLength+common.IncarnationLength+len(storageHashPrefix)) copy(key, addressHash) - binary.BigEndian.PutUint64(key[common.HashLength:], ^incarnation) - copy(key[common.HashLength+8:], storageHashPrefix) + binary.BigEndian.PutUint64(key[common.HashLength:], incarnation) + copy(key[common.HashLength+common.IncarnationLength:], storageHashPrefix) return key } @@ -149,7 +149,7 @@ func GenerateCompositeStoragePrefix(addressHash []byte, incarnation uint64, stor func GenerateStoragePrefix(addressHash []byte, incarnation uint64) []byte { prefix := make([]byte, common.HashLength+8) copy(prefix, addressHash) - binary.BigEndian.PutUint64(prefix[common.HashLength:], ^incarnation) + binary.BigEndian.PutUint64(prefix[common.HashLength:], incarnation) return prefix } @@ -157,44 +157,24 @@ func GenerateStoragePrefix(addressHash []byte, incarnation uint64) []byte { func PlainGenerateStoragePrefix(address []byte, incarnation uint64) []byte { prefix := make([]byte, common.AddressLength+8) copy(prefix, address) - binary.BigEndian.PutUint64(prefix[common.AddressLength:], ^incarnation) + binary.BigEndian.PutUint64(prefix[common.AddressLength:], incarnation) return prefix } func PlainParseStoragePrefix(prefix []byte) (common.Address, uint64) { var addr common.Address copy(addr[:], prefix[:common.AddressLength]) - inc := ^binary.BigEndian.Uint64(prefix[common.AddressLength : common.AddressLength+common.IncarnationLength]) + inc := binary.BigEndian.Uint64(prefix[common.AddressLength : common.AddressLength+common.IncarnationLength]) return addr, inc } func ParseStoragePrefix(prefix []byte) (common.Hash, uint64) { var addrHash common.Hash copy(addrHash[:], prefix[:common.HashLength]) - inc := ^binary.BigEndian.Uint64(prefix[common.HashLength : common.HashLength+common.IncarnationLength]) + inc := binary.BigEndian.Uint64(prefix[common.HashLength : common.HashLength+common.IncarnationLength]) return addrHash, inc } -func DecodeIncarnation(buf []byte) uint64 { - incarnation := binary.BigEndian.Uint64(buf) - return incarnation ^ ^uint64(0) -} - -func EncodeIncarnation(incarnation uint64, buf []byte) { - binary.BigEndian.PutUint64(buf, ^incarnation) -} - -func RemoveIncarnationFromKey(key []byte, out *[]byte) { - tmp := (*out)[:0] - if len(key) <= common.HashLength { - tmp = append(tmp, key...) - } else { - tmp = append(tmp, key[:common.HashLength]...) - tmp = append(tmp, key[common.HashLength+8:]...) - } - *out = tmp -} - // Key + blockNum func CompositeKeySuffix(key []byte, timestamp uint64) (composite, encodedTS []byte) { encodedTS = EncodeTimestamp(timestamp) diff --git a/common/dbutils/history_index_test.go b/common/dbutils/history_index_test.go index 49531bc31242fb99fbd70e8d0a1fe3d1d9333163..4b70a798be21635860a670359d6f243d7f441994 100644 --- a/common/dbutils/history_index_test.go +++ b/common/dbutils/history_index_test.go @@ -1,14 +1,12 @@ package dbutils import ( - "fmt" "reflect" "testing" ) func TestHistoryIndex_Search1(t *testing.T) { index := NewHistoryIndex().Append(3, false).Append(5, false).Append(8, false) - fmt.Println(index.Decode()) v, _, _ := index.Search(1) if v != 3 { t.Fatal("must be 3 but", v) diff --git a/core/generate_index.go b/core/generate_index.go index f136472cee7297c7aeaef905aae91ecf3216718e..8bc5d9b0258623ec63c98865ecc36634515f57c4 100644 --- a/core/generate_index.go +++ b/core/generate_index.go @@ -157,9 +157,6 @@ func loadFunc(k []byte, value []byte, state etl.State, next etl.LoadNextFunc) er return errors.New("incorrect value") } k = common.CopyBytes(k) - if len(k) >= 28 { - binary.BigEndian.PutUint64(k[common.AddressLength:], ^binary.BigEndian.Uint64(k[common.AddressLength:])) - } currentChunkKey := dbutils.IndexChunkKey(k, ^uint64(0)) indexBytes, err1 := state.Get(currentChunkKey) if err1 != nil && !errors.Is(err1, ethdb.ErrKeyNotFound) { @@ -203,9 +200,6 @@ func getExtractFunc(bytes2walker func([]byte) changeset.Walker) etl.ExtractFunc blockNum, _ := dbutils.DecodeTimestamp(dbKey) return bytes2walker(dbValue).Walk(func(changesetKey, changesetValue []byte) error { key := common.CopyBytes(changesetKey) - if len(key) >= 28 { - binary.BigEndian.PutUint64(key[common.AddressLength:], ^binary.BigEndian.Uint64(key[common.AddressLength:])) - } v := make([]byte, 9) binary.BigEndian.PutUint64(v, blockNum) if len(changesetValue) == 0 { diff --git a/core/generate_index_test.go b/core/generate_index_test.go index 65cbb28317b155eeed5d6f27263a05ffc17d5318..d793c1083fd490aaf52cc0c1577f5a9e843a7e15 100644 --- a/core/generate_index_test.go +++ b/core/generate_index_test.go @@ -175,7 +175,7 @@ func generateTestData(t *testing.T, db ethdb.Database, csBucket []byte, numOfBlo } defaultIncarnation := make([]byte, 8) - binary.BigEndian.PutUint64(defaultIncarnation, ^uint64(1)) + binary.BigEndian.PutUint64(defaultIncarnation, uint64(1)) for i := range addrs { addrs[i] = append(addrs[i], defaultIncarnation...) addrs[i] = append(addrs[i], keys[i]...) diff --git a/core/genesis.go b/core/genesis.go index 09c14311a6bee960eace5226c32344318324e0bc..d21982ede2a9978f11852804a65f679ded65fbc3 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -270,7 +270,7 @@ func (g *Genesis) ToBlock(db ethdb.Database, history bool) (*types.Block, *state if len(account.Code) == 0 && len(account.Storage) > 0 { // Special case for weird tests - inaccessible storage var b [8]byte - binary.BigEndian.PutUint64(b[:], 1) + binary.BigEndian.PutUint64(b[:], state.FirstContractIncarnation) if err := db.Put(dbutils.IncarnationMapBucket, addr[:], b[:]); err != nil { return nil, nil, nil, err } diff --git a/core/state/database.go b/core/state/database.go index 799ec8c403219707add76af409db4c7104ecc28e..106df469d80a6ca8e6c3c1d9a78b38b5e49aa2ce 100644 --- a/core/state/database.go +++ b/core/state/database.go @@ -411,7 +411,7 @@ func (tds *TrieDbState) buildStorageWrites() (common.StorageKeys, [][]byte) { for keyHash := range m { var storageKey common.StorageKey copy(storageKey[:], addrHash[:]) - binary.BigEndian.PutUint64(storageKey[common.HashLength:], ^tds.aggregateBuffer.storageIncarnation[addrHash]) + binary.BigEndian.PutUint64(storageKey[common.HashLength:], tds.aggregateBuffer.storageIncarnation[addrHash]) copy(storageKey[common.HashLength+common.IncarnationLength:], keyHash[:]) storageTouches = append(storageTouches, storageKey) } @@ -553,7 +553,7 @@ func (tds *TrieDbState) resolveAccountAndStorageTouches(accountTouches common.Ha nibbles[i*2] = b / 16 nibbles[i*2+1] = b % 16 } - binary.BigEndian.PutUint64(bytes8[:], ^incarnation) + binary.BigEndian.PutUint64(bytes8[:], incarnation) for i, b := range bytes8[:] { nibbles[2*common.HashLength+i*2] = b / 16 nibbles[2*common.HashLength+i*2+1] = b % 16 @@ -882,7 +882,7 @@ func (tds *TrieDbState) UnwindTo(blockNr uint64) error { m = make(map[common.Hash][]byte) b.storageUpdates[addrHash] = m } - b.storageIncarnation[addrHash] = ^binary.BigEndian.Uint64([]byte(key)[common.HashLength:]) + b.storageIncarnation[addrHash] = binary.BigEndian.Uint64([]byte(key)[common.HashLength:]) var storageKey common.StorageKey copy(storageKey[:], []byte(key)) b.storageReads[storageKey] = struct{}{} diff --git a/core/state/plain_readonly.go b/core/state/plain_readonly.go index 74a8b8123b602d9ffae0395399168f40ac00c2e8..43189d91b282e445beae9589d6e62042e15660a1 100644 --- a/core/state/plain_readonly.go +++ b/core/state/plain_readonly.go @@ -21,6 +21,7 @@ import ( "context" "encoding/binary" "errors" + "github.com/ledgerwatch/turbo-geth/common/changeset" "math/big" "github.com/holiman/uint256" @@ -67,7 +68,7 @@ func (dbs *PlainDBState) ForEachStorage(addr common.Address, start []byte, cb fu log.Error("Error decoding account", "error", err) return err } - binary.BigEndian.PutUint64(s[common.AddressLength:], ^acc.Incarnation) + binary.BigEndian.PutUint64(s[common.AddressLength:], acc.Incarnation) copy(s[common.AddressLength+common.IncarnationLength:], start) var lastKey common.Hash overrideCounter := 0 @@ -263,8 +264,8 @@ func (dbs *PlainDBState) CreateContract(address common.Address) error { func (dbs *PlainDBState) WalkStorageRange(addrHash common.Hash, prefix trie.Keybytes, maxItems int, walker func(common.Hash, big.Int)) (bool, error) { startkey := make([]byte, common.HashLength+common.IncarnationLength+common.HashLength) copy(startkey, addrHash[:]) - // TODO: [Issue 99] Support incarnations - binary.BigEndian.PutUint64(startkey[common.HashLength:], ^uint64(1)) + + binary.BigEndian.PutUint64(startkey[common.HashLength:], changeset.DefaultIncarnation) copy(startkey[common.HashLength+common.IncarnationLength:], prefix.Data) fixedbits := (common.HashLength + common.IncarnationLength + len(prefix.Data)) * 8 diff --git a/core/state/readonly.go b/core/state/readonly.go index 23374a7ccb051fdbfc9338ec8d2c5d1f77f2e624..0e4a4a6a3ebf0aa72586a663466d11c6e482a337 100644 --- a/core/state/readonly.go +++ b/core/state/readonly.go @@ -21,6 +21,7 @@ import ( "context" "encoding/binary" "fmt" + "github.com/ledgerwatch/turbo-geth/common/changeset" "math/big" "github.com/holiman/uint256" @@ -86,7 +87,7 @@ func (dbs *DbState) ForEachStorage(addr common.Address, start []byte, cb func(ke log.Error("Error decoding account", "error", err) return err } - binary.BigEndian.PutUint64(s[common.HashLength:], ^acc.Incarnation) + binary.BigEndian.PutUint64(s[common.HashLength:], acc.Incarnation) copy(s[common.HashLength+common.IncarnationLength:], start) var lastSecKey common.Hash overrideCounter := 0 @@ -292,7 +293,7 @@ func (dbs *DbState) WalkStorageRange(addrHash common.Hash, prefix trie.Keybytes, startkey := make([]byte, common.HashLength+common.IncarnationLength+common.HashLength) copy(startkey, addrHash[:]) // TODO: [Issue 99] Support incarnations - binary.BigEndian.PutUint64(startkey[common.HashLength:], ^uint64(1)) + binary.BigEndian.PutUint64(startkey[common.HashLength:], changeset.DefaultIncarnation) copy(startkey[common.HashLength+common.IncarnationLength:], prefix.Data) fixedbits := (common.HashLength + common.IncarnationLength + len(prefix.Data)) * 8 diff --git a/trie/flatdb_sub_trie_loader.go b/trie/flatdb_sub_trie_loader.go index 91074a7d2baba95e224e185a41e1052bf67c8cde..290e41ba29e885fc1682922700166b69e648bd5f 100644 --- a/trie/flatdb_sub_trie_loader.go +++ b/trie/flatdb_sub_trie_loader.go @@ -301,7 +301,7 @@ func (fstl *FlatDbSubTrieLoader) iteration(c, ih ethdb.Cursor, first bool) error return fmt.Errorf("fail DecodeForStorage: %w", err) } copy(fstl.accAddrHashWithInc[:], fstl.k) - binary.BigEndian.PutUint64(fstl.accAddrHashWithInc[32:], ^fstl.accountValue.Incarnation) + binary.BigEndian.PutUint64(fstl.accAddrHashWithInc[32:], fstl.accountValue.Incarnation) // Now we know the correct incarnation of the account, and we can skip all irrelevant storage records // Since 0 incarnation if 0xfff...fff, and we do not expect any records like that, this automatically diff --git a/trie/flatdb_sub_trie_loader_test.go b/trie/flatdb_sub_trie_loader_test.go index fe50c0702f53d047cf57a908bb1660cbefa835c2..7d7dad220937f46aa1cd7a34425547dc634fcf35 100644 --- a/trie/flatdb_sub_trie_loader_test.go +++ b/trie/flatdb_sub_trie_loader_test.go @@ -357,7 +357,7 @@ func TestApiDetails(t *testing.T) { { // storage loader loader := NewSubTrieLoader(0) rl := NewRetainList(0) - binary.BigEndian.PutUint64(bytes8[:], ^uint64(2)) + binary.BigEndian.PutUint64(bytes8[:], uint64(2)) for i, b := range bytes8[:] { bytes16[i*2] = b / 16 bytes16[i*2+1] = b % 16 @@ -495,7 +495,7 @@ func TestCreateLoadingPrefixes(t *testing.T) { tr := New(common.Hash{}) kAcc1 := common.FromHex("0001cf1ce0664746d39af9f6db99dc3370282f1d9d48df7f804b7e6499558c83") kInc := make([]byte, 8) - binary.BigEndian.PutUint64(kInc, ^uint64(1)) + binary.BigEndian.PutUint64(kInc, uint64(1)) ks1 := common.FromHex("0000000000000000000000000000000000000000000000000000000000000001") acc1 := accounts.NewAccount() acc1.Balance.SetUint64(12345) @@ -524,7 +524,7 @@ func TestCreateLoadingPrefixes(t *testing.T) { rs.AddKey(concat(concat(kAcc2, kInc...), ks2...)) rs.AddKey(concat(concat(kAcc2, kInc...), ks22...)) dbPrefixes, fixedbits, hooks := tr.FindSubTriesToLoad(rs) - assert.Equal("[0001cf1ce0664746d39af9f6db99dc3370282f1d9d48df7f804b7e6499558c83fffffffffffffffe 0002cf1ce0664746d39af9f6db99dc3370282f1d9d48df7f804b7e6499558c83fffffffffffffffe]", fmt.Sprintf("%x", dbPrefixes)) + assert.Equal("[0001cf1ce0664746d39af9f6db99dc3370282f1d9d48df7f804b7e6499558c830000000000000001 0002cf1ce0664746d39af9f6db99dc3370282f1d9d48df7f804b7e6499558c830000000000000001]", fmt.Sprintf("%x", dbPrefixes)) assert.Equal("[320 320]", fmt.Sprintf("%d", fixedbits)) assert.Equal("[000000010c0f010c0e000606040704060d03090a0f090f060d0b09090d0c030307000208020f010d090d04080d0f070f0800040b070e060409090505080c0803 000000020c0f010c0e000606040704060d03090a0f090f060d0b09090d0c030307000208020f010d090d04080d0f070f0800040b070e060409090505080c0803]", fmt.Sprintf("%x", hooks)) diff --git a/trie/stream.go b/trie/stream.go index 9d123b7adf9a5f6f452c24e68863f8be71f2adc8..47245727fd9fae7d620b177d818dbecd43f854f7 100644 --- a/trie/stream.go +++ b/trie/stream.go @@ -186,7 +186,7 @@ func (it *Iterator) Next() (itemType StreamItem, hex1 []byte, aValue *accounts.A fmt.Printf("accountNode %x\n", hex) } if v.storage != nil { - binary.BigEndian.PutUint64(bytes8[:], ^v.Incarnation) + binary.BigEndian.PutUint64(bytes8[:], v.Incarnation) // Add decompressed incarnation to the hex for i, b := range bytes8[:] { bytes16[i*2] = b / 16 @@ -412,7 +412,7 @@ func (it *Iterator) Next() (itemType StreamItem, hex1 []byte, aValue *accounts.A fmt.Printf("accountNode %x\n", hex) } if n.storage != nil { - binary.BigEndian.PutUint64(bytes8[:], ^n.Incarnation) + binary.BigEndian.PutUint64(bytes8[:], n.Incarnation) // Add decompressed incarnation to the hex for i, b := range bytes8[:] { bytes16[i*2] = b / 16 diff --git a/trie/structural_test.go b/trie/structural_test.go index 47f1da2b3f5fdb1d2a52da1e86c2392eefa0d07c..625bb9d7eb05fdabd46bcf0c4b63b3e974cdd211 100644 --- a/trie/structural_test.go +++ b/trie/structural_test.go @@ -188,7 +188,7 @@ func TestEmbeddedStorage(t *testing.T) { var accountAddress = common.Address{3, 4, 5, 6} addrHash := crypto.Keccak256(accountAddress[:]) incarnation := make([]byte, 8) - binary.BigEndian.PutUint64(incarnation, ^uint64(2)) + binary.BigEndian.PutUint64(incarnation, uint64(2)) var location1 = common.Hash{1} locationKey1 := append(append([]byte{}, addrHash...), crypto.Keccak256(location1[:])...) var location2 = common.Hash{2} diff --git a/trie/trie.go b/trie/trie.go index 6beee84de15f1d483c97963b94957ce17a82130c..93498ac9075865d016c40fbdda6391c1857138a1 100644 --- a/trie/trie.go +++ b/trie/trie.go @@ -502,7 +502,7 @@ func findSubTriesToLoad(nd node, nibblePath []byte, hook []byte, rl RetainDecide if n.storage == nil { return prefixes, fixedbits, hooks } - binary.BigEndian.PutUint64(bytes8[:], ^n.Incarnation) + binary.BigEndian.PutUint64(bytes8[:], n.Incarnation) dbPrefix = append(dbPrefix, bytes8[:]...) // Add decompressed incarnation to the nibblePath for i, b := range bytes8[:] {