瀏覽代碼

Specify loader when bootstrapping bpf programs (#11571)

Jack May 5 年之前
父節點
當前提交
0a94e7e7fa
共有 2 個文件被更改,包括 15 次插入9 次删除
  1. 4 3
      fetch-spl.sh
  2. 11 6
      genesis/src/main.rs

+ 4 - 3
fetch-spl.sh

@@ -10,10 +10,11 @@ fetch_program() {
   declare name=$1
   declare version=$2
   declare address=$3
+  declare loader=$4
 
   declare so=spl_$name-$version.so
 
-  genesis_args+=(--bpf-program "$address" "$so")
+  genesis_args+=(--bpf-program "$address" "$loader" "$so")
 
   if [[ -r $so ]]; then
     return
@@ -36,8 +37,8 @@ fetch_program() {
 
 }
 
-fetch_program token 1.0.0 TokenSVp5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o
-fetch_program memo  1.0.0 Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo
+fetch_program token 1.0.0 TokenSVp5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o BPFLoader1111111111111111111111111111111111
+fetch_program memo  1.0.0 Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo BPFLoader1111111111111111111111111111111111
 
 echo "${genesis_args[@]}" > spl-genesis-args.sh
 

+ 11 - 6
genesis/src/main.rs

@@ -12,7 +12,7 @@ use solana_ledger::{
 use solana_runtime::hardened_unpack::MAX_GENESIS_ARCHIVE_UNPACKED_SIZE;
 use solana_sdk::{
     account::Account,
-    bpf_loader, clock,
+    clock,
     epoch_schedule::EpochSchedule,
     fee_calculator::FeeRateGovernor,
     genesis_config::{GenesisConfig, OperatingMode},
@@ -353,7 +353,7 @@ fn main() -> Result<(), Box<dyn error::Error>> {
                 .long("bpf-program")
                 .value_name("ADDRESS BPF_PROGRAM.SO")
                 .takes_value(true)
-                .number_of_values(2)
+                .number_of_values(3)
                 .multiple(true)
                 .help("Install a BPF program at the given address"),
         )
@@ -553,14 +553,19 @@ fn main() -> Result<(), Box<dyn error::Error>> {
 
     if let Some(values) = matches.values_of("bpf_program") {
         let values: Vec<&str> = values.collect::<Vec<_>>();
-        for address_program in values.chunks(2) {
-            match address_program {
-                [address, program] => {
+        for address_loader_program in values.chunks(3) {
+            match address_loader_program {
+                [address, loader, program] => {
                     let address = address.parse::<Pubkey>().unwrap_or_else(|err| {
                         eprintln!("Error: invalid address {}: {}", address, err);
                         process::exit(1);
                     });
 
+                    let loader = loader.parse::<Pubkey>().unwrap_or_else(|err| {
+                        eprintln!("Error: invalid loader {}: {}", loader, err);
+                        process::exit(1);
+                    });
+
                     let mut program_data = vec![];
                     File::open(program)
                         .and_then(|mut file| file.read_to_end(&mut program_data))
@@ -574,7 +579,7 @@ fn main() -> Result<(), Box<dyn error::Error>> {
                             lamports: genesis_config.rent.minimum_balance(program_data.len()),
                             data: program_data,
                             executable: true,
-                            owner: bpf_loader::id(),
+                            owner: loader,
                             rent_epoch: 0,
                         },
                     );