Skip to content

Add provisory blockhash lifetime helpers #519

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

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

lorisleiva
Copy link
Member

@lorisleiva lorisleiva commented Jun 3, 2025

This PR adds the following items to the transaction-messages package:

  • The PROVISORY_BLOCKHASH_LIFETIME_CONSTRAINT constant. It defines an invalid but temporary blockhash lifetime constraint that can be used for a variety of applications such as: simulating a transaction before setting its actual blockhash, calculating the size of the transaction message, etc.
  • The setTransactionMessageLifetimeUsingProvisoryBlockhash function that simply sets the blockhash lifetime constraint using the PROVISORY_BLOCKHASH_LIFETIME_CONSTRAINT.
  • The fillMissingTransactionMessageLifetimeUsingProvisoryBlockhash function that only sets the provisory blockhash if and only if the provided transaction message does not already have a set lifetime constraint.

Note that this is currently used by the Compute Budget client and will be required for Instruction Plans.

Copy link

changeset-bot bot commented Jun 3, 2025

🦋 Changeset detected

Latest commit: 2df5868

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

This PR includes changesets to release 40 packages
Name Type
@solana/transaction-messages Patch
@solana/kit Patch
@solana/programs Patch
@solana/rpc-api Patch
@solana/rpc-subscriptions-api Patch
@solana/signers Patch
@solana/transaction-confirmation Patch
@solana/transactions Patch
@solana/rpc Patch
@solana/sysvars Patch
@solana/rpc-subscriptions Patch
@solana/react Patch
@solana/compat Patch
@solana/rpc-graphql 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/codecs Patch
@solana/errors Patch
@solana/fast-stable-stringify Patch
@solana/functional Patch
@solana/instructions Patch
@solana/keys Patch
@solana/nominal-types Patch
@solana/options Patch
@solana/promises Patch
@solana/rpc-parsed-types Patch
@solana/rpc-spec-types Patch
@solana/rpc-spec Patch
@solana/rpc-subscriptions-channel-websocket Patch
@solana/rpc-subscriptions-spec Patch
@solana/rpc-transformers Patch
@solana/rpc-transport-http Patch
@solana/rpc-types Patch
@solana/subscribable 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
Member Author

This stack of pull requests is managed by Graphite. Learn more about stacking.

Copy link

bundlemon bot commented Jun 3, 2025

BundleMon

Files updated (4)
Status Path Size Limits
transaction-messages/dist/index.browser.mjs
7.42KB (+188B +2.54%) -
transaction-messages/dist/index.native.mjs
7.42KB (+187B +2.52%) -
transaction-messages/dist/index.node.mjs
7.42KB (+187B +2.52%) -
@solana/kit production bundle
kit/dist/index.production.min.js
34.46KB (+67B +0.19%) -
Unchanged files (123)
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 -
errors/dist/index.node.mjs
14.54KB -
errors/dist/index.browser.mjs
14.52KB -
errors/dist/index.native.mjs
14.52KB -
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.62KB -
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.39KB -
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 -
transactions/dist/index.browser.mjs
2.27KB -
transactions/dist/index.native.mjs
2.27KB -
transactions/dist/index.node.mjs
2.26KB -
rpc-subscriptions-spec/dist/index.node.mjs
2.14KB -
rpc-subscriptions-spec/dist/index.native.mjs
2.09KB -
rpc-subscriptions-spec/dist/index.browser.mjs
2.09KB -
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 -
rpc/dist/index.browser.mjs
1.8KB -
subscribable/dist/index.node.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.53KB -
rpc-types/dist/index.native.mjs
1.53KB -
rpc-types/dist/index.node.mjs
1.53KB -
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
852B -
rpc-spec/dist/index.native.mjs
851B -
rpc-spec/dist/index.node.mjs
850B -
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
230B -
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 -
ws-impl/dist/index.browser.mjs
113B -
crypto-impl/dist/index.node.mjs
111B -
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 +629B +0.18%

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 June 3, 2025 14:29
@lorisleiva lorisleiva requested review from steveluscher and mcintyre94 and removed request for steveluscher June 3, 2025 14:29
Copy link
Contributor

github-actions bot commented Jun 3, 2025

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

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.

Provisory. Such a British word to use. I love it.

So, hang on, instead of introducing the concept of a placeholder lifetime, isn't the right thing to do to relax the requirements of functions that don't really require one?

  • getComputeUnitEstimateForTransactionMessage could stop requiring the message to satisfy TransactionMessageWithLifetime
  • compileTransactionMessage could add an overload that:
    • produces CompiledTransaction when the input message does not satisfy TransactionMessageWithLifetime
    • produces CompiledTransaction & CompiledTransactionWithLifetime when the input message satisfies TransactionMessageWithLifetime
  • Rpc::simulateTransaction could continue not to care, because it just takes in Base58EncodedBytes
  • compileTransaction could continue requiring as input the more strict CompilableTransactionMessage & TransactionMessageWithLifetime because there's still no good use case for marrying a transaction message that has no valid lifetime with a signature.

@lorisleiva
Copy link
Member Author

@steveluscher That is a good point. The only thing is the whole instruction plan machinery relies on the CompilableTransactionMessage type both as input to figure out the base transaction sizes and as output for the TransactionPlans. So if we were to relax some of these rules, we'd need another type definition such as SizableTransactionMessage that can be used instead of CompilableTransactionMessage by the transaction planners. What do you think?

Copy link
Collaborator

Show me a short example; I bet I can make it work.

@lorisleiva
Copy link
Member Author

Hmm extracting a small example of this API is tricky but essentially CompilableTransactionMessage is the glue that holds all the different plans together.

I believe we can change all of these to use a looser SizableTransactionMessage type instead and just let the TransactionPlanExecutor take care of the transaction from a SizableTransactionMessage to a compiled transaction. But we would have to assume the latest blockhash is required by default instead of failing if one is not explicitly provided.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants