2018-12-04 08:20:41 -08:00
|
|
|
//! storage program
|
|
|
|
//! Receive mining proofs from miners, validate the answers
|
|
|
|
//! and give reward for good proofs.
|
|
|
|
|
|
|
|
#[macro_use]
|
|
|
|
extern crate log;
|
|
|
|
#[macro_use]
|
|
|
|
extern crate solana_sdk;
|
|
|
|
|
|
|
|
use solana_sdk::account::KeyedAccount;
|
|
|
|
use solana_sdk::native_program::ProgramError;
|
|
|
|
use solana_sdk::pubkey::Pubkey;
|
|
|
|
use solana_sdk::storage_program::*;
|
|
|
|
|
|
|
|
solana_entrypoint!(entrypoint);
|
|
|
|
fn entrypoint(
|
|
|
|
_program_id: &Pubkey,
|
|
|
|
keyed_accounts: &mut [KeyedAccount],
|
|
|
|
data: &[u8],
|
|
|
|
_tick_height: u64,
|
|
|
|
) -> Result<(), ProgramError> {
|
2018-12-14 12:36:50 -08:00
|
|
|
solana_logger::setup();
|
|
|
|
|
2018-12-04 08:20:41 -08:00
|
|
|
// accounts_keys[0] must be signed
|
|
|
|
if keyed_accounts[0].signer_key().is_none() {
|
|
|
|
info!("account[0] is unsigned");
|
|
|
|
Err(ProgramError::InvalidArgument)?;
|
|
|
|
}
|
|
|
|
|
2018-12-14 12:36:50 -08:00
|
|
|
if let Ok(syscall) = bincode::deserialize(data) {
|
2018-12-04 08:20:41 -08:00
|
|
|
match syscall {
|
2018-12-10 11:38:29 -08:00
|
|
|
StorageProgram::SubmitMiningProof {
|
|
|
|
sha_state,
|
|
|
|
entry_height,
|
|
|
|
} => {
|
|
|
|
info!(
|
|
|
|
"Mining proof submitted with state {:?} entry_height: {}",
|
|
|
|
sha_state, entry_height
|
|
|
|
);
|
2018-12-04 08:20:41 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
Ok(())
|
|
|
|
} else {
|
|
|
|
info!("Invalid instruction userdata: {:?}", data);
|
|
|
|
Err(ProgramError::InvalidUserdata)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod test {
|
|
|
|
use super::*;
|
|
|
|
use solana_sdk::account::create_keyed_accounts;
|
|
|
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_storage_tx() {
|
|
|
|
let keypair = Keypair::new();
|
|
|
|
let mut accounts = [(keypair.pubkey(), Default::default())];
|
|
|
|
let mut keyed_accounts = create_keyed_accounts(&mut accounts);
|
|
|
|
assert!(entrypoint(&id(), &mut keyed_accounts, &[], 42).is_err());
|
|
|
|
}
|
|
|
|
}
|