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

services/horizon: Add endpoint for getting any ledger entry given a ledger entry key XDR string #4695

Closed
leighmcculloch opened this issue Nov 17, 2022 · 10 comments
Labels

Comments

@leighmcculloch
Copy link
Member

What

Add an endpoint for getting a ledger entry given a ledger entry key XDR string.

Supporting at least the following ledger entry key types:

  • Account
  • Trustline
  • ContractData
  • ContractCode

Example contract data ledger entry lookup:

GET /ledger_entries/AAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAZIaUVyaWMAAA==
{
  "_links": {
    "self": {
      "href": "https://horizon-futurenet.stellar.org/ledger_entries/..."
    },
  },
  "key": "AAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAZIaUVyaWMAAA==",
  "entry": "AAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAGSGlFcmljAAAAAAADAAAAAQAAAAA=",
}

Example account ledger entry lookup:

GET /ledger_entries/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
{
  "_links": {
    "self": {
      "href": "https://horizon-futurenet.stellar.org/ledger_entries/..."
    },
  },
  "key": "AAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAZIaUVyaWMAAA==",
  "entry": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2V4YW1wbGUuY29tAAEBAQEAAAAAAAAAAAAAAAA=",
}

Example contract code entry lookup:

GET /ledger_entries/AAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
{
  "_links": {
    "self": {
      "href": "https://horizon-futurenet.stellar.org/ledger_entries/..."
    },
  },
  "key": "AAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
  "entry": "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",
}

Why

Horizon has many types of ledger entries in some form but presents them only in its opinionated JSON form. It would be useful if Horizon exposed the raw XDR of those ledger entries in a similar way that it exposes raw XDR for transaction envelopes.

One use case is applications using the Soroban environment. The Soroban environment when running contracts has a lookup mechanism where it can lazily ask for ledger entries from a data source. It would be helpful in some applications to be able to lazily collect those ledger entries from Horizon who already has them.

It's probably unlikely that Horizon could provide all ledger entries, and for any ledger entry it doesn't support it could return a 422 or 400.

(This isn't a request connected to making Horizon the ledger entry data source for the RPC, although it could be an alternative data source in that way.)

@tomerweller
Copy link
Contributor

I strongly support having this functionality - I think it's an important building block.

Realistically, soroban-rpc might be a better place to implement that in as it will need to have this type of data view anyway to facilitate preflight requests.

@tsachiherman
Copy link
Contributor

I'd be happy to see the bigger picture here : what is the goal of getting a ledger ?
regardless, when a client asks for a data at a specific format, I'd encourage the request to contain ContentType: application/xdr or similar.
@mollykarcher

@ire-and-curses
Copy link
Member

ire-and-curses commented Nov 18, 2022

it will need to have this type of data view anyway to facilitate preflight requests.

I don't understand this. Can you expand? RPC server will know the state of everything for the purposes of pre-flight. Are you saying the user needs ledger entries in order to use preflight?

@tomerweller
Copy link
Contributor

Can you expand?

This is based on the following assumptions, deduced from the design doc

  1. facilitating getAccount() including balances requires access to accounts and trustlines
  2. facilitating simulateTransaction() requires access to contracts and contract data ledger entries

@leighmcculloch
Copy link
Member Author

Are you saying the user needs ledger entries in order to use preflight?

Yup, the RPC server needs ledger entries for preflight. Preflight requires the ledger entries the contract will read or write, and given it's preflight without a footprint that could include any account, any trust line, and any contract data for the executing contract, and same for any contract that is called by the invoked contract, and so on.

@tsachiherman
Copy link
Contributor

Are you saying the user needs ledger entries in order to use preflight?

Yup, the RPC server needs ledger entries for preflight. Preflight requires the ledger entries the contract will read or write, and given it's preflight without a footprint that could include any account, any trust line, and any contract data for the executing contract, and same for any contract that is called by the invoked contract, and so on.

I think that the confusion here is between the core's preflight ( soon to be depreciated ) and the simulateTransaction.

The simulateTransaction is intended to be all-in-one endpoint, that will retrieve the ledger needed(internally), simulate the transaction execution on top of that ledger, and return the results.

That won't work for the case where you want to run your transaction against custom ledger ( which I'm not sure we need ).

@ire-and-curses
Copy link
Member

ire-and-curses commented Nov 18, 2022

retrieve the ledger needed(internally)

Exactly. RPC server has internal access to the current state of the ledger. RPC preflight therefore doesn't need an endpoint. So I'm asking specifically about the need for a ledger entry endpoint like this for the user - not the smart contract.

@tomerweller
Copy link
Contributor

My assumption was that if soroban-rpc has internal access to the required ledger entries, then the added lift of exposing them externally through this API is relatively small. Is that a false assumption?

@jcx120 jcx120 moved this to Backlog in Platform Scrum Nov 18, 2022
@ire-and-curses
Copy link
Member

It's not about the lift, it's about understanding the requirements. There are trade offs around API scope and performance. Not saying it's a bad idea, just want to understand the way such an endpoint would be used.

@mollykarcher
Copy link
Contributor

Closing this as getLedgerEntry (soon to be pluralized) in RPC should service the use case described here. Reopen if you disagree

@github-project-automation github-project-automation bot moved this from Backlog to Done in Platform Scrum Feb 24, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

5 participants