From be003970b7ac1fa8329a4e656b03d24be4c5ef84 Mon Sep 17 00:00:00 2001 From: jackcmay Date: Fri, 26 Oct 2018 19:44:53 -0700 Subject: [PATCH] Program_ids were overlapping (#1626) Program_ids were overlapping --- src/bank.rs | 57 +++++++++++++++++++++++++++++++++++++++++- src/bpf_loader.rs | 7 ++++-- src/budget_program.rs | 6 +++-- src/native_loader.rs | 4 ++- src/storage_program.rs | 5 +++- src/system_program.rs | 17 +++++-------- src/token_program.rs | 5 ++-- src/vote_program.rs | 5 ++-- 8 files changed, 84 insertions(+), 22 deletions(-) diff --git a/src/bank.rs b/src/bank.rs index 49534e8052..37d1b474a3 100644 --- a/src/bank.rs +++ b/src/bank.rs @@ -1856,7 +1856,7 @@ mod tests { let string = transport_receiver.poll(); assert!(string.is_ok()); if let Async::Ready(Some(response)) = string.unwrap() { - let expected = format!(r#"{{"jsonrpc":"2.0","method":"accountNotification","params":{{"result":{{"executable":false,"loader_program_id":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"program_id":[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"tokens":1,"userdata":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},"subscription":0}}}}"#); + let expected = format!(r#"{{"jsonrpc":"2.0","method":"accountNotification","params":{{"result":{{"executable":false,"loader_program_id":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"program_id":[129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"tokens":1,"userdata":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},"subscription":0}}}}"#); assert_eq!(expected, response); } @@ -2033,4 +2033,59 @@ mod tests { Err(BankError::AccountNotFound) ); } + + #[test] + fn test_program_ids() { + let system = Pubkey::new(&[ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + let native = Pubkey::new(&[ + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, + ]); + let bpf = Pubkey::new(&[ + 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + ]); + let budget = Pubkey::new(&[ + 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + ]); + let storage = Pubkey::new(&[ + 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + ]); + let token = Pubkey::new(&[ + 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + ]); + let vote = Pubkey::new(&[ + 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + ]); + + assert_eq!(SystemProgram::id(), system); + assert_eq!(native_loader::id(), native); + assert_eq!(bpf_loader::id(), bpf); + assert_eq!(BudgetState::id(), budget); + assert_eq!(StorageProgram::id(), storage); + assert_eq!(TokenProgram::id(), token); + assert_eq!(VoteProgram::id(), vote); + } + + #[test] + fn test_program_id_uniqueness() { + let mut unique = HashSet::new(); + let ids = vec![ + SystemProgram::id(), + native_loader::id(), + bpf_loader::id(), + BudgetState::id(), + StorageProgram::id(), + TokenProgram::id(), + VoteProgram::id(), + ]; + assert!(ids.into_iter().all(move |id| unique.insert(id))); + } } diff --git a/src/bpf_loader.rs b/src/bpf_loader.rs index 789c58a511..23f7d4da1b 100644 --- a/src/bpf_loader.rs +++ b/src/bpf_loader.rs @@ -3,8 +3,11 @@ use native_loader; use solana_sdk::account::Account; use solana_sdk::pubkey::Pubkey; -pub const BPF_LOADER_PROGRAM_ID: [u8; 32] = [6u8; 32]; -pub const BPF_LOADER_NAME: &str = "bpf_loader"; +const BPF_LOADER_NAME: &str = "bpf_loader"; +const BPF_LOADER_PROGRAM_ID: [u8; 32] = [ + 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +]; pub fn id() -> Pubkey { Pubkey::new(&BPF_LOADER_PROGRAM_ID) diff --git a/src/budget_program.rs b/src/budget_program.rs index 51c89ff4dd..bff3adeba2 100644 --- a/src/budget_program.rs +++ b/src/budget_program.rs @@ -30,9 +30,11 @@ pub struct BudgetState { pub pending_budget: Option, } -pub const BUDGET_PROGRAM_ID: [u8; 32] = [ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +const BUDGET_PROGRAM_ID: [u8; 32] = [ + 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, ]; + impl BudgetState { fn is_pending(&self) -> bool { self.pending_budget != None diff --git a/src/native_loader.rs b/src/native_loader.rs index 8e9949039c..9323d9985e 100644 --- a/src/native_loader.rs +++ b/src/native_loader.rs @@ -40,7 +40,9 @@ fn create_path(name: &str) -> PathBuf { ) } -const NATIVE_LOADER_PROGRAM_ID: [u8; 32] = [2u8; 32]; +const NATIVE_LOADER_PROGRAM_ID: [u8; 32] = [ + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +]; // All native programs export a symbol named process() const ENTRYPOINT: &str = "process"; diff --git a/src/storage_program.rs b/src/storage_program.rs index 9f1c877e51..7010f0d9d1 100644 --- a/src/storage_program.rs +++ b/src/storage_program.rs @@ -17,7 +17,10 @@ pub enum StorageError { InvalidUserData, } -pub const STORAGE_PROGRAM_ID: [u8; 32] = [1u8; 32]; +const STORAGE_PROGRAM_ID: [u8; 32] = [ + 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, +]; impl StorageProgram { pub fn check_id(program_id: &Pubkey) -> bool { diff --git a/src/system_program.rs b/src/system_program.rs index 61801731bf..0fc5fcee5f 100644 --- a/src/system_program.rs +++ b/src/system_program.rs @@ -261,7 +261,7 @@ mod test { #[test] fn test_sdk_serialize() { let keypair = Keypair::new(); - use budget_program::BUDGET_PROGRAM_ID; + use budget_program::BudgetState; // CreateAccount let tx = Transaction::system_create( @@ -270,14 +270,14 @@ mod test { Hash::default(), 111, 222, - Pubkey::new(&BUDGET_PROGRAM_ID), + BudgetState::id(), 0, ); assert_eq!( tx.userdata(0).to_vec(), vec![ - 0, 0, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 222, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 222, 0, 0, 0, 0, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ); @@ -302,17 +302,12 @@ mod test { ); // Assign - let tx = Transaction::system_assign( - &keypair, - Hash::default(), - Pubkey::new(&BUDGET_PROGRAM_ID), - 0, - ); + let tx = Transaction::system_assign(&keypair, Hash::default(), BudgetState::id(), 0); assert_eq!( tx.userdata(0).to_vec(), vec![ - 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 + 1, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ); diff --git a/src/token_program.rs b/src/token_program.rs index c918fc3cf6..4b9e836f75 100644 --- a/src/token_program.rs +++ b/src/token_program.rs @@ -105,8 +105,9 @@ impl Default for TokenProgram { } } -pub const TOKEN_PROGRAM_ID: [u8; 32] = [ - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +const TOKEN_PROGRAM_ID: [u8; 32] = [ + 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, ]; impl TokenProgram { diff --git a/src/vote_program.rs b/src/vote_program.rs index 40e0881688..819f2e7343 100644 --- a/src/vote_program.rs +++ b/src/vote_program.rs @@ -53,8 +53,9 @@ pub struct VoteProgram { pub node_id: Pubkey, } -pub const VOTE_PROGRAM_ID: [u8; 32] = [ - 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +const VOTE_PROGRAM_ID: [u8; 32] = [ + 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, ]; impl VoteProgram {