-
Notifications
You must be signed in to change notification settings - Fork 2.8k
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
Use indexation cache to satisfy "coins to spend" queries #2463
base: master
Are you sure you want to change the base?
Conversation
…to_spend_cache_part_2
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice stuff so far. I have only done a relatively shallow sweep and will get back again during the week for a deeper look. I have a few nits and suggestions so far, but nothing major.
I'm not a fan of the lack of explicit error handling in crates/fuel-core/src/graphql_api/storage/coins.rs
but other than that I think the code looks generally really well-written.
…to_spend_cache_part_2
Closes #2474 ## Description This PR changes the following: 1. Adds new test in `tests/tests/relayer.rs` - to ensure that only **non**-retryable messages contribute to the balance returned from `balance()`, `balances()` and `coins_to_spend()`[^1] endpoints 2. Modifies the `balance()` test in `tests/tests/balances.rs` to also include some retryable message which is expected **not** to contribute to the total balance. * for `balances()` and `coins_to_spend()` it was already the case 1<sup>st</sup> test checks the behavior of the actual blockchain operations while the 2<sup>nd</sup> tests the proper initialization of the balances index at genesis. ## Checklist - [X] Breaking changes are clearly marked as such in the PR description and changelog - [X] New behavior is reflected in tests ### Before requesting review - [X] I have reviewed the code myself [^1]: currently, `coins_to_spend()` is not using indexation, this will change when [this PR](#2463) is merged. --------- Co-authored-by: Green Baneling <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Apologies for taking longer than expected. While most of this looks good to me, I have a few questions of some things that puzzle me. Moreover, there are two concrete things I'd like to see updated before approving:
First, we should update the description and name of the random_improve
function. Second, I'd like to see an integration test that shows how this algorithm behaves end to end.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for updating. I would like to see the "random_improve" function renamed, perhaps just to "random" but I can live with the old name as well.
…to_spend_cache_part_2
My understanding was that the "random improve" is actually the name of the algorithm. The linked article literally mentions this name. Cardano seems to be using the exact same name as well. |
// We aim to reduce dust creation by targeting twice the required amount for selection, | ||
// inspired by the random-improve approach. This increases the likelihood of generating | ||
// useful change outputs for future transactions, minimizing unusable dust outputs. | ||
// See also "let upper_target = target.saturating_mul(2);" in "fn random_improve()". |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Very interesting !
let storage = block_st_transaction.storage::<CoinsToSpendIndex>(); | ||
let maybe_old_value = storage.replace(&key, &IndexedCoinType::Coin)?; | ||
if maybe_old_value.is_some() { | ||
return Err(IndexationError::CoinToSpendAlreadyIndexed { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If we return an error here the coin will still be inserted in the transaction and not revert. If we drop the transaction in an outer function it might not be an issue but maybe the dev of the outer function isn't aware of this. Same for add_messages
Closes #2391
This PR includes all changes from the Part 1 PR, making it deprecated.
Description
Changes in this PR:
The new
CoinsToSpend
indexMessages
orCoins
on-chain databasesNonce
UtxoId
IndexedCoinType
enum, so we know which on-chain database to query when returning the actual coinsmax
andexcluded
params)max
) we fill the remaining slots with a random number of "dust" coinsChanges to
CoinsQueryError
typeMaxCoinsReached
variant has been removed because in the new algorithm we never query for more coins than the specifiedmax
, hence, without additional effort, we are not able to tell whether the query could be satisfied if user provided biggermax
InsufficientCoins
has been renamed toInsufficientCoinsForTheMax
and it now contains the additionalmax
fieldOff-chain database metadata
IndexationKind
-CoinsToSpend
Refactoring
indexation.rs
module was split into separate files, each per indexation type + errors + some utils.Other
coinsToSpend
GraphQL query is now limited to the maximum number of inputs allowed in transaction.Before requesting review
Follow-up issues
CoinsToSpendIndexKey
fromVec<u8>
to typed struct, similarly toOwnedTransactionIndexKey
#2498OffChainDatabase::coins_to_spend_index()
function should return error if indexation is not available #2499