From 15a30cfa25d1fedcbfd764510da60950f1ed391c Mon Sep 17 00:00:00 2001 From: Lucas B Date: Thu, 18 Jan 2024 17:16:45 -0600 Subject: [PATCH 1/6] SIMD 0108 --- .gitignore | 3 +- assets/tip_payment_program.png | Bin 0 -> 86816 bytes proposals/0108-dynamic-tips.md | 146 +++++++++++++++++++++++++++++++++ 3 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 assets/tip_payment_program.png create mode 100644 proposals/0108-dynamic-tips.md diff --git a/.gitignore b/.gitignore index 40b878db5..a5199f687 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -node_modules/ \ No newline at end of file +node_modules/ +.idea \ No newline at end of file diff --git a/assets/tip_payment_program.png b/assets/tip_payment_program.png new file mode 100644 index 0000000000000000000000000000000000000000..cf1996a8e76dc61314feaed8969d559cc3e5c7d1 GIT binary patch literal 86816 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 H`r>~B{UEm( literal 0 HcmV?d00001 diff --git a/proposals/0108-dynamic-tips.md b/proposals/0108-dynamic-tips.md new file mode 100644 index 000000000..1958bedf8 --- /dev/null +++ b/proposals/0108-dynamic-tips.md @@ -0,0 +1,146 @@ +--- +simd: '0108' +title: Add a built-in tipping mechanism where transactions can send SOL to the current leader +authors: + - Lucas Bruder +category: Standard +type: Core +status: Draft +created: 2024-01-18 +feature: N/A +--- + +## Summary + +I propose the addition of a mechanism that allows sending tips in SOL to the current leader through a built-in program. +It's important that this is a built-in program as opposed to directly tipping the leader to solve for potential issues with Solana's access lists and a rotating leader. + +## Motivation + +As of the time of writing, 50% of the network is running Jito-Solana and processing tips payments through the tip payment program. +In between slots 233,280,000 (December 1, 2023) and 241,629,832 (January 13, 2024), more than 50,000 SOL has been tipped through this program [[source](https://docs.google.com/spreadsheets/d/1fhGxUKYDefV_fgpGwqbEQdgZog_Q8e_J0pZHgDiRj70/edit?usp=sharing)]. +Given the large increase in tips happening out of protocol, I believe this mechanism should be brought in-protocol. + +### The Tip Payment Program + +Note: This section is an aside on how Jito's Tip Payment program works. +Skip ahead if you don't care, but I think it sets an important context as moving related functionality in protocol given 50% of the network by stake is running the Jito-Solana validator client. + +SOL tips in the Jito-Solana validator client are handled by the tip payment program. +The tip payment program is an out-of-consensus runtime program that's tightly integrated with the Jito-Solana validator client. + +![img.png](../assets/tip_payment_program.png) + +#### Motivation Behind the Tip Payment Program +This program was written for several reasons: +- 100% of the tips go to the validator's address of choosing instead of 50% being burned. +- It allows for dynamic tipping using CPIs. +- Addresses challenges with Solana's transaction access lists. + - If a searcher sends a transaction, it has the potential to land on the current and next N leaders (until their blockhash expires). + - If a searcher wants to send a tip to the validator without the tip payment program, they would need to sign their transactions N different ways. + - This program was designed such that the tip addresses stay the same and the "owner" of the tips in the program changes. +- Tips are only paid if the transaction successfully executes, as opposed to priority fees which get paid independent of transaction success or not. + +#### How does the tip payment program work? +- The tip program consists of eight tip accounts that searchers can transfer SOL to. +- These transfers can be as top-level instructions or CPIs using the `Transfer` system program instruction. +- Jito Labs' Block Engine (and likely future block builders on Solana) will simulate transactions and attempt to maximize the SOL transferred to these accounts. +- There is also an associated configuration that contains information like the block_builder address, the block_builder_commission, and a tip_receiver address. + - These can be ignored for this proposal. +- The tip receiver address is a place where the Solana tips are transferred to when an instruction is called to change the tip receiver. + +The following is the order of operations on how this program is used inside a Jito-Solana validator. +1. On the first bundle received for a given slot, the validator ensures the tip payment program tip receiver is configured correctly. + 2. If not, it will call the change tip receiver instruction, which transfers any SOL in the tip accounts to the currently configured tip reciver before changing it. +3. The validator will execute the bundles and tips accumulate in the eight tip accounts. + +### Shortcomings of the Compute Budget Program +As mentioned above, there are a few shortcomings of the Compute Budget program. +- The current compute budget program for specifying priority fees burns 50%. This is not incentive compatible for the leaders, 100% should go to the leader. + - This will be fixed in SIMD-0096. +- The current compute budget program does not allow for dynamic tipping. + - Dynamic tipping is defined as tipping in the runtime through a CPI and not a top-level instruction. + - The compute budget program is actually a runtime modifier and not a program one can call into in the runtime. + - This means that any compute budget instructions must be defined as top-level instructions. + - Top-level instructions are statically defined on transaction creation. + - When searchers are tipping in arbitrage and MEV-related transactions, they typically tip a percentage of profit as determined in the runtime. + - This is helpful as state on-chain likely changes in between their simulation (arbitrage routing) and execution. + - If searchers have static tips in their transactions, they may end up paying more than their profit. + - Most searchers have balance checks to ensure their trade was profitable. If they end up tipping too much, their entire transaction reverts. +- The tip payment program also allows validators to dynamically route where tips go. + - This allows validators to route tips to themselves or accounts owned by other programs. + - The best example of the other program is the Jito tip distribution program, which is responsible for routing tips to validators based on a custom commission and all stakers pro rata. + +### Shortcomings of the Tip Payment Program +While this program has allowed us to prove out dynamic tips, there are several issues with this mechanism: +- Significant fees for the Solana network are captured out-of-band. It's best for the network that these are moved into the protocol. +- There are eight tip accounts, and it's up to searchers to intelligently load balance across tip accounts. + - If incorrectly load balanced, it decreases the parallelism in the runtime. + +## New Terminology + +None + +## Detailed Design + +There are a few changes that need to happen to the protocol to re-implement the tip payment program in consensus. + +### Receiving Tips In The Runtime + +### Tip Program + +I suggest a tip program as a Solana Native Program with the following instructions and state. +The TipConfigurationState can either be stored in a validator's VoteState. + +```rs +struct TipConfigurationState { + tip_receiver: Pubkey, + last_epoch_update: u64, + new_tip_receiver: Pubkey, +} + +enum TipInstruction { + /// Sends lamports to the leader + /// # Account references + /// 0. `[WRITE, SIGNER]` Funding account + TipLeader { lamports: u64 }, + + /// Allows a leader to change their tip receiver. + /// This instruction enqueues a tip receiver change to happen on the next epoch boundary. + /// # Account references + /// 0. `[READ]` The new tip receiver account + /// 1. `[WRITE, SIGNER]` The leader changing their tip erceiver + ChangeTipReceiver, +} +``` + +For transactions that would like to tip the leader, they can either call TipInstruction::TipLeader as a top level instruction +or call into this method in a CPI. Inside the CPI, there is an atomic u64 that increments a variable based on the lamports supplied +in the instruction and subtracts the lamports from the signer's account. + +At the end of the slot when a bank is frozen, there is a method that runs, similar to the incinerator, which transfers any accumulated +lamports in the runtime variable into the configured tip_receiver. + +The TipInstruction::ChangeTipReceiver instruction allows a validator to change their configured tip receiver. +Any changes are delayed until an epoch boundary. Furthermore, the tip receiver can only be changed in the first 50% of the epoch +to avoid any last minute changes immediately before the epoch boundary. + +## Impact +Tips happen in consensus. + +## Alternatives Considered +Pro rata tip distribution to stakers and validators could happen on the epoch boundary and be controlled by another variable. +However, the epoch boundaries are already very tricky and slow. + +## Security Considerations +TODO + +### Misappropriation of Tips +Without the epoch rollover constraint on the tip receiver, validators would be able to sandwich transactions that contain large tips, +potentially stealing or misappropriating tips. + +## Drawbacks +TODO + +## Backwards Compatibility +This will not be backwards compatible and will need to be adopted by all validator clients on the network, gated by a feature flag. \ No newline at end of file From c960362d7e71cbdc554c05c9c26999e060947f13 Mon Sep 17 00:00:00 2001 From: Lucas B Date: Thu, 18 Jan 2024 17:34:42 -0600 Subject: [PATCH 2/6] add impact --- proposals/0108-dynamic-tips.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/0108-dynamic-tips.md b/proposals/0108-dynamic-tips.md index 1958bedf8..ca083f656 100644 --- a/proposals/0108-dynamic-tips.md +++ b/proposals/0108-dynamic-tips.md @@ -126,7 +126,7 @@ Any changes are delayed until an epoch boundary. Furthermore, the tip receiver c to avoid any last minute changes immediately before the epoch boundary. ## Impact -Tips happen in consensus. +Tips happen as a native program and not out of consensus. ## Alternatives Considered Pro rata tip distribution to stakers and validators could happen on the epoch boundary and be controlled by another variable. From 98c86d2d156adb14f519477c9b45830d3168b40c Mon Sep 17 00:00:00 2001 From: Lucas B Date: Thu, 18 Jan 2024 17:51:59 -0600 Subject: [PATCH 3/6] lintg --- proposals/0108-dynamic-tips.md | 168 +++++++++++++++++++++++---------- 1 file changed, 119 insertions(+), 49 deletions(-) diff --git a/proposals/0108-dynamic-tips.md b/proposals/0108-dynamic-tips.md index ca083f656..a5130d511 100644 --- a/proposals/0108-dynamic-tips.md +++ b/proposals/0108-dynamic-tips.md @@ -1,6 +1,6 @@ --- simd: '0108' -title: Add a built-in tipping mechanism where transactions can send SOL to the current leader +title: Add a built-in tipping mechanism authors: - Lucas Bruder category: Standard @@ -12,69 +12,122 @@ feature: N/A ## Summary -I propose the addition of a mechanism that allows sending tips in SOL to the current leader through a built-in program. -It's important that this is a built-in program as opposed to directly tipping the leader to solve for potential issues with Solana's access lists and a rotating leader. +I propose the addition of a mechanism that allows sending tips in SOL to the +current leader through a built-in program. +It's important that this is a built-in program as opposed to directly tipping +the leader to solve for potential issues with Solana's access lists +and a rotating leader. ## Motivation -As of the time of writing, 50% of the network is running Jito-Solana and processing tips payments through the tip payment program. -In between slots 233,280,000 (December 1, 2023) and 241,629,832 (January 13, 2024), more than 50,000 SOL has been tipped through this program [[source](https://docs.google.com/spreadsheets/d/1fhGxUKYDefV_fgpGwqbEQdgZog_Q8e_J0pZHgDiRj70/edit?usp=sharing)]. -Given the large increase in tips happening out of protocol, I believe this mechanism should be brought in-protocol. +As of the time of writing, 50% of the network is running Jito-Solana and +processing tips payments through the tip payment program. +In between slots 233,280,000 (December 1, 2023) and 241,629,832 +(January 13, 2024), more than 50,000 SOL has been tipped through this program +[[source](https://docs.google.com/spreadsheets/d/1fhGxUKYDefV_fgpGwqbEQdgZog_Q8e_J0pZHgDiRj70/edit?usp=sharing)]. +Given the large increase in tips happening out of protocol, I believe this +mechanism should be brought in-protocol. ### The Tip Payment Program Note: This section is an aside on how Jito's Tip Payment program works. -Skip ahead if you don't care, but I think it sets an important context as moving related functionality in protocol given 50% of the network by stake is running the Jito-Solana validator client. +Skip ahead if you don't care, but I think it sets an important context as +moving related functionality in protocol given 50% of the network by +stake is running the Jito-Solana validator client. -SOL tips in the Jito-Solana validator client are handled by the tip payment program. -The tip payment program is an out-of-consensus runtime program that's tightly integrated with the Jito-Solana validator client. +SOL tips in the Jito-Solana validator client are handled by the tip payment +program. +The tip payment program is an out-of-consensus runtime program that's +tightly integrated with the Jito-Solana validator client. ![img.png](../assets/tip_payment_program.png) #### Motivation Behind the Tip Payment Program + This program was written for several reasons: -- 100% of the tips go to the validator's address of choosing instead of 50% being burned. + +- 100% of the tips go to the validator's address of choosing +instead of 50% being burned. - It allows for dynamic tipping using CPIs. - Addresses challenges with Solana's transaction access lists. - - If a searcher sends a transaction, it has the potential to land on the current and next N leaders (until their blockhash expires). - - If a searcher wants to send a tip to the validator without the tip payment program, they would need to sign their transactions N different ways. - - This program was designed such that the tip addresses stay the same and the "owner" of the tips in the program changes. -- Tips are only paid if the transaction successfully executes, as opposed to priority fees which get paid independent of transaction success or not. + - If a searcher sends a transaction, it has the potential + to land on the current and next N leaders (until their blockhash expires). + - If a searcher wants to send a tip to the validator without the + tip payment program, they would need to sign their transactions N + different ways. + - This program was designed such that the tip addresses stay the + same and the "owner" of the tips in the program changes. +- Tips are only paid if the transaction successfully executes, as opposed to +priority fees which get paid independent of transaction success or not. #### How does the tip payment program work? -- The tip program consists of eight tip accounts that searchers can transfer SOL to. -- These transfers can be as top-level instructions or CPIs using the `Transfer` system program instruction. -- Jito Labs' Block Engine (and likely future block builders on Solana) will simulate transactions and attempt to maximize the SOL transferred to these accounts. -- There is also an associated configuration that contains information like the block_builder address, the block_builder_commission, and a tip_receiver address. + +- The tip program consists of eight tip accounts that searchers can +transfer SOL to. +- These transfers can be as top-level instructions or CPIs using +the `Transfer` system program instruction. +- Jito Labs' Block Engine (and likely future block builders on Solana) +will simulate transactions and attempt to maximize the SOL transferred +to these accounts. +- There is also an associated configuration that contains information +like the block_builder address, the block_builder_commission, +and a tip_receiver address. - These can be ignored for this proposal. -- The tip receiver address is a place where the Solana tips are transferred to when an instruction is called to change the tip receiver. +- The tip receiver address is a place where the Solana tips are +transferred to when an instruction is called to change the tip receiver. + +The following is the order of operations on how this program is used +inside a Jito-Solana validator. -The following is the order of operations on how this program is used inside a Jito-Solana validator. -1. On the first bundle received for a given slot, the validator ensures the tip payment program tip receiver is configured correctly. - 2. If not, it will call the change tip receiver instruction, which transfers any SOL in the tip accounts to the currently configured tip reciver before changing it. -3. The validator will execute the bundles and tips accumulate in the eight tip accounts. +1. On the first bundle received for a given slot, the validator ensures +the tip payment program tip receiver is configured correctly. + 2. If not, it will call the change tip receiver instruction, which + transfers any SOL in the tip accounts to the currently configured tip + receiver before changing it. +3. The validator will execute the bundles and tips accumulate in the +eight tip accounts. ### Shortcomings of the Compute Budget Program + As mentioned above, there are a few shortcomings of the Compute Budget program. -- The current compute budget program for specifying priority fees burns 50%. This is not incentive compatible for the leaders, 100% should go to the leader. + +- The current compute budget program for specifying priority fees burns 50%. +This is not incentive compatible for the leaders, 100% should go to the leader. - This will be fixed in SIMD-0096. - The current compute budget program does not allow for dynamic tipping. - - Dynamic tipping is defined as tipping in the runtime through a CPI and not a top-level instruction. - - The compute budget program is actually a runtime modifier and not a program one can call into in the runtime. - - This means that any compute budget instructions must be defined as top-level instructions. + - Dynamic tipping is defined as tipping in the runtime through a CPI and + not a top-level instruction. + - The compute budget program is actually a runtime modifier and not a + program one can call into in the runtime. + - This means that any compute budget instructions must be defined as + top-level instructions. - Top-level instructions are statically defined on transaction creation. - - When searchers are tipping in arbitrage and MEV-related transactions, they typically tip a percentage of profit as determined in the runtime. - - This is helpful as state on-chain likely changes in between their simulation (arbitrage routing) and execution. - - If searchers have static tips in their transactions, they may end up paying more than their profit. - - Most searchers have balance checks to ensure their trade was profitable. If they end up tipping too much, their entire transaction reverts. -- The tip payment program also allows validators to dynamically route where tips go. - - This allows validators to route tips to themselves or accounts owned by other programs. - - The best example of the other program is the Jito tip distribution program, which is responsible for routing tips to validators based on a custom commission and all stakers pro rata. + - When searchers are tipping in arbitrage and MEV-related transactions, + they typically tip a percentage of profit as determined in the runtime. + - This is helpful as state on-chain likely changes in between their + simulation (arbitrage routing) and execution. + - If searchers have static tips in their transactions, they may + end up paying more than their profit. + - Most searchers have balance checks to ensure their trade was + profitable. If they end up tipping too much, their entire transaction + reverts. +- The tip payment program also allows validators to dynamically route +where tips go. + - This allows validators to route tips to themselves or accounts + owned by other programs. + - The best example of the other program is the Jito tip distribution + program, which is responsible for routing tips to validators based + on a custom commission and all stakers pro rata. ### Shortcomings of the Tip Payment Program -While this program has allowed us to prove out dynamic tips, there are several issues with this mechanism: -- Significant fees for the Solana network are captured out-of-band. It's best for the network that these are moved into the protocol. -- There are eight tip accounts, and it's up to searchers to intelligently load balance across tip accounts. + +While this program has allowed us to prove out dynamic tips, +there are several issues with this mechanism: + +- Significant fees for the Solana network are captured out-of-band. +It's best for the network that these are moved into the protocol. +- There are eight tip accounts, and it's up to searchers to +intelligently load balance across tip accounts. - If incorrectly load balanced, it decreases the parallelism in the runtime. ## New Terminology @@ -83,14 +136,16 @@ None ## Detailed Design -There are a few changes that need to happen to the protocol to re-implement the tip payment program in consensus. +There are a few changes that need to happen to the protocol to re-implement +the tip payment program in consensus. ### Receiving Tips In The Runtime ### Tip Program -I suggest a tip program as a Solana Native Program with the following instructions and state. -The TipConfigurationState can either be stored in a validator's VoteState. +I suggest a tip program as a Solana Native Program with the following +instructions and state. The TipConfigurationState can either be stored in a +validator's VoteState. ```rs struct TipConfigurationState { @@ -106,7 +161,8 @@ enum TipInstruction { TipLeader { lamports: u64 }, /// Allows a leader to change their tip receiver. - /// This instruction enqueues a tip receiver change to happen on the next epoch boundary. + /// This instruction enqueues a tip receiver change to happen on + /// the next epoch boundary. /// # Account references /// 0. `[READ]` The new tip receiver account /// 1. `[WRITE, SIGNER]` The leader changing their tip erceiver @@ -114,33 +170,47 @@ enum TipInstruction { } ``` -For transactions that would like to tip the leader, they can either call TipInstruction::TipLeader as a top level instruction -or call into this method in a CPI. Inside the CPI, there is an atomic u64 that increments a variable based on the lamports supplied +For transactions that would like to tip the leader, they can either call +TipInstruction::TipLeader as a top level instruction or call into this +method in a CPI. Inside the CPI, there is an atomic u64 that +increments a variable based on the lamports supplied in the instruction and subtracts the lamports from the signer's account. -At the end of the slot when a bank is frozen, there is a method that runs, similar to the incinerator, which transfers any accumulated +At the end of the slot when a bank is frozen, there is a method that runs, +similar to the incinerator, which transfers any accumulated lamports in the runtime variable into the configured tip_receiver. -The TipInstruction::ChangeTipReceiver instruction allows a validator to change their configured tip receiver. -Any changes are delayed until an epoch boundary. Furthermore, the tip receiver can only be changed in the first 50% of the epoch +The TipInstruction::ChangeTipReceiver instruction allows a validator to +change their configured tip receiver. +Any changes are delayed until an epoch boundary. Furthermore, the +tip receiver can only be changed in the first 50% of the epoch to avoid any last minute changes immediately before the epoch boundary. ## Impact + Tips happen as a native program and not out of consensus. ## Alternatives Considered -Pro rata tip distribution to stakers and validators could happen on the epoch boundary and be controlled by another variable. + +Pro rata tip distribution to stakers and validators could +happen on the epoch boundary and be controlled by another variable. However, the epoch boundaries are already very tricky and slow. ## Security Considerations + TODO ### Misappropriation of Tips -Without the epoch rollover constraint on the tip receiver, validators would be able to sandwich transactions that contain large tips, + +Without the epoch rollover constraint on the tip receiver, +validators would be able to sandwich transactions that contain large tips, potentially stealing or misappropriating tips. ## Drawbacks + TODO ## Backwards Compatibility -This will not be backwards compatible and will need to be adopted by all validator clients on the network, gated by a feature flag. \ No newline at end of file + +This will not be backwards compatible and will need to be +adopted by all validator clients on the network, gated by a feature flag. \ No newline at end of file From b3ad80f0190379dfe9d724f7cd0c7a31a0d838a4 Mon Sep 17 00:00:00 2001 From: Lucas B Date: Thu, 18 Jan 2024 17:54:39 -0600 Subject: [PATCH 4/6] bump simd number --- proposals/{0108-dynamic-tips.md => 0109-dynamic-tips.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename proposals/{0108-dynamic-tips.md => 0109-dynamic-tips.md} (99%) diff --git a/proposals/0108-dynamic-tips.md b/proposals/0109-dynamic-tips.md similarity index 99% rename from proposals/0108-dynamic-tips.md rename to proposals/0109-dynamic-tips.md index a5130d511..95c3be476 100644 --- a/proposals/0108-dynamic-tips.md +++ b/proposals/0109-dynamic-tips.md @@ -1,5 +1,5 @@ --- -simd: '0108' +simd: '0109' title: Add a built-in tipping mechanism authors: - Lucas Bruder From 2df488f94cae08df4b91ddc49284808bea5ed3c2 Mon Sep 17 00:00:00 2001 From: Lucas B Date: Thu, 18 Jan 2024 17:57:20 -0600 Subject: [PATCH 5/6] dynamic tips --- proposals/0109-dynamic-tips.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/proposals/0109-dynamic-tips.md b/proposals/0109-dynamic-tips.md index 95c3be476..87d22818b 100644 --- a/proposals/0109-dynamic-tips.md +++ b/proposals/0109-dynamic-tips.md @@ -180,12 +180,16 @@ At the end of the slot when a bank is frozen, there is a method that runs, similar to the incinerator, which transfers any accumulated lamports in the runtime variable into the configured tip_receiver. -The TipInstruction::ChangeTipReceiver instruction allows a validator to +The TipInstruction::ChangeTipReceiver instruction allows a validator to change their configured tip receiver. Any changes are delayed until an epoch boundary. Furthermore, the tip receiver can only be changed in the first 50% of the epoch to avoid any last minute changes immediately before the epoch boundary. +If there's no tip receiver configured, it may make sense to default to the +validator's identity account. The validator's identity account can also +be configured as a valid tip receiver. + ## Impact Tips happen as a native program and not out of consensus. From 2fcddb1e0e6c5b1d18dd8d01c7c7f12930caaed6 Mon Sep 17 00:00:00 2001 From: Lucas B Date: Thu, 18 Jan 2024 18:31:06 -0600 Subject: [PATCH 6/6] edit summary --- proposals/0109-dynamic-tips.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/proposals/0109-dynamic-tips.md b/proposals/0109-dynamic-tips.md index 87d22818b..63d6e61e3 100644 --- a/proposals/0109-dynamic-tips.md +++ b/proposals/0109-dynamic-tips.md @@ -13,10 +13,9 @@ feature: N/A ## Summary I propose the addition of a mechanism that allows sending tips in SOL to the -current leader through a built-in program. -It's important that this is a built-in program as opposed to directly tipping -the leader to solve for potential issues with Solana's access lists -and a rotating leader. +current leader through a built-in program. This is useful for out of band +prioritization schemes that are appearing on Solana with Jito and likely +others in the future. ## Motivation