solana_runtime/bank/builtins/
mod.rs

1pub(crate) mod core_bpf_migration;
2pub mod prototypes;
3
4pub use prototypes::{BuiltinPrototype, StatelessBuiltinPrototype};
5use {
6    core_bpf_migration::CoreBpfMigrationConfig,
7    solana_feature_set as feature_set,
8    solana_sdk::{bpf_loader, bpf_loader_deprecated, bpf_loader_upgradeable},
9};
10
11macro_rules! testable_prototype {
12    ($prototype:ident {
13        core_bpf_migration_config: $core_bpf_migration_config:expr,
14        name: $name:ident,
15        $($field:ident : $value:expr),* $(,)?
16    }) => {
17        $prototype {
18            core_bpf_migration_config: {
19                #[cfg(not(test))]
20                {
21                    $core_bpf_migration_config
22                }
23                #[cfg(test)]
24                {
25                    Some( test_only::$name::CONFIG )
26                }
27            },
28            name: stringify!($name),
29            $($field: $value),*
30        }
31    };
32}
33
34/// DEVELOPER: when a builtin is migrated to sbpf, please add its corresponding
35/// migration feature ID to solana-builtin-default-costs::BUILTIN_INSTRUCTION_COSTS,
36/// so the builtin's default cost can be determined properly based on feature status.
37/// When migration completed, and the feature gate is enabled everywhere, please
38/// remove that builtin entry from solana-builtin-default-costs::BUILTIN_INSTRUCTION_COSTS.
39pub static BUILTINS: &[BuiltinPrototype] = &[
40    testable_prototype!(BuiltinPrototype {
41        core_bpf_migration_config: None,
42        name: system_program,
43        enable_feature_id: None,
44        program_id: solana_system_program::id(),
45        entrypoint: solana_system_program::system_processor::Entrypoint::vm,
46    }),
47    testable_prototype!(BuiltinPrototype {
48        core_bpf_migration_config: None,
49        name: vote_program,
50        enable_feature_id: None,
51        program_id: solana_vote_program::id(),
52        entrypoint: solana_vote_program::vote_processor::Entrypoint::vm,
53    }),
54    BuiltinPrototype {
55        core_bpf_migration_config: Some(CoreBpfMigrationConfig {
56            source_buffer_address: buffer_accounts::stake_program::id(),
57            upgrade_authority_address: None,
58            feature_id: solana_feature_set::migrate_stake_program_to_core_bpf::id(),
59            migration_target: core_bpf_migration::CoreBpfMigrationTargetType::Builtin,
60            datapoint_name: "migrate_builtin_to_core_bpf_stake_program",
61        }),
62        name: "stake_program",
63        enable_feature_id: None,
64        program_id: solana_stake_program::id(),
65        entrypoint: solana_stake_program::stake_instruction::Entrypoint::vm,
66    },
67    BuiltinPrototype {
68        core_bpf_migration_config: Some(CoreBpfMigrationConfig {
69            source_buffer_address: buffer_accounts::config_program::id(),
70            upgrade_authority_address: None,
71            feature_id: solana_feature_set::migrate_config_program_to_core_bpf::id(),
72            migration_target: core_bpf_migration::CoreBpfMigrationTargetType::Builtin,
73            datapoint_name: "migrate_builtin_to_core_bpf_config_program",
74        }),
75        name: "config_program",
76        enable_feature_id: None,
77        program_id: solana_config_program::id(),
78        entrypoint: solana_config_program::config_processor::Entrypoint::vm,
79    },
80    testable_prototype!(BuiltinPrototype {
81        core_bpf_migration_config: None,
82        name: solana_bpf_loader_deprecated_program,
83        enable_feature_id: None,
84        program_id: bpf_loader_deprecated::id(),
85        entrypoint: solana_bpf_loader_program::Entrypoint::vm,
86    }),
87    testable_prototype!(BuiltinPrototype {
88        core_bpf_migration_config: None,
89        name: solana_bpf_loader_program,
90        enable_feature_id: None,
91        program_id: bpf_loader::id(),
92        entrypoint: solana_bpf_loader_program::Entrypoint::vm,
93    }),
94    testable_prototype!(BuiltinPrototype {
95        core_bpf_migration_config: None,
96        name: solana_bpf_loader_upgradeable_program,
97        enable_feature_id: None,
98        program_id: bpf_loader_upgradeable::id(),
99        entrypoint: solana_bpf_loader_program::Entrypoint::vm,
100    }),
101    testable_prototype!(BuiltinPrototype {
102        core_bpf_migration_config: None,
103        name: compute_budget_program,
104        enable_feature_id: None,
105        program_id: solana_sdk::compute_budget::id(),
106        entrypoint: solana_compute_budget_program::Entrypoint::vm,
107    }),
108    BuiltinPrototype {
109        core_bpf_migration_config: Some(CoreBpfMigrationConfig {
110            source_buffer_address: buffer_accounts::address_lookup_table_program::id(),
111            upgrade_authority_address: None,
112            feature_id: solana_feature_set::migrate_address_lookup_table_program_to_core_bpf::id(),
113            migration_target: core_bpf_migration::CoreBpfMigrationTargetType::Builtin,
114            datapoint_name: "migrate_builtin_to_core_bpf_address_lookup_table_program",
115        }),
116        name: "address_lookup_table_program",
117        enable_feature_id: None,
118        program_id: solana_sdk::address_lookup_table::program::id(),
119        entrypoint: solana_address_lookup_table_program::processor::Entrypoint::vm,
120    },
121    testable_prototype!(BuiltinPrototype {
122        core_bpf_migration_config: None,
123        name: zk_token_proof_program,
124        enable_feature_id: Some(feature_set::zk_token_sdk_enabled::id()),
125        program_id: solana_zk_token_sdk::zk_token_proof_program::id(),
126        entrypoint: solana_zk_token_proof_program::Entrypoint::vm,
127    }),
128    testable_prototype!(BuiltinPrototype {
129        core_bpf_migration_config: None,
130        name: loader_v4,
131        enable_feature_id: Some(feature_set::enable_program_runtime_v2_and_loader_v4::id()),
132        program_id: solana_sdk::loader_v4::id(),
133        entrypoint: solana_loader_v4_program::Entrypoint::vm,
134    }),
135    testable_prototype!(BuiltinPrototype {
136        core_bpf_migration_config: None,
137        name: zk_elgamal_proof_program,
138        enable_feature_id: Some(feature_set::zk_elgamal_proof_program_enabled::id()),
139        program_id: solana_zk_sdk::zk_elgamal_proof_program::id(),
140        entrypoint: solana_zk_elgamal_proof_program::Entrypoint::vm,
141    }),
142];
143
144pub static STATELESS_BUILTINS: &[StatelessBuiltinPrototype] = &[StatelessBuiltinPrototype {
145    core_bpf_migration_config: Some(CoreBpfMigrationConfig {
146        source_buffer_address: buffer_accounts::feature_gate_program::id(),
147        upgrade_authority_address: None,
148        feature_id: solana_feature_set::migrate_feature_gate_program_to_core_bpf::id(),
149        migration_target: core_bpf_migration::CoreBpfMigrationTargetType::Stateless,
150        datapoint_name: "migrate_stateless_to_core_bpf_feature_gate_program",
151    }),
152    name: "feature_gate_program",
153    program_id: solana_sdk::feature::id(),
154}];
155
156/// Live source buffer accounts for builtin migrations.
157mod buffer_accounts {
158    pub mod address_lookup_table_program {
159        solana_sdk::declare_id!("AhXWrD9BBUYcKjtpA3zuiiZG4ysbo6C6wjHo1QhERk6A");
160    }
161    pub mod config_program {
162        solana_sdk::declare_id!("BuafH9fBv62u6XjzrzS4ZjAE8963ejqF5rt1f8Uga4Q3");
163    }
164    pub mod feature_gate_program {
165        solana_sdk::declare_id!("3D3ydPWvmEszrSjrickCtnyRSJm1rzbbSsZog8Ub6vLh");
166    }
167    pub mod stake_program {
168        solana_sdk::declare_id!("8t3vv6v99tQA6Gp7fVdsBH66hQMaswH5qsJVqJqo8xvG");
169    }
170}
171
172// This module contains a number of arbitrary addresses used for testing Core
173// BPF migrations.
174// Since the list of builtins is static, using `declare_id!` with constant
175// values is arguably the least-overhead approach to injecting static addresses
176// into the builtins list for both the feature ID and the source program ID.
177// These arbitrary IDs can then be used to configure feature-activation runtime
178// tests.
179#[cfg(test)]
180mod test_only {
181    use super::core_bpf_migration::{CoreBpfMigrationConfig, CoreBpfMigrationTargetType};
182    pub mod system_program {
183        pub mod feature {
184            solana_sdk::declare_id!("AnjsdWg7LXFbjDdy78wncCJs9PyTdWpKkFmHAwQU1mQ6");
185        }
186        pub mod source_buffer {
187            solana_sdk::declare_id!("EDEhzg1Jk79Wrk4mwpRa7txjgRxcE6igXwd6egFDVhuz");
188        }
189        pub mod upgrade_authority {
190            solana_sdk::declare_id!("4d14UK2o1FKKoecEBWhVDZrBBbRuhug75G1j9XYCawC2");
191        }
192        pub const CONFIG: super::CoreBpfMigrationConfig = super::CoreBpfMigrationConfig {
193            source_buffer_address: source_buffer::id(),
194            upgrade_authority_address: Some(upgrade_authority::id()),
195            feature_id: feature::id(),
196            migration_target: super::CoreBpfMigrationTargetType::Builtin,
197            datapoint_name: "migrate_builtin_to_core_bpf_system_program",
198        };
199    }
200
201    pub mod vote_program {
202        pub mod feature {
203            solana_sdk::declare_id!("5wDLHMasPmtrcpfRZX67RVkBXBbSTQ9S4C8EJomD3yAk");
204        }
205        pub mod source_buffer {
206            solana_sdk::declare_id!("6T9s4PTcHnpq2AVAqoCbJd4FuHsdD99MjSUEbS7qb1tT");
207        }
208        pub mod upgrade_authority {
209            solana_sdk::declare_id!("2N4JfyYub6cWUP9R4JrsFHv6FYKT7JnoRX8GQUH9MdT3");
210        }
211        pub const CONFIG: super::CoreBpfMigrationConfig = super::CoreBpfMigrationConfig {
212            source_buffer_address: source_buffer::id(),
213            upgrade_authority_address: Some(upgrade_authority::id()),
214            feature_id: feature::id(),
215            migration_target: super::CoreBpfMigrationTargetType::Builtin,
216            datapoint_name: "migrate_builtin_to_core_bpf_vote_program",
217        };
218    }
219
220    pub mod solana_bpf_loader_deprecated_program {
221        pub mod feature {
222            solana_sdk::declare_id!("8gpakCv5Pk5PZGv9RUjzdkk2GVQPGx12cNRUDMQ3bP86");
223        }
224        pub mod source_buffer {
225            solana_sdk::declare_id!("DveUYB5m9G3ce4zpV3fxg9pCNkvH1wDsyd8XberZ47JL");
226        }
227        pub mod upgrade_authority {
228            solana_sdk::declare_id!("8Y5VTHdadnz4rZZWdUA4Qq2m2zWoCwwtb38spPZCXuGU");
229        }
230        pub const CONFIG: super::CoreBpfMigrationConfig = super::CoreBpfMigrationConfig {
231            source_buffer_address: source_buffer::id(),
232            upgrade_authority_address: Some(upgrade_authority::id()),
233            feature_id: feature::id(),
234            migration_target: super::CoreBpfMigrationTargetType::Builtin,
235            datapoint_name: "migrate_builtin_to_core_bpf_bpf_loader_deprecated_program",
236        };
237    }
238
239    pub mod solana_bpf_loader_program {
240        pub mod feature {
241            solana_sdk::declare_id!("8yEdUm4SaP1yNq2MczEVdrM48SucvZCTDSqjcAKfYfL6");
242        }
243        pub mod source_buffer {
244            solana_sdk::declare_id!("2EWMYGJPuGLW4TexLLEMeXP2BkB1PXEKBFb698yw6LhT");
245        }
246        pub mod upgrade_authority {
247            solana_sdk::declare_id!("3sQ9VZ1Lvuvs6NpFXFV3ByFAf52ajPPdXwuhYERJR3iJ");
248        }
249        pub const CONFIG: super::CoreBpfMigrationConfig = super::CoreBpfMigrationConfig {
250            source_buffer_address: source_buffer::id(),
251            upgrade_authority_address: Some(upgrade_authority::id()),
252            feature_id: feature::id(),
253            migration_target: super::CoreBpfMigrationTargetType::Builtin,
254            datapoint_name: "migrate_builtin_to_core_bpf_bpf_loader_program",
255        };
256    }
257
258    pub mod solana_bpf_loader_upgradeable_program {
259        pub mod feature {
260            solana_sdk::declare_id!("oPQbVjgoQ7SaQmzZiiHW4xqHbh4BJqqrFhxEJZiMiwY");
261        }
262        pub mod source_buffer {
263            solana_sdk::declare_id!("6bTmA9iefD57GDoQ9wUjG8SeYkSpRw3EkKzxZCbhkavq");
264        }
265        pub mod upgrade_authority {
266            solana_sdk::declare_id!("CuJvJY1K2wx82oLrQGSSWtw4AF7nVifEHupzSC2KEcq5");
267        }
268        pub const CONFIG: super::CoreBpfMigrationConfig = super::CoreBpfMigrationConfig {
269            source_buffer_address: source_buffer::id(),
270            upgrade_authority_address: Some(upgrade_authority::id()),
271            feature_id: feature::id(),
272            migration_target: super::CoreBpfMigrationTargetType::Builtin,
273            datapoint_name: "migrate_builtin_to_core_bpf_bpf_loader_upgradeable_program",
274        };
275    }
276
277    pub mod compute_budget_program {
278        pub mod feature {
279            solana_sdk::declare_id!("D39vUspVfhjPVD7EtMJZrA5j1TSMp4LXfb43nxumGdHT");
280        }
281        pub mod source_buffer {
282            solana_sdk::declare_id!("KfX1oLpFC5CwmFeSgXrNcXaouKjFkPuSJ4UsKb3zKMX");
283        }
284        pub mod upgrade_authority {
285            solana_sdk::declare_id!("HGTbQhaCXNTbpgpLb2KNjqWSwpJyb2dqDB66Lc3Ph4aN");
286        }
287        pub const CONFIG: super::CoreBpfMigrationConfig = super::CoreBpfMigrationConfig {
288            source_buffer_address: source_buffer::id(),
289            upgrade_authority_address: Some(upgrade_authority::id()),
290            feature_id: feature::id(),
291            migration_target: super::CoreBpfMigrationTargetType::Builtin,
292            datapoint_name: "migrate_builtin_to_core_bpf_compute_budget_program",
293        };
294    }
295
296    pub mod zk_token_proof_program {
297        pub mod feature {
298            solana_sdk::declare_id!("GfeFwUzKP9NmaP5u4VfnFgEvQoeQc2wPgnBFrUZhpib5");
299        }
300        pub mod source_buffer {
301            solana_sdk::declare_id!("Ffe9gL8vXraBkiv3HqbLvBqY7i9V4qtZxjH83jYYDe1V");
302        }
303        pub mod upgrade_authority {
304            solana_sdk::declare_id!("6zkXWHR8YeCvfMqHwyiz2n7g6hMUKCFhrVccZZTDk4ei");
305        }
306        pub const CONFIG: super::CoreBpfMigrationConfig = super::CoreBpfMigrationConfig {
307            source_buffer_address: source_buffer::id(),
308            upgrade_authority_address: Some(upgrade_authority::id()),
309            feature_id: feature::id(),
310            migration_target: super::CoreBpfMigrationTargetType::Builtin,
311            datapoint_name: "migrate_builtin_to_core_bpf_zk_token_proof_program",
312        };
313    }
314
315    pub mod loader_v4 {
316        pub mod feature {
317            solana_sdk::declare_id!("Cz5JthYp27KR3rwTCtVJhbRgwHCurbwcYX46D8setL22");
318        }
319        pub mod source_buffer {
320            solana_sdk::declare_id!("EH45pKy1kzjifB93wEJi91js3S4HETdsteywR7ZCNPn5");
321        }
322        pub mod upgrade_authority {
323            solana_sdk::declare_id!("AWbiYRbFts9GVX5uwUkwV46hTFP85PxCAM8e8ir8Hqtq");
324        }
325        pub const CONFIG: super::CoreBpfMigrationConfig = super::CoreBpfMigrationConfig {
326            source_buffer_address: source_buffer::id(),
327            upgrade_authority_address: Some(upgrade_authority::id()),
328            feature_id: feature::id(),
329            migration_target: super::CoreBpfMigrationTargetType::Builtin,
330            datapoint_name: "migrate_builtin_to_core_bpf_loader_v4_program",
331        };
332    }
333
334    pub mod zk_elgamal_proof_program {
335        pub mod feature {
336            solana_sdk::declare_id!("EYtuxScWqGWmcPEDmeUsEt3iPkvWE26EWLfSxUvWP2WN");
337        }
338        pub mod source_buffer {
339            solana_sdk::declare_id!("AaVrLPurAUmjw6XRNGr6ezQfHaJWpBGHhcRSJmNjoVpQ");
340        }
341        pub mod upgrade_authority {
342            solana_sdk::declare_id!("EyGkQYHgynUdvdNPNiWbJQk9roFCexgdJQMNcWbuvp78");
343        }
344        pub const CONFIG: super::CoreBpfMigrationConfig = super::CoreBpfMigrationConfig {
345            source_buffer_address: source_buffer::id(),
346            upgrade_authority_address: Some(upgrade_authority::id()),
347            feature_id: feature::id(),
348            migration_target: super::CoreBpfMigrationTargetType::Builtin,
349            datapoint_name: "migrate_builtin_to_core_bpf_zk_elgamal_proof_program",
350        };
351    }
352}
353
354#[cfg(test)]
355mod tests {
356    // Since a macro is used to initialize the test IDs from the `test_only`
357    // module, best to ensure the lists have the expected values within a test
358    // context.
359    #[test]
360    fn test_testable_prototypes() {
361        assert_eq!(
362            &super::BUILTINS[0].core_bpf_migration_config,
363            &Some(super::test_only::system_program::CONFIG)
364        );
365        assert_eq!(
366            &super::BUILTINS[1].core_bpf_migration_config,
367            &Some(super::test_only::vote_program::CONFIG)
368        );
369        // Stake has a live migration config, so it has no test-only configs
370        // to test here.
371        // Config has a live migration config, so it has no test-only configs
372        // to test here.
373        assert_eq!(
374            &super::BUILTINS[4].core_bpf_migration_config,
375            &Some(super::test_only::solana_bpf_loader_deprecated_program::CONFIG)
376        );
377        assert_eq!(
378            &super::BUILTINS[5].core_bpf_migration_config,
379            &Some(super::test_only::solana_bpf_loader_program::CONFIG)
380        );
381        assert_eq!(
382            &super::BUILTINS[6].core_bpf_migration_config,
383            &Some(super::test_only::solana_bpf_loader_upgradeable_program::CONFIG)
384        );
385        assert_eq!(
386            &super::BUILTINS[7].core_bpf_migration_config,
387            &Some(super::test_only::compute_budget_program::CONFIG)
388        );
389        // Address Lookup Table has a live migration config, so it has no
390        // test-only configs to test here.
391        assert_eq!(
392            &super::BUILTINS[9].core_bpf_migration_config,
393            &Some(super::test_only::zk_token_proof_program::CONFIG)
394        );
395        assert_eq!(
396            &super::BUILTINS[10].core_bpf_migration_config,
397            &Some(super::test_only::loader_v4::CONFIG)
398        );
399        assert_eq!(
400            &super::BUILTINS[11].core_bpf_migration_config,
401            &Some(super::test_only::zk_elgamal_proof_program::CONFIG)
402        );
403        // Feature Gate has a live migration config, so it has no test-only
404        // configs to test here.
405    }
406}