Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.

Commit

Permalink
update test bpf program owner
Browse files Browse the repository at this point in the history
  • Loading branch information
HaoranYi committed Jan 8, 2024
1 parent 6847c6c commit d30de0d
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 35 deletions.
86 changes: 56 additions & 30 deletions programs/sbf/c/src/invoked/invoked.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,30 @@
#include "instruction.h"
#include <solana_sdk.h>

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, &params, 0)) {
if (!sol_deserialize(input, &params, 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;
Expand All @@ -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, &params, 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);
Expand All @@ -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);
}

Expand All @@ -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);
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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, &params, 1));
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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, &params, 3)) {
if (!sol_deserialize(input, &params, 3))
{
sol_assert(sol_deserialize(input, &params, 2));
}

Expand All @@ -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},
Expand All @@ -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, &params, 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;
Expand Down
7 changes: 5 additions & 2 deletions programs/sbf/rust/invoked/src/processor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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);
Expand Down
4 changes: 1 addition & 3 deletions programs/sbf/tests/programs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Pubkey> = inner_instructions[0]
Expand Down

0 comments on commit d30de0d

Please sign in to comment.