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

Extend the Change structure in the ledger_change_reader to include the operation that prompted the ledger entry change #5535

Closed
karthikiyer56 opened this issue Nov 19, 2024 · 7 comments

Comments

@karthikiyer56
Copy link
Contributor

karthikiyer56 commented Nov 19, 2024

A Change struct as represented here indicates that a ledger entry has changed.

A ledger entry can be changed because of a transaction or because of an operation.
Every successful operation will cause one or more ledger change entries.

For e.g a path payment operation will, at a minimum, will cause a ledger change entry for source account entry and destination account, vis-a-vis account balances. The same path payment operation can also cause one or more offers to be partially filled in the order book or take some liquidity of the liquidity pool.
So, in the operationMeta for a successful path payment operation, there will be ledger entry changes corresponding to - source account, destination account, offers that might have been touched by the operation, liqudity pool changes.

It is a useful construct to be able to tie "what caused this change" to the ledger change entry.

This task deals with extending the Change struct to include additional fields to indicate what operation, if any, caused this change

Note that not all changes are caused by operations.
For e.g a change can be caused by a transaction - for e.g The fees for all the operations in a transaction will be debited from the source account of the transaction. So, the Change struct that captures account balance changes for the soure account of the transaction, will not have any details about operation.

@sydneynotthecity
Copy link

➕ this would be immediately beneficial for Hubble. We are creating a tokens_transfer table that makes it easier for analysts to track token movement across the network. Eventually, this table will be loaded from the results of stellar/stellar-protocol#1553. In the interim, we are manually parsing this data from history_trades, history_operations and the ledger state tables, which is a bit of a mess. We're doing some fuzzy joins in BigQuery to associate an operation <> state table, but if the operation was included in the change struct, we would be able to predictably join these two tables.

So, the Change struct that captures account balance changes for the source account of the transaction, will not have any details about operation.

Would it make sense to also include the transaction id or transaction hash on the Change struct? While there is no operation that makes the change, there is a transaction that is associated with the change. For any type of change, regardless if an operation caused it, I think it's useful to also include a way to tie back to transaction id.

@karthikiyer56
Copy link
Contributor Author

karthikiyer56 commented Nov 21, 2024

Would it make sense to also include the transaction id or transaction hash on the Change struct? While there is no operation that makes the change, there is a transaction that is associated with the change. For any type of change, regardless if an operation caused it, I think it's useful to also include a way to tie back to transaction id.

@sydneynotthecity - yes, this is a fair ask and one that is easily done.
I will include the Transaction Hash and Transaction id (They start from 0, instead of 1) within the LCM, in the Change entry struct

@chowbao
Copy link
Contributor

chowbao commented Nov 21, 2024

Would it also make sense to include the ledger sequence? Or at what point is the normalization/denormalization of the data model reasonable for the change reader?

Does this change also include updates to the change compactor then?
Does it make sense to force the change compactor to only accept 1 ledger sequence at a time rather than a range of sequences?

Edit: PR shows added LedgerCloseMeta and LedgerTransaction which takes care of ledger sequence

@karthikiyer56
Copy link
Contributor Author

karthikiyer56 commented Nov 21, 2024

The semantic of reading changes does not work with the change compactor.
Meaning, if you are using the ChangeCompactor, do not expect the sub-entries in the []Change to be accurate, wrto Txinfo etc etc.

I mention that in the comments over the Change struct

Tl;dr - if you want to get change information at this kind of grass root level, you should not be using the ChangeCompactor.
instead you should use the LedgerChangeReader...

Something like

changeReader, err = ingest.NewLedgerChangeReaderFromLedgerCloseMeta("network pass phrase", ledger)
var changes []ingest.Change
	for {
		change, err := reader.Read()
		if err != nil {
			changes = append(cchanges, change)
		}
	}
dosomethingWithChanges(changes)

@karthikiyer56
Copy link
Contributor Author

karthikiyer56 commented Nov 21, 2024

Re

Does it make sense to force the change compactor to only accept 1 ledger sequence at a time rather than a range of sequences?
The changeCompactor works at the cadence of a single ledger and not a sequence of ledgrs.

If an entry undergoes multiple changes as a part of one or more operations within a transaction OR as a part of one or more transactions in a ledger, the change compactor simply spews a single Change struct that highlights the ledgerEntry state before ledger and after ledger.

Unless you meant something else?

@karthikiyer56 karthikiyer56 moved this from To Do to In Progress in Platform Scrum Nov 21, 2024
@chowbao
Copy link
Contributor

chowbao commented Nov 22, 2024

Re

Does it make sense to force the change compactor to only accept 1 ledger sequence at a time rather than a range of sequences?
The changeCompactor works at the cadence of a single ledger and not a sequence of ledgrs.

If an entry undergoes multiple changes as a part of one or more operations within a transaction OR as a part of one or more transactions in a ledger, the change compactor simply spews a single Change struct that highlights the ledgerEntry state before ledger and after ledger.

Unless you meant something else?

Well right now I think the change compactor can take more than 1 ledger to compact the changes. Stellar-etl is written in a way so it only compacts 1 ledger at a time to create our state tables. I'm asking if it is worth standardizing the practice of only passing one ledger at a time to the change compactor instead of a ledger range

NVM the change compactor accepts changes. It is up to the user to decide what changes to pass to the compactor

karthikiyer56 added a commit that referenced this issue Dec 3, 2024
This squash commit is the sum total of all the commits for this github issue - #5535

TL;dr 
Extend the ingest.Change struct to include information about the reason for the state change in the ledgerEntry.

* Include operation information in the Change struct

* Dont error out when operation index out of range

* Fix failing unit test

* Reafactor ledger_transaction.GetChanges() to use internal functions

* reformat comments

* Add all types of change reasons to the Change struct. Simplify LedgerTransaction.GetChanges()

* Add LCM and transaction info altogether in change entry

* Wrte help doc for Change Entry

* Add TxHash to LedgerTransaction struct

* reorg comments

* Comments cleanup

* Address PR review changes

* rename fields

* uncommit half baked changes

* Add helpers in intergration tests for creating captive core config

* fix updates to change struct

* Updates to integration.go

* Integration tests for change - part 1

* Undo all changes to parameters_test.go

* Make updates to comments and rename variables

* - Several changes to integration.go to pull out common functions from parameters_test.go to configure captive core
- Add flags to capture state for upgrade version in test.
- Add support to skip container deletion for debugging

- Add test for upgrade related changes

* cosmetic doc style changes

* check err before file close

* Add tx test and in change_test.go

* code cleanup

* Rework test fixtures

* reformat file

* Fix breaking test

* Address code review comments
@sreuland
Copy link
Contributor

sreuland commented Dec 3, 2024

confirmed this is done-done in standup.

@sreuland sreuland closed this as completed Dec 3, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: Done
Development

No branches or pull requests

4 participants