diff --git a/programs/bpf/build.rs b/programs/bpf/build.rs index 1c4f271cf1..8d29eca326 100644 --- a/programs/bpf/build.rs +++ b/programs/bpf/build.rs @@ -67,7 +67,15 @@ fn main() { .expect("Unable to create BPF install directory") .success()); - let rust_programs = ["alloc", "dep_crate", "iter", "many_args", "noop", "panic"]; + let rust_programs = [ + "alloc", + "dep_crate", + "iter", + "many_args", + "noop", + "panic", + "tick_height", + ]; for program in rust_programs.iter() { println!( "cargo:warning=(not a warning) Building Rust-based BPF programs: solana_bpf_rust_{}", diff --git a/programs/bpf/rust/tick_height/.gitignore b/programs/bpf/rust/tick_height/.gitignore new file mode 100644 index 0000000000..e13de17f65 --- /dev/null +++ b/programs/bpf/rust/tick_height/.gitignore @@ -0,0 +1,3 @@ +/target/ + +Cargo.lock diff --git a/programs/bpf/rust/tick_height/Cargo.toml b/programs/bpf/rust/tick_height/Cargo.toml new file mode 100644 index 0000000000..accb107404 --- /dev/null +++ b/programs/bpf/rust/tick_height/Cargo.toml @@ -0,0 +1,24 @@ + +# Note: This crate must be built using build.sh + +[package] +name = "solana-bpf-rust-tick-height" +version = "0.16.0" +description = "Solana BPF noop program written in Rust" +authors = ["Solana Maintainers "] +repository = "https://github.com/solana-labs/solana" +license = "Apache-2.0" +homepage = "https://solana.com/" +edition = "2018" + +[dependencies] +byteorder = { version = "1", default-features = false } + +solana-sdk-bpf-utils = { path = "../../../../sdk/bpf/rust/rust-utils", version = "0.16.0" } + +[workspace] +members = [] + +[lib] +crate-type = ["cdylib"] +name = "solana_bpf_rust_tick_height" diff --git a/programs/bpf/rust/tick_height/Xargo.toml b/programs/bpf/rust/tick_height/Xargo.toml new file mode 100644 index 0000000000..385a264b04 --- /dev/null +++ b/programs/bpf/rust/tick_height/Xargo.toml @@ -0,0 +1,6 @@ +[dependencies.compiler_builtins] +path = "../../../../sdk/bpf/dependencies/rust-bpf-sysroot/src/compiler-builtins" +features = ["c", "mem"] + +[target.bpfel-unknown-unknown.dependencies] +alloc = { path = "../../../../sdk/bpf/dependencies/rust-bpf-sysroot/src/liballoc" } \ No newline at end of file diff --git a/programs/bpf/rust/tick_height/src/lib.rs b/programs/bpf/rust/tick_height/src/lib.rs new file mode 100644 index 0000000000..26b37a0c4c --- /dev/null +++ b/programs/bpf/rust/tick_height/src/lib.rs @@ -0,0 +1,27 @@ +//! @brief Example Rust-based BPF program that prints out the parameters passed to it + +#![no_std] +#![allow(unreachable_code)] + +extern crate solana_sdk_bpf_utils; + +use byteorder::{ByteOrder, LittleEndian}; +use solana_sdk_bpf_utils::entrypoint; +use solana_sdk_bpf_utils::entrypoint::*; +use solana_sdk_bpf_utils::log::*; + +entrypoint!(process_instruction); +fn process_instruction( + ka: &mut [Option; MAX_ACCOUNTS], + _info: &SolClusterInfo, + _data: &[u8], +) -> bool { + sol_log("Tick Height:"); + if let Some(k) = &ka[2] { + let tick_height = LittleEndian::read_u64(k.data); + assert_eq!(10u64, tick_height); + sol_log("Success"); + return true + } + panic!(); +} diff --git a/programs/bpf/tests/programs.rs b/programs/bpf/tests/programs.rs index 56e4102cfb..076be996fd 100644 --- a/programs/bpf/tests/programs.rs +++ b/programs/bpf/tests/programs.rs @@ -75,8 +75,10 @@ mod bpf { use super::*; use solana_sdk::bpf_loader; use solana_sdk::client::SyncClient; + use solana_sdk::hash; use solana_sdk::instruction::{AccountMeta, Instruction}; use solana_sdk::signature::{Keypair, KeypairUtil}; + use solana_sdk::syscall::tick_height; use std::io::Read; #[test] @@ -90,6 +92,7 @@ mod bpf { ("solana_bpf_rust_noop", true), ("solana_bpf_rust_dep_crate", true), ("solana_bpf_rust_panic", false), + ("solana_bpf_rust_tick_height", true), ]; for program in programs.iter() { let filename = create_bpf_path(program.0); @@ -104,6 +107,10 @@ mod bpf { .. } = create_genesis_block(50); let bank = Bank::new(&genesis_block); + // register some ticks, used by solana_bpf_rust_tick_height + for i in 0..10 { + bank.register_tick(&hash::hash(format!("hashing {}", i).as_bytes())); + } let bank_client = BankClient::new(bank); // Call user program @@ -111,6 +118,7 @@ mod bpf { let account_metas = vec![ AccountMeta::new(mint_keypair.pubkey(), true), AccountMeta::new(Keypair::new().pubkey(), false), + AccountMeta::new(tick_height::id(), false), ]; let instruction = Instruction::new(program_id, &1u8, account_metas); let result = bank_client.send_instruction(&mint_keypair, instruction);