From d30de0d593bee4e22ce785e0341daa758b48eee2 Mon Sep 17 00:00:00 2001 From: HaoranYi Date: Mon, 8 Jan 2024 19:32:46 +0000 Subject: [PATCH] update test bpf program owner --- programs/sbf/c/src/invoked/invoked.c | 86 ++++++++++++++-------- programs/sbf/rust/invoked/src/processor.rs | 7 +- programs/sbf/tests/programs.rs | 4 +- 3 files changed, 62 insertions(+), 35 deletions(-) diff --git a/programs/sbf/c/src/invoked/invoked.c b/programs/sbf/c/src/invoked/invoked.c index f57896c47bf44c..724ba4fba5ae4b 100644 --- a/programs/sbf/c/src/invoked/invoked.c +++ b/programs/sbf/c/src/invoked/invoked.c @@ -4,25 +4,30 @@ #include "instruction.h" #include -extern uint64_t entrypoint(const uint8_t *input) { +extern uint64_t entrypoint(const uint8_t *input) +{ sol_log("Invoked C program"); SolAccountInfo accounts[4]; SolParameters params = (SolParameters){.ka = accounts}; - if (!sol_deserialize(input, ¶ms, 0)) { + if (!sol_deserialize(input, ¶ms, 0)) + { return ERROR_INVALID_ARGUMENT; } // on entry, return data must not be set sol_assert(sol_get_return_data(NULL, 0, NULL) == 0); - if (params.data_len == 0) { + if (params.data_len == 0) + { return SUCCESS; } - switch (params.data[0]) { - case VERIFY_TRANSLATIONS: { + switch (params.data[0]) + { + case VERIFY_TRANSLATIONS: + { sol_log("verify data translations"); static const int ARGUMENT_INDEX = 0; @@ -31,12 +36,14 @@ extern uint64_t entrypoint(const uint8_t *input) { static const int INVOKED_PROGRAM_DUP_INDEX = 3; sol_assert(sol_deserialize(input, ¶ms, 4)); - SolPubkey sbf_loader_id = - (SolPubkey){.x = {2, 168, 246, 145, 78, 136, 161, 110, 57, 90, 225, - 40, 148, 143, 250, 105, 86, 147, 55, 104, 24, 221, - 71, 67, 82, 33, 243, 198, 0, 0, 0, 0}}; + SolPubkey sbf_loader_upgradable_id = + (SolPubkey){.x = { + 2, 168, 246, 145, 78, 136, 161, 176, 226, 16, 21, 62, + 247, 99, 174, 43, 0, 194, 185, 61, 22, 193, 36, 210, 192, + 83, 122, 16, 4, 128, 0, 0}}; - for (int i = 0; i < params.data_len; i++) { + for (int i = 0; i < params.data_len; i++) + { sol_assert(params.data[i] == i); } sol_assert(params.ka_num == 4); @@ -47,7 +54,8 @@ extern uint64_t entrypoint(const uint8_t *input) { sol_assert(accounts[ARGUMENT_INDEX].is_writable); sol_assert(accounts[ARGUMENT_INDEX].rent_epoch == UINT64_MAX); sol_assert(!accounts[ARGUMENT_INDEX].executable); - for (int i = 0; i < accounts[ARGUMENT_INDEX].data_len; i++) { + for (int i = 0; i < accounts[ARGUMENT_INDEX].data_len; i++) + { sol_assert(accounts[ARGUMENT_INDEX].data[i] == i); } @@ -63,7 +71,7 @@ extern uint64_t entrypoint(const uint8_t *input) { sol_assert( SolPubkey_same(accounts[INVOKED_PROGRAM_INDEX].key, params.program_id)) sol_assert(SolPubkey_same(accounts[INVOKED_PROGRAM_INDEX].owner, - &sbf_loader_id)); + &sbf_loader_upgradable_id)); sol_assert(!accounts[INVOKED_PROGRAM_INDEX].is_signer); sol_assert(!accounts[INVOKED_PROGRAM_INDEX].is_writable); sol_assert(accounts[INVOKED_PROGRAM_INDEX].rent_epoch == UINT64_MAX); @@ -85,21 +93,25 @@ extern uint64_t entrypoint(const uint8_t *input) { accounts[INVOKED_PROGRAM_DUP_INDEX].executable); break; } - case RETURN_OK: { + case RETURN_OK: + { sol_log("return Ok"); return SUCCESS; } - case SET_RETURN_DATA: { - sol_set_return_data((const uint8_t*)RETURN_DATA_VAL, sizeof(RETURN_DATA_VAL)); + case SET_RETURN_DATA: + { + sol_set_return_data((const uint8_t *)RETURN_DATA_VAL, sizeof(RETURN_DATA_VAL)); sol_log("set return data"); sol_assert(sol_get_return_data(NULL, 0, NULL) == sizeof(RETURN_DATA_VAL)); return SUCCESS; } - case RETURN_ERROR: { + case RETURN_ERROR: + { sol_log("return error"); return 42; } - case DERIVED_SIGNERS: { + case DERIVED_SIGNERS: + { sol_log("verify derived signers"); static const int INVOKED_PROGRAM_INDEX = 0; static const int DERIVED_KEY1_INDEX = 1; @@ -140,7 +152,8 @@ extern uint64_t entrypoint(const uint8_t *input) { break; } - case VERIFY_NESTED_SIGNERS: { + case VERIFY_NESTED_SIGNERS: + { sol_log("verify derived nested signers"); static const int DERIVED_KEY1_INDEX = 0; static const int DERIVED_KEY2_INDEX = 1; @@ -154,7 +167,8 @@ extern uint64_t entrypoint(const uint8_t *input) { break; } - case VERIFY_WRITER: { + case VERIFY_WRITER: + { sol_log("verify writable"); static const int ARGUMENT_INDEX = 0; sol_assert(sol_deserialize(input, ¶ms, 1)); @@ -163,19 +177,22 @@ extern uint64_t entrypoint(const uint8_t *input) { break; } - case VERIFY_PRIVILEGE_ESCALATION: { + case VERIFY_PRIVILEGE_ESCALATION: + { sol_log("Verify privilege escalation"); break; } - case VERIFY_PRIVILEGE_DEESCALATION: { + case VERIFY_PRIVILEGE_DEESCALATION: + { sol_log("verify privilege deescalation"); static const int INVOKED_ARGUMENT_INDEX = 0; sol_assert(false == accounts[INVOKED_ARGUMENT_INDEX].is_signer); sol_assert(false == accounts[INVOKED_ARGUMENT_INDEX].is_writable); break; } - case VERIFY_PRIVILEGE_DEESCALATION_ESCALATION_SIGNER: { + case VERIFY_PRIVILEGE_DEESCALATION_ESCALATION_SIGNER: + { sol_log("verify privilege deescalation escalation signer"); static const int INVOKED_PROGRAM_INDEX = 0; static const int INVOKED_ARGUMENT_INDEX = 1; @@ -194,7 +211,8 @@ extern uint64_t entrypoint(const uint8_t *input) { break; } - case VERIFY_PRIVILEGE_DEESCALATION_ESCALATION_WRITABLE: { + case VERIFY_PRIVILEGE_DEESCALATION_ESCALATION_WRITABLE: + { sol_log("verify privilege deescalation escalation writable"); static const int INVOKED_PROGRAM_INDEX = 0; static const int INVOKED_ARGUMENT_INDEX = 1; @@ -213,14 +231,16 @@ extern uint64_t entrypoint(const uint8_t *input) { break; } - case NESTED_INVOKE: { + case NESTED_INVOKE: + { sol_log("invoke"); static const int INVOKED_ARGUMENT_INDEX = 0; static const int ARGUMENT_INDEX = 1; static const int INVOKED_PROGRAM_INDEX = 2; - if (!sol_deserialize(input, ¶ms, 3)) { + if (!sol_deserialize(input, ¶ms, 3)) + { sol_assert(sol_deserialize(input, ¶ms, 2)); } @@ -233,7 +253,8 @@ extern uint64_t entrypoint(const uint8_t *input) { *accounts[ARGUMENT_INDEX].lamports += 1; uint8_t remaining_invokes = params.data[1]; - if (remaining_invokes > 1) { + if (remaining_invokes > 1) + { sol_log("Invoke again"); SolAccountMeta arguments[] = { {accounts[INVOKED_ARGUMENT_INDEX].key, true, true}, @@ -244,21 +265,26 @@ extern uint64_t entrypoint(const uint8_t *input) { arguments, SOL_ARRAY_SIZE(arguments), data, SOL_ARRAY_SIZE(data)}; sol_assert(SUCCESS == sol_invoke(&instruction, accounts, params.ka_num)); - } else { + } + else + { sol_log("Last invoked"); - for (int i = 0; i < accounts[INVOKED_ARGUMENT_INDEX].data_len; i++) { + for (int i = 0; i < accounts[INVOKED_ARGUMENT_INDEX].data_len; i++) + { accounts[INVOKED_ARGUMENT_INDEX].data[i] = i; } } break; } - case WRITE_ACCOUNT: { + case WRITE_ACCOUNT: + { sol_log("write account"); static const int INVOKED_ARGUMENT_INDEX = 0; sol_assert(sol_deserialize(input, ¶ms, 1)); - for (int i = 0; i < params.data[1]; i++) { + for (int i = 0; i < params.data[1]; i++) + { accounts[INVOKED_ARGUMENT_INDEX].data[i] = params.data[1]; } break; diff --git a/programs/sbf/rust/invoked/src/processor.rs b/programs/sbf/rust/invoked/src/processor.rs index 52d02dc99a6c21..8f60a90c15cf4e 100644 --- a/programs/sbf/rust/invoked/src/processor.rs +++ b/programs/sbf/rust/invoked/src/processor.rs @@ -7,7 +7,7 @@ use { crate::instructions::*, solana_program::{ account_info::AccountInfo, - bpf_loader, + bpf_loader_upgradeable, entrypoint::{ProgramResult, MAX_PERMITTED_DATA_INCREASE}, log::sol_log_64, msg, @@ -70,7 +70,10 @@ fn process_instruction( assert!(!accounts[INVOKED_ARGUMENT_INDEX].executable); assert_eq!(accounts[INVOKED_PROGRAM_INDEX].key, program_id); - assert_eq!(accounts[INVOKED_PROGRAM_INDEX].owner, &bpf_loader::id()); + assert_eq!( + accounts[INVOKED_PROGRAM_INDEX].owner, + &bpf_loader_upgradeable::id() + ); assert!(!accounts[INVOKED_PROGRAM_INDEX].is_signer); assert!(!accounts[INVOKED_PROGRAM_INDEX].is_writable); assert_eq!(accounts[INVOKED_PROGRAM_INDEX].rent_epoch, u64::MAX); diff --git a/programs/sbf/tests/programs.rs b/programs/sbf/tests/programs.rs index f364c8d4a56aac..ac394f156e014c 100644 --- a/programs/sbf/tests/programs.rs +++ b/programs/sbf/tests/programs.rs @@ -977,10 +977,8 @@ fn test_program_sbf_invoke_sanity() { message.clone(), bank.last_blockhash(), ); - let (result, inner_instructions, log_messages) = + let (result, inner_instructions, _log_messages) = process_transaction_and_record_inner(&bank, tx); - - println!("{:?}", log_messages); assert_eq!(result, Ok(())); let invoked_programs: Vec = inner_instructions[0]