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

Refactor xdr.LedgerEntry.LedgerKey method #4942

Merged
merged 21 commits into from
Jul 4, 2023
Merged
Show file tree
Hide file tree
Changes from 18 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
42 changes: 35 additions & 7 deletions ingest/change_compactor.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,11 @@ func (c *ChangeCompactor) AddChange(change Change) error {
// change is unexpected.
func (c *ChangeCompactor) addCreatedChange(change Change) error {
// safe, since we later cast to string (causing a copy)
ledgerKey, err := c.encodingBuffer.UnsafeMarshalBinary(change.Post.LedgerKey())
key, err := change.Post.LedgerKey()
if err != nil {
return errors.Wrap(err, "Error LedgerKey")
paulbellamy marked this conversation as resolved.
Show resolved Hide resolved
}
ledgerKey, err := c.encodingBuffer.UnsafeMarshalBinary(key)
if err != nil {
return errors.Wrap(err, "Error MarshalBinary")
}
Expand All @@ -111,8 +115,12 @@ func (c *ChangeCompactor) addCreatedChange(change Change) error {
case xdr.LedgerEntryChangeTypeLedgerEntryRemoved:
// If existing type is removed it means that this entry does exist
// in a DB so we update entry change.
key, err := change.Post.LedgerKey()
if err != nil {
return errors.Wrap(err, "Error LedgerKey")
}
c.cache[ledgerKeyString] = Change{
Type: change.Post.LedgerKey().Type,
Type: key.Type,
paulbellamy marked this conversation as resolved.
Show resolved Hide resolved
Pre: existingChange.Pre,
Post: change.Post,
}
Expand All @@ -127,7 +135,11 @@ func (c *ChangeCompactor) addCreatedChange(change Change) error {
// change is unexpected.
func (c *ChangeCompactor) addUpdatedChange(change Change) error {
// safe, since we later cast to string (causing a copy)
ledgerKey, err := c.encodingBuffer.UnsafeMarshalBinary(change.Post.LedgerKey())
key, err := change.Post.LedgerKey()
if err != nil {
return errors.Wrap(err, "Error LedgerKey")
}
ledgerKey, err := c.encodingBuffer.UnsafeMarshalBinary(key)
if err != nil {
return errors.Wrap(err, "Error MarshalBinary")
}
Expand All @@ -144,14 +156,22 @@ func (c *ChangeCompactor) addUpdatedChange(change Change) error {
case xdr.LedgerEntryChangeTypeLedgerEntryCreated:
// If existing type is created it means that this entry does not
// exist in a DB so we update entry change.
key, err := change.Post.LedgerKey()
if err != nil {
return errors.Wrap(err, "Error LedgerKey")
}
c.cache[ledgerKeyString] = Change{
Type: change.Post.LedgerKey().Type,
Type: key.Type,
Pre: existingChange.Pre, // = nil
Post: change.Post,
}
case xdr.LedgerEntryChangeTypeLedgerEntryUpdated:
key, err := change.Post.LedgerKey()
if err != nil {
return errors.Wrap(err, "Error LedgerKey")
}
c.cache[ledgerKeyString] = Change{
Type: change.Post.LedgerKey().Type,
Type: key.Type,
Pre: existingChange.Pre,
Post: change.Post,
paulbellamy marked this conversation as resolved.
Show resolved Hide resolved
}
Expand All @@ -171,7 +191,11 @@ func (c *ChangeCompactor) addUpdatedChange(change Change) error {
// change is unexpected.
func (c *ChangeCompactor) addRemovedChange(change Change) error {
// safe, since we later cast to string (causing a copy)
ledgerKey, err := c.encodingBuffer.UnsafeMarshalBinary(change.Pre.LedgerKey())
key, err := change.Pre.LedgerKey()
if err != nil {
return errors.Wrap(err, "Error LedgerKey")
}
ledgerKey, err := c.encodingBuffer.UnsafeMarshalBinary(key)
if err != nil {
return errors.Wrap(err, "Error MarshalBinary")
}
Expand All @@ -190,8 +214,12 @@ func (c *ChangeCompactor) addRemovedChange(change Change) error {
// Entry was created and is now removed in a single ledger.
delete(c.cache, ledgerKeyString)
case xdr.LedgerEntryChangeTypeLedgerEntryUpdated:
key, err := change.Pre.LedgerKey()
if err != nil {
return errors.Wrap(err, "Error LedgerKey")
}
c.cache[ledgerKeyString] = Change{
Type: change.Pre.LedgerKey().Type,
Type: key.Type,
Pre: existingChange.Pre,
Post: nil,
paulbellamy marked this conversation as resolved.
Show resolved Hide resolved
}
Expand Down
24 changes: 21 additions & 3 deletions ingest/checkpoint_change_reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -357,11 +357,18 @@ LoopBucketEntry:

// Generate a key
var key xdr.LedgerKey
var err error

switch entry.Type {
case xdr.BucketEntryTypeLiveentry, xdr.BucketEntryTypeInitentry:
liveEntry := entry.MustLiveEntry()
key = liveEntry.LedgerKey()
key, err = liveEntry.LedgerKey()
if err != nil {
r.readChan <- r.error(
errors.Wrapf(err, "Error generating ledger key for XDR record %d of hash '%s'", n, hash.String()),
)
return false
}
case xdr.BucketEntryTypeDeadentry:
key = entry.MustDeadEntry()
default:
Expand Down Expand Up @@ -396,6 +403,7 @@ LoopBucketEntry:
n++

var key xdr.LedgerKey
var err error

switch entry.Type {
case xdr.BucketEntryTypeMetaentry:
Expand All @@ -414,7 +422,13 @@ LoopBucketEntry:
continue LoopBucketEntry
case xdr.BucketEntryTypeLiveentry, xdr.BucketEntryTypeInitentry:
liveEntry := entry.MustLiveEntry()
key = liveEntry.LedgerKey()
key, err = liveEntry.LedgerKey()
if err != nil {
r.readChan <- r.error(
errors.Wrapf(err, "Error generating ledger key for XDR record %d of hash '%s'", n, hash.String()),
)
return false
}
case xdr.BucketEntryTypeDeadentry:
key = entry.MustDeadEntry()
default:
Expand Down Expand Up @@ -523,8 +537,12 @@ func (r *CheckpointChangeReader) Read() (Change, error) {
if result.e != nil {
return Change{}, errors.Wrap(result.e, "Error while reading from buckets")
}
entryType, err := result.entryChange.EntryType()
if err != nil {
return Change{}, errors.Wrap(err, "Error getting entry type")
}
return Change{
Type: result.entryChange.EntryType(),
Type: entryType,
Post: result.entryChange.State,
}, nil
}
Expand Down
6 changes: 5 additions & 1 deletion ingest/ledger_change_reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,11 @@ func (r *LedgerChangeReader) Read() (Change, error) {
return r.Read()
case evictionChangesState:
// Get contract ledgerEntry evictions
changes, err := GetChangesFromLedgerEntryEvictions(r.ledgerCloseMeta.EvictedLedgerKeys())
keys, err := r.ledgerCloseMeta.EvictedLedgerKeys()
if err != nil {
return Change{}, err
}
changes, err := GetChangesFromLedgerEntryEvictions(keys)
if err != nil {
return Change{}, err
}
Expand Down
15 changes: 11 additions & 4 deletions ingest/verify/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,10 @@ func (v *StateVerifier) GetLedgerEntries(count int) ([]xdr.LedgerEntry, error) {
}
}

ledgerKey := entry.LedgerKey()
ledgerKey, err := entry.LedgerKey()
if err != nil {
return entries, errors.Wrap(err, "Error marshalling ledgerKey")
paulbellamy marked this conversation as resolved.
Show resolved Hide resolved
}
key, err := v.encodingBuffer.MarshalBinary(ledgerKey)
if err != nil {
return entries, errors.Wrap(err, "Error marshalling ledgerKey")
Expand Down Expand Up @@ -117,17 +120,21 @@ func (v *StateVerifier) Write(entry xdr.LedgerEntry) error {
}

// safe, since we convert to string right away (causing a copy)
key, err := v.encodingBuffer.UnsafeMarshalBinary(actualEntry.LedgerKey())
key, err := actualEntry.LedgerKey()
if err != nil {
return errors.Wrap(err, "Error marshalling ledgerKey")
paulbellamy marked this conversation as resolved.
Show resolved Hide resolved
}
keyBinary, err := v.encodingBuffer.UnsafeMarshalBinary(key)
if err != nil {
return errors.Wrap(err, "Error marshalling ledgerKey")
}
keyString := string(key)
keyString := string(keyBinary)
expectedEntry, exist := v.currentEntries[keyString]
if !exist {
return ingest.NewStateError(errors.Errorf(
"Cannot find entry in currentEntries map: %s (key = %s)",
base64.StdEncoding.EncodeToString(actualEntryMarshaled),
base64.StdEncoding.EncodeToString(key),
base64.StdEncoding.EncodeToString(keyBinary),
))
}
delete(v.currentEntries, keyString)
Expand Down
10 changes: 7 additions & 3 deletions ingest/verify/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@ func (s *StateVerifierTestSuite) TestCurrentEntriesNotEmpty() {
entryBase64, err := xdr.MarshalBase64(entry)
s.Assert().NoError(err)

ledgerKey := entry.LedgerKey()
ledgerKey, err := entry.LedgerKey()
s.Assert().NoError(err)
ledgerKeyBase64, err := xdr.MarshalBase64(ledgerKey)
s.Assert().NoError(err)

Expand Down Expand Up @@ -125,7 +126,9 @@ func (s *StateVerifierTestSuite) TestTransformFunction() {
s.Assert().NoError(err)

// Check currentEntries
ledgerKey, err := accountEntry.LedgerKey().MarshalBinary()
key, err := accountEntry.LedgerKey()
s.Assert().NoError(err)
ledgerKey, err := key.MarshalBinary()
s.Assert().NoError(err)

// Account entry transformed and offer entry ignored
Expand Down Expand Up @@ -164,7 +167,8 @@ func (s *StateVerifierTestSuite) TestWriteEntryNotExist() {
entryBase64, err := xdr.MarshalBase64(entry)
s.Assert().NoError(err)

ledgerKey := entry.LedgerKey()
ledgerKey, err := entry.LedgerKey()
s.Assert().NoError(err)
ledgerKeyBase64, err := xdr.MarshalBase64(ledgerKey)
s.Assert().NoError(err)

Expand Down
10 changes: 8 additions & 2 deletions services/horizon/internal/ingest/processors/trades_processor.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,8 +175,14 @@ func (p *TradeProcessor) findOperationChange(tx ingest.LedgerTransaction, opidx
var change ingest.Change
for i := len(changes) - 1; i >= 0; i-- {
change = changes[i]
if change.Pre != nil && key.Equals(change.Pre.LedgerKey()) {
return change, nil
if change.Pre != nil {
preKey, err := change.Pre.LedgerKey()
if err != nil {
return ingest.Change{}, errors.Wrap(err, "could not determine ledger key for change")
}
if key.Equals(preKey) {
return change, nil
}
}
}
return ingest.Change{}, errors.Errorf("could not find operation for key %v", key)
Expand Down
12 changes: 10 additions & 2 deletions services/horizon/internal/ingest/verify.go
Original file line number Diff line number Diff line change
Expand Up @@ -205,13 +205,21 @@ func (s *system) verifyState(verifyAgainstLatestCheckpoint bool) error {
accounts = append(accounts, entry.Data.MustAccount().AccountId.Address())
totalByType["accounts"]++
case xdr.LedgerEntryTypeData:
data = append(data, *entry.LedgerKey().Data)
key, keyErr := entry.LedgerKey()
if keyErr != nil {
return errors.Wrap(keyErr, "entry.LedgerKey")
}
data = append(data, *key.Data)
totalByType["data"]++
case xdr.LedgerEntryTypeOffer:
offers = append(offers, int64(entry.Data.MustOffer().OfferId))
totalByType["offers"]++
case xdr.LedgerEntryTypeTrustline:
trustLines = append(trustLines, entry.LedgerKey().MustTrustLine())
key, keyErr := entry.LedgerKey()
if keyErr != nil {
return errors.Wrap(keyErr, "entry.LedgerKey")
paulbellamy marked this conversation as resolved.
Show resolved Hide resolved
}
trustLines = append(trustLines, key.MustTrustLine())
totalByType["trust_lines"]++
case xdr.LedgerEntryTypeClaimableBalance:
cBalances = append(cBalances, entry.Data.MustClaimableBalance().BalanceId)
Expand Down
9 changes: 2 additions & 7 deletions xdr/account_id.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,8 @@ func (aid *AccountId) Equals(other AccountId) bool {
}

// LedgerKey implements the `Keyer` interface
func (aid *AccountId) LedgerKey() (ret LedgerKey) {
err := ret.SetAccount(*aid)
if err != nil {
panic(err)
}

return
func (aid *AccountId) LedgerKey() (key LedgerKey, err error) {
return key, key.SetAccount(*aid)
}

func (e *EncodingBuffer) accountIdCompressEncodeTo(aid AccountId) error {
Expand Down
3 changes: 2 additions & 1 deletion xdr/account_id_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ var _ = Describe("xdr.AccountId#LedgerKey()", func() {
err := aid.SetAddress("GCR22L3WS7TP72S4Z27YTO6JIQYDJK2KLS2TQNHK6Y7XYPA3AGT3X4FH")
Expect(err).ShouldNot(HaveOccurred())

key := aid.LedgerKey()
key, err := aid.LedgerKey()
Expect(err).ShouldNot(HaveOccurred())
packed := key.MustAccount().AccountId
Expect(packed.Equals(aid)).To(BeTrue())
})
Expand Down
12 changes: 8 additions & 4 deletions xdr/ledger_close_meta.go
Original file line number Diff line number Diff line change
Expand Up @@ -147,18 +147,22 @@ func (l LedgerCloseMeta) UpgradesProcessing() []UpgradeEntryMeta {
// EvictedLedgerKeys returns the LedgerKeys for both the
// EvictedTemporaryLedgerKeys and and the EvictedPersistentLedgerEntries in a
// ledger.
func (l LedgerCloseMeta) EvictedLedgerKeys() []LedgerKey {
func (l LedgerCloseMeta) EvictedLedgerKeys() ([]LedgerKey, error) {
switch l.V {
case 0, 1:
return nil
return nil, nil
case 2:
v2 := l.MustV2()
keys := make([]LedgerKey, 0, len(v2.EvictedTemporaryLedgerKeys)+len(v2.EvictedPersistentLedgerEntries))
keys = append(keys, l.MustV2().EvictedTemporaryLedgerKeys...)
for _, entry := range l.MustV2().EvictedPersistentLedgerEntries {
keys = append(keys, entry.LedgerKey())
key, err := entry.LedgerKey()
if err != nil {
return nil, err
}
keys = append(keys, key)
}
return keys
return keys, nil
default:
panic(fmt.Sprintf("Unsupported LedgerCloseMeta.V: %d", l.V))
}
Expand Down
Loading