Skip to content

Add transaction size helpers #425

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

Merged
merged 1 commit into from
May 14, 2025
Merged

Conversation

lorisleiva
Copy link
Member

@lorisleiva lorisleiva commented May 1, 2025

This PR adds various types and functions to help get the size of a transaction (or its message) and ensure its size is valid (under the transaction size limit).

Additionally, it provides two new types — TransactionUnderSizeLimit and TransactionMessageUnderSizeLimit — to provide additional type safety before sending a transaction.

In this PR, TransactionUnderSizeLimit and TransactionMessageUnderSizeLimit are only used by their respective type guards but this stack of PR aims to use these types to offer more type safety in other parts of the code. For instance: adding an instruction to or changing the lifetime of a transaction message should remove the TransactionMessageUnderSizeLimit type if any; sending a transaction should require the TransactionUnderSizeLimit; compiling a TransactionMessageUnderSizeLimit into a transaction should return a TransactionUnderSizeLimit; etc.

The next few PRs don't do any of that just yet but prepare the field for such changes. Mainly, it aims to bring more consistency amongst the type flags of transactions and transaction messages so adding yet another one does not affect the developer experience.

Copy link

changeset-bot bot commented May 1, 2025

🦋 Changeset detected

Latest commit: 867e852

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 40 packages
Name Type
@solana/transactions Patch
@solana/errors Patch
@solana/compat Patch
@solana/kit Patch
@solana/react Patch
@solana/rpc-api Patch
@solana/rpc-graphql Patch
@solana/rpc-subscriptions-api Patch
@solana/signers Patch
@solana/transaction-confirmation Patch
@solana/accounts Patch
@solana/addresses Patch
@solana/assertions Patch
@solana/codecs-core Patch
@solana/codecs-data-structures Patch
@solana/codecs-numbers Patch
@solana/codecs-strings Patch
@solana/instructions Patch
@solana/keys Patch
@solana/options Patch
@solana/programs Patch
@solana/rpc-spec Patch
@solana/rpc-subscriptions-channel-websocket Patch
@solana/rpc-subscriptions-spec Patch
@solana/rpc-subscriptions Patch
@solana/rpc-transformers Patch
@solana/rpc-transport-http Patch
@solana/rpc-types Patch
@solana/rpc Patch
@solana/subscribable Patch
@solana/sysvars Patch
@solana/transaction-messages Patch
@solana/rpc-parsed-types Patch
@solana/codecs Patch
@solana/fast-stable-stringify Patch
@solana/functional Patch
@solana/nominal-types Patch
@solana/promises Patch
@solana/rpc-spec-types Patch
@solana/webcrypto-ed25519-polyfill Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

Copy link

vercel bot commented May 1, 2025

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
kit-docs ❌ Failed (Inspect) May 2, 2025 4:54pm

Copy link

bundlemon bot commented May 1, 2025

BundleMon

Files updated (7)
Status Path Size Limits
transactions/dist/index.native.mjs
2.22KB (+243B +11.95%) -
transactions/dist/index.browser.mjs
2.22KB (+242B +11.89%) -
transactions/dist/index.node.mjs
2.22KB (+242B +11.9%) -
@solana/kit production bundle
kit/dist/index.production.min.js
34.38KB (+196B +0.56%) -
errors/dist/index.native.mjs
14.52KB (+59B +0.4%) -
errors/dist/index.node.mjs
14.54KB (+59B +0.4%) -
errors/dist/index.browser.mjs
14.52KB (+58B +0.39%) -
Unchanged files (120)
Status Path Size Limits
rpc-graphql/dist/index.browser.mjs
18.78KB -
rpc-graphql/dist/index.native.mjs
18.78KB -
rpc-graphql/dist/index.node.mjs
18.78KB -
transaction-messages/dist/index.browser.mjs
7.24KB -
transaction-messages/dist/index.native.mjs
7.24KB -
transaction-messages/dist/index.node.mjs
7.24KB -
codecs-data-structures/dist/index.native.mjs
4.77KB -
codecs-data-structures/dist/index.browser.mjs
4.77KB -
codecs-data-structures/dist/index.node.mjs
4.77KB -
webcrypto-ed25519-polyfill/dist/index.node.mj
s
3.57KB -
webcrypto-ed25519-polyfill/dist/index.browser
.mjs
3.56KB -
webcrypto-ed25519-polyfill/dist/index.native.
mjs
3.54KB -
rpc-subscriptions/dist/index.browser.mjs
3.38KB -
rpc-subscriptions/dist/index.node.mjs
3.34KB -
rpc-subscriptions/dist/index.native.mjs
3.31KB -
codecs-core/dist/index.browser.mjs
3.3KB -
codecs-core/dist/index.native.mjs
3.3KB -
codecs-core/dist/index.node.mjs
3.3KB -
rpc-transformers/dist/index.browser.mjs
2.93KB -
rpc-transformers/dist/index.native.mjs
2.93KB -
rpc-transformers/dist/index.node.mjs
2.93KB -
addresses/dist/index.browser.mjs
2.86KB -
addresses/dist/index.native.mjs
2.86KB -
addresses/dist/index.node.mjs
2.86KB -
kit/dist/index.browser.mjs
2.71KB -
kit/dist/index.native.mjs
2.71KB -
kit/dist/index.node.mjs
2.71KB -
signers/dist/index.browser.mjs
2.63KB -
signers/dist/index.native.mjs
2.63KB -
signers/dist/index.node.mjs
2.63KB -
codecs-strings/dist/index.browser.mjs
2.53KB -
codecs-strings/dist/index.node.mjs
2.48KB -
codecs-strings/dist/index.native.mjs
2.45KB -
transaction-confirmation/dist/index.node.mjs
2.4KB -
sysvars/dist/index.browser.mjs
2.35KB -
sysvars/dist/index.native.mjs
2.34KB -
transaction-confirmation/dist/index.native.mj
s
2.34KB -
sysvars/dist/index.node.mjs
2.34KB -
transaction-confirmation/dist/index.browser.m
js
2.34KB -
rpc-subscriptions-spec/dist/index.node.mjs
2.13KB -
rpc-subscriptions-spec/dist/index.native.mjs
2.08KB -
rpc-subscriptions-spec/dist/index.browser.mjs
2.08KB -
keys/dist/index.browser.mjs
2.02KB -
keys/dist/index.native.mjs
2.02KB -
keys/dist/index.node.mjs
2.02KB -
codecs-numbers/dist/index.native.mjs
2.01KB -
codecs-numbers/dist/index.browser.mjs
2.01KB -
codecs-numbers/dist/index.node.mjs
2.01KB -
react/dist/index.native.mjs
1.99KB -
react/dist/index.browser.mjs
1.99KB -
react/dist/index.node.mjs
1.99KB -
rpc/dist/index.node.mjs
1.95KB -
rpc-transport-http/dist/index.browser.mjs
1.91KB -
rpc-transport-http/dist/index.native.mjs
1.91KB -
rpc/dist/index.native.mjs
1.8KB -
subscribable/dist/index.node.mjs
1.8KB -
rpc/dist/index.browser.mjs
1.8KB -
subscribable/dist/index.native.mjs
1.75KB -
subscribable/dist/index.browser.mjs
1.74KB -
rpc-transport-http/dist/index.node.mjs
1.73KB -
rpc-types/dist/index.browser.mjs
1.6KB -
rpc-types/dist/index.native.mjs
1.6KB -
rpc-types/dist/index.node.mjs
1.6KB -
rpc-subscriptions-channel-websocket/dist/inde
x.node.mjs
1.33KB -
rpc-subscriptions-channel-websocket/dist/inde
x.native.mjs
1.27KB -
rpc-subscriptions-channel-websocket/dist/inde
x.browser.mjs
1.26KB -
options/dist/index.browser.mjs
1.18KB -
options/dist/index.native.mjs
1.18KB -
options/dist/index.node.mjs
1.17KB -
accounts/dist/index.browser.mjs
1.13KB -
accounts/dist/index.native.mjs
1.12KB -
accounts/dist/index.node.mjs
1.12KB -
compat/dist/index.browser.mjs
971B -
compat/dist/index.native.mjs
970B -
compat/dist/index.node.mjs
968B -
rpc-spec-types/dist/index.browser.mjs
964B -
rpc-api/dist/index.browser.mjs
963B -
rpc-api/dist/index.native.mjs
962B -
rpc-spec-types/dist/index.native.mjs
962B -
rpc-api/dist/index.node.mjs
961B -
rpc-spec-types/dist/index.node.mjs
961B -
rpc-subscriptions-api/dist/index.native.mjs
870B -
rpc-subscriptions-api/dist/index.node.mjs
869B -
rpc-subscriptions-api/dist/index.browser.mjs
868B -
rpc-spec/dist/index.browser.mjs
829B -
rpc-spec/dist/index.native.mjs
829B -
rpc-spec/dist/index.node.mjs
828B -
promises/dist/index.browser.mjs
799B -
promises/dist/index.native.mjs
798B -
promises/dist/index.node.mjs
797B -
assertions/dist/index.browser.mjs
783B -
instructions/dist/index.browser.mjs
769B -
instructions/dist/index.native.mjs
768B -
instructions/dist/index.node.mjs
767B -
fast-stable-stringify/dist/index.browser.mjs
726B -
fast-stable-stringify/dist/index.native.mjs
725B -
assertions/dist/index.native.mjs
724B -
fast-stable-stringify/dist/index.node.mjs
724B -
assertions/dist/index.node.mjs
723B -
programs/dist/index.browser.mjs
329B -
programs/dist/index.native.mjs
327B -
programs/dist/index.node.mjs
325B -
event-target-impl/dist/index.node.mjs
233B -
functional/dist/index.browser.mjs
154B -
functional/dist/index.native.mjs
152B -
text-encoding-impl/dist/index.native.mjs
152B -
functional/dist/index.node.mjs
151B -
codecs/dist/index.browser.mjs
137B -
codecs/dist/index.native.mjs
136B -
codecs/dist/index.node.mjs
134B -
event-target-impl/dist/index.browser.mjs
133B -
ws-impl/dist/index.node.mjs
131B -
text-encoding-impl/dist/index.browser.mjs
122B -
text-encoding-impl/dist/index.node.mjs
119B -
crypto-impl/dist/index.node.mjs
114B -
ws-impl/dist/index.browser.mjs
113B -
crypto-impl/dist/index.browser.mjs
109B -
rpc-parsed-types/dist/index.browser.mjs
66B -
rpc-parsed-types/dist/index.native.mjs
65B -
rpc-parsed-types/dist/index.node.mjs
63B -

Total files change +1.07KB +0.31%

Final result: ✅

View report in BundleMon website ➡️


Current branch size history | Target branch size history

@lorisleiva lorisleiva marked this pull request as ready for review May 1, 2025 17:48
Copy link
Member

@mcintyre94 mcintyre94 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice, LGTM!

Copy link
Collaborator

@steveluscher steveluscher left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For instance: adding an instruction to or changing the lifetime of a transaction message should remove the TransactionMessageUnderSizeLimit type

I think this is only true when you're going from not-nonce to nonce. Otherwise the size of the transaction should stay the same or decrease.

Lifetime before Lifetime after Should remove TransactionMessageUnderSizeLimit
None Blockhash
None Nonce
Blockhash Nonce
Blockhash Blockhash
Blockhash None
Nonce Nonce
Nonce Blockhash
Nonce None

@lorisleiva lorisleiva force-pushed the 05-01-add_transaction_size_helpers branch from f33ef5d to 18f576a Compare May 5, 2025 13:45
@lorisleiva
Copy link
Member Author

@steveluscher I'm a little confused by your table. Could the second half of it be a bad copy/paste?

@lorisleiva lorisleiva force-pushed the 05-01-add_transaction_size_helpers branch from 18f576a to 243b7f6 Compare May 5, 2025 14:39
Copy link
Collaborator

I don't think so! Essentially all blockhash-based transactions will be the same size, even one that has ‘no’ blockhash, because all that changes is the choice of 32 lifetime specifier bytes in the message, but never the number of bytes.

If a nonce transaction used to have an acceptable size, it will always have an acceptable size if it changes to a blockhash-based one, because the only thing that could have happened is that the AdvanceNonce instruction might have been deleted, or not.

If a nonce transaction used to have an acceptable size, it will still have an acceptable size given a new choice of nonce; while the choice of lifetime specifier and AdvanceNonce instruction bytes changes, the number of those bytes will stay the same.

@lorisleiva
Copy link
Member Author

lorisleiva commented May 5, 2025

Oh so sorry, my brain could categorically not see the difference between "Nonce" and "None" on that table. Makes a lot more sense now.

I'll definitely keep that in mind when I add this logic in subsequent PRs.

@lorisleiva lorisleiva force-pushed the 05-01-add_transaction_size_helpers branch from 243b7f6 to 89bf30d Compare May 6, 2025 08:26
@lorisleiva lorisleiva force-pushed the 05-01-add_transaction_size_helpers branch 2 times, most recently from 5aeb05a to af2e039 Compare May 6, 2025 09:07
@lorisleiva lorisleiva force-pushed the 05-01-add_transaction_size_helpers branch from af2e039 to 437f9f8 Compare May 6, 2025 12:58
@lorisleiva lorisleiva mentioned this pull request May 6, 2025
@lorisleiva lorisleiva force-pushed the 05-01-add_transaction_size_helpers branch from 437f9f8 to e9d78a5 Compare May 7, 2025 12:06
Copy link
Contributor

github-actions bot commented May 7, 2025

Documentation Preview: https://kit-docs-1lgwzynj4-anza-tech.vercel.app

@lorisleiva lorisleiva changed the base branch from main to graphite-base/425 May 8, 2025 15:02
@lorisleiva lorisleiva force-pushed the 05-01-add_transaction_size_helpers branch from e9d78a5 to dbbc080 Compare May 8, 2025 15:02
@lorisleiva lorisleiva changed the base branch from graphite-base/425 to 05-06-fix_signers_typetest_filenames May 8, 2025 15:02
@lorisleiva lorisleiva force-pushed the 05-06-fix_signers_typetest_filenames branch from 6982c44 to c8b5fda Compare May 8, 2025 15:15
@lorisleiva lorisleiva force-pushed the 05-01-add_transaction_size_helpers branch 2 times, most recently from 87bbf91 to 4e54279 Compare May 8, 2025 15:43
@lorisleiva lorisleiva force-pushed the 05-06-fix_signers_typetest_filenames branch from c8b5fda to 82ecc10 Compare May 8, 2025 15:43
@lorisleiva lorisleiva force-pushed the 05-01-add_transaction_size_helpers branch from 4e54279 to a864afe Compare May 8, 2025 15:53
@lorisleiva lorisleiva force-pushed the 05-06-fix_signers_typetest_filenames branch from 82ecc10 to e659cfc Compare May 8, 2025 21:40
@lorisleiva lorisleiva force-pushed the 05-01-add_transaction_size_helpers branch from a864afe to 630dd47 Compare May 8, 2025 21:40
@lorisleiva lorisleiva changed the base branch from 05-06-fix_signers_typetest_filenames to graphite-base/425 May 8, 2025 21:47
@lorisleiva lorisleiva force-pushed the 05-01-add_transaction_size_helpers branch from 630dd47 to f3093e0 Compare May 8, 2025 21:48
@lorisleiva lorisleiva force-pushed the graphite-base/425 branch from e659cfc to 3049e01 Compare May 8, 2025 21:48
@graphite-app graphite-app bot changed the base branch from graphite-base/425 to main May 8, 2025 21:48
@lorisleiva lorisleiva force-pushed the 05-01-add_transaction_size_helpers branch 3 times, most recently from f3093e0 to 56aa6ee Compare May 12, 2025 10:17
@lorisleiva lorisleiva force-pushed the 05-01-add_transaction_size_helpers branch from 56aa6ee to 867e852 Compare May 14, 2025 08:31
Copy link
Member Author

lorisleiva commented May 14, 2025

Merge activity

  • May 14, 5:56 AM EDT: A user started a stack merge that includes this pull request via Graphite.
  • May 14, 5:57 AM EDT: @lorisleiva merged this pull request with Graphite.

@lorisleiva lorisleiva merged commit 93609aa into main May 14, 2025
14 checks passed
@lorisleiva lorisleiva deleted the 05-01-add_transaction_size_helpers branch May 14, 2025 09:57
@github-actions github-actions bot mentioned this pull request May 14, 2025
Copy link
Contributor

Because there has been no activity on this PR for 14 days since it was merged, it has been automatically locked. Please open a new issue if it requires a follow up.

@github-actions github-actions bot locked as resolved and limited conversation to collaborators May 29, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants