From 9c013c28136a40c68d6e0878043091b0b377fc07 Mon Sep 17 00:00:00 2001 From: James Li Date: Mon, 30 Jan 2023 15:12:59 -0500 Subject: [PATCH 001/314] fix envars syntax in build.yml --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c89841e..e074779 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -62,11 +62,11 @@ jobs: ASSET_NAME: ${{matrix.asset_name}} EXEC_PATH: $${{matrix.artifact_path}} run: | - echo "asset name: $ASSET_NAME executable path: $EXEC_PATH" - mv EXEC_PATH $ASSET_NAME + echo "asset name: ${ASSET_NAME} executable path: ${EXEC_PATH}" + mv ${EXEC_PATH} ${ASSET_NAME} - name: Upload binaries to release uses: softprops/action-gh-release@v1 with: - files: $ASSET_NAME + files: ${{matrix.asset_name}} fail_on_unmatched_files: true From 5d3c8330a0328acea8ce81ffced63bcbe2c67d9c Mon Sep 17 00:00:00 2001 From: James Li Date: Mon, 30 Jan 2023 15:18:45 -0500 Subject: [PATCH 002/314] fix indentation --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e074779..e1b7da0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -60,10 +60,10 @@ jobs: - name: Rename executable based on OS env: ASSET_NAME: ${{matrix.asset_name}} - EXEC_PATH: $${{matrix.artifact_path}} + EXEC_PATH: ${{matrix.artifact_path}} run: | - echo "asset name: ${ASSET_NAME} executable path: ${EXEC_PATH}" - mv ${EXEC_PATH} ${ASSET_NAME} + echo "asset name: ${ASSET_NAME} executable path: ${EXEC_PATH}" + mv ${EXEC_PATH} ${ASSET_NAME} - name: Upload binaries to release uses: softprops/action-gh-release@v1 From 4440428436cc3e1bfab8d62b8671fdf1bd627eae Mon Sep 17 00:00:00 2001 From: James Li Date: Mon, 30 Jan 2023 15:39:06 -0500 Subject: [PATCH 003/314] remove windows from auto build --- .github/workflows/build.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e1b7da0..1543d3e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,7 +27,6 @@ jobs: matrix: name: [ linux, - windows, macos ] @@ -36,10 +35,6 @@ jobs: os: ubuntu-latest artifact_path: target/release/verifier-cli asset_name: verifier-cli-linux - - name: windows - os: windows-latest - artifact_path: target/release/verifier-cli.exe - asset_name: verifier-cli-windows - name: macos os: macos-latest artifact_path: target/release/verifier-cli From 722194feb9002735b5057d825d2d4113d7c8af6f Mon Sep 17 00:00:00 2001 From: James Li Date: Mon, 30 Jan 2023 16:08:37 -0500 Subject: [PATCH 004/314] update install script to point at latest auto build --- verifier-cli-install.sh | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/verifier-cli-install.sh b/verifier-cli-install.sh index 2709b17..f09579d 100755 --- a/verifier-cli-install.sh +++ b/verifier-cli-install.sh @@ -41,15 +41,18 @@ case "$PROCESSOR" in esac BIN="verifier-cli" -VERSION="0.1.0-x86_64-unknown-linux-gnu" +SUFFIX="linux" if [ "$OS_FLAVOUR" = Darwin ]; then + SUFFIX="macos" +fi - VERSION="0.1.0-x86_64-apple-darwin" - +if ["$OS_FLAVOUR" = Windows ]; then + echo "Windows is not currently supported using this installer." + exit 1 fi -DIST="$VERSION" +DIST="verifier-cli-$SUFFIX" # creates a temporary directory to save the distribution file SOURCE="$(mktemp -d)" @@ -58,9 +61,9 @@ echo "$(CYN "1.") 🖥 $(CYN "Downloading distribution")" echo "" # downloads the distribution file -REMOTE="https://github.com/Ellipsis-Labs/solana-verifiable-build/releases/download/v0.1.2/" -echo " => downloading from: $(CYN $REMOTE$BIN)" -curl -L $REMOTE$BIN --output "$SOURCE/$DIST" +REMOTE="https://github.com/Ellipsis-Labs/solana-verifiable-build/releases/latest/download/" +echo " => downloading from: $(CYN $REMOTE$DIST)" +curl -L $REMOTE$DIST --output "$SOURCE/$DIST" abort_on_error $? SIZE=$(wc -c "$SOURCE/$DIST" | grep -oE "[0-9]+" | head -n 1) From cd3a68ca33ab10c66bd6f34f7c3c52ad3726c492 Mon Sep 17 00:00:00 2001 From: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> Date: Mon, 30 Jan 2023 16:41:03 -0500 Subject: [PATCH 005/314] Update README.md Signed-off-by: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index dd6292c..49f6553 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,8 @@ This the output: Verifying image: "ellipsislabs/hello_world_verifiable_build:latest", on network "https://api.mainnet-beta.solana.com" against program ID 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn Executable path in container: "examples/hello_world/target/deploy/hello_world.so" +Executable hash (un-stripped): 79061f569f4b23728b3412153dedf5c5d4109257 +Program hash (un-stripped): 79061f569f4b23728b3412153dedf5c5d4109257 Executable matches on-chain program data ✅ ``` From 1087499c7b2c07c9837f0c83febc799fc9f0d478 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Tue, 31 Jan 2023 11:08:53 -0500 Subject: [PATCH 006/314] update to sha256 and print out hash after build --- Cargo.lock | 83 ++++++++++++++++++++++++++++++++++++++++++----------- Cargo.toml | 7 +++-- README.md | 5 ++-- src/main.rs | 57 ++++++++++++++++++++++++------------ 4 files changed, 113 insertions(+), 39 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5a2af48..c86b9e2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1334,6 +1334,12 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "histogram" version = "0.6.9" @@ -2138,7 +2144,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" dependencies = [ - "toml", + "toml 0.5.11", ] [[package]] @@ -2148,7 +2154,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66618389e4ec1c7afe67d51a9bf34ff9236480f8d51e7489b7d5ab0303c13f34" dependencies = [ "once_cell", - "toml_edit", + "toml_edit 0.18.1", ] [[package]] @@ -2693,6 +2699,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -2728,17 +2743,6 @@ dependencies = [ "digest 0.10.6", ] -[[package]] -name = "sha1" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.6", -] - [[package]] name = "sha2" version = "0.9.9" @@ -2763,6 +2767,16 @@ dependencies = [ "digest 0.10.6", ] +[[package]] +name = "sha256" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e334db67871c14c18fc066ad14af13f9fdf5f9a91c61af432d1e3a39c8c6a141" +dependencies = [ + "hex 0.4.3", + "sha2 0.9.9", +] + [[package]] name = "sha3" version = "0.9.1" @@ -3786,12 +3800,33 @@ dependencies = [ "serde", ] +[[package]] +name = "toml" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772c1426ab886e7362aedf4abc9c0d1348a979517efedfc25862944d10137af0" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime 0.6.1", + "toml_edit 0.19.1", +] + [[package]] name = "toml_datetime" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4553f467ac8e3d374bc9a177a26801e5d0f9b211aa1673fb137a403afd1c9cf5" +[[package]] +name = "toml_datetime" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" +dependencies = [ + "serde", +] + [[package]] name = "toml_edit" version = "0.18.1" @@ -3800,7 +3835,20 @@ checksum = "56c59d8dd7d0dcbc6428bf7aa2f0e823e26e43b3c9aca15bbc9475d23e5fa12b" dependencies = [ "indexmap", "nom8", - "toml_datetime", + "toml_datetime 0.5.1", +] + +[[package]] +name = "toml_edit" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90a238ee2e6ede22fb95350acc78e21dc40da00bb66c0334bde83de4ed89424e" +dependencies = [ + "indexmap", + "nom8", + "serde", + "serde_spanned", + "toml_datetime 0.6.1", ] [[package]] @@ -3970,10 +4018,13 @@ dependencies = [ "anyhow", "clap 4.1.4", "cmd_lib", - "hex", - "sha1", + "hex 0.3.2", + "serde", + "serde_json", + "sha256", "solana-client", "solana-sdk", + "toml 0.7.1", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index c4f8090..0f2fcec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,5 +11,8 @@ anyhow = "1.0.68" cmd_lib = "1.3.0" solana-client = "1.14.10" solana-sdk = "1.14.10" -sha1 = "0.10.5" -hex = "0.3.1" \ No newline at end of file +sha256 = "1.1.1" +hex = "0.3.1" +serde = { version = "1.0.130", features = ["derive"] } +serde_json = "1.0.68" +toml = "0.7.1" diff --git a/README.md b/README.md index dd6292c..a409d7b 100644 --- a/README.md +++ b/README.md @@ -48,12 +48,11 @@ verifier-cli get-program-hash -p 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn Which will return the following hash: ``` -627a5b29a06179d08ac5eab2c085703e59decbe6 +08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 ``` By default, this command will strip any trailing zeros away from the program executable file and run the sha1 algorithm against it to compute the hash. - To manually verify this build, one could run the following from the root of this repository. _This command takes a long time because it is building the binary in a Docker container_ ``` @@ -73,6 +72,6 @@ This will return the hash of the stripped executable ``` -627a5b29a06179d08ac5eab2c085703e59decbe6 +08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 ``` diff --git a/src/main.rs b/src/main.rs index 7615f82..4700e2d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,8 @@ -use std::io::Read; +use std::{io::Read, path::Path}; use clap::{Parser, Subcommand}; use cmd_lib::{init_builtin_logger, run_cmd, run_fun}; -use sha1::{Digest, Sha1}; +use serde::Deserialize; use solana_client::rpc_client::RpcClient; use solana_sdk::{ bpf_loader_upgradeable::{self, UpgradeableLoaderState}, @@ -16,12 +16,22 @@ struct Arguments { subcommand: SubCommand, } +#[derive(Deserialize, Debug)] +struct Config { + package: Package, +} + +#[derive(Deserialize, Debug)] +struct Package { + name: String, +} + #[derive(Subcommand, Debug)] enum SubCommand { /// Deterministically build the program in an Docker container Build { /// Path to mount to the docker image - filepath: Option, + build_dir: Option, #[clap(short, long)] base_image: Option, }, @@ -61,7 +71,7 @@ fn main() -> anyhow::Result<()> { let args = Arguments::parse(); match args.subcommand { SubCommand::Build { - filepath, + build_dir: filepath, base_image, } => build(filepath, base_image), SubCommand::VerifyFromImage { @@ -104,17 +114,16 @@ fn main() -> anyhow::Result<()> { } } -pub fn get_binary_hash(bytes: Vec) -> String { - let mut hasher = Sha1::new(); - let mut buffer = bytes +fn get_binary_hash(program_data: Vec) -> String { + let buffer = program_data .into_iter() .rev() .skip_while(|&x| x == 0) + .collect::>() + .into_iter() + .rev() .collect::>(); - buffer = buffer.iter().map(|x| *x).rev().collect::>(); - hasher.update(&buffer); - let program_hash = hasher.finalize(); - hex::encode(program_hash) + sha256::digest(&buffer[..]) } pub fn build(filepath: Option, base_image: Option) -> anyhow::Result<()> { @@ -131,11 +140,25 @@ pub fn build(filepath: Option, base_image: Option) -> anyhow::Re let container_id = run_fun!( docker run --rm - -v $path:/work + -v $path:/build -dit $image sh -c "cargo build-sbf -- --locked --frozen" )?; run_cmd!(docker logs --follow $container_id)?; + let build_path = Path::new(&path); + let toml_path = build_path.join("Cargo.toml"); + let toml: Config = toml::from_str(&std::fs::read_to_string(&toml_path)?)?; + let package_name = toml.package.name; + let executable_path = Path::new(&path) + .join("target") + .join("deploy") + .join(format!("{}.so", package_name)); + let mut f = std::fs::File::open(&executable_path)?; + let metadata = std::fs::metadata(&executable_path)?; + let mut buffer = vec![0; metadata.len() as usize]; + f.read(&mut buffer)?; + let program_hash = get_binary_hash(buffer); + println!("Executable hash: {}", program_hash); Ok(()) } @@ -154,7 +177,7 @@ pub fn verify_from_image( let output = run_fun!( docker run --rm -it $image sh -c - "(wc -c $executable_path && shasum $executable_path) | tr '\n' ' '" + "(wc -c $executable_path && shasum -a 256 $executable_path) | tr '\n' ' '" | tail -n 1 | awk "{print $1, $3}" )?; @@ -168,13 +191,11 @@ pub fn verify_from_image( let offset = UpgradeableLoaderState::size_of_programdata_metadata(); let account_data = &client.get_account_data(&program_buffer)?[offset..offset + executable_size]; - let mut hasher = Sha1::new(); - hasher.update(account_data); - let program_hash = hasher.finalize(); + let program_hash = sha256::digest(account_data); println!("Executable hash (un-stripped): {}", executable_hash); - println!("Program hash (un-stripped): {}", hex::encode(program_hash)); + println!("Program hash (un-stripped): {}", program_hash); - if hex::encode(program_hash) != executable_hash { + if program_hash != executable_hash { println!("Executable hash mismatch"); return Err(anyhow::Error::msg("Executable hash mismatch")); } else { From 9f442382c13a7ad45b4c0f020b2ebe851afc03df Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Tue, 31 Jan 2023 11:45:31 -0500 Subject: [PATCH 007/314] update verify logic --- src/main.rs | 38 ++++++++++++++++---------------------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/src/main.rs b/src/main.rs index 4700e2d..009d6a1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -81,11 +81,7 @@ fn main() -> anyhow::Result<()> { program_id, } => verify_from_image(executable_path, image, network, program_id), SubCommand::GetExecutableHash { filepath } => { - let mut f = std::fs::File::open(&filepath)?; - let metadata = std::fs::metadata(&filepath)?; - let mut buffer = vec![0; metadata.len() as usize]; - f.read(&mut buffer)?; - let program_hash = get_binary_hash(buffer); + let program_hash = get_file_hash(&filepath)?; println!("{}", program_hash); Ok(()) } @@ -126,6 +122,14 @@ fn get_binary_hash(program_data: Vec) -> String { sha256::digest(&buffer[..]) } +pub fn get_file_hash(filepath: &str) -> Result { + let mut f = std::fs::File::open(&filepath)?; + let metadata = std::fs::metadata(&filepath)?; + let mut buffer = vec![0; metadata.len() as usize]; + f.read(&mut buffer)?; + Ok(get_binary_hash(buffer)) +} + pub fn build(filepath: Option, base_image: Option) -> anyhow::Result<()> { let path = filepath.unwrap_or( std::env::current_dir()? @@ -153,11 +157,7 @@ pub fn build(filepath: Option, base_image: Option) -> anyhow::Re .join("target") .join("deploy") .join(format!("{}.so", package_name)); - let mut f = std::fs::File::open(&executable_path)?; - let metadata = std::fs::metadata(&executable_path)?; - let mut buffer = vec![0; metadata.len() as usize]; - f.read(&mut buffer)?; - let program_hash = get_binary_hash(buffer); + let program_hash = get_file_hash(executable_path.to_str().unwrap())?; println!("Executable hash: {}", program_hash); Ok(()) } @@ -174,24 +174,18 @@ pub fn verify_from_image( ); println!("Executable path in container: {:?}", executable_path); println!(""); - let output = run_fun!( - docker run --rm - -it $image sh -c - "(wc -c $executable_path && shasum -a 256 $executable_path) | tr '\n' ' '" - | tail -n 1 - | awk "{print $1, $3}" + let container_id = run_fun!( + docker run --rm -dit $image )?; + run_cmd!(docker cp $container_id:/build/$executable_path /tmp/program.so)?; - let tokens = output.split_whitespace().collect::>(); - let executable_size = tokens[0].parse::()?; - let executable_hash = tokens[1]; + let executable_hash = get_file_hash("/tmp/program.so")?; let client = RpcClient::new(network); let program_buffer = Pubkey::find_program_address(&[program_id.as_ref()], &bpf_loader_upgradeable::id()).0; - let offset = UpgradeableLoaderState::size_of_programdata_metadata(); - let account_data = &client.get_account_data(&program_buffer)?[offset..offset + executable_size]; - let program_hash = sha256::digest(account_data); + let account_data = &client.get_account_data(&program_buffer)?[offset..]; + let program_hash = get_binary_hash(account_data.to_vec()); println!("Executable hash (un-stripped): {}", executable_hash); println!("Program hash (un-stripped): {}", program_hash); From 4baaf4d847245d1b42d3eaaee2c61d9a5951c9dd Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Tue, 31 Jan 2023 11:46:34 -0500 Subject: [PATCH 008/314] update readme --- README.md | 4 ++-- src/main.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9e2865a..ee9bcd4 100644 --- a/README.md +++ b/README.md @@ -32,8 +32,8 @@ This the output: Verifying image: "ellipsislabs/hello_world_verifiable_build:latest", on network "https://api.mainnet-beta.solana.com" against program ID 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn Executable path in container: "examples/hello_world/target/deploy/hello_world.so" -Executable hash (un-stripped): 79061f569f4b23728b3412153dedf5c5d4109257 -Program hash (un-stripped): 79061f569f4b23728b3412153dedf5c5d4109257 +Executable hash: 08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 +Program hash: 08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 Executable matches on-chain program data ✅ ``` diff --git a/src/main.rs b/src/main.rs index 009d6a1..45ff919 100644 --- a/src/main.rs +++ b/src/main.rs @@ -186,8 +186,8 @@ pub fn verify_from_image( let offset = UpgradeableLoaderState::size_of_programdata_metadata(); let account_data = &client.get_account_data(&program_buffer)?[offset..]; let program_hash = get_binary_hash(account_data.to_vec()); - println!("Executable hash (un-stripped): {}", executable_hash); - println!("Program hash (un-stripped): {}", program_hash); + println!("Executable hash: {}", executable_hash); + println!("Program hash: {}", program_hash); if program_hash != executable_hash { println!("Executable hash mismatch"); From 64a95dfad5e7ad4b2e81d6031374749d8fc0fa80 Mon Sep 17 00:00:00 2001 From: James Li Date: Tue, 31 Jan 2023 12:19:20 -0500 Subject: [PATCH 009/314] cleanup docker and tmp; rename package to solana-verify --- Cargo.lock | 32 ++++++++++++++++---------------- Cargo.toml | 2 +- src/main.rs | 4 ++++ 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c86b9e2..a05d65a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3384,6 +3384,22 @@ dependencies = [ "thiserror", ] +[[package]] +name = "solana-verify" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap 4.1.4", + "cmd_lib", + "hex 0.3.2", + "serde", + "serde_json", + "sha256", + "solana-client", + "solana-sdk", + "toml 0.7.1", +] + [[package]] name = "solana-version" version = "1.14.13" @@ -4011,22 +4027,6 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" -[[package]] -name = "verifier-cli" -version = "0.1.0" -dependencies = [ - "anyhow", - "clap 4.1.4", - "cmd_lib", - "hex 0.3.2", - "serde", - "serde_json", - "sha256", - "solana-client", - "solana-sdk", - "toml 0.7.1", -] - [[package]] name = "version_check" version = "0.9.4" diff --git a/Cargo.toml b/Cargo.toml index 0f2fcec..7dd967f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "verifier-cli" +name = "solana-verify" version = "0.1.0" edition = "2021" diff --git a/src/main.rs b/src/main.rs index 45ff919..658d2bb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -189,6 +189,10 @@ pub fn verify_from_image( println!("Executable hash: {}", executable_hash); println!("Program hash: {}", program_hash); + // Cleanup docker and rm file + run_cmd!(docker kill $container_id)?; + run_cmd!(rm "/tmp/program.so")?; + if program_hash != executable_hash { println!("Executable hash mismatch"); return Err(anyhow::Error::msg("Executable hash mismatch")); From d2d9dda3ea6bfc0d3ad5c546ef7724e569b49dbf Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Tue, 31 Jan 2023 12:22:19 -0500 Subject: [PATCH 010/314] Don't log on kill --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 658d2bb..e6f68be 100644 --- a/src/main.rs +++ b/src/main.rs @@ -190,8 +190,8 @@ pub fn verify_from_image( println!("Program hash: {}", program_hash); // Cleanup docker and rm file - run_cmd!(docker kill $container_id)?; - run_cmd!(rm "/tmp/program.so")?; + run_fun!(docker kill $container_id)?; + run_fun!(rm "/tmp/program.so")?; if program_hash != executable_hash { println!("Executable hash mismatch"); From 1d104b29a6b333a50015125952c70f82e6e3d8e3 Mon Sep 17 00:00:00 2001 From: James Li Date: Tue, 31 Jan 2023 14:35:30 -0500 Subject: [PATCH 011/314] update readme, build.yml, and install script --- .github/workflows/build.yml | 8 +++--- README.md | 29 ++++++++++++--------- examples/hello_world/hello_world.dockerfile | 7 +++++ verifier-cli-install.sh | 8 +++--- 4 files changed, 31 insertions(+), 21 deletions(-) create mode 100644 examples/hello_world/hello_world.dockerfile diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1543d3e..cba7724 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,12 +33,12 @@ jobs: include: - name: linux os: ubuntu-latest - artifact_path: target/release/verifier-cli - asset_name: verifier-cli-linux + artifact_path: target/release/solana-verify + asset_name: solana-verify-linux - name: macos os: macos-latest - artifact_path: target/release/verifier-cli - asset_name: verifier-cli-macos + artifact_path: target/release/solana-verify + asset_name: solana-verify-macos steps: - name: Checkout code uses: actions/checkout@v1 diff --git a/README.md b/README.md index ee9bcd4..3c0a986 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -# Solana Verifiable Build CLI +# Solana Verify CLI + +A command line tool to build and verify solana programs. Users can ensure that the hash of the on-chain program matches the hash of the program of the given codebase. ## Installation @@ -6,7 +8,7 @@ In order for this CLI to work properly, you must have `docker` installed on your Once the installation is complete, make sure that the server has been started: (https://docs.docker.com/config/daemon/start/) -To install the verifier cli, run the following in your shell: +To install the Solana Verify cli, run the following in your shell: ``` bash <(curl -sSf https://raw.githubusercontent.com/Ellipsis-Labs/solana-verifiable-build/master/verifier-cli-install.sh) @@ -23,10 +25,14 @@ Check it out here: https://solana.fm/address/2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TT Run the following command: ``` -verifier-cli verify-from-image -e examples/hello_world/target/deploy/hello_world.so -i ellipsislabs/hello_world_verifiable_build:latest -p 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn +solana-verify verify-from-image -e examples/hello_world/target/deploy/hello_world.so -i ellipsislabs/hello_world_verifiable_build:latest -p 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn ``` -This the output: +This command loads up the image stored at [ellipsislabs/hello_world_verifiable_build:latest](https://hub.docker.com/layers/ellipsislabs/hello_world_verifiable_build/latest/images/sha256-d8b51c04c739999da618df4271d8d088fdcb3a0d8474044ebf434ebb993b5c7d?context=explore), and verifies that the hash of the executable path in the container is the same as the hash of the on-chain program supplied to the command. Because the build was already uploaded to an image, there is no need for a full rebuild of the executable which takes an extremely long time. + +The Dockerfile that creates the image `ellipsislabs/hello_world_verifiable_build:latest` can be found in ./examples/hello_world under this repo. + +Below is the expected output: ``` Verifying image: "ellipsislabs/hello_world_verifiable_build:latest", on network "https://api.mainnet-beta.solana.com" against program ID 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn @@ -37,14 +43,12 @@ Program hash: 08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 Executable matches on-chain program data ✅ ``` -This command loads up the image stored at [ellipsislabs/hello_world_verifiable_build:latest](https://hub.docker.com/layers/ellipsislabs/hello_world_verifiable_build/latest/images/sha256-d8b51c04c739999da618df4271d8d088fdcb3a0d8474044ebf434ebb993b5c7d?context=explore), and verifies that the hash of the executable path in the container is the same as the hash of the on-chain program supplied to the command. Because the build was already uploaded to an image, there is no need for a full rebuild of the executable which takes an extremely long time. - ### Manual Verification -To get the hash of the of this program, we can run the following: +To get the hash of this on-chain program, we can run the following: ``` -verifier-cli get-program-hash -p 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn +solana-verify get-program-hash 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn ``` Which will return the following hash: @@ -53,24 +57,23 @@ Which will return the following hash: 08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 ``` -By default, this command will strip any trailing zeros away from the program executable file and run the sha1 algorithm against it to compute the hash. +By default, this command will strip any trailing zeros away from the program executable file and run the sha256 algorithm against it to compute the hash. To manually verify this build, one could run the following from the root of this repository. _This command takes a long time because it is building the binary in a Docker container_ ``` -cd examples/hello_world -verifier-cli build +solana-verify build $PWD/examples/hello_world ``` Now we can check the resulting hash from the build. ``` -verifier-cli get-executable-hash -f target/deploy/hello_world.so +solana-verify get-executable-hash ./examples/hello_world/target/deploy/hello_world.so ``` -This will return the hash of the stripped executable +This will return the hash of the stripped executable, which should match the hash of the program data retrieved from the blockchain. ``` diff --git a/examples/hello_world/hello_world.dockerfile b/examples/hello_world/hello_world.dockerfile new file mode 100644 index 0000000..faf2609 --- /dev/null +++ b/examples/hello_world/hello_world.dockerfile @@ -0,0 +1,7 @@ +# Get rust and solana toolchain +FROM ellipsislabs/solana:latest +# Install the Solana Verify CLI +RUN git clone https://github.com/Ellipsis-Labs/solana-verifiable-build.git /build +RUN git checkout 08c4a64 +# Get the code of the program to build and verify +RUN cd examples/hello_world && cargo build-sbf -- --locked --frozen \ No newline at end of file diff --git a/verifier-cli-install.sh b/verifier-cli-install.sh index f09579d..0fa86ee 100755 --- a/verifier-cli-install.sh +++ b/verifier-cli-install.sh @@ -19,7 +19,7 @@ abort_on_error() { fi } -CYN "Verifier CLI installation script" +CYN "Solana Verify CLI installation script" echo "---------------------------------------" echo "" @@ -40,7 +40,7 @@ case "$PROCESSOR" in ;; esac -BIN="verifier-cli" +BIN="solana-verify" SUFFIX="linux" if [ "$OS_FLAVOUR" = Darwin ]; then @@ -52,7 +52,7 @@ if ["$OS_FLAVOUR" = Windows ]; then exit 1 fi -DIST="verifier-cli-$SUFFIX" +DIST="$BIN-$SUFFIX" # creates a temporary directory to save the distribution file SOURCE="$(mktemp -d)" @@ -129,7 +129,7 @@ else echo " => adding '$TARGET' to 'PATH' variable in '$ENV_FILE'" echo "export PATH=\"$HOME/bin:\$PATH\"" >> "$ENV_FILE" else - echo " => adding '$TARGET' to 'PATH' variable to execute 'verifier-cli' from any directory." + echo " => adding '$TARGET' to 'PATH' variable to execute 'solana-verify' from any directory." echo " - file '$(CYN $ENV_FILE)' was not found" echo "" echo -n "$(CYN "Would you like to create '$ENV_FILE'? [y/n]") (default 'n'): " From 520cc3f40341ef0a50e633dac2a7dff483a7ab93 Mon Sep 17 00:00:00 2001 From: James Li Date: Tue, 31 Jan 2023 14:38:59 -0500 Subject: [PATCH 012/314] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3c0a986..ded355d 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ Executable matches on-chain program data ✅ ### Manual Verification -To get the hash of this on-chain program, we can run the following: +To get the hash of an on-chain program, we can run the following with a given program ID: ``` solana-verify get-program-hash 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn From f352d55c63a361ecf59b7a9ee3a8398e5e7b9543 Mon Sep 17 00:00:00 2001 From: James Li Date: Tue, 31 Jan 2023 14:49:01 -0500 Subject: [PATCH 013/314] update readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ded355d..915c909 100644 --- a/README.md +++ b/README.md @@ -57,9 +57,9 @@ Which will return the following hash: 08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 ``` -By default, this command will strip any trailing zeros away from the program executable file and run the sha256 algorithm against it to compute the hash. +By default, this command will strip any trailing zeros away from the program executable and run the sha256 algorithm against it to compute the hash. -To manually verify this build, one could run the following from the root of this repository. _This command takes a long time because it is building the binary in a Docker container_ +To manually verify this program, one could run the following from the root of this repository, which builds a program from source code and computes a hash. _This command takes a long time because it is building the binary in a Docker container_ ``` solana-verify build $PWD/examples/hello_world From c623e2cefadace2ec95f268e5a0e88158550e079 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Tue, 31 Jan 2023 15:29:31 -0500 Subject: [PATCH 014/314] don't print out exec hash --- src/main.rs | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/main.rs b/src/main.rs index e6f68be..3fa8229 100644 --- a/src/main.rs +++ b/src/main.rs @@ -149,16 +149,6 @@ pub fn build(filepath: Option, base_image: Option) -> anyhow::Re sh -c "cargo build-sbf -- --locked --frozen" )?; run_cmd!(docker logs --follow $container_id)?; - let build_path = Path::new(&path); - let toml_path = build_path.join("Cargo.toml"); - let toml: Config = toml::from_str(&std::fs::read_to_string(&toml_path)?)?; - let package_name = toml.package.name; - let executable_path = Path::new(&path) - .join("target") - .join("deploy") - .join(format!("{}.so", package_name)); - let program_hash = get_file_hash(executable_path.to_str().unwrap())?; - println!("Executable hash: {}", program_hash); Ok(()) } From 91eb488d4c9278de4c261d16adab03dc54d27fef Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Tue, 31 Jan 2023 15:33:39 -0500 Subject: [PATCH 015/314] remove toml and serde deps --- Cargo.lock | 52 +++------------------------------------------------- Cargo.toml | 3 --- src/main.rs | 13 +------------ 3 files changed, 4 insertions(+), 64 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a05d65a..9d9d9c8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2144,7 +2144,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" dependencies = [ - "toml 0.5.11", + "toml", ] [[package]] @@ -2154,7 +2154,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66618389e4ec1c7afe67d51a9bf34ff9236480f8d51e7489b7d5ab0303c13f34" dependencies = [ "once_cell", - "toml_edit 0.18.1", + "toml_edit", ] [[package]] @@ -2699,15 +2699,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_spanned" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4" -dependencies = [ - "serde", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -3392,12 +3383,9 @@ dependencies = [ "clap 4.1.4", "cmd_lib", "hex 0.3.2", - "serde", - "serde_json", "sha256", "solana-client", "solana-sdk", - "toml 0.7.1", ] [[package]] @@ -3816,33 +3804,12 @@ dependencies = [ "serde", ] -[[package]] -name = "toml" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "772c1426ab886e7362aedf4abc9c0d1348a979517efedfc25862944d10137af0" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime 0.6.1", - "toml_edit 0.19.1", -] - [[package]] name = "toml_datetime" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4553f467ac8e3d374bc9a177a26801e5d0f9b211aa1673fb137a403afd1c9cf5" -[[package]] -name = "toml_datetime" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" -dependencies = [ - "serde", -] - [[package]] name = "toml_edit" version = "0.18.1" @@ -3851,20 +3818,7 @@ checksum = "56c59d8dd7d0dcbc6428bf7aa2f0e823e26e43b3c9aca15bbc9475d23e5fa12b" dependencies = [ "indexmap", "nom8", - "toml_datetime 0.5.1", -] - -[[package]] -name = "toml_edit" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90a238ee2e6ede22fb95350acc78e21dc40da00bb66c0334bde83de4ed89424e" -dependencies = [ - "indexmap", - "nom8", - "serde", - "serde_spanned", - "toml_datetime 0.6.1", + "toml_datetime", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 7dd967f..3f0b2e5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,3 @@ solana-client = "1.14.10" solana-sdk = "1.14.10" sha256 = "1.1.1" hex = "0.3.1" -serde = { version = "1.0.130", features = ["derive"] } -serde_json = "1.0.68" -toml = "0.7.1" diff --git a/src/main.rs b/src/main.rs index 3fa8229..8acaada 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,7 @@ -use std::{io::Read, path::Path}; +use std::io::Read; use clap::{Parser, Subcommand}; use cmd_lib::{init_builtin_logger, run_cmd, run_fun}; -use serde::Deserialize; use solana_client::rpc_client::RpcClient; use solana_sdk::{ bpf_loader_upgradeable::{self, UpgradeableLoaderState}, @@ -16,16 +15,6 @@ struct Arguments { subcommand: SubCommand, } -#[derive(Deserialize, Debug)] -struct Config { - package: Package, -} - -#[derive(Deserialize, Debug)] -struct Package { - name: String, -} - #[derive(Subcommand, Debug)] enum SubCommand { /// Deterministically build the program in an Docker container From 74bad9113a2f839a21908f3f7f89b2eb079b61f9 Mon Sep 17 00:00:00 2001 From: James Li Date: Tue, 31 Jan 2023 16:25:32 -0500 Subject: [PATCH 016/314] add verify from repo url feature --- src/main.rs | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 8acaada..3b9595f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use std::io::Read; +use std::{io::Read, path::PathBuf}; use clap::{Parser, Subcommand}; use cmd_lib::{init_builtin_logger, run_cmd, run_fun}; @@ -54,6 +54,17 @@ enum SubCommand { /// Address of the buffer account containing the deployed program data buffer_address: Pubkey, }, + VerifyFromRepo { + #[clap(short, long)] + solana_program_path: String, + repo_url: String, + #[clap(short, long, default_value = "https://api.mainnet-beta.solana.com")] + connection_url: String, + #[clap(short, long)] + program_id: Pubkey, + #[clap(short, long)] + base_image: Option, + }, } fn main() -> anyhow::Result<()> { @@ -62,7 +73,10 @@ fn main() -> anyhow::Result<()> { SubCommand::Build { build_dir: filepath, base_image, - } => build(filepath, base_image), + } => { + build(filepath, base_image)?; + Ok(()) + } SubCommand::VerifyFromImage { executable_path_in_image: executable_path, image, @@ -96,6 +110,55 @@ fn main() -> anyhow::Result<()> { println!("{}", program_hash); Ok(()) } + SubCommand::VerifyFromRepo { + solana_program_path, + repo_url, + program_id, + connection_url, + base_image, + } => { + // Get source code from repo_url + let base_name = run_fun!(basename $repo_url)?; + run_fun!(git clone $repo_url /tmp/solana-verify/$base_name)?; + run_fun!(cd /tmp/solana-verify/$base_name)?; + + // Get the absolute build path to the solana program directory to build inside docker + let build_path = PathBuf::from(format!("/tmp/solana-verify/{}", base_name)) + .join(solana_program_path.clone()); + println!("Build path: {:?}", build_path); + + // Build the code using the docker container + build(Some(build_path.to_str().unwrap().to_string()), base_image)?; + + // Get the hash of the build + let executable_path = + run_fun!(find $solana_program_path/target/deploy -type f -name "*.so")?; + let build_hash = get_file_hash(&executable_path)?; + + // Get hash of on-chain program + let client = RpcClient::new(connection_url); + let program_buffer = + Pubkey::find_program_address(&[program_id.as_ref()], &bpf_loader_upgradeable::id()) + .0; + let offset = UpgradeableLoaderState::size_of_programdata_metadata(); + let account_data = client.get_account_data(&program_buffer)?[offset..].to_vec(); + let program_hash = get_binary_hash(account_data); + + // Compare hashes + println!("Executable Program Hash from repo: {}", build_hash); + println!("On-chain Program Hash: {}", program_hash); + + // Remove temp repo + run_fun!(rm -rf /tmp/solana-verify/$base_name)?; + + if program_hash != build_hash { + println!("Executable hash mismatch"); + return Err(anyhow::Error::msg("Executable hash mismatch")); + } else { + println!("Executable matches on-chain program data ✅"); + } + Ok(()) + } } } From 25663b14a53ed242925add2c1f32d54d738cfdb9 Mon Sep 17 00:00:00 2001 From: James Li Date: Tue, 31 Jan 2023 16:52:53 -0500 Subject: [PATCH 017/314] fix clippy errors --- src/main.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main.rs b/src/main.rs index 3b9595f..11f3e9f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -175,10 +175,10 @@ fn get_binary_hash(program_data: Vec) -> String { } pub fn get_file_hash(filepath: &str) -> Result { - let mut f = std::fs::File::open(&filepath)?; - let metadata = std::fs::metadata(&filepath)?; + let mut f = std::fs::File::open(filepath)?; + let metadata = std::fs::metadata(filepath)?; let mut buffer = vec![0; metadata.len() as usize]; - f.read(&mut buffer)?; + f.read_exact(&mut buffer)?; Ok(get_binary_hash(buffer)) } @@ -187,11 +187,11 @@ pub fn build(filepath: Option, base_image: Option) -> anyhow::Re std::env::current_dir()? .as_os_str() .to_str() - .ok_or(anyhow::Error::msg("Invalid path string"))? + .ok_or_else(|| anyhow::Error::msg("Invalid path string"))? .to_string(), ); println!("Mounting path: {}", path); - let image = base_image.unwrap_or("ellipsislabs/solana:latest".to_string()); + let image = base_image.unwrap_or_else(|| "ellipsislabs/solana:latest".to_string()); init_builtin_logger(); let container_id = run_fun!( docker run @@ -215,7 +215,7 @@ pub fn verify_from_image( image, network, program_id ); println!("Executable path in container: {:?}", executable_path); - println!(""); + println!(" "); let container_id = run_fun!( docker run --rm -dit $image )?; From 0a3a1be54b7a46cb8b6a622a9ecb2037d4fafd8a Mon Sep 17 00:00:00 2001 From: James Li Date: Tue, 31 Jan 2023 23:22:02 -0500 Subject: [PATCH 018/314] add flag for build-bpf, program name if multiple programs in repo, and refactor to clean up --- Cargo.lock | 23 +++++++++++++ Cargo.toml | 8 +++++ src/main.rs | 96 +++++++++++++++++++++++++++++++++++++---------------- 3 files changed, 98 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9d9d9c8..ccc3812 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3386,6 +3386,7 @@ dependencies = [ "sha256", "solana-client", "solana-sdk", + "uuid", ] [[package]] @@ -3975,6 +3976,28 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "uuid" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c" +dependencies = [ + "getrandom 0.2.8", + "rand 0.8.5", + "uuid-macro-internal", +] + +[[package]] +name = "uuid-macro-internal" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73bc89f2894593e665241e0052c3791999e6787b7c4831daa0a5c2e637e276d8" +dependencies = [ + "proc-macro2 1.0.50", + "quote 1.0.23", + "syn 1.0.107", +] + [[package]] name = "vec_map" version = "0.8.2" diff --git a/Cargo.toml b/Cargo.toml index 3f0b2e5..913c078 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,3 +13,11 @@ solana-client = "1.14.10" solana-sdk = "1.14.10" sha256 = "1.1.1" hex = "0.3.1" + +[dependencies.uuid] +version = "1.2.2" +features = [ + "v4", # Lets you generate random UUIDs + "fast-rng", # Use a faster (but still sufficiently random) RNG + "macro-diagnostics", # Enable better diagnostics for compile-time UUIDs +] \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 11f3e9f..3e569bf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ use std::{io::Read, path::PathBuf}; +use anyhow::anyhow; use clap::{Parser, Subcommand}; use cmd_lib::{init_builtin_logger, run_cmd, run_fun}; use solana_client::rpc_client::RpcClient; @@ -7,6 +8,7 @@ use solana_sdk::{ bpf_loader_upgradeable::{self, UpgradeableLoaderState}, pubkey::Pubkey, }; +use uuid::Uuid; #[derive(Parser, Debug)] #[clap(author = "Ellipsis", version, about)] @@ -23,6 +25,9 @@ enum SubCommand { build_dir: Option, #[clap(short, long)] base_image: Option, + /// If the program requires cargo build-bpf (instead of cargo build-sbf), as for anchor program, set this flag + #[clap(short, long, default_value = "false")] + bpf_flag: bool, }, /// Verifies a cached build from a docker image VerifyFromImage { @@ -64,6 +69,12 @@ enum SubCommand { program_id: Pubkey, #[clap(short, long)] base_image: Option, + /// If the repo_url points to a repo that contains multiple programs, specify the name of the program to build and verify + #[clap(short, long, default_value = "*")] + name_of_program: String, + /// If the program requires cargo build-bpf (instead of cargo build-sbf), as for anchor program, set this flag + #[clap(long, default_value = "false")] + bpf_flag: bool, }, } @@ -73,8 +84,9 @@ fn main() -> anyhow::Result<()> { SubCommand::Build { build_dir: filepath, base_image, + bpf_flag, } => { - build(filepath, base_image)?; + build(filepath, base_image, bpf_flag)?; Ok(()) } SubCommand::VerifyFromImage { @@ -92,21 +104,12 @@ fn main() -> anyhow::Result<()> { url, buffer_address, } => { - let client = RpcClient::new(url); - let offset = UpgradeableLoaderState::size_of_buffer_metadata(); - let account_data = client.get_account_data(&buffer_address)?[offset..].to_vec(); - let program_hash = get_binary_hash(account_data); - println!("{}", program_hash); + let buffer_hash = get_buffer_hash(url, buffer_address)?; + println!("{}", buffer_hash); Ok(()) } SubCommand::GetProgramHash { url, program_id } => { - let client = RpcClient::new(url); - let program_buffer = - Pubkey::find_program_address(&[program_id.as_ref()], &bpf_loader_upgradeable::id()) - .0; - let offset = UpgradeableLoaderState::size_of_programdata_metadata(); - let account_data = client.get_account_data(&program_buffer)?[offset..].to_vec(); - let program_hash = get_binary_hash(account_data); + let program_hash = get_program_hash(url, program_id)?; println!("{}", program_hash); Ok(()) } @@ -116,40 +119,42 @@ fn main() -> anyhow::Result<()> { program_id, connection_url, base_image, + name_of_program, + bpf_flag, } => { // Get source code from repo_url let base_name = run_fun!(basename $repo_url)?; - run_fun!(git clone $repo_url /tmp/solana-verify/$base_name)?; - run_fun!(cd /tmp/solana-verify/$base_name)?; + let uuid = Uuid::new_v4().to_string(); + + run_fun!(git clone $repo_url /tmp/solana-verify/$uuid/$base_name)?; // Get the absolute build path to the solana program directory to build inside docker - let build_path = PathBuf::from(format!("/tmp/solana-verify/{}", base_name)) + let build_path = PathBuf::from(format!("/tmp/solana-verify/{}/{}", uuid, base_name)) .join(solana_program_path.clone()); println!("Build path: {:?}", build_path); // Build the code using the docker container - build(Some(build_path.to_str().unwrap().to_string()), base_image)?; + build( + Some(build_path.to_str().unwrap().to_string()), + base_image, + bpf_flag, + )?; + + let executable_filename = format!("{}.so", name_of_program); // Get the hash of the build - let executable_path = - run_fun!(find $solana_program_path/target/deploy -type f -name "*.so")?; + let executable_path = run_fun!(find /tmp/solana-verify/$uuid/$base_name/target/deploy -type f -name "$executable_filename")?; let build_hash = get_file_hash(&executable_path)?; // Get hash of on-chain program - let client = RpcClient::new(connection_url); - let program_buffer = - Pubkey::find_program_address(&[program_id.as_ref()], &bpf_loader_upgradeable::id()) - .0; - let offset = UpgradeableLoaderState::size_of_programdata_metadata(); - let account_data = client.get_account_data(&program_buffer)?[offset..].to_vec(); - let program_hash = get_binary_hash(account_data); + let program_hash = get_program_hash(connection_url, program_id)?; // Compare hashes println!("Executable Program Hash from repo: {}", build_hash); println!("On-chain Program Hash: {}", program_hash); // Remove temp repo - run_fun!(rm -rf /tmp/solana-verify/$base_name)?; + run_fun!(rm -rf build_path)?; if program_hash != build_hash { println!("Executable hash mismatch"); @@ -182,7 +187,11 @@ pub fn get_file_hash(filepath: &str) -> Result { Ok(get_binary_hash(buffer)) } -pub fn build(filepath: Option, base_image: Option) -> anyhow::Result<()> { +pub fn build( + filepath: Option, + base_image: Option, + bpf_flag: bool, +) -> anyhow::Result<()> { let path = filepath.unwrap_or( std::env::current_dir()? .as_os_str() @@ -192,18 +201,47 @@ pub fn build(filepath: Option, base_image: Option) -> anyhow::Re ); println!("Mounting path: {}", path); let image = base_image.unwrap_or_else(|| "ellipsislabs/solana:latest".to_string()); + let cargo_command = if bpf_flag { + "cargo build-bpf" + } else { + "cargo build-sbf" + }; + + println!( + "Cargo build command: {} -- --locked --frozen", + cargo_command + ); + init_builtin_logger(); let container_id = run_fun!( docker run --rm -v $path:/build -dit $image - sh -c "cargo build-sbf -- --locked --frozen" + sh -c "$cargo_command -- --locked --frozen" )?; run_cmd!(docker logs --follow $container_id)?; Ok(()) } +pub fn get_buffer_hash(url: String, buffer_address: Pubkey) -> anyhow::Result { + let client = RpcClient::new(url); + let offset = UpgradeableLoaderState::size_of_buffer_metadata(); + let account_data = client.get_account_data(&buffer_address)?[offset..].to_vec(); + let program_hash = get_binary_hash(account_data); + Ok(program_hash) +} + +pub fn get_program_hash(url: String, program_id: Pubkey) -> anyhow::Result { + let client = RpcClient::new(url); + let program_buffer = + Pubkey::find_program_address(&[program_id.as_ref()], &bpf_loader_upgradeable::id()).0; + let offset = UpgradeableLoaderState::size_of_programdata_metadata(); + let account_data = client.get_account_data(&program_buffer)?[offset..].to_vec(); + let program_hash = get_binary_hash(account_data); + Ok(program_hash) +} + pub fn verify_from_image( executable_path: String, image: String, From 284016eba48c4cbc3f7a350d91a9ed60b4d1cf46 Mon Sep 17 00:00:00 2001 From: James Li Date: Wed, 1 Feb 2023 17:11:06 -0500 Subject: [PATCH 019/314] Cleanup on fail; add build by commit hash; add comments for all flags --- src/main.rs | 117 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 89 insertions(+), 28 deletions(-) diff --git a/src/main.rs b/src/main.rs index 3e569bf..9da6d64 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,6 +23,7 @@ enum SubCommand { Build { /// Path to mount to the docker image build_dir: Option, + /// Optionally specify a custom base docker image to use for building the program repository #[clap(short, long)] base_image: Option, /// If the program requires cargo build-bpf (instead of cargo build-sbf), as for anchor program, set this flag @@ -31,42 +32,57 @@ enum SubCommand { }, /// Verifies a cached build from a docker image VerifyFromImage { + /// Path to the executable solana program within the source code repository in the docker image #[clap(short, long)] executable_path_in_image: String, + /// Image that contains the source code to be verified #[clap(short, long)] image: String, + /// Connection URL to Solana network to verify the on-chain program. Default is mainnet-beta. #[clap(short, long, default_value = "https://api.mainnet-beta.solana.com")] url: String, + /// The Program ID of the program to verify #[clap(short, long)] program_id: Pubkey, }, /// Get the hash of a program binary from an executable file GetExecutableHash { - /// Path to the executable + /// Path to the executable solana program filepath: String, }, /// Get the hash of a program binary from the deployed on-chain program GetProgramHash { + /// Connection URL to Solana network to verify the on-chain program. Default is mainnet-beta. #[clap(short, long, default_value = "https://api.mainnet-beta.solana.com")] url: String, - /// Program ID + /// The Program ID of the program to verify program_id: Pubkey, }, /// Get the hash of a program binary from the deployed buffer address GetBufferHash { + /// Connection URL to Solana network to verify the on-chain program. Default is mainnet-beta. #[clap(short, long, default_value = "https://api.mainnet-beta.solana.com")] url: String, /// Address of the buffer account containing the deployed program data buffer_address: Pubkey, }, + /// Builds and verifies a program from a given repository URL and a program ID VerifyFromRepo { - #[clap(short, long)] + /// Path to the executable solana program within the source code repository if the program is not part of the top-level Cargo.toml + #[clap(short, long, default_value = ".")] solana_program_path: String, + /// The HTTPS URL of the repo to clone repo_url: String, + /// Optional commit hash to checkout + #[clap(long)] + commit_hash: Option, + /// Connection URL to Solana network to verify the on-chain program #[clap(short, long, default_value = "https://api.mainnet-beta.solana.com")] connection_url: String, + /// The Program ID of the program to verify #[clap(short, long)] program_id: Pubkey, + /// Optionally specify a custom base docker image to use for building the program repository #[clap(short, long)] base_image: Option, /// If the repo_url points to a repo that contains multiple programs, specify the name of the program to build and verify @@ -116,6 +132,7 @@ fn main() -> anyhow::Result<()> { SubCommand::VerifyFromRepo { solana_program_path, repo_url, + commit_hash, program_id, connection_url, base_image, @@ -126,43 +143,53 @@ fn main() -> anyhow::Result<()> { let base_name = run_fun!(basename $repo_url)?; let uuid = Uuid::new_v4().to_string(); - run_fun!(git clone $repo_url /tmp/solana-verify/$uuid/$base_name)?; + // Create a temporary directory to clone the repo into + let tmp_file_path = format!("/tmp/solana-verify/{}/{}", uuid, base_name); + run_fun!(git clone $repo_url $tmp_file_path)?; + + // Checkout a specific commit hash, if provided + if let Some(commit_hash) = commit_hash { + println!("tmp_file_path: {:?}", tmp_file_path); + let result = run_fun!(cd $tmp_file_path; git checkout $commit_hash); + if result.is_ok() { + println!("Checked out commit hash: {}", commit_hash); + } else { + run_fun!(rm -rf /tmp/solana-verify/$uuid)?; + Err(anyhow!("Failed to checkout commit hash: {:?}", result))?; + } + } // Get the absolute build path to the solana program directory to build inside docker - let build_path = PathBuf::from(format!("/tmp/solana-verify/{}/{}", uuid, base_name)) - .join(solana_program_path.clone()); + let build_path = PathBuf::from(tmp_file_path.clone()).join(solana_program_path); println!("Build path: {:?}", build_path); - // Build the code using the docker container - build( - Some(build_path.to_str().unwrap().to_string()), + let result = verify_from_repo( + build_path.to_str().unwrap().to_string(), base_image, bpf_flag, - )?; - - let executable_filename = format!("{}.so", name_of_program); - - // Get the hash of the build - let executable_path = run_fun!(find /tmp/solana-verify/$uuid/$base_name/target/deploy -type f -name "$executable_filename")?; - let build_hash = get_file_hash(&executable_path)?; + name_of_program, + connection_url, + program_id, + ); - // Get hash of on-chain program - let program_hash = get_program_hash(connection_url, program_id)?; + // Cleanup no matter the result + run_fun!(rm -rf /tmp/solana-verify/$uuid)?; - // Compare hashes - println!("Executable Program Hash from repo: {}", build_hash); - println!("On-chain Program Hash: {}", program_hash); + // Compare hashes or return error + if let Ok((build_hash, program_hash)) = result { + println!("Executable Program Hash from repo: {}", build_hash); + println!("On-chain Program Hash: {}", program_hash); - // Remove temp repo - run_fun!(rm -rf build_path)?; + if build_hash == program_hash { + println!("Program hash matches"); + } else { + println!("Program hash does not match"); + } - if program_hash != build_hash { - println!("Executable hash mismatch"); - return Err(anyhow::Error::msg("Executable hash mismatch")); + Ok(()) } else { - println!("Executable matches on-chain program data ✅"); + Err(anyhow!("Error verifying program. {:?}", result)) } - Ok(()) } } } @@ -281,3 +308,37 @@ pub fn verify_from_image( } Ok(()) } + +pub fn verify_from_repo( + base_repo_path: String, + base_image: Option, + bpf_flag: bool, + name_of_program: String, + connection_url: String, + program_id: Pubkey, +) -> anyhow::Result<(String, String)> { + // Build the code using the docker container + build(Some(base_repo_path.clone()), base_image, bpf_flag)?; + + let executable_filename = format!("{}.so", name_of_program); + + // Get the hash of the build + println!( + "Looking for executable name {} at path: {}/target/deploy", + executable_filename, base_repo_path + ); + let executable_path = + run_fun!(find $base_repo_path/target/deploy -name "$executable_filename")?; + println!("Executable file found at path: {:?}", executable_path); + let build_hash = get_file_hash(&executable_path)?; + println!("Build hash: {}", build_hash); + + // Get the hash of the deployed program + println!( + "Fetching on-chain program data for program ID: {} on connection url: {}", + program_id, connection_url + ); + let program_hash = get_program_hash(connection_url, program_id)?; + + Ok((build_hash, program_hash)) +} From fd7aa7fedd88ec686ad1ac818ab915a9bc2ca1db Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Wed, 1 Feb 2023 17:31:00 -0500 Subject: [PATCH 020/314] Update cli for specifying url endpoints: --- Cargo.lock | 1 + Cargo.toml | 1 + src/main.rs | 92 +++++++++++++++++++++++++++++++++-------------------- 3 files changed, 59 insertions(+), 35 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ccc3812..e8183d9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3384,6 +3384,7 @@ dependencies = [ "cmd_lib", "hex 0.3.2", "sha256", + "solana-cli-config", "solana-client", "solana-sdk", "uuid", diff --git a/Cargo.toml b/Cargo.toml index 913c078..722039b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,7 @@ clap = { version = "4.1.4", features = ["derive"] } anyhow = "1.0.68" cmd_lib = "1.3.0" solana-client = "1.14.10" +solana-cli-config = "1.14.10" solana-sdk = "1.14.10" sha256 = "1.1.1" hex = "0.3.1" diff --git a/src/main.rs b/src/main.rs index 9da6d64..96836de 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ use std::{io::Read, path::PathBuf}; use anyhow::anyhow; use clap::{Parser, Subcommand}; use cmd_lib::{init_builtin_logger, run_cmd, run_fun}; +use solana_cli_config::{Config, CONFIG_FILE}; use solana_client::rpc_client::RpcClient; use solana_sdk::{ bpf_loader_upgradeable::{self, UpgradeableLoaderState}, @@ -10,6 +11,15 @@ use solana_sdk::{ }; use uuid::Uuid; +pub fn get_network(network_str: &str) -> &str { + match network_str { + "devnet" | "dev" | "d" => "https://api.devnet.solana.com", + "mainnet" | "main" | "m" | "mainnet-beta" => "https://api.mainnet-beta.solana.com", + "localnet" | "localhost" | "l" | "local" => "http://localhost:8899", + _ => network_str, + } +} + #[derive(Parser, Debug)] #[clap(author = "Ellipsis", version, about)] struct Arguments { @@ -38,9 +48,9 @@ enum SubCommand { /// Image that contains the source code to be verified #[clap(short, long)] image: String, - /// Connection URL to Solana network to verify the on-chain program. Default is mainnet-beta. - #[clap(short, long, default_value = "https://api.mainnet-beta.solana.com")] - url: String, + /// Connection URL to Solana network to verify the on-chain program. Defaults to user global config + #[clap(short, long)] + url: Option, /// The Program ID of the program to verify #[clap(short, long)] program_id: Pubkey, @@ -52,17 +62,17 @@ enum SubCommand { }, /// Get the hash of a program binary from the deployed on-chain program GetProgramHash { - /// Connection URL to Solana network to verify the on-chain program. Default is mainnet-beta. - #[clap(short, long, default_value = "https://api.mainnet-beta.solana.com")] - url: String, + /// Connection URL to Solana network to verify the on-chain program. Defaults to user global config + #[clap(short, long)] + url: Option, /// The Program ID of the program to verify program_id: Pubkey, }, /// Get the hash of a program binary from the deployed buffer address GetBufferHash { - /// Connection URL to Solana network to verify the on-chain program. Default is mainnet-beta. - #[clap(short, long, default_value = "https://api.mainnet-beta.solana.com")] - url: String, + /// Connection URL to Solana network to verify the on-chain program. Defaults to user global config + #[clap(short, long)] + url: Option, /// Address of the buffer account containing the deployed program data buffer_address: Pubkey, }, @@ -76,9 +86,9 @@ enum SubCommand { /// Optional commit hash to checkout #[clap(long)] commit_hash: Option, - /// Connection URL to Solana network to verify the on-chain program - #[clap(short, long, default_value = "https://api.mainnet-beta.solana.com")] - connection_url: String, + /// Connection URL to Solana network to verify the on-chain program. Defaults to user global config + #[clap(short, long)] + connection_url: Option, /// The Program ID of the program to verify #[clap(short, long)] program_id: Pubkey, @@ -194,6 +204,18 @@ fn main() -> anyhow::Result<()> { } } +pub fn get_client(url: Option) -> RpcClient { + let config = match CONFIG_FILE.as_ref() { + Some(config_file) => Config::load(config_file).unwrap_or_else(|_| { + println!("Failed to load config file: {}", config_file); + Config::default() + }), + None => Config::default(), + }; + let url = &get_network(&url.unwrap_or(config.json_rpc_url)).to_string(); + RpcClient::new(url) +} + fn get_binary_hash(program_data: Vec) -> String { let buffer = program_data .into_iter() @@ -214,6 +236,24 @@ pub fn get_file_hash(filepath: &str) -> Result { Ok(get_binary_hash(buffer)) } +pub fn get_buffer_hash(url: Option, buffer_address: Pubkey) -> anyhow::Result { + let client = get_client(url); + let offset = UpgradeableLoaderState::size_of_buffer_metadata(); + let account_data = client.get_account_data(&buffer_address)?[offset..].to_vec(); + let program_hash = get_binary_hash(account_data); + Ok(program_hash) +} + +pub fn get_program_hash(url: Option, program_id: Pubkey) -> anyhow::Result { + let client = get_client(url); + let program_buffer = + Pubkey::find_program_address(&[program_id.as_ref()], &bpf_loader_upgradeable::id()).0; + let offset = UpgradeableLoaderState::size_of_programdata_metadata(); + let account_data = client.get_account_data(&program_buffer)?[offset..].to_vec(); + let program_hash = get_binary_hash(account_data); + Ok(program_hash) +} + pub fn build( filepath: Option, base_image: Option, @@ -251,28 +291,10 @@ pub fn build( Ok(()) } -pub fn get_buffer_hash(url: String, buffer_address: Pubkey) -> anyhow::Result { - let client = RpcClient::new(url); - let offset = UpgradeableLoaderState::size_of_buffer_metadata(); - let account_data = client.get_account_data(&buffer_address)?[offset..].to_vec(); - let program_hash = get_binary_hash(account_data); - Ok(program_hash) -} - -pub fn get_program_hash(url: String, program_id: Pubkey) -> anyhow::Result { - let client = RpcClient::new(url); - let program_buffer = - Pubkey::find_program_address(&[program_id.as_ref()], &bpf_loader_upgradeable::id()).0; - let offset = UpgradeableLoaderState::size_of_programdata_metadata(); - let account_data = client.get_account_data(&program_buffer)?[offset..].to_vec(); - let program_hash = get_binary_hash(account_data); - Ok(program_hash) -} - pub fn verify_from_image( executable_path: String, image: String, - network: String, + network: Option, program_id: Pubkey, ) -> anyhow::Result<()> { println!( @@ -287,7 +309,7 @@ pub fn verify_from_image( run_cmd!(docker cp $container_id:/build/$executable_path /tmp/program.so)?; let executable_hash = get_file_hash("/tmp/program.so")?; - let client = RpcClient::new(network); + let client = get_client(network); let program_buffer = Pubkey::find_program_address(&[program_id.as_ref()], &bpf_loader_upgradeable::id()).0; let offset = UpgradeableLoaderState::size_of_programdata_metadata(); @@ -314,7 +336,7 @@ pub fn verify_from_repo( base_image: Option, bpf_flag: bool, name_of_program: String, - connection_url: String, + connection_url: Option, program_id: Pubkey, ) -> anyhow::Result<(String, String)> { // Build the code using the docker container @@ -335,8 +357,8 @@ pub fn verify_from_repo( // Get the hash of the deployed program println!( - "Fetching on-chain program data for program ID: {} on connection url: {}", - program_id, connection_url + "Fetching on-chain program data for program ID: {}", + program_id, ); let program_hash = get_program_hash(connection_url, program_id)?; From 1a9a7e5f4060c9700d250d32da976c9e01dfa11a Mon Sep 17 00:00:00 2001 From: James Li Date: Wed, 1 Feb 2023 17:41:23 -0500 Subject: [PATCH 021/314] change connection_url to url_solana to utilize -um throughout --- src/main.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index 96836de..b01f0c9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -88,7 +88,7 @@ enum SubCommand { commit_hash: Option, /// Connection URL to Solana network to verify the on-chain program. Defaults to user global config #[clap(short, long)] - connection_url: Option, + url_solana: Option, /// The Program ID of the program to verify #[clap(short, long)] program_id: Pubkey, @@ -144,7 +144,7 @@ fn main() -> anyhow::Result<()> { repo_url, commit_hash, program_id, - connection_url, + url_solana, base_image, name_of_program, bpf_flag, @@ -178,7 +178,7 @@ fn main() -> anyhow::Result<()> { base_image, bpf_flag, name_of_program, - connection_url, + url_solana, program_id, ); From aa4eac4c2b2b4e781d3b832a2b8938fa6df8130d Mon Sep 17 00:00:00 2001 From: James Li Date: Wed, 1 Feb 2023 18:23:36 -0500 Subject: [PATCH 022/314] remove option flag collision --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index b01f0c9..f0c2f85 100644 --- a/src/main.rs +++ b/src/main.rs @@ -37,7 +37,7 @@ enum SubCommand { #[clap(short, long)] base_image: Option, /// If the program requires cargo build-bpf (instead of cargo build-sbf), as for anchor program, set this flag - #[clap(short, long, default_value = "false")] + #[clap(long, default_value = "false")] bpf_flag: bool, }, /// Verifies a cached build from a docker image From b73324afab5a025080d6185d678c564b72bab9ca Mon Sep 17 00:00:00 2001 From: Akash Thota <118552471+Otter-0x4ka5h@users.noreply.github.com> Date: Mon, 13 Feb 2023 18:13:09 +0530 Subject: [PATCH 023/314] Update main.rs Signed-off-by: Akash Thota <118552471+Otter-0x4ka5h@users.noreply.github.com> --- src/main.rs | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index f0c2f85..2ae749a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,7 +32,10 @@ enum SubCommand { /// Deterministically build the program in an Docker container Build { /// Path to mount to the docker image - build_dir: Option, + mount_dir: Option, + /// Path to build the docker image + #[clap(short, long)] + program_build_dir: Option, /// Optionally specify a custom base docker image to use for building the program repository #[clap(short, long)] base_image: Option, @@ -108,11 +111,12 @@ fn main() -> anyhow::Result<()> { let args = Arguments::parse(); match args.subcommand { SubCommand::Build { - build_dir: filepath, + mount_dir: filepath, + program_build_dir, base_image, bpf_flag, } => { - build(filepath, base_image, bpf_flag)?; + build(filepath, program_build_dir, base_image, bpf_flag)?; Ok(()) } SubCommand::VerifyFromImage { @@ -256,6 +260,7 @@ pub fn get_program_hash(url: Option, program_id: Pubkey) -> anyhow::Resu pub fn build( filepath: Option, + buildpath: Option, base_image: Option, bpf_flag: bool, ) -> anyhow::Result<()> { @@ -274,6 +279,12 @@ pub fn build( "cargo build-sbf" }; + let cd_dir = if buildpath.is_none() { + format!("cd .") + } else { + format!("cd {}", buildpath.unwrap()) + }; + println!( "Cargo build command: {} -- --locked --frozen", cargo_command @@ -285,7 +296,7 @@ pub fn build( --rm -v $path:/build -dit $image - sh -c "$cargo_command -- --locked --frozen" + sh -c "$cd_dir && $cargo_command -- --locked --frozen" )?; run_cmd!(docker logs --follow $container_id)?; Ok(()) @@ -340,7 +351,7 @@ pub fn verify_from_repo( program_id: Pubkey, ) -> anyhow::Result<(String, String)> { // Build the code using the docker container - build(Some(base_repo_path.clone()), base_image, bpf_flag)?; + build(Some(base_repo_path.clone()), None, base_image, bpf_flag)?; let executable_filename = format!("{}.so", name_of_program); From fc5e5393e5e7bc54a5d5a1932273f0ed21b99008 Mon Sep 17 00:00:00 2001 From: ox4ka5h <0x4ka5h@osec.io> Date: Mon, 13 Feb 2023 13:03:55 +0000 Subject: [PATCH 024/314] feat: add program_build_dir to build command --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 2ae749a..483736d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -278,7 +278,7 @@ pub fn build( } else { "cargo build-sbf" }; - + // change directory to program/build dir let cd_dir = if buildpath.is_none() { format!("cd .") } else { From 0ce35552d36886952057f5f98f031e97d7f92ede Mon Sep 17 00:00:00 2001 From: ox4ka5h <0x4ka5h@osec.io> Date: Mon, 13 Feb 2023 13:13:34 +0000 Subject: [PATCH 025/314] feat: comment flags --- src/main.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main.rs b/src/main.rs index 483736d..9ff6292 100644 --- a/src/main.rs +++ b/src/main.rs @@ -111,7 +111,9 @@ fn main() -> anyhow::Result<()> { let args = Arguments::parse(); match args.subcommand { SubCommand::Build { + // mount directory mount_dir: filepath, + // program build directory program_build_dir, base_image, bpf_flag, From d3ddfd235b60811ff93c53392274a272b9187b02 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Thu, 23 Feb 2023 20:08:29 -0500 Subject: [PATCH 026/314] Add workdir to arguments --- Cargo.lock | 19 +++++++++++++++++++ Cargo.toml | 3 +++ src/main.rs | 23 ++++++++++++++++++++--- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e8183d9..02e22a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -438,6 +438,16 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cargo_toml" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497049e9477329f8f6a559972ee42e117487d01d1e8c2cc9f836ea6fa23a9e1a" +dependencies = [ + "serde", + "toml", +] + [[package]] name = "cc" version = "1.0.78" @@ -2049,6 +2059,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + [[package]] name = "pbkdf2" version = "0.4.0" @@ -3380,9 +3396,12 @@ name = "solana-verify" version = "0.1.0" dependencies = [ "anyhow", + "cargo_toml", "clap 4.1.4", "cmd_lib", "hex 0.3.2", + "pathdiff", + "serde_json", "sha256", "solana-cli-config", "solana-client", diff --git a/Cargo.toml b/Cargo.toml index 722039b..4095d37 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,9 @@ solana-cli-config = "1.14.10" solana-sdk = "1.14.10" sha256 = "1.1.1" hex = "0.3.1" +serde_json = "1.0" +cargo_toml = "0.13.0" +pathdiff = "0.2.0" [dependencies.uuid] version = "1.2.2" diff --git a/src/main.rs b/src/main.rs index 9ff6292..e540a06 100644 --- a/src/main.rs +++ b/src/main.rs @@ -42,6 +42,9 @@ enum SubCommand { /// If the program requires cargo build-bpf (instead of cargo build-sbf), as for anchor program, set this flag #[clap(long, default_value = "false")] bpf_flag: bool, + /// Docker workdir + #[clap(long, default_value = "build")] + workdir: String, }, /// Verifies a cached build from a docker image VerifyFromImage { @@ -104,6 +107,9 @@ enum SubCommand { /// If the program requires cargo build-bpf (instead of cargo build-sbf), as for anchor program, set this flag #[clap(long, default_value = "false")] bpf_flag: bool, + /// Docker workdir + #[clap(long, default_value = "build")] + workdir: String, }, } @@ -117,8 +123,9 @@ fn main() -> anyhow::Result<()> { program_build_dir, base_image, bpf_flag, + workdir, } => { - build(filepath, program_build_dir, base_image, bpf_flag)?; + build(filepath, program_build_dir, base_image, bpf_flag, workdir)?; Ok(()) } SubCommand::VerifyFromImage { @@ -154,6 +161,7 @@ fn main() -> anyhow::Result<()> { base_image, name_of_program, bpf_flag, + workdir, } => { // Get source code from repo_url let base_name = run_fun!(basename $repo_url)?; @@ -186,6 +194,7 @@ fn main() -> anyhow::Result<()> { name_of_program, url_solana, program_id, + workdir, ); // Cleanup no matter the result @@ -265,6 +274,7 @@ pub fn build( buildpath: Option, base_image: Option, bpf_flag: bool, + workdir: String, ) -> anyhow::Result<()> { let path = filepath.unwrap_or( std::env::current_dir()? @@ -296,7 +306,7 @@ pub fn build( let container_id = run_fun!( docker run --rm - -v $path:/build + -v $path:/$workdir -dit $image sh -c "$cd_dir && $cargo_command -- --locked --frozen" )?; @@ -351,9 +361,16 @@ pub fn verify_from_repo( name_of_program: String, connection_url: Option, program_id: Pubkey, + workdir: String, ) -> anyhow::Result<(String, String)> { // Build the code using the docker container - build(Some(base_repo_path.clone()), None, base_image, bpf_flag)?; + build( + Some(base_repo_path.clone()), + None, + base_image, + bpf_flag, + workdir, + )?; let executable_filename = format!("{}.so", name_of_program); From e7f489566a31d223a50f6cb0d3ff392b26d000c3 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Wed, 29 Mar 2023 14:18:25 -0400 Subject: [PATCH 027/314] Add base Dockerfile --- Dockerfile | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..97099db --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM solanalabs/rust:1.68.0 + +RUN apt-get update && apt-get install -qy clang libudev-dev tmux vim git netcat zsh +RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended + +WORKDIR /build + +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.14/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +CMD /bin/zsh From adacc8003259ac9eac99f5614b1f02f572abdab2 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Wed, 21 Jun 2023 16:06:57 -0400 Subject: [PATCH 028/314] Updated code to mostly use std::process::Command --- src/main.rs | 134 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 93 insertions(+), 41 deletions(-) diff --git a/src/main.rs b/src/main.rs index 9ff6292..6808ed8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,8 @@ -use std::{io::Read, path::PathBuf}; +use std::{io::Read, path::PathBuf, process::Stdio}; use anyhow::anyhow; use clap::{Parser, Subcommand}; -use cmd_lib::{init_builtin_logger, run_cmd, run_fun}; +use cmd_lib::run_fun; use solana_cli_config::{Config, CONFIG_FILE}; use solana_client::rpc_client::RpcClient; use solana_sdk::{ @@ -25,6 +25,9 @@ pub fn get_network(network_str: &str) -> &str { struct Arguments { #[clap(subcommand)] subcommand: SubCommand, + /// Optionally include your RPC endpoint. Use "local", "dev", "main" for default endpoints. Defaults to your Solana CLI config file. + #[clap(global = true, short, long)] + url: Option, } #[derive(Subcommand, Debug)] @@ -51,9 +54,6 @@ enum SubCommand { /// Image that contains the source code to be verified #[clap(short, long)] image: String, - /// Connection URL to Solana network to verify the on-chain program. Defaults to user global config - #[clap(short, long)] - url: Option, /// The Program ID of the program to verify #[clap(short, long)] program_id: Pubkey, @@ -65,17 +65,11 @@ enum SubCommand { }, /// Get the hash of a program binary from the deployed on-chain program GetProgramHash { - /// Connection URL to Solana network to verify the on-chain program. Defaults to user global config - #[clap(short, long)] - url: Option, /// The Program ID of the program to verify program_id: Pubkey, }, /// Get the hash of a program binary from the deployed buffer address GetBufferHash { - /// Connection URL to Solana network to verify the on-chain program. Defaults to user global config - #[clap(short, long)] - url: Option, /// Address of the buffer account containing the deployed program data buffer_address: Pubkey, }, @@ -89,9 +83,6 @@ enum SubCommand { /// Optional commit hash to checkout #[clap(long)] commit_hash: Option, - /// Connection URL to Solana network to verify the on-chain program. Defaults to user global config - #[clap(short, long)] - url_solana: Option, /// The Program ID of the program to verify #[clap(short, long)] program_id: Pubkey, @@ -124,24 +115,20 @@ fn main() -> anyhow::Result<()> { SubCommand::VerifyFromImage { executable_path_in_image: executable_path, image, - url: network, program_id, - } => verify_from_image(executable_path, image, network, program_id), + } => verify_from_image(executable_path, image, args.url, program_id), SubCommand::GetExecutableHash { filepath } => { let program_hash = get_file_hash(&filepath)?; println!("{}", program_hash); Ok(()) } - SubCommand::GetBufferHash { - url, - buffer_address, - } => { - let buffer_hash = get_buffer_hash(url, buffer_address)?; + SubCommand::GetBufferHash { buffer_address } => { + let buffer_hash = get_buffer_hash(args.url, buffer_address)?; println!("{}", buffer_hash); Ok(()) } - SubCommand::GetProgramHash { url, program_id } => { - let program_hash = get_program_hash(url, program_id)?; + SubCommand::GetProgramHash { program_id } => { + let program_hash = get_program_hash(args.url, program_id)?; println!("{}", program_hash); Ok(()) } @@ -150,27 +137,44 @@ fn main() -> anyhow::Result<()> { repo_url, commit_hash, program_id, - url_solana, base_image, name_of_program, bpf_flag, } => { // Get source code from repo_url - let base_name = run_fun!(basename $repo_url)?; + let base_name = std::process::Command::new("basename") + .arg(&repo_url) + .output() + .map_err(|e| anyhow!("Failed to get basename of repo_url: {:?}", e)) + .and_then(|output| parse_output(output.stdout))?; + let uuid = Uuid::new_v4().to_string(); // Create a temporary directory to clone the repo into - let tmp_file_path = format!("/tmp/solana-verify/{}/{}", uuid, base_name); - run_fun!(git clone $repo_url $tmp_file_path)?; + let tmp_dir = format!("/tmp/solana-verify/{}", uuid); + let tmp_file_path = format!("{}/{}", tmp_dir, base_name); + + std::process::Command::new("git") + .args(["clone", &repo_url, &tmp_file_path]) + .output()?; // Checkout a specific commit hash, if provided if let Some(commit_hash) = commit_hash { println!("tmp_file_path: {:?}", tmp_file_path); - let result = run_fun!(cd $tmp_file_path; git checkout $commit_hash); + let result = std::process::Command::new("cd") + .arg(&tmp_file_path) + .output() + .and_then(|_| { + std::process::Command::new("git") + .args(["checkout", &commit_hash]) + .output() + }); if result.is_ok() { println!("Checked out commit hash: {}", commit_hash); } else { - run_fun!(rm -rf /tmp/solana-verify/$uuid)?; + std::process::Command::new("rm") + .args(["-rf", format!("/tmp/solana-verify/{}", uuid).as_str()]) + .output()?; Err(anyhow!("Failed to checkout commit hash: {:?}", result))?; } } @@ -184,12 +188,14 @@ fn main() -> anyhow::Result<()> { base_image, bpf_flag, name_of_program, - url_solana, + args.url, program_id, ); // Cleanup no matter the result - run_fun!(rm -rf /tmp/solana-verify/$uuid)?; + std::process::Command::new("rm") + .args(["-rf", &tmp_dir]) + .output()?; // Compare hashes or return error if let Ok((build_hash, program_hash)) = result { @@ -275,11 +281,13 @@ pub fn build( ); println!("Mounting path: {}", path); let image = base_image.unwrap_or_else(|| "ellipsislabs/solana:latest".to_string()); + let cargo_command = if bpf_flag { "cargo build-bpf" } else { "cargo build-sbf" }; + // change directory to program/build dir let cd_dir = if buildpath.is_none() { format!("cd .") @@ -292,7 +300,6 @@ pub fn build( cargo_command ); - init_builtin_logger(); let container_id = run_fun!( docker run --rm @@ -300,7 +307,13 @@ pub fn build( -dit $image sh -c "$cd_dir && $cargo_command -- --locked --frozen" )?; - run_cmd!(docker logs --follow $container_id)?; + + std::process::Command::new("docker") + .args(["logs", "--follow", &container_id]) + .stderr(Stdio::inherit()) + .stdout(Stdio::inherit()) + .output()?; + Ok(()) } @@ -316,10 +329,23 @@ pub fn verify_from_image( ); println!("Executable path in container: {:?}", executable_path); println!(" "); - let container_id = run_fun!( - docker run --rm -dit $image - )?; - run_cmd!(docker cp $container_id:/build/$executable_path /tmp/program.so)?; + + let container_id = std::process::Command::new("docker") + .args(["run", "--rm", "-dit", image.as_str()]) + .output() + .map_err(|e| anyhow::format_err!("Failed to run image {}", e.to_string())) + .and_then(|output| parse_output(output.stdout))?; + + std::process::Command::new("docker") + .args([ + "cp", + format!("{}:/build/{}", container_id, executable_path).as_str(), + "/tmp/program.so", + ]) + .stdout(Stdio::inherit()) + .stderr(Stdio::inherit()) + .output() + .map_err(|e| anyhow::format_err!("Failed to copy executable file {}", e.to_string()))?; let executable_hash = get_file_hash("/tmp/program.so")?; let client = get_client(network); @@ -332,8 +358,19 @@ pub fn verify_from_image( println!("Program hash: {}", program_hash); // Cleanup docker and rm file - run_fun!(docker kill $container_id)?; - run_fun!(rm "/tmp/program.so")?; + std::process::Command::new("docker") + .args(["kill", container_id.as_str()]) + .stderr(Stdio::inherit()) + .output() + .map_err(|e| anyhow::format_err!("Docker build failed: {}", e.to_string()))?; + + std::process::Command::new("rm") + .args(["/tmp/program.so"]) + .stderr(Stdio::inherit()) + .output() + .map_err(|e| { + anyhow::format_err!("Failed to remove temp program file: {}", e.to_string()) + })?; if program_hash != executable_hash { println!("Executable hash mismatch"); @@ -362,8 +399,15 @@ pub fn verify_from_repo( "Looking for executable name {} at path: {}/target/deploy", executable_filename, base_repo_path ); - let executable_path = - run_fun!(find $base_repo_path/target/deploy -name "$executable_filename")?; + let executable_path = std::process::Command::new("find") + .args([ + &format!("{}/target/deploy", base_repo_path), + "-name", + executable_filename.as_str(), + ]) + .output() + .map_err(|e| anyhow::format_err!("Failed to find executable file {}", e.to_string())) + .and_then(|output| parse_output(output.stdout))?; println!("Executable file found at path: {:?}", executable_path); let build_hash = get_file_hash(&executable_path)?; println!("Build hash: {}", build_hash); @@ -377,3 +421,11 @@ pub fn verify_from_repo( Ok((build_hash, program_hash)) } + +pub fn parse_output(output: Vec) -> anyhow::Result { + let parsed_output = String::from_utf8(output)? + .strip_suffix("\n") + .unwrap() + .to_string(); + Ok(parsed_output) +} From 3f10e43b78352d3834963531c544346f1b069a7a Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Wed, 21 Jun 2023 16:09:05 -0400 Subject: [PATCH 029/314] bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e8183d9..47d564f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3377,7 +3377,7 @@ dependencies = [ [[package]] name = "solana-verify" -version = "0.1.0" +version = "0.2.0" dependencies = [ "anyhow", "clap 4.1.4", diff --git a/Cargo.toml b/Cargo.toml index 722039b..b3ae27b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "solana-verify" -version = "0.1.0" +version = "0.2.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From 5f68973f1d23395a53de627e29dd04260d381e8e Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Wed, 21 Jun 2023 17:23:22 -0400 Subject: [PATCH 030/314] fix mc --- src/main.rs | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index 0a4ae80..40dbf36 100644 --- a/src/main.rs +++ b/src/main.rs @@ -48,6 +48,9 @@ enum SubCommand { /// Docker workdir #[clap(long, default_value = "build")] workdir: String, + /// If the program requires cargo build-bpf (instead of cargo build-sbf), as for anchor program, set this flag + #[clap(long)] + program_name: Option, }, /// Verifies a cached build from a docker image VerifyFromImage { @@ -115,8 +118,16 @@ fn main() -> anyhow::Result<()> { base_image, bpf_flag, workdir, + program_name, } => { - build(filepath, program_build_dir, base_image, bpf_flag, workdir)?; + build( + filepath, + program_build_dir, + base_image, + bpf_flag, + workdir, + program_name, + )?; Ok(()) } SubCommand::VerifyFromImage { @@ -281,6 +292,7 @@ pub fn build( base_image: Option, bpf_flag: bool, workdir: String, + program_name: Option, ) -> anyhow::Result<()> { let path = filepath.unwrap_or( std::env::current_dir()? @@ -300,7 +312,7 @@ pub fn build( // change directory to program/build dir let cd_dir = if buildpath.is_none() { - format!("cd .") + format!("cd {}", path) } else { format!("cd {}", buildpath.unwrap()) }; @@ -310,7 +322,7 @@ pub fn build( cargo_command ); - let container_id = run_fun!( + let container_id: String = run_fun!( docker run --rm -v $path:/$workdir @@ -320,10 +332,22 @@ pub fn build( std::process::Command::new("docker") .args(["logs", "--follow", &container_id]) - .stderr(Stdio::inherit()) .stdout(Stdio::inherit()) .output()?; + if let Some(program_name) = program_name { + let executable_path = std::process::Command::new("find") + .args([ + &format!("{}/target/deploy", path), + "-name", + &format!("{}.so", program_name), + ]) + .output() + .map_err(|e| anyhow!("Failed to find program: {}", e.to_string())) + .and_then(|output| parse_output(output.stdout))?; + let executable_hash = get_file_hash(&executable_path)?; + println!("Executable hash: {}", executable_hash); + } Ok(()) } @@ -407,6 +431,7 @@ pub fn verify_from_repo( base_image, bpf_flag, workdir, + None, )?; let executable_filename = format!("{}.so", name_of_program); @@ -442,7 +467,7 @@ pub fn verify_from_repo( pub fn parse_output(output: Vec) -> anyhow::Result { let parsed_output = String::from_utf8(output)? .strip_suffix("\n") - .unwrap() + .ok_or_else(|| anyhow!("Failed to parse output"))? .to_string(); Ok(parsed_output) } From 6cdabbaef02caf224dee6ead4a21ff5f28adea68 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Wed, 21 Jun 2023 19:20:56 -0400 Subject: [PATCH 031/314] Add signal handling --- Cargo.lock | 58 +++++----------------- Cargo.toml | 2 +- src/main.rs | 140 +++++++++++++++++++++++++++++++++------------------- 3 files changed, 102 insertions(+), 98 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0ac8b15..4785bfd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -575,31 +575,6 @@ dependencies = [ "os_str_bytes", ] -[[package]] -name = "cmd_lib" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ba0f413777386d37f85afa5242f277a7b461905254c1af3c339d4af06800f62" -dependencies = [ - "cmd_lib_macros", - "faccess", - "lazy_static", - "log", - "os_pipe", -] - -[[package]] -name = "cmd_lib_macros" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e66605092ff6c6e37e0246601ae6c3f62dc1880e0599359b5f303497c112dc0" -dependencies = [ - "proc-macro-error", - "proc-macro2 1.0.50", - "quote 1.0.23", - "syn 1.0.107", -] - [[package]] name = "codespan-reporting" version = "0.11.1" @@ -1081,17 +1056,6 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" -[[package]] -name = "faccess" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ae66425802d6a903e268ae1a08b8c38ba143520f227a205edf4e9c7e3e26d5" -dependencies = [ - "bitflags", - "libc", - "winapi", -] - [[package]] name = "fastrand" version = "1.8.0" @@ -2020,16 +1984,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" -[[package]] -name = "os_pipe" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb233f06c2307e1f5ce2ecad9f8121cffbbee2c95428f44ea85222e460d0d213" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "os_str_bytes" version = "6.4.1" @@ -2812,6 +2766,16 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" +[[package]] +name = "signal-hook" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "732768f1176d21d09e076c23a93123d40bba92d50c4058da34d45c8de8e682b9" +dependencies = [ + "libc", + "signal-hook-registry", +] + [[package]] name = "signal-hook-registry" version = "1.4.0" @@ -3398,11 +3362,11 @@ dependencies = [ "anyhow", "cargo_toml", "clap 4.1.4", - "cmd_lib", "hex 0.3.2", "pathdiff", "serde_json", "sha256", + "signal-hook", "solana-cli-config", "solana-client", "solana-sdk", diff --git a/Cargo.toml b/Cargo.toml index daea7e4..ac88815 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,6 @@ edition = "2021" [dependencies] clap = { version = "4.1.4", features = ["derive"] } anyhow = "1.0.68" -cmd_lib = "1.3.0" solana-client = "1.14.10" solana-cli-config = "1.14.10" solana-sdk = "1.14.10" @@ -17,6 +16,7 @@ hex = "0.3.1" serde_json = "1.0" cargo_toml = "0.13.0" pathdiff = "0.2.0" +signal-hook = "0.3.15" [dependencies.uuid] version = "1.2.2" diff --git a/src/main.rs b/src/main.rs index 40dbf36..9afd3ca 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,14 +1,17 @@ -use std::{io::Read, path::PathBuf, process::Stdio}; - use anyhow::anyhow; use clap::{Parser, Subcommand}; -use cmd_lib::run_fun; +use signal_hook::{ + consts::{SIGINT, SIGTERM}, + iterator::Signals, +}; use solana_cli_config::{Config, CONFIG_FILE}; use solana_client::rpc_client::RpcClient; use solana_sdk::{ bpf_loader_upgradeable::{self, UpgradeableLoaderState}, pubkey::Pubkey, }; +use std::sync::{Arc, Mutex}; +use std::{io::Read, path::PathBuf, process::Stdio}; use uuid::Uuid; pub fn get_network(network_str: &str) -> &str { @@ -36,9 +39,9 @@ enum SubCommand { Build { /// Path to mount to the docker image mount_dir: Option, - /// Path to build the docker image - #[clap(short, long)] - program_build_dir: Option, + /// Which binary file to build (applies to repositories with multiple programs) + #[clap(long)] + package_name: Option, /// Optionally specify a custom base docker image to use for building the program repository #[clap(short, long)] base_image: Option, @@ -48,9 +51,9 @@ enum SubCommand { /// Docker workdir #[clap(long, default_value = "build")] workdir: String, - /// If the program requires cargo build-bpf (instead of cargo build-sbf), as for anchor program, set this flag - #[clap(long)] - program_name: Option, + /// Arguments to pass to the underlying `cargo build-bpf` command + #[clap(required = false, last = true)] + cargo_args: Vec, }, /// Verifies a cached build from a docker image VerifyFromImage { @@ -97,36 +100,60 @@ enum SubCommand { base_image: Option, /// If the repo_url points to a repo that contains multiple programs, specify the name of the program to build and verify #[clap(short, long, default_value = "*")] - name_of_program: String, + package_name: String, /// If the program requires cargo build-bpf (instead of cargo build-sbf), as for anchor program, set this flag #[clap(long, default_value = "false")] bpf_flag: bool, /// Docker workdir #[clap(long, default_value = "build")] workdir: String, + /// Arguments to pass to the underlying `cargo build-bpf` command + #[clap(required = false, last = true)] + cargo_args: Vec, }, } fn main() -> anyhow::Result<()> { + // Handle SIGTERM and SIGINT gracefully by stopping the docker container + let mut signals = Signals::new(&[SIGTERM, SIGINT])?; + let container_id: Arc>> = Arc::new(Mutex::new(None)); + + let container_id_for_thread = container_id.clone(); + std::thread::spawn(move || { + for _ in signals.forever() { + let container_id = container_id_for_thread.lock().unwrap(); + if let Some(container_id) = container_id.clone().take() { + println!("Stopping container {}", container_id); + std::process::Command::new("docker") + .args(&["kill", &container_id]) + .output() + .expect("Failed to close docker container"); + println!("Stopped container {}", container_id) + } + break; + } + }); + let args = Arguments::parse(); match args.subcommand { SubCommand::Build { // mount directory - mount_dir: filepath, + mount_dir, // program build directory - program_build_dir, + package_name, base_image, bpf_flag, workdir, - program_name, + cargo_args, } => { build( - filepath, - program_build_dir, + mount_dir, + package_name, base_image, bpf_flag, workdir, - program_name, + cargo_args, + container_id, )?; Ok(()) } @@ -134,7 +161,7 @@ fn main() -> anyhow::Result<()> { executable_path_in_image: executable_path, image, program_id, - } => verify_from_image(executable_path, image, args.url, program_id), + } => verify_from_image(executable_path, image, args.url, program_id, container_id), SubCommand::GetExecutableHash { filepath } => { let program_hash = get_file_hash(&filepath)?; println!("{}", program_hash); @@ -156,9 +183,10 @@ fn main() -> anyhow::Result<()> { commit_hash, program_id, base_image, - name_of_program, + package_name, bpf_flag, workdir, + cargo_args, } => { // Get source code from repo_url let base_name = std::process::Command::new("basename") @@ -206,10 +234,12 @@ fn main() -> anyhow::Result<()> { build_path.to_str().unwrap().to_string(), base_image, bpf_flag, - name_of_program, + package_name, args.url, program_id, workdir, + cargo_args, + container_id, ); // Cleanup no matter the result @@ -287,14 +317,15 @@ pub fn get_program_hash(url: Option, program_id: Pubkey) -> anyhow::Resu } pub fn build( - filepath: Option, - buildpath: Option, + mount_path: Option, + package_name: Option, base_image: Option, bpf_flag: bool, workdir: String, - program_name: Option, + cargo_args: Vec, + container_id_arc: Arc>>, ) -> anyhow::Result<()> { - let path = filepath.unwrap_or( + let path = mount_path.unwrap_or( std::env::current_dir()? .as_os_str() .to_str() @@ -304,38 +335,38 @@ pub fn build( println!("Mounting path: {}", path); let image = base_image.unwrap_or_else(|| "ellipsislabs/solana:latest".to_string()); - let cargo_command = if bpf_flag { - "cargo build-bpf" - } else { - "cargo build-sbf" - }; + let build_command = if bpf_flag { "build-bpf" } else { "build-sbf" }; - // change directory to program/build dir - let cd_dir = if buildpath.is_none() { - format!("cd {}", path) - } else { - format!("cd {}", buildpath.unwrap()) - }; + let package_filter = package_name + .clone() + .map(|pkg| vec!["-p".to_string(), pkg]) + .unwrap_or_else(|| vec![]); - println!( - "Cargo build command: {} -- --locked --frozen", - cargo_command - ); + // change directory to program/build dir + let mount_params = format!("{}:/{}", path, workdir); + let container_id = std::process::Command::new("docker") + .args(["run", "--rm", "-v", &mount_params, "-dit", &image]) + .args(["cargo", build_command, "--", "--locked", "--frozen"]) + .args(package_filter) + .args(cargo_args) + .stderr(Stdio::inherit()) + .output() + .map_err(|e| anyhow::format_err!("Docker build failed: {}", e.to_string())) + .and_then(|output| parse_output(output.stdout))?; - let container_id: String = run_fun!( - docker run - --rm - -v $path:/$workdir - -dit $image - sh -c "$cd_dir && $cargo_command -- --locked --frozen" - )?; + // Set the container id so we can kill it later if the process is interrupted + container_id_arc + .lock() + .unwrap() + .replace(container_id.clone()); std::process::Command::new("docker") .args(["logs", "--follow", &container_id]) + .stderr(Stdio::inherit()) .stdout(Stdio::inherit()) .output()?; - if let Some(program_name) = program_name { + if let Some(program_name) = package_name { let executable_path = std::process::Command::new("find") .args([ &format!("{}/target/deploy", path), @@ -356,6 +387,7 @@ pub fn verify_from_image( image: String, network: Option, program_id: Pubkey, + container_id_arc: Arc>>, ) -> anyhow::Result<()> { println!( "Verifying image: {:?}, on network {:?} against program ID {}", @@ -370,6 +402,11 @@ pub fn verify_from_image( .map_err(|e| anyhow::format_err!("Failed to run image {}", e.to_string())) .and_then(|output| parse_output(output.stdout))?; + container_id_arc + .lock() + .unwrap() + .replace(container_id.clone()); + std::process::Command::new("docker") .args([ "cp", @@ -419,22 +456,25 @@ pub fn verify_from_repo( base_repo_path: String, base_image: Option, bpf_flag: bool, - name_of_program: String, + package_name: String, connection_url: Option, program_id: Pubkey, workdir: String, + cargo_args: Vec, + container_id_arc: Arc>>, ) -> anyhow::Result<(String, String)> { // Build the code using the docker container build( Some(base_repo_path.clone()), - None, + Some(package_name.clone()), base_image, bpf_flag, workdir, - None, + cargo_args, + container_id_arc, )?; - let executable_filename = format!("{}.so", name_of_program); + let executable_filename = format!("{}.so", package_name); // Get the hash of the build println!( From c58a942e3016c449af94875865892eee1a5bc113 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Wed, 21 Jun 2023 20:32:10 -0400 Subject: [PATCH 032/314] single threaded signal handler --- src/main.rs | 157 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 111 insertions(+), 46 deletions(-) diff --git a/src/main.rs b/src/main.rs index 9afd3ca..61482b0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,7 +10,6 @@ use solana_sdk::{ bpf_loader_upgradeable::{self, UpgradeableLoaderState}, pubkey::Pubkey, }; -use std::sync::{Arc, Mutex}; use std::{io::Read, path::PathBuf, process::Stdio}; use uuid::Uuid; @@ -85,7 +84,7 @@ enum SubCommand { /// Builds and verifies a program from a given repository URL and a program ID VerifyFromRepo { /// Path to the executable solana program within the source code repository if the program is not part of the top-level Cargo.toml - #[clap(short, long, default_value = ".")] + #[clap(short, long, default_value = "")] solana_program_path: String, /// The HTTPS URL of the repo to clone repo_url: String, @@ -93,13 +92,13 @@ enum SubCommand { #[clap(long)] commit_hash: Option, /// The Program ID of the program to verify - #[clap(short, long)] + #[clap(long)] program_id: Pubkey, /// Optionally specify a custom base docker image to use for building the program repository #[clap(short, long)] base_image: Option, /// If the repo_url points to a repo that contains multiple programs, specify the name of the program to build and verify - #[clap(short, long, default_value = "*")] + #[clap(long, default_value = "*")] package_name: String, /// If the program requires cargo build-bpf (instead of cargo build-sbf), as for anchor program, set this flag #[clap(long, default_value = "false")] @@ -107,6 +106,9 @@ enum SubCommand { /// Docker workdir #[clap(long, default_value = "build")] workdir: String, + /// Verify in current directory + #[clap(long, default_value = "false")] + current_dir: bool, /// Arguments to pass to the underlying `cargo build-bpf` command #[clap(required = false, last = true)] cargo_args: Vec, @@ -116,26 +118,44 @@ enum SubCommand { fn main() -> anyhow::Result<()> { // Handle SIGTERM and SIGINT gracefully by stopping the docker container let mut signals = Signals::new(&[SIGTERM, SIGINT])?; - let container_id: Arc>> = Arc::new(Mutex::new(None)); - - let container_id_for_thread = container_id.clone(); - std::thread::spawn(move || { - for _ in signals.forever() { - let container_id = container_id_for_thread.lock().unwrap(); - if let Some(container_id) = container_id.clone().take() { - println!("Stopping container {}", container_id); - std::process::Command::new("docker") - .args(&["kill", &container_id]) - .output() - .expect("Failed to close docker container"); - println!("Stopped container {}", container_id) - } - break; - } - }); + let mut container_id: Option = None; + let mut temp_dir: Option = None; + + // std::thread::spawn(move || { + // for _ in signals.forever() { + // let container_id = container_id_for_thread.lock().unwrap(); + // if let Some(container_id) = container_id.clone().take() { + // println!("Stopping container {}", container_id); + // if std::process::Command::new("docker") + // .args(&["kill", &container_id]) + // .output() + // .is_err() + // { + // println!("Failed to close docker container"); + // } else { + // println!("Stopped container {}", container_id) + // } + // } + // let temp_dir = temp_dir_for_thread.lock().unwrap(); + // println!("temp_dir: {:?}", temp_dir); + // if let Some(temp_dir) = temp_dir.clone().take() { + // println!("Removing temp dir {}", temp_dir); + // if std::process::Command::new("rm") + // .args(&["-rf", &temp_dir]) + // .output() + // .is_err() + // { + // println!("Failed to remove temp dir"); + // } else { + // println!("Removed temp dir {}", temp_dir); + // } + // } + // break; + // } + // }); let args = Arguments::parse(); - match args.subcommand { + let res = match args.subcommand { SubCommand::Build { // mount directory mount_dir, @@ -153,7 +173,7 @@ fn main() -> anyhow::Result<()> { bpf_flag, workdir, cargo_args, - container_id, + &mut container_id, )?; Ok(()) } @@ -161,7 +181,13 @@ fn main() -> anyhow::Result<()> { executable_path_in_image: executable_path, image, program_id, - } => verify_from_image(executable_path, image, args.url, program_id, container_id), + } => verify_from_image( + executable_path, + image, + args.url, + program_id, + &mut container_id, + ), SubCommand::GetExecutableHash { filepath } => { let program_hash = get_file_hash(&filepath)?; println!("{}", program_hash); @@ -187,6 +213,7 @@ fn main() -> anyhow::Result<()> { bpf_flag, workdir, cargo_args, + current_dir, } => { // Get source code from repo_url let base_name = std::process::Command::new("basename") @@ -198,18 +225,32 @@ fn main() -> anyhow::Result<()> { let uuid = Uuid::new_v4().to_string(); // Create a temporary directory to clone the repo into - let tmp_dir = format!("/tmp/solana-verify/{}", uuid); - let tmp_file_path = format!("{}/{}", tmp_dir, base_name); + let verify_dir = if current_dir { + format!( + "{}/{}", + std::env::current_dir()? + .as_os_str() + .to_str() + .ok_or_else(|| anyhow::Error::msg("Invalid path string"))? + .to_string(), + uuid.clone() + ) + } else { + format!("/tmp/solana-verify/{}", uuid) + }; + + temp_dir.replace(verify_dir.clone()); + + let verify_tmp_file_path = format!("{}/{}", verify_dir, base_name); std::process::Command::new("git") - .args(["clone", &repo_url, &tmp_file_path]) + .args(["clone", &repo_url, &verify_tmp_file_path]) .output()?; // Checkout a specific commit hash, if provided if let Some(commit_hash) = commit_hash { - println!("tmp_file_path: {:?}", tmp_file_path); let result = std::process::Command::new("cd") - .arg(&tmp_file_path) + .arg(&verify_tmp_file_path) .output() .and_then(|_| { std::process::Command::new("git") @@ -220,14 +261,14 @@ fn main() -> anyhow::Result<()> { println!("Checked out commit hash: {}", commit_hash); } else { std::process::Command::new("rm") - .args(["-rf", format!("/tmp/solana-verify/{}", uuid).as_str()]) + .args(["-rf", verify_dir.as_str()]) .output()?; Err(anyhow!("Failed to checkout commit hash: {:?}", result))?; } } // Get the absolute build path to the solana program directory to build inside docker - let build_path = PathBuf::from(tmp_file_path.clone()).join(solana_program_path); + let build_path = PathBuf::from(verify_tmp_file_path.clone()).join(solana_program_path); println!("Build path: {:?}", build_path); let result = verify_from_repo( @@ -239,12 +280,12 @@ fn main() -> anyhow::Result<()> { program_id, workdir, cargo_args, - container_id, + &mut container_id, ); // Cleanup no matter the result std::process::Command::new("rm") - .args(["-rf", &tmp_dir]) + .args(["-rf", &verify_dir]) .output()?; // Compare hashes or return error @@ -263,7 +304,37 @@ fn main() -> anyhow::Result<()> { Err(anyhow!("Error verifying program. {:?}", result)) } } + }; + + for _ in &mut signals { + if let Some(container_id) = container_id.clone().take() { + println!("Stopping container {}", container_id); + if std::process::Command::new("docker") + .args(&["kill", &container_id]) + .output() + .is_err() + { + println!("Failed to close docker container"); + } else { + println!("Stopped container {}", container_id) + } + } + println!("temp_dir: {:?}", temp_dir); + if let Some(temp_dir) = temp_dir.clone().take() { + println!("Removing temp dir {}", temp_dir); + if std::process::Command::new("rm") + .args(&["-rf", &temp_dir]) + .output() + .is_err() + { + println!("Failed to remove temp dir"); + } else { + println!("Removed temp dir {}", temp_dir); + } + } + break; } + res } pub fn get_client(url: Option) -> RpcClient { @@ -323,7 +394,7 @@ pub fn build( bpf_flag: bool, workdir: String, cargo_args: Vec, - container_id_arc: Arc>>, + container_id_opt: &mut Option, ) -> anyhow::Result<()> { let path = mount_path.unwrap_or( std::env::current_dir()? @@ -355,10 +426,7 @@ pub fn build( .and_then(|output| parse_output(output.stdout))?; // Set the container id so we can kill it later if the process is interrupted - container_id_arc - .lock() - .unwrap() - .replace(container_id.clone()); + container_id_opt.replace(container_id.clone()); std::process::Command::new("docker") .args(["logs", "--follow", &container_id]) @@ -387,7 +455,7 @@ pub fn verify_from_image( image: String, network: Option, program_id: Pubkey, - container_id_arc: Arc>>, + container_id_opt: &mut Option, ) -> anyhow::Result<()> { println!( "Verifying image: {:?}, on network {:?} against program ID {}", @@ -402,10 +470,7 @@ pub fn verify_from_image( .map_err(|e| anyhow::format_err!("Failed to run image {}", e.to_string())) .and_then(|output| parse_output(output.stdout))?; - container_id_arc - .lock() - .unwrap() - .replace(container_id.clone()); + container_id_opt.replace(container_id.clone()); std::process::Command::new("docker") .args([ @@ -418,7 +483,7 @@ pub fn verify_from_image( .output() .map_err(|e| anyhow::format_err!("Failed to copy executable file {}", e.to_string()))?; - let executable_hash = get_file_hash("/tmp/program.so")?; + let executable_hash: String = get_file_hash("/tmp/program.so")?; let client = get_client(network); let program_buffer = Pubkey::find_program_address(&[program_id.as_ref()], &bpf_loader_upgradeable::id()).0; @@ -461,7 +526,7 @@ pub fn verify_from_repo( program_id: Pubkey, workdir: String, cargo_args: Vec, - container_id_arc: Arc>>, + container_id_opt: &mut Option, ) -> anyhow::Result<(String, String)> { // Build the code using the docker container build( @@ -471,7 +536,7 @@ pub fn verify_from_repo( bpf_flag, workdir, cargo_args, - container_id_arc, + container_id_opt, )?; let executable_filename = format!("{}.so", package_name); From 4c7deb0692c3a682da36c00c3d88b5433834115a Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Wed, 21 Jun 2023 20:44:13 -0400 Subject: [PATCH 033/314] Use atomic bool --- src/main.rs | 56 ++++++++++++++++++----------------------------------- 1 file changed, 19 insertions(+), 37 deletions(-) diff --git a/src/main.rs b/src/main.rs index 61482b0..5208bb7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,7 +10,13 @@ use solana_sdk::{ bpf_loader_upgradeable::{self, UpgradeableLoaderState}, pubkey::Pubkey, }; -use std::{io::Read, path::PathBuf, process::Stdio}; +use std::{ + io::Read, + path::PathBuf, + process::Stdio, + sync::atomic::AtomicBool, + sync::{atomic::Ordering, Arc}, +}; use uuid::Uuid; pub fn get_network(network_str: &str) -> &str { @@ -120,39 +126,16 @@ fn main() -> anyhow::Result<()> { let mut signals = Signals::new(&[SIGTERM, SIGINT])?; let mut container_id: Option = None; let mut temp_dir: Option = None; - - // std::thread::spawn(move || { - // for _ in signals.forever() { - // let container_id = container_id_for_thread.lock().unwrap(); - // if let Some(container_id) = container_id.clone().take() { - // println!("Stopping container {}", container_id); - // if std::process::Command::new("docker") - // .args(&["kill", &container_id]) - // .output() - // .is_err() - // { - // println!("Failed to close docker container"); - // } else { - // println!("Stopped container {}", container_id) - // } - // } - // let temp_dir = temp_dir_for_thread.lock().unwrap(); - // println!("temp_dir: {:?}", temp_dir); - // if let Some(temp_dir) = temp_dir.clone().take() { - // println!("Removing temp dir {}", temp_dir); - // if std::process::Command::new("rm") - // .args(&["-rf", &temp_dir]) - // .output() - // .is_err() - // { - // println!("Failed to remove temp dir"); - // } else { - // println!("Removed temp dir {}", temp_dir); - // } - // } - // break; - // } - // }); + let caught_signal = Arc::new(AtomicBool::new(false)); + + let caught_signal_clone = caught_signal.clone(); + let handle = signals.handle(); + std::thread::spawn(move || { + for _ in signals.forever() { + caught_signal_clone.store(true, Ordering::Relaxed); + break; + } + }); let args = Arguments::parse(); let res = match args.subcommand { @@ -306,7 +289,7 @@ fn main() -> anyhow::Result<()> { } }; - for _ in &mut signals { + if caught_signal.load(Ordering::Relaxed) { if let Some(container_id) = container_id.clone().take() { println!("Stopping container {}", container_id); if std::process::Command::new("docker") @@ -319,7 +302,6 @@ fn main() -> anyhow::Result<()> { println!("Stopped container {}", container_id) } } - println!("temp_dir: {:?}", temp_dir); if let Some(temp_dir) = temp_dir.clone().take() { println!("Removing temp dir {}", temp_dir); if std::process::Command::new("rm") @@ -332,8 +314,8 @@ fn main() -> anyhow::Result<()> { println!("Removed temp dir {}", temp_dir); } } - break; } + handle.close(); res } From fca3c79bbf232c49fa5d141ef409bf08bc77fe2f Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Wed, 21 Jun 2023 20:57:25 -0400 Subject: [PATCH 034/314] fix verify with image --- src/main.rs | 45 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index 5208bb7..4f09e08 100644 --- a/src/main.rs +++ b/src/main.rs @@ -71,6 +71,12 @@ enum SubCommand { /// The Program ID of the program to verify #[clap(short, long)] program_id: Pubkey, + /// Docker workdir + #[clap(long, default_value = "build")] + workdir: String, + /// Verify in current directory + #[clap(long, default_value = "false")] + current_dir: bool, }, /// Get the hash of a program binary from an executable file GetExecutableHash { @@ -164,11 +170,16 @@ fn main() -> anyhow::Result<()> { executable_path_in_image: executable_path, image, program_id, + workdir, + current_dir, } => verify_from_image( executable_path, image, args.url, program_id, + workdir, + current_dir, + &mut temp_dir, &mut container_id, ), SubCommand::GetExecutableHash { filepath } => { @@ -331,7 +342,7 @@ pub fn get_client(url: Option) -> RpcClient { RpcClient::new(url) } -fn get_binary_hash(program_data: Vec) -> String { +pub fn get_binary_hash(program_data: Vec) -> String { let buffer = program_data .into_iter() .rev() @@ -437,6 +448,9 @@ pub fn verify_from_image( image: String, network: Option, program_id: Pubkey, + workdir: String, + current_dir: bool, + temp_dir: &mut Option, container_id_opt: &mut Option, ) -> anyhow::Result<()> { println!( @@ -454,18 +468,39 @@ pub fn verify_from_image( container_id_opt.replace(container_id.clone()); + let uuid = Uuid::new_v4().to_string(); + + // Create a temporary directory to clone the repo into + let verify_dir = if current_dir { + format!( + "{}/{}", + std::env::current_dir()? + .as_os_str() + .to_str() + .ok_or_else(|| anyhow::Error::msg("Invalid path string"))? + .to_string(), + uuid.clone() + ) + } else { + "/tmp".to_string() + }; + + temp_dir.replace(verify_dir.clone()); + + let program_filepath = format!("{}/program.so", verify_dir); + std::process::Command::new("docker") .args([ "cp", - format!("{}:/build/{}", container_id, executable_path).as_str(), - "/tmp/program.so", + format!("{}:/{}/{}", container_id, workdir, executable_path).as_str(), + program_filepath.as_str(), ]) .stdout(Stdio::inherit()) .stderr(Stdio::inherit()) .output() .map_err(|e| anyhow::format_err!("Failed to copy executable file {}", e.to_string()))?; - let executable_hash: String = get_file_hash("/tmp/program.so")?; + let executable_hash: String = get_file_hash(program_filepath.as_str())?; let client = get_client(network); let program_buffer = Pubkey::find_program_address(&[program_id.as_ref()], &bpf_loader_upgradeable::id()).0; @@ -483,7 +518,7 @@ pub fn verify_from_image( .map_err(|e| anyhow::format_err!("Docker build failed: {}", e.to_string()))?; std::process::Command::new("rm") - .args(["/tmp/program.so"]) + .args([program_filepath]) .stderr(Stdio::inherit()) .output() .map_err(|e| { From 76f3aa7119485621c1fad5dadc6cb4b74cd7b5e4 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Wed, 21 Jun 2023 22:32:29 -0400 Subject: [PATCH 035/314] add functions to infer rust version from solana version --- Cargo.lock | 248 ++++++++++++++++++++++++++++++++++++---- Cargo.toml | 2 + src/main.rs | 324 +++++++++++++++++++++++++++++++++++----------------- 3 files changed, 448 insertions(+), 126 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4785bfd..237c0db 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -172,9 +172,9 @@ checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" [[package]] name = "async-compression" -version = "0.3.15" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942c7cd7ae39e91bde4820d74132e9862e62c2f386c3aa90ccf55949f5bad63a" +checksum = "5b0122885821398cc923ece939e24d1056a2384ee719432397fa9db87230ff11" dependencies = [ "brotli", "flate2", @@ -438,6 +438,18 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cargo-lock" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11c675378efb449ed3ce8de78d75d0d80542fc98487c26aba28eb3b82feac72" +dependencies = [ + "semver", + "serde", + "toml 0.7.4", + "url", +] + [[package]] name = "cargo_toml" version = "0.13.3" @@ -445,7 +457,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "497049e9477329f8f6a559972ee42e117487d01d1e8c2cc9f836ea6fa23a9e1a" dependencies = [ "serde", - "toml", + "toml 0.5.11", ] [[package]] @@ -1087,6 +1099,21 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.1.0" @@ -1416,15 +1443,28 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.23.2" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" +checksum = "0646026eb1b3eea4cd9ba47912ea5ce9cc07713d105b1a14698f4e6433d348b7" dependencies = [ "http", "hyper", - "rustls", + "rustls 0.21.2", + "tokio", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", "tokio", - "tokio-rustls", + "tokio-native-tls", ] [[package]] @@ -1790,6 +1830,24 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "nix" version = "0.24.3" @@ -1978,12 +2036,50 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "openssl" +version = "0.10.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +dependencies = [ + "proc-macro2 1.0.50", + "quote 1.0.23", + "syn 1.0.107", +] + [[package]] name = "openssl-probe" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "openssl-sys" +version = "0.9.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "os_str_bytes" version = "6.4.1" @@ -2114,7 +2210,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" dependencies = [ - "toml", + "toml 0.5.11", ] [[package]] @@ -2124,7 +2220,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66618389e4ec1c7afe67d51a9bf34ff9236480f8d51e7489b7d5ab0303c13f34" dependencies = [ "once_cell", - "toml_edit", + "toml_edit 0.18.1", ] [[package]] @@ -2190,7 +2286,7 @@ dependencies = [ "fxhash", "quinn-proto", "quinn-udp", - "rustls", + "rustls 0.20.8", "thiserror", "tokio", "tracing", @@ -2207,7 +2303,7 @@ dependencies = [ "fxhash", "rand 0.8.5", "ring", - "rustls", + "rustls 0.20.8", "rustls-native-certs", "rustls-pemfile 0.2.1", "slab", @@ -2411,9 +2507,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.14" +version = "0.11.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21eed90ec8570952d53b772ecf8f206aa1ec9a3d76b2521c56c42973f2d91ee9" +checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" dependencies = [ "async-compression", "base64 0.21.0", @@ -2426,20 +2522,23 @@ dependencies = [ "http-body", "hyper", "hyper-rustls", + "hyper-tls", "ipnet", "js-sys", "log", "mime", + "native-tls", "once_cell", "percent-encoding", "pin-project-lite", - "rustls", + "rustls 0.21.2", "rustls-pemfile 1.0.2", "serde", "serde_json", "serde_urlencoded", "tokio", - "tokio-rustls", + "tokio-native-tls", + "tokio-rustls 0.24.1", "tokio-util", "tower-service", "url", @@ -2527,6 +2626,18 @@ dependencies = [ "webpki", ] +[[package]] +name = "rustls" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e32ca28af694bc1bbf399c33a516dbdf1c90090b8ab23c2bc24f834aa2247f5f" +dependencies = [ + "log", + "ring", + "rustls-webpki", + "sct", +] + [[package]] name = "rustls-native-certs" version = "0.6.2" @@ -2557,6 +2668,16 @@ dependencies = [ "base64 0.21.0", ] +[[package]] +name = "rustls-webpki" +version = "0.100.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.11" @@ -2628,6 +2749,9 @@ name = "semver" version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" +dependencies = [ + "serde", +] [[package]] name = "serde" @@ -2669,6 +2793,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93107647184f6027e3b7dcb2e11034cf95ffa1e3a682c67951963ac69c1c007d" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -2935,7 +3068,7 @@ dependencies = [ "rand_chacha 0.2.2", "rayon", "reqwest", - "rustls", + "rustls 0.20.8", "semver", "serde", "serde_derive", @@ -3317,7 +3450,7 @@ dependencies = [ "quinn", "rand 0.7.3", "rcgen", - "rustls", + "rustls 0.20.8", "solana-metrics", "solana-perf", "solana-sdk", @@ -3360,10 +3493,12 @@ name = "solana-verify" version = "0.2.0" dependencies = [ "anyhow", + "cargo-lock", "cargo_toml", "clap 4.1.4", "hex 0.3.2", "pathdiff", + "reqwest", "serde_json", "sha256", "signal-hook", @@ -3728,17 +3863,37 @@ dependencies = [ "syn 1.0.107", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + [[package]] name = "tokio-rustls" version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ - "rustls", + "rustls 0.20.8", "tokio", "webpki", ] +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls 0.21.2", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.11" @@ -3758,9 +3913,9 @@ checksum = "f714dd15bead90401d77e04243611caec13726c2408afd5b31901dfcdcb3b181" dependencies = [ "futures-util", "log", - "rustls", + "rustls 0.20.8", "tokio", - "tokio-rustls", + "tokio-rustls 0.23.4", "tungstenite", "webpki", "webpki-roots", @@ -3789,12 +3944,33 @@ dependencies = [ "serde", ] +[[package]] +name = "toml" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6135d499e69981f9ff0ef2167955a5333c35e36f6937d382974566b3d5b94ec" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime 0.6.2", + "toml_edit 0.19.10", +] + [[package]] name = "toml_datetime" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4553f467ac8e3d374bc9a177a26801e5d0f9b211aa1673fb137a403afd1c9cf5" +[[package]] +name = "toml_datetime" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a76a9312f5ba4c2dec6b9161fdf25d87ad8a09256ccea5a556fef03c706a10f" +dependencies = [ + "serde", +] + [[package]] name = "toml_edit" version = "0.18.1" @@ -3803,7 +3979,20 @@ checksum = "56c59d8dd7d0dcbc6428bf7aa2f0e823e26e43b3c9aca15bbc9475d23e5fa12b" dependencies = [ "indexmap", "nom8", - "toml_datetime", + "toml_datetime 0.5.1", +] + +[[package]] +name = "toml_edit" +version = "0.19.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380d56e8670370eee6566b0bfd4265f65b3f432e8c6d85623f728d4fa31f739" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime 0.6.2", + "winnow", ] [[package]] @@ -3863,7 +4052,7 @@ dependencies = [ "httparse", "log", "rand 0.8.5", - "rustls", + "rustls 0.20.8", "sha-1", "thiserror", "url", @@ -3982,6 +4171,12 @@ dependencies = [ "syn 1.0.107", ] +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "vec_map" version = "0.8.2" @@ -4205,6 +4400,15 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" +[[package]] +name = "winnow" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca0ace3845f0d96209f0375e6d367e3eb87eb65d27d445bdc9f1843a26f39448" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.10.1" diff --git a/Cargo.toml b/Cargo.toml index ac88815..feb472b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,8 @@ serde_json = "1.0" cargo_toml = "0.13.0" pathdiff = "0.2.0" signal-hook = "0.3.15" +reqwest = "0.11.18" +cargo-lock = "9.0.0" [dependencies.uuid] version = "1.2.2" diff --git a/src/main.rs b/src/main.rs index 4f09e08..89bfeff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ use anyhow::anyhow; +use cargo_lock::Lockfile; use clap::{Parser, Subcommand}; use signal_hook::{ consts::{SIGINT, SIGTERM}, @@ -148,24 +149,20 @@ fn main() -> anyhow::Result<()> { SubCommand::Build { // mount directory mount_dir, - // program build directory package_name, base_image, bpf_flag, workdir, cargo_args, - } => { - build( - mount_dir, - package_name, - base_image, - bpf_flag, - workdir, - cargo_args, - &mut container_id, - )?; - Ok(()) - } + } => build( + mount_dir, + package_name, + base_image, + bpf_flag, + workdir, + cargo_args, + &mut container_id, + ), SubCommand::VerifyFromImage { executable_path_in_image: executable_path, image, @@ -208,96 +205,21 @@ fn main() -> anyhow::Result<()> { workdir, cargo_args, current_dir, - } => { - // Get source code from repo_url - let base_name = std::process::Command::new("basename") - .arg(&repo_url) - .output() - .map_err(|e| anyhow!("Failed to get basename of repo_url: {:?}", e)) - .and_then(|output| parse_output(output.stdout))?; - - let uuid = Uuid::new_v4().to_string(); - - // Create a temporary directory to clone the repo into - let verify_dir = if current_dir { - format!( - "{}/{}", - std::env::current_dir()? - .as_os_str() - .to_str() - .ok_or_else(|| anyhow::Error::msg("Invalid path string"))? - .to_string(), - uuid.clone() - ) - } else { - format!("/tmp/solana-verify/{}", uuid) - }; - - temp_dir.replace(verify_dir.clone()); - - let verify_tmp_file_path = format!("{}/{}", verify_dir, base_name); - - std::process::Command::new("git") - .args(["clone", &repo_url, &verify_tmp_file_path]) - .output()?; - - // Checkout a specific commit hash, if provided - if let Some(commit_hash) = commit_hash { - let result = std::process::Command::new("cd") - .arg(&verify_tmp_file_path) - .output() - .and_then(|_| { - std::process::Command::new("git") - .args(["checkout", &commit_hash]) - .output() - }); - if result.is_ok() { - println!("Checked out commit hash: {}", commit_hash); - } else { - std::process::Command::new("rm") - .args(["-rf", verify_dir.as_str()]) - .output()?; - Err(anyhow!("Failed to checkout commit hash: {:?}", result))?; - } - } - - // Get the absolute build path to the solana program directory to build inside docker - let build_path = PathBuf::from(verify_tmp_file_path.clone()).join(solana_program_path); - println!("Build path: {:?}", build_path); - - let result = verify_from_repo( - build_path.to_str().unwrap().to_string(), - base_image, - bpf_flag, - package_name, - args.url, - program_id, - workdir, - cargo_args, - &mut container_id, - ); - - // Cleanup no matter the result - std::process::Command::new("rm") - .args(["-rf", &verify_dir]) - .output()?; - - // Compare hashes or return error - if let Ok((build_hash, program_hash)) = result { - println!("Executable Program Hash from repo: {}", build_hash); - println!("On-chain Program Hash: {}", program_hash); - - if build_hash == program_hash { - println!("Program hash matches"); - } else { - println!("Program hash does not match"); - } - - Ok(()) - } else { - Err(anyhow!("Error verifying program. {:?}", result)) - } - } + } => verify_from_repo( + solana_program_path, + args.url, + repo_url, + commit_hash, + program_id, + base_image, + package_name, + bpf_flag, + workdir, + cargo_args, + current_dir, + &mut temp_dir, + &mut container_id, + ), }; if caught_signal.load(Ordering::Relaxed) { @@ -473,7 +395,7 @@ pub fn verify_from_image( // Create a temporary directory to clone the repo into let verify_dir = if current_dir { format!( - "{}/{}", + "{}/.{}", std::env::current_dir()? .as_os_str() .to_str() @@ -535,6 +457,111 @@ pub fn verify_from_image( } pub fn verify_from_repo( + solana_program_path: String, + connection_url: Option, + repo_url: String, + commit_hash: Option, + program_id: Pubkey, + base_image: Option, + package_name: String, + bpf_flag: bool, + workdir: String, + cargo_args: Vec, + current_dir: bool, + container_id_opt: &mut Option, + temp_dir_opt: &mut Option, +) -> anyhow::Result<()> { + // Get source code from repo_url + let base_name = std::process::Command::new("basename") + .arg(&repo_url) + .output() + .map_err(|e| anyhow!("Failed to get basename of repo_url: {:?}", e)) + .and_then(|output| parse_output(output.stdout))?; + + let uuid = Uuid::new_v4().to_string(); + + // Create a temporary directory to clone the repo into + let verify_dir = if current_dir { + format!( + "{}/.{}", + std::env::current_dir()? + .as_os_str() + .to_str() + .ok_or_else(|| anyhow::Error::msg("Invalid path string"))? + .to_string(), + uuid.clone() + ) + } else { + format!("/tmp/solana-verify/{}", uuid) + }; + + temp_dir_opt.replace(verify_dir.clone()); + + let verify_tmp_file_path = format!("{}/{}", verify_dir, base_name); + + std::process::Command::new("git") + .args(["clone", &repo_url, &verify_tmp_file_path]) + .output()?; + + // Checkout a specific commit hash, if provided + if let Some(commit_hash) = commit_hash { + let result = std::process::Command::new("cd") + .arg(&verify_tmp_file_path) + .output() + .and_then(|_| { + std::process::Command::new("git") + .args(["checkout", &commit_hash]) + .output() + }); + if result.is_ok() { + println!("Checked out commit hash: {}", commit_hash); + } else { + std::process::Command::new("rm") + .args(["-rf", verify_dir.as_str()]) + .output()?; + Err(anyhow!("Failed to checkout commit hash: {:?}", result))?; + } + } + + // Get the absolute build path to the solana program directory to build inside docker + let build_path = PathBuf::from(verify_tmp_file_path.clone()).join(solana_program_path); + println!("Build path: {:?}", build_path); + + let result = build_and_verify_repo( + build_path.to_str().unwrap().to_string(), + base_image, + bpf_flag, + package_name, + connection_url, + program_id, + workdir, + cargo_args, + container_id_opt, + ); + + // Cleanup no matter the result + std::process::Command::new("rm") + .args(["-rf", &verify_dir]) + .output()?; + + // Compare hashes or return error + if let Ok((build_hash, program_hash)) = result { + println!("Executable Program Hash from repo: {}", build_hash); + println!("On-chain Program Hash: {}", program_hash); + + if build_hash == program_hash { + println!("Program hash matches"); + } else { + println!("Program hash does not match"); + } + + Ok(()) + } else { + Err(anyhow!("Error verifying program. {:?}", result)) + } +} + +pub fn build_and_verify_repo( base_repo_path: String, base_image: Option, bpf_flag: bool, @@ -593,3 +620,92 @@ pub fn parse_output(output: Vec) -> anyhow::Result { .to_string(); Ok(parsed_output) } + +pub fn get_solana_version_from_cargo_lock( + cargo_lock_file: &str, +) -> anyhow::Result<(u32, u32, u32)> { + let lockfile = Lockfile::load(cargo_lock_file)?; + let res = lockfile + .packages + .iter() + .filter(|pkg| pkg.name.to_string() == "solana-program".to_string()) + .filter_map(|pkg| { + let version = pkg.version.clone().to_string(); + let version_parts: Vec<&str> = version.split(".").collect(); + if version_parts.len() == 3 { + let major = version_parts[0].parse::().unwrap_or(0); + let minor = version_parts[1].parse::().unwrap_or(0); + let patch = version_parts[2].parse::().unwrap_or(0); + return Some((major, minor, patch)); + } + return None; + }) + .next() + .ok_or_else(|| anyhow!("Failed to parse solana-program version from Cargo.lock"))?; + Ok(res) +} + +pub fn get_rust_version_for_solana_version( + major: u32, + minor: u32, + patch: u32, +) -> anyhow::Result { + let release = format!("v{}.{}.{}", major, minor, patch); + if minor > 14 { + // https://github.com/solana-labs/solana/commit/cdb204114ef529f9f63d4b5a995e0429919e3131 + // This is the first commit that moves the rust version to rust-toolchain.toml (1.15.0) + let endpoint = format!( + "https://raw.githubusercontent.com/solana-labs/solana/{}/rust-toolchain.toml", + release + ); + let body = reqwest::blocking::get(endpoint)?.text()?; + body.split("\n") + .skip(1) + .next() + .ok_or_else(|| anyhow!("Failed to parse rust version")) + .map(|s| s.to_string().replace("channel = ", "").replace("\"", "")) + } else { + // For all previous releases, the rust version is in ci/rust-version.sh on line 21 + let endpoint = format!( + "https://raw.githubusercontent.com/solana-labs/solana/{}/ci/rust-version.sh", + release + ); + let body = reqwest::blocking::get(endpoint)?.text()?; + body.split("\n") + .filter(|s| s.contains("stable_version")) + .skip(1) + .next() + .ok_or_else(|| anyhow!("Failed to parse rust version")) + .map(|s| { + s.to_string() + .replace("stable_version=", "") + .replace(" ", "") + }) + } +} + +#[test] +fn test_rust_version() { + for major in [1] { + for minor in 0..18 { + for patch in 0..30 { + let res = get_rust_version_for_solana_version(major, minor, patch); + if res.is_err() { + break; + } + println!("{}.{}.{}: {}", major, minor, patch, res.unwrap()); + } + } + } +} + +#[test] +fn test_parse_cargo_log() { + let res = get_solana_version_from_cargo_lock("examples/hello_world/Cargo.lock").unwrap(); + println!("{:?}", res); + let (major, minor, patch) = res; + println!( + "{:?}", + get_rust_version_for_solana_version(major, minor, patch).unwrap() + ); +} From 578249a72b3471577d1745e7e33f8268610f70fc Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Thu, 22 Jun 2023 19:33:38 -0400 Subject: [PATCH 036/314] Inference from lib name/pain with docker --- Cargo.lock | 6 +- Cargo.toml | 2 +- Dockerfile | 1 - src/main.rs | 176 ++++++++++++++++++++++++++++++++++++++++++++++------ 4 files changed, 162 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 237c0db..9177949 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -452,12 +452,12 @@ dependencies = [ [[package]] name = "cargo_toml" -version = "0.13.3" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497049e9477329f8f6a559972ee42e117487d01d1e8c2cc9f836ea6fa23a9e1a" +checksum = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838" dependencies = [ "serde", - "toml 0.5.11", + "toml 0.7.4", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index feb472b..8ffd5df 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ solana-sdk = "1.14.10" sha256 = "1.1.1" hex = "0.3.1" serde_json = "1.0" -cargo_toml = "0.13.0" +cargo_toml = "0.15.3" pathdiff = "0.2.0" signal-hook = "0.3.15" reqwest = "0.11.18" diff --git a/Dockerfile b/Dockerfile index 97099db..4a5ad47 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,6 @@ FROM solanalabs/rust:1.68.0 RUN apt-get update && apt-get install -qy clang libudev-dev tmux vim git netcat zsh -RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended WORKDIR /build diff --git a/src/main.rs b/src/main.rs index 89bfeff..aa53481 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ use anyhow::anyhow; use cargo_lock::Lockfile; +use cargo_toml::Manifest; use clap::{Parser, Subcommand}; use signal_hook::{ consts::{SIGINT, SIGTERM}, @@ -111,8 +112,10 @@ enum SubCommand { #[clap(short, long)] base_image: Option, /// If the repo_url points to a repo that contains multiple programs, specify the name of the program to build and verify - #[clap(long, default_value = "*")] - package_name: String, + /// You will also need to specify the package_name if the program is not part of the top-level Cargo.toml + /// Otherwise it will be inferred from the Cargo.toml file + #[clap(long)] + package_name: Option, /// If the program requires cargo build-bpf (instead of cargo build-sbf), as for anchor program, set this flag #[clap(long, default_value = "false")] bpf_flag: bool, @@ -222,7 +225,7 @@ fn main() -> anyhow::Result<()> { ), }; - if caught_signal.load(Ordering::Relaxed) { + if caught_signal.load(Ordering::Relaxed) || res.is_err() { if let Some(container_id) = container_id.clone().take() { println!("Stopping container {}", container_id); if std::process::Command::new("docker") @@ -319,9 +322,50 @@ pub fn build( .to_string(), ); println!("Mounting path: {}", path); + + let lockfile = format!("{}/Cargo.lock", path); + if !std::path::Path::new(&lockfile).exists() { + println!("Mount directory must contain a Cargo.lock file"); + return Err(anyhow!(format!("No lockfile found at {}", lockfile))); + } + let image = base_image.unwrap_or_else(|| "ellipsislabs/solana:latest".to_string()); - let build_command = if bpf_flag { "build-bpf" } else { "build-sbf" }; + let is_anchor = std::path::Path::new(&format!("{}/Anchor.toml", path)).exists(); + let build_command = if bpf_flag || is_anchor { + "build-bpf" + } else { + "build-sbf" + }; + + let relative_build_path = std::process::Command::new("find") + .args([&path, "-name", "Cargo.toml"]) + .output() + .map_err(|e| { + anyhow::format_err!( + "Failed to find Cargo.toml files in root directory: {}", + e.to_string() + ) + }) + .and_then(|output| { + for p in String::from_utf8(output.stdout)?.split("\n") { + match get_lib_name_from_cargo_toml(p) { + Ok(name) => { + if name == package_name.clone().unwrap_or_default() { + return Ok(p.to_string().replace("/Cargo.toml", "").replace(&path, "")); + } + } + Err(_) => { + continue; + } + } + } + Err(anyhow!("No Cargo.toml files found")) + }) + .unwrap_or_else(|_| "".to_string()); + + let build_path = format!("/{}/{}", workdir, relative_build_path); + println!("Building program at {}", build_path); let package_filter = package_name .clone() @@ -331,10 +375,7 @@ pub fn build( // change directory to program/build dir let mount_params = format!("{}:/{}", path, workdir); let container_id = std::process::Command::new("docker") - .args(["run", "--rm", "-v", &mount_params, "-dit", &image]) - .args(["cargo", build_command, "--", "--locked", "--frozen"]) - .args(package_filter) - .args(cargo_args) + .args(["run", "--rm", "-v", &mount_params, "-dit", &image, "bash"]) .stderr(Stdio::inherit()) .output() .map_err(|e| anyhow::format_err!("Docker build failed: {}", e.to_string())) @@ -343,8 +384,37 @@ pub fn build( // Set the container id so we can kill it later if the process is interrupted container_id_opt.replace(container_id.clone()); + // First, we resolve the dependencies and cache them in the docker container + // ARM processors running Linux have a bug where the build fails if the dependencies + // because the container runs out of memory. This is a workaround for that issue. std::process::Command::new("docker") - .args(["logs", "--follow", &container_id]) + .args(["exec", &container_id]) + .args([ + "cargo", + "--config", + "net.git-fetch-with-cli=true", + "metadata", + ]) + .stderr(Stdio::inherit()) + .stdout(Stdio::inherit()) + .output()?; + + println!("Finished fetching build dependencies"); + std::process::Command::new("docker") + .args(["exec", "-w", &build_path, &container_id]) + .args([ + "cargo", + build_command, + "--", + "--locked", + "--frozen", + "-Z", + "unstable-options", + "--config", + "net.git-fetch-with-cli=true", + ]) + .args(package_filter) + .args(cargo_args) .stderr(Stdio::inherit()) .stdout(Stdio::inherit()) .output()?; @@ -362,6 +432,15 @@ pub fn build( let executable_hash = get_file_hash(&executable_path)?; println!("Executable hash: {}", executable_hash); } + if std::process::Command::new("docker") + .args(&["kill", &container_id]) + .output() + .is_err() + { + println!("Failed to close docker container"); + } else { + println!("Stopped container {}", container_id) + } Ok(()) } @@ -437,7 +516,7 @@ pub fn verify_from_image( .args(["kill", container_id.as_str()]) .stderr(Stdio::inherit()) .output() - .map_err(|e| anyhow::format_err!("Docker build failed: {}", e.to_string()))?; + .map_err(|e| anyhow::format_err!("Docker kill failed: {}", e.to_string()))?; std::process::Command::new("rm") .args([program_filepath]) @@ -463,7 +542,7 @@ pub fn verify_from_repo( commit_hash: Option, program_id: Pubkey, base_image: Option, - package_name: String, + package_name_opt: Option, bpf_flag: bool, workdir: String, cargo_args: Vec, @@ -524,11 +603,60 @@ pub fn verify_from_repo( } // Get the absolute build path to the solana program directory to build inside docker - let build_path = PathBuf::from(verify_tmp_file_path.clone()).join(solana_program_path); - println!("Build path: {:?}", build_path); + let base_path = PathBuf::from(verify_tmp_file_path.clone()).join(solana_program_path); + println!("Build path: {:?}", base_path); + + let package_name = match package_name_opt { + Some(p) => p, + None => { + let name = + std::process::Command::new("find") + .args([base_path.to_str().unwrap(), "-name", "Cargo.toml"]) + .output() + .map_err(|e| { + anyhow::format_err!( + "Failed to find Cargo.toml files in root directory: {}", + e.to_string() + ) + }) + .and_then(|output| { + let mut options = vec![]; + for path in String::from_utf8(output.stdout)?.split("\n") { + match get_lib_name_from_cargo_toml(path) { + Ok(name) => { + options.push(name); + } + Err(_) => { + continue; + } + } + } + if options.len() != 1 { + println!( + "Found multiple possible targets in root directory: {:?}", + options + ); + println!( + "Please explicitly specify the target with the --package-name option", + ); + Err(anyhow::format_err!( + "Failed to find unique Cargo.toml file in root directory" + )) + } else { + Ok(options[0].clone()) + } + })?; + name + } + }; + println!("Verifying program: {}", package_name); + + std::process::Command::new("cd") + .arg(base_path.to_str().unwrap()) + .output()?; let result = build_and_verify_repo( - build_path.to_str().unwrap().to_string(), + base_path.to_str().unwrap().to_string(), base_image, bpf_flag, package_name, @@ -621,14 +749,15 @@ pub fn parse_output(output: Vec) -> anyhow::Result { Ok(parsed_output) } -pub fn get_solana_version_from_cargo_lock( +pub fn get_package_version_from_cargo_lock( + package_name: &str, cargo_lock_file: &str, ) -> anyhow::Result<(u32, u32, u32)> { let lockfile = Lockfile::load(cargo_lock_file)?; let res = lockfile .packages .iter() - .filter(|pkg| pkg.name.to_string() == "solana-program".to_string()) + .filter(|pkg| pkg.name.to_string() == package_name.to_string()) .filter_map(|pkg| { let version = pkg.version.clone().to_string(); let version_parts: Vec<&str> = version.split(".").collect(); @@ -645,6 +774,15 @@ pub fn get_solana_version_from_cargo_lock( Ok(res) } +pub fn get_lib_name_from_cargo_toml(cargo_toml_file: &str) -> anyhow::Result { + let manifest = Manifest::from_path(cargo_toml_file)?; + let lib = manifest + .lib + .ok_or_else(|| anyhow!("Failed to parse lib from Cargo.toml"))?; + lib.name + .ok_or_else(|| anyhow!("Failed to parse lib name from Cargo.toml")) +} + pub fn get_rust_version_for_solana_version( major: u32, minor: u32, @@ -687,7 +825,7 @@ pub fn get_rust_version_for_solana_version( #[test] fn test_rust_version() { for major in [1] { - for minor in 0..18 { + for minor in 10..18 { for patch in 0..30 { let res = get_rust_version_for_solana_version(major, minor, patch); if res.is_err() { @@ -701,7 +839,9 @@ fn test_rust_version() { #[test] fn test_parse_cargo_log() { - let res = get_solana_version_from_cargo_lock("examples/hello_world/Cargo.lock").unwrap(); + let res = + get_package_version_from_cargo_lock("solana-program", "examples/hello_world/Cargo.lock") + .unwrap(); println!("{:?}", res); let (major, minor, patch) = res; println!( From 8b8903fc3abc0ea9a02c369a03fb469c4e016536 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Thu, 22 Jun 2023 20:09:16 -0400 Subject: [PATCH 037/314] Verification works again --- src/main.rs | 151 +++++++++++++++++++++++++--------------------------- 1 file changed, 74 insertions(+), 77 deletions(-) diff --git a/src/main.rs b/src/main.rs index aa53481..9688a96 100644 --- a/src/main.rs +++ b/src/main.rs @@ -45,10 +45,10 @@ enum SubCommand { /// Deterministically build the program in an Docker container Build { /// Path to mount to the docker image - mount_dir: Option, + mount_directory: Option, /// Which binary file to build (applies to repositories with multiple programs) #[clap(long)] - package_name: Option, + library_name: Option, /// Optionally specify a custom base docker image to use for building the program repository #[clap(short, long)] base_image: Option, @@ -97,9 +97,10 @@ enum SubCommand { }, /// Builds and verifies a program from a given repository URL and a program ID VerifyFromRepo { - /// Path to the executable solana program within the source code repository if the program is not part of the top-level Cargo.toml - #[clap(short, long, default_value = "")] - solana_program_path: String, + /// Relative path to the root directory or the source code repository from which to build the program + /// This should be the directory that contains the workspace Cargo.toml and the Cargo.lock file + #[clap(long, default_value = "")] + mount_path: String, /// The HTTPS URL of the repo to clone repo_url: String, /// Optional commit hash to checkout @@ -111,12 +112,12 @@ enum SubCommand { /// Optionally specify a custom base docker image to use for building the program repository #[clap(short, long)] base_image: Option, - /// If the repo_url points to a repo that contains multiple programs, specify the name of the program to build and verify - /// You will also need to specify the package_name if the program is not part of the top-level Cargo.toml + /// If the repo_url points to a repo that contains multiple programs, specify the name of the library name of the program to + /// build and verify. You will also need to specify the library_name if the program is not part of the top-level Cargo.toml /// Otherwise it will be inferred from the Cargo.toml file #[clap(long)] - package_name: Option, - /// If the program requires cargo build-bpf (instead of cargo build-sbf), as for anchor program, set this flag + library_name: Option, + /// If the program requires cargo build-bpf (instead of cargo build-sbf), as for an Anchor program, set this flag #[clap(long, default_value = "false")] bpf_flag: bool, /// Docker workdir @@ -151,15 +152,15 @@ fn main() -> anyhow::Result<()> { let res = match args.subcommand { SubCommand::Build { // mount directory - mount_dir, - package_name, + mount_directory, + library_name, base_image, bpf_flag, workdir, cargo_args, } => build( - mount_dir, - package_name, + mount_directory, + library_name, base_image, bpf_flag, workdir, @@ -198,24 +199,24 @@ fn main() -> anyhow::Result<()> { Ok(()) } SubCommand::VerifyFromRepo { - solana_program_path, + mount_path, repo_url, commit_hash, program_id, base_image, - package_name, + library_name, bpf_flag, workdir, cargo_args, current_dir, } => verify_from_repo( - solana_program_path, + mount_path, args.url, repo_url, commit_hash, program_id, base_image, - package_name, + library_name, bpf_flag, workdir, cargo_args, @@ -306,24 +307,24 @@ pub fn get_program_hash(url: Option, program_id: Pubkey) -> anyhow::Resu } pub fn build( - mount_path: Option, - package_name: Option, + mount_directory: Option, + library_name: Option, base_image: Option, bpf_flag: bool, workdir: String, cargo_args: Vec, container_id_opt: &mut Option, ) -> anyhow::Result<()> { - let path = mount_path.unwrap_or( + let mount_path = mount_directory.unwrap_or( std::env::current_dir()? .as_os_str() .to_str() .ok_or_else(|| anyhow::Error::msg("Invalid path string"))? .to_string(), ); - println!("Mounting path: {}", path); + println!("Mounting path: {}", mount_path); - let lockfile = format!("{}/Cargo.lock", path); + let lockfile = format!("{}/Cargo.lock", mount_path); if !std::path::Path::new(&lockfile).exists() { println!("Mount directory must contain a Cargo.lock file"); return Err(anyhow!(format!("No lockfile found at {}", lockfile))); @@ -331,15 +332,17 @@ pub fn build( let image = base_image.unwrap_or_else(|| "ellipsislabs/solana:latest".to_string()); - let is_anchor = std::path::Path::new(&format!("{}/Anchor.toml", path)).exists(); + let is_anchor = std::path::Path::new(&format!("{}/Anchor.toml", mount_path)).exists(); let build_command = if bpf_flag || is_anchor { "build-bpf" } else { "build-sbf" }; + let mut package_name = None; + let relative_build_path = std::process::Command::new("find") - .args([&path, "-name", "Cargo.toml"]) + .args([&mount_path, "-name", "Cargo.toml"]) .output() .map_err(|e| { anyhow::format_err!( @@ -351,8 +354,12 @@ pub fn build( for p in String::from_utf8(output.stdout)?.split("\n") { match get_lib_name_from_cargo_toml(p) { Ok(name) => { - if name == package_name.clone().unwrap_or_default() { - return Ok(p.to_string().replace("/Cargo.toml", "").replace(&path, "")); + if name == library_name.clone().unwrap_or_default() { + package_name = get_pkg_name_from_cargo_toml(p); + return Ok(p + .to_string() + .replace("/Cargo.toml", "") + .replace(&mount_path, "")); } } Err(_) => { @@ -372,8 +379,12 @@ pub fn build( .map(|pkg| vec!["-p".to_string(), pkg]) .unwrap_or_else(|| vec![]); + if package_name.is_some() { + println!("Building package: {}", package_name.unwrap()); + } + // change directory to program/build dir - let mount_params = format!("{}:/{}", path, workdir); + let mount_params = format!("{}:/{}", mount_path, workdir); let container_id = std::process::Command::new("docker") .args(["run", "--rm", "-v", &mount_params, "-dit", &image, "bash"]) .stderr(Stdio::inherit()) @@ -384,16 +395,18 @@ pub fn build( // Set the container id so we can kill it later if the process is interrupted container_id_opt.replace(container_id.clone()); - // First, we resolve the dependencies and cache them in the docker container - // ARM processors running Linux have a bug where the build fails if the dependencies - // because the container runs out of memory. This is a workaround for that issue. + // First, we resolve the dependencies and cache them in the Docker container + // ARM processors running Linux have a bug where the build fails if the dependencies are not preloaded. + // Running the build without the pre-fetch will cause the container to run out of memory. + // This is a workaround for that issue. std::process::Command::new("docker") .args(["exec", &container_id]) .args([ "cargo", "--config", "net.git-fetch-with-cli=true", - "metadata", + "fetch", + "--locked", ]) .stderr(Stdio::inherit()) .stdout(Stdio::inherit()) @@ -402,27 +415,17 @@ pub fn build( println!("Finished fetching build dependencies"); std::process::Command::new("docker") .args(["exec", "-w", &build_path, &container_id]) - .args([ - "cargo", - build_command, - "--", - "--locked", - "--frozen", - "-Z", - "unstable-options", - "--config", - "net.git-fetch-with-cli=true", - ]) + .args(["cargo", build_command, "--", "--locked", "--frozen"]) .args(package_filter) .args(cargo_args) .stderr(Stdio::inherit()) .stdout(Stdio::inherit()) .output()?; - if let Some(program_name) = package_name { + if let Some(program_name) = library_name { let executable_path = std::process::Command::new("find") .args([ - &format!("{}/target/deploy", path), + &format!("{}/target/deploy", mount_path), "-name", &format!("{}.so", program_name), ]) @@ -432,15 +435,9 @@ pub fn build( let executable_hash = get_file_hash(&executable_path)?; println!("Executable hash: {}", executable_hash); } - if std::process::Command::new("docker") + std::process::Command::new("docker") .args(&["kill", &container_id]) - .output() - .is_err() - { - println!("Failed to close docker container"); - } else { - println!("Stopped container {}", container_id) - } + .output()?; Ok(()) } @@ -536,13 +533,13 @@ pub fn verify_from_image( } pub fn verify_from_repo( - solana_program_path: String, + relative_mount_path: String, connection_url: Option, repo_url: String, commit_hash: Option, program_id: Pubkey, base_image: Option, - package_name_opt: Option, + library_name_opt: Option, bpf_flag: bool, workdir: String, cargo_args: Vec, @@ -603,15 +600,15 @@ pub fn verify_from_repo( } // Get the absolute build path to the solana program directory to build inside docker - let base_path = PathBuf::from(verify_tmp_file_path.clone()).join(solana_program_path); - println!("Build path: {:?}", base_path); + let mount_path = PathBuf::from(verify_tmp_file_path.clone()).join(relative_mount_path); + println!("Build path: {:?}", mount_path); - let package_name = match package_name_opt { + let library_name = match library_name_opt { Some(p) => p, None => { let name = std::process::Command::new("find") - .args([base_path.to_str().unwrap(), "-name", "Cargo.toml"]) + .args([mount_path.to_str().unwrap(), "-name", "Cargo.toml"]) .output() .map_err(|e| { anyhow::format_err!( @@ -649,17 +646,13 @@ pub fn verify_from_repo( name } }; - println!("Verifying program: {}", package_name); - - std::process::Command::new("cd") - .arg(base_path.to_str().unwrap()) - .output()?; + println!("Verifying program: {}", library_name); let result = build_and_verify_repo( - base_path.to_str().unwrap().to_string(), + mount_path.to_str().unwrap().to_string(), base_image, bpf_flag, - package_name, + library_name, connection_url, program_id, workdir, @@ -690,10 +683,10 @@ pub fn verify_from_repo( } pub fn build_and_verify_repo( - base_repo_path: String, + mount_path: String, base_image: Option, bpf_flag: bool, - package_name: String, + library_name: String, connection_url: Option, program_id: Pubkey, workdir: String, @@ -701,9 +694,10 @@ pub fn build_and_verify_repo( container_id_opt: &mut Option, ) -> anyhow::Result<(String, String)> { // Build the code using the docker container + let executable_filename = format!("{}.so", &library_name); build( - Some(base_repo_path.clone()), - Some(package_name.clone()), + Some(mount_path.clone()), + Some(library_name), base_image, bpf_flag, workdir, @@ -711,16 +705,14 @@ pub fn build_and_verify_repo( container_id_opt, )?; - let executable_filename = format!("{}.so", package_name); - // Get the hash of the build println!( "Looking for executable name {} at path: {}/target/deploy", - executable_filename, base_repo_path + executable_filename, mount_path ); let executable_path = std::process::Command::new("find") .args([ - &format!("{}/target/deploy", base_repo_path), + &format!("{}/target/deploy", mount_path), "-name", executable_filename.as_str(), ]) @@ -749,7 +741,7 @@ pub fn parse_output(output: Vec) -> anyhow::Result { Ok(parsed_output) } -pub fn get_package_version_from_cargo_lock( +pub fn get_pkg_version_from_cargo_lock( package_name: &str, cargo_lock_file: &str, ) -> anyhow::Result<(u32, u32, u32)> { @@ -783,6 +775,12 @@ pub fn get_lib_name_from_cargo_toml(cargo_toml_file: &str) -> anyhow::Result Option { + let manifest = Manifest::from_path(cargo_toml_file).ok()?; + let pkg = manifest.package?; + Some(pkg.name) +} + pub fn get_rust_version_for_solana_version( major: u32, minor: u32, @@ -839,9 +837,8 @@ fn test_rust_version() { #[test] fn test_parse_cargo_log() { - let res = - get_package_version_from_cargo_lock("solana-program", "examples/hello_world/Cargo.lock") - .unwrap(); + let res = get_pkg_version_from_cargo_lock("solana-program", "examples/hello_world/Cargo.lock") + .unwrap(); println!("{:?}", res); let (major, minor, patch) = res; println!( From b7751fa2224a68dd784d4733ad3b1080e45fd4b1 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Thu, 22 Jun 2023 23:08:15 -0400 Subject: [PATCH 038/314] Update args to make it easier to work with Anchor programs --- src/main.rs | 62 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/src/main.rs b/src/main.rs index 9688a96..4b3c998 100644 --- a/src/main.rs +++ b/src/main.rs @@ -54,10 +54,10 @@ enum SubCommand { base_image: Option, /// If the program requires cargo build-bpf (instead of cargo build-sbf), as for anchor program, set this flag #[clap(long, default_value = "false")] - bpf_flag: bool, + bpf: bool, /// Docker workdir - #[clap(long, default_value = "build")] - workdir: String, + #[clap(long)] + workdir: Option, /// Arguments to pass to the underlying `cargo build-bpf` command #[clap(required = false, last = true)] cargo_args: Vec, @@ -119,10 +119,10 @@ enum SubCommand { library_name: Option, /// If the program requires cargo build-bpf (instead of cargo build-sbf), as for an Anchor program, set this flag #[clap(long, default_value = "false")] - bpf_flag: bool, + bpf: bool, /// Docker workdir - #[clap(long, default_value = "build")] - workdir: String, + #[clap(long)] + workdir: Option, /// Verify in current directory #[clap(long, default_value = "false")] current_dir: bool, @@ -155,7 +155,7 @@ fn main() -> anyhow::Result<()> { mount_directory, library_name, base_image, - bpf_flag, + bpf: bpf_flag, workdir, cargo_args, } => build( @@ -205,7 +205,7 @@ fn main() -> anyhow::Result<()> { program_id, base_image, library_name, - bpf_flag, + bpf: bpf_flag, workdir, cargo_args, current_dir, @@ -311,7 +311,7 @@ pub fn build( library_name: Option, base_image: Option, bpf_flag: bool, - workdir: String, + workdir_opt: Option, cargo_args: Vec, container_id_opt: &mut Option, ) -> anyhow::Result<()> { @@ -330,8 +330,6 @@ pub fn build( return Err(anyhow!(format!("No lockfile found at {}", lockfile))); } - let image = base_image.unwrap_or_else(|| "ellipsislabs/solana:latest".to_string()); - let is_anchor = std::path::Path::new(&format!("{}/Anchor.toml", mount_path)).exists(); let build_command = if bpf_flag || is_anchor { "build-bpf" @@ -339,6 +337,15 @@ pub fn build( "build-sbf" }; + let image = base_image.unwrap_or_else(|| { + if bpf_flag || is_anchor { + "projectserum/build:v0.26.0" + } else { + "ellipsislabs/solana:latest" + } + .to_string() + }); + let mut package_name = None; let relative_build_path = std::process::Command::new("find") @@ -371,6 +378,15 @@ pub fn build( }) .unwrap_or_else(|_| "".to_string()); + let workdir = workdir_opt.unwrap_or_else(|| { + if bpf_flag || is_anchor { + "workdir" + } else { + "build" + } + .to_string() + }); + let build_path = format!("/{}/{}", workdir, relative_build_path); println!("Building program at {}", build_path); @@ -433,7 +449,7 @@ pub fn build( .map_err(|e| anyhow!("Failed to find program: {}", e.to_string())) .and_then(|output| parse_output(output.stdout))?; let executable_hash = get_file_hash(&executable_path)?; - println!("Executable hash: {}", executable_hash); + println!("{}", executable_hash); } std::process::Command::new("docker") .args(&["kill", &container_id]) @@ -541,7 +557,7 @@ pub fn verify_from_repo( base_image: Option, library_name_opt: Option, bpf_flag: bool, - workdir: String, + workdir: Option, cargo_args: Vec, current_dir: bool, container_id_opt: &mut Option, @@ -573,16 +589,17 @@ pub fn verify_from_repo( temp_dir_opt.replace(verify_dir.clone()); - let verify_tmp_file_path = format!("{}/{}", verify_dir, base_name); + let verify_tmp_root_path = format!("{}/{}", verify_dir, base_name); + println!("Cloning repo into: {}", verify_tmp_root_path); std::process::Command::new("git") - .args(["clone", &repo_url, &verify_tmp_file_path]) + .args(["clone", &repo_url, &verify_tmp_root_path]) .output()?; // Checkout a specific commit hash, if provided if let Some(commit_hash) = commit_hash { let result = std::process::Command::new("cd") - .arg(&verify_tmp_file_path) + .arg(&verify_tmp_root_path) .output() .and_then(|_| { std::process::Command::new("git") @@ -600,7 +617,7 @@ pub fn verify_from_repo( } // Get the absolute build path to the solana program directory to build inside docker - let mount_path = PathBuf::from(verify_tmp_file_path.clone()).join(relative_mount_path); + let mount_path = PathBuf::from(verify_tmp_root_path.clone()).join(relative_mount_path); println!("Build path: {:?}", mount_path); let library_name = match library_name_opt { @@ -671,9 +688,9 @@ pub fn verify_from_repo( println!("On-chain Program Hash: {}", program_hash); if build_hash == program_hash { - println!("Program hash matches"); + println!("Program hash matches ✅"); } else { - println!("Program hash does not match"); + println!("Program hashes do not match ❌"); } Ok(()) @@ -689,7 +706,7 @@ pub fn build_and_verify_repo( library_name: String, connection_url: Option, program_id: Pubkey, - workdir: String, + workdir: Option, cargo_args: Vec, container_id_opt: &mut Option, ) -> anyhow::Result<(String, String)> { @@ -706,10 +723,6 @@ pub fn build_and_verify_repo( )?; // Get the hash of the build - println!( - "Looking for executable name {} at path: {}/target/deploy", - executable_filename, mount_path - ); let executable_path = std::process::Command::new("find") .args([ &format!("{}/target/deploy", mount_path), @@ -721,7 +734,6 @@ pub fn build_and_verify_repo( .and_then(|output| parse_output(output.stdout))?; println!("Executable file found at path: {:?}", executable_path); let build_hash = get_file_hash(&executable_path)?; - println!("Build hash: {}", build_hash); // Get the hash of the deployed program println!( From a4eb638e58e300034acab296584599027d7a454d Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Thu, 22 Jun 2023 23:16:05 -0400 Subject: [PATCH 039/314] better logs for debugging --- src/main.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 4b3c998..87494e9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -601,10 +601,12 @@ pub fn verify_from_repo( let result = std::process::Command::new("cd") .arg(&verify_tmp_root_path) .output() + .map_err(|e| anyhow!("Failed to cd into verify_tmp_root_path: {:?}", e)) .and_then(|_| { std::process::Command::new("git") .args(["checkout", &commit_hash]) .output() + .map_err(|e| anyhow!("Failed to checkout commit hash: {:?}", e)) }); if result.is_ok() { println!("Checked out commit hash: {}", commit_hash); @@ -612,7 +614,7 @@ pub fn verify_from_repo( std::process::Command::new("rm") .args(["-rf", verify_dir.as_str()]) .output()?; - Err(anyhow!("Failed to checkout commit hash: {:?}", result))?; + Err(anyhow!("Encountered error in git setup: {:?}", result))?; } } From fde2b30e0d224deaea5dd56759e9b0ac8c187e38 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Thu, 22 Jun 2023 23:19:44 -0400 Subject: [PATCH 040/314] more logs --- src/main.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 87494e9..50e4db0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -594,6 +594,17 @@ pub fn verify_from_repo( std::process::Command::new("git") .args(["clone", &repo_url, &verify_tmp_root_path]) + .stdout(Stdio::inherit()) + .output()?; + + std::process::Command::new("ls") + .args(["-la"]) + .stdout(Stdio::inherit()) + .output()?; + + std::process::Command::new("ls") + .args(["-la", &verify_dir]) + .stdout(Stdio::inherit()) .output()?; // Checkout a specific commit hash, if provided @@ -601,7 +612,7 @@ pub fn verify_from_repo( let result = std::process::Command::new("cd") .arg(&verify_tmp_root_path) .output() - .map_err(|e| anyhow!("Failed to cd into verify_tmp_root_path: {:?}", e)) + .map_err(|e| anyhow!("Failed to cd into {}: {:?}", verify_tmp_root_path, e)) .and_then(|_| { std::process::Command::new("git") .args(["checkout", &commit_hash]) From 069fda3ef81c99aa54740bd7569d037000985cc9 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Thu, 22 Jun 2023 23:23:55 -0400 Subject: [PATCH 041/314] more logs --- src/main.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 50e4db0..33b26f8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -602,8 +602,13 @@ pub fn verify_from_repo( .stdout(Stdio::inherit()) .output()?; + std::process::Command::new("cd") + .args([&verify_dir]) + .stdout(Stdio::inherit()) + .output()?; + std::process::Command::new("ls") - .args(["-la", &verify_dir]) + .args(["-la"]) .stdout(Stdio::inherit()) .output()?; From b5a6ae6668c933920184e4f547f17c4e6c3df733 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Thu, 22 Jun 2023 23:26:50 -0400 Subject: [PATCH 042/314] use git -C --- src/main.rs | 28 ++++------------------------ 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/src/main.rs b/src/main.rs index 33b26f8..37c98a8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -597,33 +597,13 @@ pub fn verify_from_repo( .stdout(Stdio::inherit()) .output()?; - std::process::Command::new("ls") - .args(["-la"]) - .stdout(Stdio::inherit()) - .output()?; - - std::process::Command::new("cd") - .args([&verify_dir]) - .stdout(Stdio::inherit()) - .output()?; - - std::process::Command::new("ls") - .args(["-la"]) - .stdout(Stdio::inherit()) - .output()?; - // Checkout a specific commit hash, if provided if let Some(commit_hash) = commit_hash { - let result = std::process::Command::new("cd") - .arg(&verify_tmp_root_path) + let result = std::process::Command::new("git") + .args(["-C", &verify_tmp_root_path]) + .args(["checkout", &commit_hash]) .output() - .map_err(|e| anyhow!("Failed to cd into {}: {:?}", verify_tmp_root_path, e)) - .and_then(|_| { - std::process::Command::new("git") - .args(["checkout", &commit_hash]) - .output() - .map_err(|e| anyhow!("Failed to checkout commit hash: {:?}", e)) - }); + .map_err(|e| anyhow!("Failed to checkout commit hash: {:?}", e)); if result.is_ok() { println!("Checked out commit hash: {}", commit_hash); } else { From 2ce9333d9421c9b27a83915c27ff7291880bd9af Mon Sep 17 00:00:00 2001 From: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> Date: Thu, 22 Jun 2023 23:38:05 -0400 Subject: [PATCH 043/314] Update README.md Signed-off-by: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> --- README.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/README.md b/README.md index 915c909..ffb4d87 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,30 @@ To install the Solana Verify cli, run the following in your shell: ``` bash <(curl -sSf https://raw.githubusercontent.com/Ellipsis-Labs/solana-verifiable-build/master/verifier-cli-install.sh) ``` +## Mainnet Verified Programs +### Phoenix +``` +solana-verify verify-from-repo -um --program-id PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY https://github.com/Ellipsis-Labs/phoenix-v1 +``` +Fianl Output: +``` +Executable Program Hash from repo: 7c76ba11f8742d040b1a874d943c2096f1b3a48db14d2a5b411fd5dad5d1bc2d +On-chain Program Hash: 7c76ba11f8742d040b1a874d943c2096f1b3a48db14d2a5b411fd5dad5d1bc2d +Program hash matches ✅ +``` + +### Squads V3 +``` +solana-verify verify-from-repo https://github.com/Squads-Protocol/squads-mpl --commit-hash c95b7673d616c377a349ca424261872dfcf8b19d --program-id SMPLecH534NA9acpos4G6x7uf3LWbCAwZQE9e8ZekMu -um --library-name squads_mpl --bpf +``` +(Note: we needed to specify the `library-name` because the Squads repo includes multiple programs. We use the `--bpf` flag because `squads_mpl` was previously verified with Anchor.) + +Final Output: +``` +Executable Program Hash from repo: 72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205c +On-chain Program Hash: 72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205c +Program hash matches ✅ +``` ## Example Walkthrough From d822c6b9c730d94b918dbd85bab8a9d2dc1e3dd2 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Thu, 22 Jun 2023 23:42:06 -0400 Subject: [PATCH 044/314] fix small bug --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 37c98a8..a63e315 100644 --- a/src/main.rs +++ b/src/main.rs @@ -221,8 +221,8 @@ fn main() -> anyhow::Result<()> { workdir, cargo_args, current_dir, - &mut temp_dir, &mut container_id, + &mut temp_dir, ), }; From 09b0fa3292214aaa5acf287d3fedbc5568f521f1 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Thu, 22 Jun 2023 23:47:12 -0400 Subject: [PATCH 045/314] ubuntu bug --- src/main.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main.rs b/src/main.rs index a63e315..0a5c2aa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -363,6 +363,8 @@ pub fn build( Ok(name) => { if name == library_name.clone().unwrap_or_default() { package_name = get_pkg_name_from_cargo_toml(p); + println!("Package name: {:?}", package_name); + println!("Cargo path: {}", p); return Ok(p .to_string() .replace("/Cargo.toml", "") From 7d271b2e6da53128c57d2d3b6339e8fe16261c59 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Thu, 22 Jun 2023 23:48:27 -0400 Subject: [PATCH 046/314] dbg --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 0a5c2aa..71ac7c2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -364,7 +364,7 @@ pub fn build( if name == library_name.clone().unwrap_or_default() { package_name = get_pkg_name_from_cargo_toml(p); println!("Package name: {:?}", package_name); - println!("Cargo path: {}", p); + println!("Cargo path: {}", p.replace(&mount_path, "")); return Ok(p .to_string() .replace("/Cargo.toml", "") From 78faab2f2bf9c5374512bc3d4cf5709d7242a7bd Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Thu, 22 Jun 2023 23:50:06 -0400 Subject: [PATCH 047/314] fix small bug --- src/main.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index 71ac7c2..558d26c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -363,11 +363,9 @@ pub fn build( Ok(name) => { if name == library_name.clone().unwrap_or_default() { package_name = get_pkg_name_from_cargo_toml(p); - println!("Package name: {:?}", package_name); - println!("Cargo path: {}", p.replace(&mount_path, "")); return Ok(p .to_string() - .replace("/Cargo.toml", "") + .replace("Cargo.toml", "") .replace(&mount_path, "")); } } From dfe9678ad213d8eba28d4c6844a0dd7bb8f03571 Mon Sep 17 00:00:00 2001 From: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> Date: Fri, 23 Jun 2023 00:04:50 -0400 Subject: [PATCH 048/314] Update README.md Signed-off-by: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ffb4d87..ade68d2 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ bash <(curl -sSf https://raw.githubusercontent.com/Ellipsis-Labs/solana-verifiab ``` solana-verify verify-from-repo -um --program-id PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY https://github.com/Ellipsis-Labs/phoenix-v1 ``` -Fianl Output: +Final Output: ``` Executable Program Hash from repo: 7c76ba11f8742d040b1a874d943c2096f1b3a48db14d2a5b411fd5dad5d1bc2d On-chain Program Hash: 7c76ba11f8742d040b1a874d943c2096f1b3a48db14d2a5b411fd5dad5d1bc2d From b0c88ade310af7d31897f2bac95e2ea32e426481 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Wed, 5 Jul 2023 16:23:27 -0400 Subject: [PATCH 049/314] remove workdir and change static docker images to use hashes --- Dockerfile | 11 ++--- src/main.rs | 135 +++++++++++----------------------------------------- 2 files changed, 32 insertions(+), 114 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4a5ad47..30a3151 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,8 @@ -FROM solanalabs/rust:1.68.0 - -RUN apt-get update && apt-get install -qy clang libudev-dev tmux vim git netcat zsh - -WORKDIR /build +FROM --platform=linux/amd64 rust:1.68.0 +RUN apt-get update && apt-get install -qy git RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.14/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -CMD /bin/zsh +WORKDIR /build + +CMD /bin/bash diff --git a/src/main.rs b/src/main.rs index a63e315..e074c10 100644 --- a/src/main.rs +++ b/src/main.rs @@ -55,9 +55,6 @@ enum SubCommand { /// If the program requires cargo build-bpf (instead of cargo build-sbf), as for anchor program, set this flag #[clap(long, default_value = "false")] bpf: bool, - /// Docker workdir - #[clap(long)] - workdir: Option, /// Arguments to pass to the underlying `cargo build-bpf` command #[clap(required = false, last = true)] cargo_args: Vec, @@ -73,9 +70,6 @@ enum SubCommand { /// The Program ID of the program to verify #[clap(short, long)] program_id: Pubkey, - /// Docker workdir - #[clap(long, default_value = "build")] - workdir: String, /// Verify in current directory #[clap(long, default_value = "false")] current_dir: bool, @@ -120,9 +114,6 @@ enum SubCommand { /// If the program requires cargo build-bpf (instead of cargo build-sbf), as for an Anchor program, set this flag #[clap(long, default_value = "false")] bpf: bool, - /// Docker workdir - #[clap(long)] - workdir: Option, /// Verify in current directory #[clap(long, default_value = "false")] current_dir: bool, @@ -156,14 +147,12 @@ fn main() -> anyhow::Result<()> { library_name, base_image, bpf: bpf_flag, - workdir, cargo_args, } => build( mount_directory, library_name, base_image, bpf_flag, - workdir, cargo_args, &mut container_id, ), @@ -171,14 +160,12 @@ fn main() -> anyhow::Result<()> { executable_path_in_image: executable_path, image, program_id, - workdir, current_dir, } => verify_from_image( executable_path, image, args.url, program_id, - workdir, current_dir, &mut temp_dir, &mut container_id, @@ -206,7 +193,6 @@ fn main() -> anyhow::Result<()> { base_image, library_name, bpf: bpf_flag, - workdir, cargo_args, current_dir, } => verify_from_repo( @@ -218,7 +204,6 @@ fn main() -> anyhow::Result<()> { base_image, library_name, bpf_flag, - workdir, cargo_args, current_dir, &mut container_id, @@ -311,7 +296,6 @@ pub fn build( library_name: Option, base_image: Option, bpf_flag: bool, - workdir_opt: Option, cargo_args: Vec, container_id_opt: &mut Option, ) -> anyhow::Result<()> { @@ -330,18 +314,16 @@ pub fn build( return Err(anyhow!(format!("No lockfile found at {}", lockfile))); } - let is_anchor = std::path::Path::new(&format!("{}/Anchor.toml", mount_path)).exists(); - let build_command = if bpf_flag || is_anchor { - "build-bpf" - } else { - "build-sbf" - }; + let build_command = if bpf_flag { "build-bpf" } else { "build-sbf" }; let image = base_image.unwrap_or_else(|| { - if bpf_flag || is_anchor { - "projectserum/build:v0.26.0" + if bpf_flag { + // Use this for backwards compatibility with anchor verified builds + "projectserum/build@sha256:75b75eab447ebcca1f471c98583d9b5d82c4be122c470852a022afcf9c98bead" } else { - "ellipsislabs/solana:latest" + // TODO: Update this to route to a different docker image based off the Solana version + // in the Cargo.lock file + "ellipsislabs/solana@sha256:eb050ec6c9f83df67324bb2e36b971b9ae162a4f1db6b314af889d6d6e939315" } .to_string() }); @@ -378,16 +360,16 @@ pub fn build( }) .unwrap_or_else(|_| "".to_string()); - let workdir = workdir_opt.unwrap_or_else(|| { - if bpf_flag || is_anchor { - "workdir" - } else { - "build" - } - .to_string() - }); + let workdir = std::process::Command::new("docker") + .args(["run", "--rm", &image, "pwd"]) + .stderr(Stdio::inherit()) + .output() + .map_err(|e| anyhow::format_err!("Failed to get workdir: {}", e.to_string())) + .and_then(|output| parse_output(output.stdout))?; + + println!("Workdir: {}", workdir); - let build_path = format!("/{}/{}", workdir, relative_build_path); + let build_path = format!("{}/{}", workdir, relative_build_path); println!("Building program at {}", build_path); let package_filter = package_name @@ -400,7 +382,7 @@ pub fn build( } // change directory to program/build dir - let mount_params = format!("{}:/{}", mount_path, workdir); + let mount_params = format!("{}:{}", mount_path, workdir); let container_id = std::process::Command::new("docker") .args(["run", "--rm", "-v", &mount_params, "-dit", &image, "bash"]) .stderr(Stdio::inherit()) @@ -462,7 +444,6 @@ pub fn verify_from_image( image: String, network: Option, program_id: Pubkey, - workdir: String, current_dir: bool, temp_dir: &mut Option, container_id_opt: &mut Option, @@ -474,6 +455,15 @@ pub fn verify_from_image( println!("Executable path in container: {:?}", executable_path); println!(" "); + let workdir = std::process::Command::new("docker") + .args(["run", "--rm", &image, "pwd"]) + .stderr(Stdio::inherit()) + .output() + .map_err(|e| anyhow::format_err!("Failed to get workdir: {}", e.to_string())) + .and_then(|output| parse_output(output.stdout))?; + + println!("Workdir: {}", workdir); + let container_id = std::process::Command::new("docker") .args(["run", "--rm", "-dit", image.as_str()]) .output() @@ -502,11 +492,10 @@ pub fn verify_from_image( temp_dir.replace(verify_dir.clone()); let program_filepath = format!("{}/program.so", verify_dir); - std::process::Command::new("docker") .args([ "cp", - format!("{}:/{}/{}", container_id, workdir, executable_path).as_str(), + format!("{}:{}/{}", container_id, workdir, executable_path).as_str(), program_filepath.as_str(), ]) .stdout(Stdio::inherit()) @@ -557,7 +546,6 @@ pub fn verify_from_repo( base_image: Option, library_name_opt: Option, bpf_flag: bool, - workdir: Option, cargo_args: Vec, current_dir: bool, container_id_opt: &mut Option, @@ -670,7 +658,6 @@ pub fn verify_from_repo( library_name, connection_url, program_id, - workdir, cargo_args, container_id_opt, ); @@ -704,7 +691,6 @@ pub fn build_and_verify_repo( library_name: String, connection_url: Option, program_id: Pubkey, - workdir: Option, cargo_args: Vec, container_id_opt: &mut Option, ) -> anyhow::Result<(String, String)> { @@ -715,7 +701,6 @@ pub fn build_and_verify_repo( Some(library_name), base_image, bpf_flag, - workdir, cargo_args, container_id_opt, )?; @@ -790,69 +775,3 @@ pub fn get_pkg_name_from_cargo_toml(cargo_toml_file: &str) -> Option { let pkg = manifest.package?; Some(pkg.name) } - -pub fn get_rust_version_for_solana_version( - major: u32, - minor: u32, - patch: u32, -) -> anyhow::Result { - let release = format!("v{}.{}.{}", major, minor, patch); - if minor > 14 { - // https://github.com/solana-labs/solana/commit/cdb204114ef529f9f63d4b5a995e0429919e3131 - // This is the first commit that moves the rust version to rust-toolchain.toml (1.15.0) - let endpoint = format!( - "https://raw.githubusercontent.com/solana-labs/solana/{}/rust-toolchain.toml", - release - ); - let body = reqwest::blocking::get(endpoint)?.text()?; - body.split("\n") - .skip(1) - .next() - .ok_or_else(|| anyhow!("Failed to parse rust version")) - .map(|s| s.to_string().replace("channel = ", "").replace("\"", "")) - } else { - // For all previous releases, the rust version is in ci/rust-version.sh on line 21 - let endpoint = format!( - "https://raw.githubusercontent.com/solana-labs/solana/{}/ci/rust-version.sh", - release - ); - let body = reqwest::blocking::get(endpoint)?.text()?; - body.split("\n") - .filter(|s| s.contains("stable_version")) - .skip(1) - .next() - .ok_or_else(|| anyhow!("Failed to parse rust version")) - .map(|s| { - s.to_string() - .replace("stable_version=", "") - .replace(" ", "") - }) - } -} - -#[test] -fn test_rust_version() { - for major in [1] { - for minor in 10..18 { - for patch in 0..30 { - let res = get_rust_version_for_solana_version(major, minor, patch); - if res.is_err() { - break; - } - println!("{}.{}.{}: {}", major, minor, patch, res.unwrap()); - } - } - } -} - -#[test] -fn test_parse_cargo_log() { - let res = get_pkg_version_from_cargo_lock("solana-program", "examples/hello_world/Cargo.lock") - .unwrap(); - println!("{:?}", res); - let (major, minor, patch) = res; - println!( - "{:?}", - get_rust_version_for_solana_version(major, minor, patch).unwrap() - ); -} From 54543b64a0c14708046bb6f76aa85c9f7ac09aa0 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Wed, 5 Jul 2023 16:30:58 -0400 Subject: [PATCH 050/314] add license and description --- Cargo.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 8ffd5df..28df084 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,8 @@ name = "solana-verify" version = "0.2.0" edition = "2021" +description = "A CLI tool for building verifiable Solana programs" +license = "MIT" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From 400476128c77731c84bb73af1133fa60ca128d4f Mon Sep 17 00:00:00 2001 From: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> Date: Wed, 5 Jul 2023 16:35:22 -0400 Subject: [PATCH 051/314] Update README.md Signed-off-by: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ade68d2..f041dbe 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,9 @@ Once the installation is complete, make sure that the server has been started: ( To install the Solana Verify cli, run the following in your shell: ``` -bash <(curl -sSf https://raw.githubusercontent.com/Ellipsis-Labs/solana-verifiable-build/master/verifier-cli-install.sh) +cargo install solana-verify ``` + ## Mainnet Verified Programs ### Phoenix ``` From 926673ed965edbcf3aea470ed7ede810f09e541a Mon Sep 17 00:00:00 2001 From: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> Date: Wed, 5 Jul 2023 16:50:02 -0400 Subject: [PATCH 052/314] Update README.md Signed-off-by: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f041dbe..4d4ef94 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,14 @@ In order for this CLI to work properly, you must have `docker` installed on your Once the installation is complete, make sure that the server has been started: (https://docs.docker.com/config/daemon/start/) -To install the Solana Verify cli, run the following in your shell: +You will also need to install Cargo if you don't already have it. + +Run the following command in your shell to install it (or visit https://rustup.rs/): +``` +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +``` + +Finally, to install the Solana Verify cli, run the following in your shell: ``` cargo install solana-verify From 6b8e289454ef5e6ca32a91944a7a4a33a0804ddb Mon Sep 17 00:00:00 2001 From: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> Date: Thu, 6 Jul 2023 11:30:23 -0400 Subject: [PATCH 053/314] Update README.md Signed-off-by: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> --- README.md | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/README.md b/README.md index 4d4ef94..84235cd 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,57 @@ Finally, to install the Solana Verify cli, run the following in your shell: cargo install solana-verify ``` +## Building Verifiable Programs + +To verifiably build your Solana program, go to the directory with the workspace Cargo.toml file and run the following: +``` +solana-verify build +``` + +If you're working in a repository with multiple programs, in order to build a specific program, `$PROGRAM_LIB_NAME`, run the following: +``` +solana-verify build --library-name $PROGRAM_LIB_NAME +``` +The string that's passed in must be the *lib* name and NOT the *package* name. These are usually the same, but the distinction is important. +![image](https://github.com/Ellipsis-Labs/solana-verifiable-build/assets/61092285/0427e88f-cc0f-465f-b2e9-747ea1b8d3af) + + +(NOTE: These commands can take up to 30 minutes if you're running on an M1 Macbook Pro. This has to do with the architecture emulation required to ensure build determinism. For best performance, it is recommended to run builds on a Linux machine running x86) + +You can now print the executable hash of the program by running the following: +``` +solana-verify get-executable-hash target/deploy/$PROGRAM_LIB_NAME.so +``` + + +## Deploying Verifiable Programs + +When the build completes, the executable file in `target/deploy/$PROGRAM_LIB_NAME.so` will contain the buffer to upload to the network. + +In order to directly upload the program to chain (NOT RECOMMENDED), run the following: +``` +solana program deploy -u $NETWORK_URL target/deploy/$PROGRAM_LIB_NAME.so --program-id $PROGRAM_ID --upgrade-authority $UPDGRADE_AUTHORITY +``` +The same caveats apply as any normal deployment. See the Solana [docs](https://docs.solana.com/cli/deploy-a-program) for more details. + +Once the upload is completed, you can verify that the program hash matches the executable hash computed in the previous step: +``` +solana-verify get-program-hash -u $NETWORK_URL $PROGRAM_ID +``` + +The recommended approach for deploying program is to use (Squads V3)[https://docs.squads.so/squads-v3-docs/navigating-your-squad/developers/programs]. + +To upgrade a verifiable build, run the following to upload the program buffer: +``` +solana program write-buffer -u $NETWORK_URL target/deploy/$PROGRAM_LIB_NAME.so +``` + +This command will output a `$BUFFER_ADDRESS`. Before voting you upgrade the program, verify that the following command produces an identical hash to executable hash (built from the previous step) +``` +solana-verify get-buffer-hash -u $NETWORK_URL $BUFFER_ADDRESS +``` + + ## Mainnet Verified Programs ### Phoenix ``` From ae5e16735796c1ffd44169cd2898feafa954d825 Mon Sep 17 00:00:00 2001 From: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> Date: Thu, 6 Jul 2023 11:49:02 -0400 Subject: [PATCH 054/314] Update README.md Signed-off-by: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 84235cd..87aee84 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ Once the upload is completed, you can verify that the program hash matches the e solana-verify get-program-hash -u $NETWORK_URL $PROGRAM_ID ``` -The recommended approach for deploying program is to use (Squads V3)[https://docs.squads.so/squads-v3-docs/navigating-your-squad/developers/programs]. +The recommended approach for deploying program is to use [Squads V3](https://docs.squads.so/squads-v3-docs/navigating-your-squad/developers/programs). To upgrade a verifiable build, run the following to upload the program buffer: ``` From 02abf15612942553777f8d863aeb0b45bfafd211 Mon Sep 17 00:00:00 2001 From: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> Date: Thu, 6 Jul 2023 11:49:27 -0400 Subject: [PATCH 055/314] Update README.md Signed-off-by: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 87aee84..29b64c7 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ To upgrade a verifiable build, run the following to upload the program buffer: solana program write-buffer -u $NETWORK_URL target/deploy/$PROGRAM_LIB_NAME.so ``` -This command will output a `$BUFFER_ADDRESS`. Before voting you upgrade the program, verify that the following command produces an identical hash to executable hash (built from the previous step) +This command will output a `$BUFFER_ADDRESS`. Before voting to upgrade the program, verify that the following command produces an identical hash to executable hash (built from the previous step) ``` solana-verify get-buffer-hash -u $NETWORK_URL $BUFFER_ADDRESS ``` From 3d0c5406e4b05dc3460547c611065927237a5b34 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Fri, 7 Jul 2023 16:22:23 -0400 Subject: [PATCH 056/314] Update docker image to not fail on large fetches --- Dockerfile | 2 +- src/main.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 30a3151..8061f39 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM --platform=linux/amd64 rust:1.68.0 -RUN apt-get update && apt-get install -qy git +RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.14/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build diff --git a/src/main.rs b/src/main.rs index 586fd69..c1a2108 100644 --- a/src/main.rs +++ b/src/main.rs @@ -323,7 +323,7 @@ pub fn build( } else { // TODO: Update this to route to a different docker image based off the Solana version // in the Cargo.lock file - "ellipsislabs/solana@sha256:eb050ec6c9f83df67324bb2e36b971b9ae162a4f1db6b314af889d6d6e939315" + "ellipsislabs/solana@sha256:7b002dfaa945f6d293a9458f816c2972b9238439280c02d51cfa6d637d16875e" } .to_string() }); From 33f5d432031cc44c1fbb892b2faa7c75f9cde0ee Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Fri, 7 Jul 2023 16:22:52 -0400 Subject: [PATCH 057/314] bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9177949..55e8f69 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3490,7 +3490,7 @@ dependencies = [ [[package]] name = "solana-verify" -version = "0.2.0" +version = "0.2.1" dependencies = [ "anyhow", "cargo-lock", diff --git a/Cargo.toml b/Cargo.toml index 28df084..e7e5c92 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "solana-verify" -version = "0.2.0" +version = "0.2.1" edition = "2021" description = "A CLI tool for building verifiable Solana programs" license = "MIT" From 8ea79cc7f9b7152e558ca9bf94e1ec71210d88e1 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Fri, 7 Jul 2023 17:07:03 -0400 Subject: [PATCH 058/314] use manifest path instead of package --- src/main.rs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main.rs b/src/main.rs index c1a2108..8178cc3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -328,7 +328,7 @@ pub fn build( .to_string() }); - let mut package_name = None; + let mut manifest_path = None; let relative_build_path = std::process::Command::new("find") .args([&mount_path, "-name", "Cargo.toml"]) @@ -344,7 +344,7 @@ pub fn build( match get_lib_name_from_cargo_toml(p) { Ok(name) => { if name == library_name.clone().unwrap_or_default() { - package_name = get_pkg_name_from_cargo_toml(p); + manifest_path = Some(p.to_string().replace(&mount_path, "")); return Ok(p .to_string() .replace("Cargo.toml", "") @@ -372,13 +372,17 @@ pub fn build( let build_path = format!("{}/{}", workdir, relative_build_path); println!("Building program at {}", build_path); - let package_filter = package_name + let manifest_path_filter = manifest_path .clone() - .map(|pkg| vec!["-p".to_string(), pkg]) + .map(|m| vec!["--manifest-path".to_string(), format!("{}/{}", workdir, m)]) .unwrap_or_else(|| vec![]); - if package_name.is_some() { - println!("Building package: {}", package_name.unwrap()); + if manifest_path.is_some() { + println!( + "Building manifest path: {}/{}", + workdir, + manifest_path.unwrap() + ); } // change directory to program/build dir @@ -414,7 +418,7 @@ pub fn build( std::process::Command::new("docker") .args(["exec", "-w", &build_path, &container_id]) .args(["cargo", build_command, "--", "--locked", "--frozen"]) - .args(package_filter) + .args(manifest_path_filter) .args(cargo_args) .stderr(Stdio::inherit()) .stdout(Stdio::inherit()) From bc0d9691960dab79df7e1a9de3a274b2d5730707 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Fri, 7 Jul 2023 17:07:46 -0400 Subject: [PATCH 059/314] bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 55e8f69..7df1e4f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3490,7 +3490,7 @@ dependencies = [ [[package]] name = "solana-verify" -version = "0.2.1" +version = "0.2.2" dependencies = [ "anyhow", "cargo-lock", diff --git a/Cargo.toml b/Cargo.toml index e7e5c92..d5dc012 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "solana-verify" -version = "0.2.1" +version = "0.2.2" edition = "2021" description = "A CLI tool for building verifiable Solana programs" license = "MIT" From 54811e80ee7b85c5e9c092b2ac5b39b20f272ac5 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Mon, 10 Jul 2023 16:14:48 -0400 Subject: [PATCH 060/314] Add dockerfiles and script to generate dockerfiles --- docker/v1.14.0.Dockerfile | 8 +++ docker/v1.14.1.Dockerfile | 8 +++ docker/v1.14.10.Dockerfile | 8 +++ docker/v1.14.11.Dockerfile | 8 +++ docker/v1.14.12.Dockerfile | 8 +++ docker/v1.14.13.Dockerfile | 8 +++ Dockerfile => docker/v1.14.14.Dockerfile | 4 +- docker/v1.14.15.Dockerfile | 8 +++ docker/v1.14.16.Dockerfile | 8 +++ docker/v1.14.17.Dockerfile | 8 +++ docker/v1.14.18.Dockerfile | 8 +++ docker/v1.14.19.Dockerfile | 8 +++ docker/v1.14.2.Dockerfile | 8 +++ docker/v1.14.20.Dockerfile | 8 +++ docker/v1.14.3.Dockerfile | 8 +++ docker/v1.14.4.Dockerfile | 8 +++ docker/v1.14.5.Dockerfile | 8 +++ docker/v1.14.6.Dockerfile | 8 +++ docker/v1.14.7.Dockerfile | 8 +++ docker/v1.14.8.Dockerfile | 8 +++ docker/v1.14.9.Dockerfile | 8 +++ docker/v1.15.0.Dockerfile | 8 +++ docker/v1.15.1.Dockerfile | 8 +++ docker/v1.15.2.Dockerfile | 8 +++ docker/v1.16.0.Dockerfile | 8 +++ docker/v1.16.1.Dockerfile | 8 +++ docker/v1.16.2.Dockerfile | 8 +++ docker/v1.16.3.Dockerfile | 8 +++ generate_dockerfiles.py | 72 ++++++++++++++++++++++++ 29 files changed, 290 insertions(+), 2 deletions(-) create mode 100644 docker/v1.14.0.Dockerfile create mode 100644 docker/v1.14.1.Dockerfile create mode 100644 docker/v1.14.10.Dockerfile create mode 100644 docker/v1.14.11.Dockerfile create mode 100644 docker/v1.14.12.Dockerfile create mode 100644 docker/v1.14.13.Dockerfile rename Dockerfile => docker/v1.14.14.Dockerfile (64%) create mode 100644 docker/v1.14.15.Dockerfile create mode 100644 docker/v1.14.16.Dockerfile create mode 100644 docker/v1.14.17.Dockerfile create mode 100644 docker/v1.14.18.Dockerfile create mode 100644 docker/v1.14.19.Dockerfile create mode 100644 docker/v1.14.2.Dockerfile create mode 100644 docker/v1.14.20.Dockerfile create mode 100644 docker/v1.14.3.Dockerfile create mode 100644 docker/v1.14.4.Dockerfile create mode 100644 docker/v1.14.5.Dockerfile create mode 100644 docker/v1.14.6.Dockerfile create mode 100644 docker/v1.14.7.Dockerfile create mode 100644 docker/v1.14.8.Dockerfile create mode 100644 docker/v1.14.9.Dockerfile create mode 100644 docker/v1.15.0.Dockerfile create mode 100644 docker/v1.15.1.Dockerfile create mode 100644 docker/v1.15.2.Dockerfile create mode 100644 docker/v1.16.0.Dockerfile create mode 100644 docker/v1.16.1.Dockerfile create mode 100644 docker/v1.16.2.Dockerfile create mode 100644 docker/v1.16.3.Dockerfile create mode 100644 generate_dockerfiles.py diff --git a/docker/v1.14.0.Dockerfile b/docker/v1.14.0.Dockerfile new file mode 100644 index 0000000..11a2bd5 --- /dev/null +++ b/docker/v1.14.0.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.0/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.14.1.Dockerfile b/docker/v1.14.1.Dockerfile new file mode 100644 index 0000000..06efd15 --- /dev/null +++ b/docker/v1.14.1.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.1/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.14.10.Dockerfile b/docker/v1.14.10.Dockerfile new file mode 100644 index 0000000..7aa9dda --- /dev/null +++ b/docker/v1.14.10.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.10/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.14.11.Dockerfile b/docker/v1.14.11.Dockerfile new file mode 100644 index 0000000..2de1346 --- /dev/null +++ b/docker/v1.14.11.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.11/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.14.12.Dockerfile b/docker/v1.14.12.Dockerfile new file mode 100644 index 0000000..4628927 --- /dev/null +++ b/docker/v1.14.12.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.12/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.14.13.Dockerfile b/docker/v1.14.13.Dockerfile new file mode 100644 index 0000000..6210cb4 --- /dev/null +++ b/docker/v1.14.13.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.13/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/Dockerfile b/docker/v1.14.14.Dockerfile similarity index 64% rename from Dockerfile rename to docker/v1.14.14.Dockerfile index 8061f39..dd8754d 100644 --- a/Dockerfile +++ b/docker/v1.14.14.Dockerfile @@ -1,8 +1,8 @@ -FROM --platform=linux/amd64 rust:1.68.0 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.14/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.14.15.Dockerfile b/docker/v1.14.15.Dockerfile new file mode 100644 index 0000000..6b9aac5 --- /dev/null +++ b/docker/v1.14.15.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.15/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.14.16.Dockerfile b/docker/v1.14.16.Dockerfile new file mode 100644 index 0000000..9cf9a02 --- /dev/null +++ b/docker/v1.14.16.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.16/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.14.17.Dockerfile b/docker/v1.14.17.Dockerfile new file mode 100644 index 0000000..800c003 --- /dev/null +++ b/docker/v1.14.17.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.17/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.14.18.Dockerfile b/docker/v1.14.18.Dockerfile new file mode 100644 index 0000000..026c296 --- /dev/null +++ b/docker/v1.14.18.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.18/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.14.19.Dockerfile b/docker/v1.14.19.Dockerfile new file mode 100644 index 0000000..005676a --- /dev/null +++ b/docker/v1.14.19.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.19/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.14.2.Dockerfile b/docker/v1.14.2.Dockerfile new file mode 100644 index 0000000..5b96409 --- /dev/null +++ b/docker/v1.14.2.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.2/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.14.20.Dockerfile b/docker/v1.14.20.Dockerfile new file mode 100644 index 0000000..6b61373 --- /dev/null +++ b/docker/v1.14.20.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.20/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.14.3.Dockerfile b/docker/v1.14.3.Dockerfile new file mode 100644 index 0000000..642ce42 --- /dev/null +++ b/docker/v1.14.3.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.3/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.14.4.Dockerfile b/docker/v1.14.4.Dockerfile new file mode 100644 index 0000000..1c6d8d5 --- /dev/null +++ b/docker/v1.14.4.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.4/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.14.5.Dockerfile b/docker/v1.14.5.Dockerfile new file mode 100644 index 0000000..75f10b2 --- /dev/null +++ b/docker/v1.14.5.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.5/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.14.6.Dockerfile b/docker/v1.14.6.Dockerfile new file mode 100644 index 0000000..4c70013 --- /dev/null +++ b/docker/v1.14.6.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.6/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.14.7.Dockerfile b/docker/v1.14.7.Dockerfile new file mode 100644 index 0000000..3dea53c --- /dev/null +++ b/docker/v1.14.7.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.7/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.14.8.Dockerfile b/docker/v1.14.8.Dockerfile new file mode 100644 index 0000000..83fdb7a --- /dev/null +++ b/docker/v1.14.8.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.8/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.14.9.Dockerfile b/docker/v1.14.9.Dockerfile new file mode 100644 index 0000000..75270e3 --- /dev/null +++ b/docker/v1.14.9.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.9/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.15.0.Dockerfile b/docker/v1.15.0.Dockerfile new file mode 100644 index 0000000..ccf858a --- /dev/null +++ b/docker/v1.15.0.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.15.0/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.15.1.Dockerfile b/docker/v1.15.1.Dockerfile new file mode 100644 index 0000000..93e67ff --- /dev/null +++ b/docker/v1.15.1.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.15.1/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.15.2.Dockerfile b/docker/v1.15.2.Dockerfile new file mode 100644 index 0000000..a21a323 --- /dev/null +++ b/docker/v1.15.2.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.15.2/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.16.0.Dockerfile b/docker/v1.16.0.Dockerfile new file mode 100644 index 0000000..b9437a7 --- /dev/null +++ b/docker/v1.16.0.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.0/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.16.1.Dockerfile b/docker/v1.16.1.Dockerfile new file mode 100644 index 0000000..582f4a2 --- /dev/null +++ b/docker/v1.16.1.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.1/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.16.2.Dockerfile b/docker/v1.16.2.Dockerfile new file mode 100644 index 0000000..84a1592 --- /dev/null +++ b/docker/v1.16.2.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.2/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/docker/v1.16.3.Dockerfile b/docker/v1.16.3.Dockerfile new file mode 100644 index 0000000..3539d07 --- /dev/null +++ b/docker/v1.16.3.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.3/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash \ No newline at end of file diff --git a/generate_dockerfiles.py b/generate_dockerfiles.py new file mode 100644 index 0000000..e408104 --- /dev/null +++ b/generate_dockerfiles.py @@ -0,0 +1,72 @@ +import subprocess +import os +import argparse + +parser = argparse.ArgumentParser() +parser.add_argument("--upload", action="store_true") +args = parser.parse_args() + +VERSION_PLACEHOLDER = "$VERSION" + +base_dockerfile_text = f""" +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/{VERSION_PLACEHOLDER}/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash +""" + +output = subprocess.check_output( + ["git", "ls-remote", "--tags", "https://github.com/solana-labs/solana"] +) + + +def check_version(version_str): + try: + [major, minor, _patch] = version_str.strip("v").split(".") + return int(major) >= 1 and int(minor) >= 14 + except Exception as e: + return False + + +tags = list( + filter( + check_version, + [ + elem.split("\t")[1].split("/")[-1] + for elem in output.decode("utf-8").split("\n") + if elem + ], + ) +) + +dockerfiles = {} + +for release in tags: + dockerfile = base_dockerfile_text.replace(VERSION_PLACEHOLDER, release).strip("\n") + path = f"docker/{release}.Dockerfile" + with open(path, "w") as f: + f.write(dockerfile) + dockerfiles[release] = path + +if args.upload: + print("Uploading all Dockerfiles") + for tag, dockerfile in dockerfiles.items(): + # Strip the `v` from the tag to keep the versions consistent in Docker + version_tag = f"solana:{tag.strip('v')}" + print(version_tag) + current_directory = os.getcwd() + res = subprocess.call( + f"docker build -t {version_tag} - < {current_directory}/{dockerfile}", + shell=True, + ) + if res == 0: + subprocess.call( + f"docker tag {version_tag} ellipsislabs/{version_tag}", shell=True + ) + subprocess.call(f"docker push ellipsislabs/{version_tag}", shell=True) + else: + continue From 88ba9bcfb270b3a61aeaac1df624e9aefb925dcb Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Mon, 10 Jul 2023 16:58:16 -0400 Subject: [PATCH 061/314] add newlines --- docker/v1.14.0.Dockerfile | 2 +- docker/v1.14.1.Dockerfile | 2 +- docker/v1.14.10.Dockerfile | 2 +- docker/v1.14.11.Dockerfile | 2 +- docker/v1.14.12.Dockerfile | 2 +- docker/v1.14.13.Dockerfile | 2 +- docker/v1.14.14.Dockerfile | 2 +- docker/v1.14.15.Dockerfile | 2 +- docker/v1.14.16.Dockerfile | 2 +- docker/v1.14.17.Dockerfile | 2 +- docker/v1.14.18.Dockerfile | 2 +- docker/v1.14.19.Dockerfile | 2 +- docker/v1.14.2.Dockerfile | 2 +- docker/v1.14.20.Dockerfile | 2 +- docker/v1.14.3.Dockerfile | 2 +- docker/v1.14.4.Dockerfile | 2 +- docker/v1.14.5.Dockerfile | 2 +- docker/v1.14.6.Dockerfile | 2 +- docker/v1.14.7.Dockerfile | 2 +- docker/v1.14.8.Dockerfile | 2 +- docker/v1.14.9.Dockerfile | 2 +- docker/v1.15.0.Dockerfile | 2 +- docker/v1.15.1.Dockerfile | 2 +- docker/v1.15.2.Dockerfile | 2 +- docker/v1.16.0.Dockerfile | 2 +- docker/v1.16.1.Dockerfile | 2 +- docker/v1.16.2.Dockerfile | 2 +- docker/v1.16.3.Dockerfile | 2 +- generate_dockerfiles.py | 2 +- 29 files changed, 29 insertions(+), 29 deletions(-) diff --git a/docker/v1.14.0.Dockerfile b/docker/v1.14.0.Dockerfile index 11a2bd5..4747b6a 100644 --- a/docker/v1.14.0.Dockerfile +++ b/docker/v1.14.0.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.0/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.14.1.Dockerfile b/docker/v1.14.1.Dockerfile index 06efd15..ded722d 100644 --- a/docker/v1.14.1.Dockerfile +++ b/docker/v1.14.1.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.1/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.14.10.Dockerfile b/docker/v1.14.10.Dockerfile index 7aa9dda..9da5c6f 100644 --- a/docker/v1.14.10.Dockerfile +++ b/docker/v1.14.10.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.10/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.14.11.Dockerfile b/docker/v1.14.11.Dockerfile index 2de1346..5b16d65 100644 --- a/docker/v1.14.11.Dockerfile +++ b/docker/v1.14.11.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.11/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.14.12.Dockerfile b/docker/v1.14.12.Dockerfile index 4628927..62b6bb1 100644 --- a/docker/v1.14.12.Dockerfile +++ b/docker/v1.14.12.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.12/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.14.13.Dockerfile b/docker/v1.14.13.Dockerfile index 6210cb4..4c5f406 100644 --- a/docker/v1.14.13.Dockerfile +++ b/docker/v1.14.13.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.13/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.14.14.Dockerfile b/docker/v1.14.14.Dockerfile index dd8754d..39a8722 100644 --- a/docker/v1.14.14.Dockerfile +++ b/docker/v1.14.14.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.14/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.14.15.Dockerfile b/docker/v1.14.15.Dockerfile index 6b9aac5..bb4da27 100644 --- a/docker/v1.14.15.Dockerfile +++ b/docker/v1.14.15.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.15/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.14.16.Dockerfile b/docker/v1.14.16.Dockerfile index 9cf9a02..69610aa 100644 --- a/docker/v1.14.16.Dockerfile +++ b/docker/v1.14.16.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.16/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.14.17.Dockerfile b/docker/v1.14.17.Dockerfile index 800c003..89c7aa1 100644 --- a/docker/v1.14.17.Dockerfile +++ b/docker/v1.14.17.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.17/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.14.18.Dockerfile b/docker/v1.14.18.Dockerfile index 026c296..90e7221 100644 --- a/docker/v1.14.18.Dockerfile +++ b/docker/v1.14.18.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.18/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.14.19.Dockerfile b/docker/v1.14.19.Dockerfile index 005676a..4bbaf1d 100644 --- a/docker/v1.14.19.Dockerfile +++ b/docker/v1.14.19.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.19/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.14.2.Dockerfile b/docker/v1.14.2.Dockerfile index 5b96409..ee2ca98 100644 --- a/docker/v1.14.2.Dockerfile +++ b/docker/v1.14.2.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.2/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.14.20.Dockerfile b/docker/v1.14.20.Dockerfile index 6b61373..f1a44b0 100644 --- a/docker/v1.14.20.Dockerfile +++ b/docker/v1.14.20.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.20/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.14.3.Dockerfile b/docker/v1.14.3.Dockerfile index 642ce42..4bab5a7 100644 --- a/docker/v1.14.3.Dockerfile +++ b/docker/v1.14.3.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.3/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.14.4.Dockerfile b/docker/v1.14.4.Dockerfile index 1c6d8d5..66dc294 100644 --- a/docker/v1.14.4.Dockerfile +++ b/docker/v1.14.4.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.4/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.14.5.Dockerfile b/docker/v1.14.5.Dockerfile index 75f10b2..0b91e9b 100644 --- a/docker/v1.14.5.Dockerfile +++ b/docker/v1.14.5.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.5/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.14.6.Dockerfile b/docker/v1.14.6.Dockerfile index 4c70013..191664d 100644 --- a/docker/v1.14.6.Dockerfile +++ b/docker/v1.14.6.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.6/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.14.7.Dockerfile b/docker/v1.14.7.Dockerfile index 3dea53c..cd1548e 100644 --- a/docker/v1.14.7.Dockerfile +++ b/docker/v1.14.7.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.7/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.14.8.Dockerfile b/docker/v1.14.8.Dockerfile index 83fdb7a..315646a 100644 --- a/docker/v1.14.8.Dockerfile +++ b/docker/v1.14.8.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.8/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.14.9.Dockerfile b/docker/v1.14.9.Dockerfile index 75270e3..2410937 100644 --- a/docker/v1.14.9.Dockerfile +++ b/docker/v1.14.9.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.9/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.15.0.Dockerfile b/docker/v1.15.0.Dockerfile index ccf858a..219d98a 100644 --- a/docker/v1.15.0.Dockerfile +++ b/docker/v1.15.0.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.15.0/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.15.1.Dockerfile b/docker/v1.15.1.Dockerfile index 93e67ff..05e799b 100644 --- a/docker/v1.15.1.Dockerfile +++ b/docker/v1.15.1.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.15.1/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.15.2.Dockerfile b/docker/v1.15.2.Dockerfile index a21a323..1000043 100644 --- a/docker/v1.15.2.Dockerfile +++ b/docker/v1.15.2.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.15.2/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.16.0.Dockerfile b/docker/v1.16.0.Dockerfile index b9437a7..d7b107e 100644 --- a/docker/v1.16.0.Dockerfile +++ b/docker/v1.16.0.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.0/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.16.1.Dockerfile b/docker/v1.16.1.Dockerfile index 582f4a2..72a511a 100644 --- a/docker/v1.16.1.Dockerfile +++ b/docker/v1.16.1.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.1/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.16.2.Dockerfile b/docker/v1.16.2.Dockerfile index 84a1592..3019fb1 100644 --- a/docker/v1.16.2.Dockerfile +++ b/docker/v1.16.2.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.2/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/docker/v1.16.3.Dockerfile b/docker/v1.16.3.Dockerfile index 3539d07..2b5792b 100644 --- a/docker/v1.16.3.Dockerfile +++ b/docker/v1.16.3.Dockerfile @@ -5,4 +5,4 @@ RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.3/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build -CMD /bin/bash \ No newline at end of file +CMD /bin/bash diff --git a/generate_dockerfiles.py b/generate_dockerfiles.py index e408104..78b855d 100644 --- a/generate_dockerfiles.py +++ b/generate_dockerfiles.py @@ -46,7 +46,7 @@ def check_version(version_str): dockerfiles = {} for release in tags: - dockerfile = base_dockerfile_text.replace(VERSION_PLACEHOLDER, release).strip("\n") + dockerfile = base_dockerfile_text.replace(VERSION_PLACEHOLDER, release).lstrip("\n") path = f"docker/{release}.Dockerfile" with open(path, "w") as f: f.write(dockerfile) From bf6d682751064ce35630bee1f749463b8deed858 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Mon, 10 Jul 2023 18:05:32 -0400 Subject: [PATCH 062/314] add python scripts and autogenerated code --- Cargo.lock | 1 + Cargo.toml | 1 + generate_dockerfiles.py | 25 +++++++++++++++++++++++- src/image_config.rs | 37 +++++++++++++++++++++++++++++++++++ src/main.rs | 40 ++++++++++++++++++++++++++++++++------ update_image_whitelist.py | 41 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 138 insertions(+), 7 deletions(-) create mode 100644 src/image_config.rs create mode 100644 update_image_whitelist.py diff --git a/Cargo.lock b/Cargo.lock index 7df1e4f..01c628c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3497,6 +3497,7 @@ dependencies = [ "cargo_toml", "clap 4.1.4", "hex 0.3.2", + "lazy_static", "pathdiff", "reqwest", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index d5dc012..d7e06da 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,6 +21,7 @@ pathdiff = "0.2.0" signal-hook = "0.3.15" reqwest = "0.11.18" cargo-lock = "9.0.0" +lazy_static = "1.4.0" [dependencies.uuid] version = "1.2.2" diff --git a/generate_dockerfiles.py b/generate_dockerfiles.py index 78b855d..1e20576 100644 --- a/generate_dockerfiles.py +++ b/generate_dockerfiles.py @@ -1,9 +1,11 @@ import subprocess import os import argparse +import requests parser = argparse.ArgumentParser() parser.add_argument("--upload", action="store_true") +parser.add_argument("--skip_cache", action="store_true") args = parser.parse_args() VERSION_PLACEHOLDER = "$VERSION" @@ -26,6 +28,9 @@ def check_version(version_str): try: + # Ignore this one + if version_str == "v1.14.0": + return False [major, minor, _patch] = version_str.strip("v").split(".") return int(major) >= 1 and int(minor) >= 14 except Exception as e: @@ -53,10 +58,28 @@ def check_version(version_str): dockerfiles[release] = path if args.upload: + digest_set = set() + if not args.skip_cache: + print("Fetching existing images") + response = requests.get( + "https://hub.docker.com/v2/namespaces/ellipsislabs/repositories/solana/tags?page_size=1000" + ) + for result in response.json()["results"]: + if result["name"] != "latest": + try: + digest_set.add(result["name"]) + except Exception as e: + print(e) + continue + print("Uploading all Dockerfiles") for tag, dockerfile in dockerfiles.items(): # Strip the `v` from the tag to keep the versions consistent in Docker - version_tag = f"solana:{tag.strip('v')}" + stripped_tag = tag.strip("v") + if stripped_tag in digest_set: + print(f"Already built image for {stripped_tag}, skipping") + continue + version_tag = f"solana:{stripped_tag}" print(version_tag) current_directory = os.getcwd() res = subprocess.call( diff --git a/src/image_config.rs b/src/image_config.rs new file mode 100644 index 0000000..52922c9 --- /dev/null +++ b/src/image_config.rs @@ -0,0 +1,37 @@ +/// THIS FILE IS AUTOGENERATED. DO NOT MODIFY +use lazy_static::lazy_static; +use std::collections::BTreeMap; + +lazy_static! { + pub static ref IMAGE_MAP: BTreeMap<(u32, u32, u32), &'static str> = { + let mut m = BTreeMap::new(); + m.insert((1, 14, 1), "sha256:987d26c8f94115d9a1ab0543aa3336340e55c7799e6ddc716c1a9c963f0bd031"); + m.insert((1, 14, 2), "sha256:d4bcffdb9403b154ceeab3063cc5a846a0b4d59a41a8b708249fcc4239b4129d"); + m.insert((1, 14, 3), "sha256:4adf5dfa0812d3b6835f65fb19687d705d057b7e7cb0cfe14abd240679e12de2"); + m.insert((1, 14, 4), "sha256:67cf2a1be16075ca0b53325212c03f48624ca68cdd86dcaaf5a06ff18e959fae"); + m.insert((1, 14, 5), "sha256:608c50412eb0459b0c894117c1e468a480a6f4ea38c4c074e85fc565ecd29214"); + m.insert((1, 14, 6), "sha256:167ed207752e2ec495851e096bf56c1a276b3330e754b322d401c1087a31f540"); + m.insert((1, 14, 7), "sha256:b73ccf1e636e278e20c5789b3d3be3e4a72e7813350a93e2ef39a66933175272"); + m.insert((1, 14, 8), "sha256:a1f76a938980f4bd05ac92829660a781cab167a9a8dd2179787cf23a17526502"); + m.insert((1, 14, 9), "sha256:073eb70e7fa3be8c7d7809e03bdedcf7ddd8744c8004921151c7b1c19fe760fd"); + m.insert((1, 14, 10), "sha256:cbfbe8952496bb22130f6857698491a63a4832f3f8576e469543202ccbfea796"); + m.insert((1, 14, 11), "sha256:e82b7df2bb23e6031a04b99e361acb0340b86857e9ad6c76db61fe65757166fd"); + m.insert((1, 14, 12), "sha256:15341a61fcee68cd04f0b0b566e8c2a00978899b3d98aa34e4a30bfac7d6deea"); + m.insert((1, 14, 13), "sha256:4976bd71a0bfa868c28c456bfb080ac59719c570ca6eb0917b445851c4615af4"); + m.insert((1, 14, 14), "sha256:2700fb6433143e6e8c66ba3dffbad50f001e80c1b4e86815f94b32323f05332d"); + m.insert((1, 14, 15), "sha256:0cf3a1945d24f2525e165ddef8b173d8a4387563477fbbae6696c15f4c51e26e"); + m.insert((1, 14, 16), "sha256:c6d3797b4a7790163049933c361ea2a74b4dff8d6a42434e6a04d0d82c04eda0"); + m.insert((1, 14, 17), "sha256:2aa6adc2a856df8977a332f089ab352211eb28812823121e3b5aedd6bbb89df1"); + m.insert((1, 14, 18), "sha256:fe75071a171f817799cb33821f7d680d594d6f066440c9a4c3fd54b55b681439"); + m.insert((1, 14, 19), "sha256:3e567c978dfc782f60c4ce768738cfacc5c36bd005becd1c14379b120d8f9174"); + m.insert((1, 14, 20), "sha256:e9501544d3d085bbbff7c100898ce29bf085dd8c851fb85a73b00f72b2ce7c4c"); + m.insert((1, 15, 0), "sha256:a757e2fae64c17273a8ca4dbd4951c427a95df677fe180bbab9e14744aa3aa0b"); + m.insert((1, 15, 1), "sha256:bade492bb15e8485ff5a392146d38e4e655b656040b85ddd758eb7383d35e148"); + m.insert((1, 15, 2), "sha256:004336407be9e14a2ca84ba8a81ca4f585a354c0279c23dc3f141a4c53d7fdea"); + m.insert((1, 16, 0), "sha256:eaf330939f614dab0c1daab2db65431753f114c82c62f9868f1993010db0e814"); + m.insert((1, 16, 1), "sha256:0e0b25a58363ceacfa63130c220affde874a9fe6872c9bdeceef2a3ab20a0c62"); + m.insert((1, 16, 2), "sha256:f18ea6e9f41e2cd23f1519ab0c327c671af697f14bcabfc7f86b14dee11e53f6"); + m.insert((1, 16, 3), "sha256:42bee5c9d5af3c9da1c9a1dee60edaa3f4015d1ee1cdb1b4f0706421d7efb554"); + m + }; +} diff --git a/src/main.rs b/src/main.rs index 8178cc3..30cf700 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,6 +20,9 @@ use std::{ sync::{atomic::Ordering, Arc}, }; use uuid::Uuid; +pub mod image_config; + +use image_config::IMAGE_MAP; pub fn get_network(network_str: &str) -> &str { match network_str { @@ -316,16 +319,35 @@ pub fn build( let build_command = if bpf_flag { "build-bpf" } else { "build-sbf" }; - let image = base_image.unwrap_or_else(|| { + let (major, minor, patch) = get_pkg_version_from_cargo_lock("solana-program", &lockfile)?; + + let mut solana_version: Option = None; + let image: String = base_image.unwrap_or_else(|| { if bpf_flag { // Use this for backwards compatibility with anchor verified builds - "projectserum/build@sha256:75b75eab447ebcca1f471c98583d9b5d82c4be122c470852a022afcf9c98bead" + solana_version = Some("v1.13.5".to_string()); + "projectserum/build@sha256:75b75eab447ebcca1f471c98583d9b5d82c4be122c470852a022afcf9c98bead".to_string() } else { - // TODO: Update this to route to a different docker image based off the Solana version - // in the Cargo.lock file - "ellipsislabs/solana@sha256:7b002dfaa945f6d293a9458f816c2972b9238439280c02d51cfa6d637d16875e" + if let Some(digest) = IMAGE_MAP.get(&(major, minor, patch)) { + + solana_version = Some(format!("v{}.{}.{}", major, minor, patch)); + format!("ellipsislabs/solana@{}", digest) + } else { + println!("Unable to find docker image for Solana version {}.{}.{}", major, minor, patch); + let prev = IMAGE_MAP.range(..(major, minor, patch)).next_back(); + let next = IMAGE_MAP.range((major, minor, patch)..).next(); + if let Some((version, digest)) = prev { + solana_version = Some(format!("v{}.{}.{}", version.0, version.1, version.2)); + format!("ellipsislabs/solana@{}", digest) + } else if let Some((version, digest)) = next { + solana_version = Some(format!("v{}.{}.{}", version.0, version.1, version.2)); + format!("ellipsislabs/solana@{}", digest) + } else { + println!("Unable to find docker image for Solana version {}.{}.{}", major, minor, patch); + std::process::exit(1); + } + } } - .to_string() }); let mut manifest_path = None; @@ -424,6 +446,12 @@ pub fn build( .stdout(Stdio::inherit()) .output()?; + println!("Finished building program"); + println!("Program Solana version: {}", format!("v{}.{}.{}", major, minor, patch)); + if let Some(solana_version) = solana_version { + println!("Docker image Solana version: {}", solana_version); + } + if let Some(program_name) = library_name { let executable_path = std::process::Command::new("find") .args([ diff --git a/update_image_whitelist.py b/update_image_whitelist.py new file mode 100644 index 0000000..958a379 --- /dev/null +++ b/update_image_whitelist.py @@ -0,0 +1,41 @@ +import requests + +response = requests.get( + "https://hub.docker.com/v2/namespaces/ellipsislabs/repositories/solana/tags?page_size=1000" +) + +digest_map = {} +for result in response.json()["results"]: + if result["name"] != "latest": + try: + major, minor, patch = list(map(int, result["name"].split("."))) + digest_map[(major, minor, patch)] = result["digest"] + except Exception as e: + print(e) + continue + + +entries = [] +for k, v in sorted(digest_map.items()): + entries.append(f' m.insert({k}, "{v}");') + +mappings = "\n".join(entries) + +code = f""" +/// THIS FILE IS AUTOGENERATED. DO NOT MODIFY +use lazy_static::lazy_static; +use std::collections::BTreeMap; + +lazy_static! {{ + pub static ref IMAGE_MAP: BTreeMap<(u32, u32, u32), &'static str> = {{ + let mut m = BTreeMap::new(); +{mappings} + m + }}; +}} +""" + +print(code) + +with open("src/image_config.rs", "w") as f: + f.write(code.lstrip("\n")) From 9654d95007612fb90d937f3e971fff1453947db3 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Mon, 10 Jul 2023 18:09:41 -0400 Subject: [PATCH 063/314] add some more print statements --- src/main.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 30cf700..4da3e9c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -329,7 +329,7 @@ pub fn build( "projectserum/build@sha256:75b75eab447ebcca1f471c98583d9b5d82c4be122c470852a022afcf9c98bead".to_string() } else { if let Some(digest) = IMAGE_MAP.get(&(major, minor, patch)) { - + println!("Found docker image for Solana version {}.{}.{}", major, minor, patch); solana_version = Some(format!("v{}.{}.{}", major, minor, patch)); format!("ellipsislabs/solana@{}", digest) } else { @@ -337,9 +337,11 @@ pub fn build( let prev = IMAGE_MAP.range(..(major, minor, patch)).next_back(); let next = IMAGE_MAP.range((major, minor, patch)..).next(); if let Some((version, digest)) = prev { + println!("Using docker image for Solana version {}.{}.{}", version.0, version.1, version.2); solana_version = Some(format!("v{}.{}.{}", version.0, version.1, version.2)); format!("ellipsislabs/solana@{}", digest) } else if let Some((version, digest)) = next { + println!("Using docker image for Solana version {}.{}.{}", version.0, version.1, version.2); solana_version = Some(format!("v{}.{}.{}", version.0, version.1, version.2)); format!("ellipsislabs/solana@{}", digest) } else { From aba4f0691b8f1db5bc0d3080c7f85fdbd00a4bb0 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Mon, 10 Jul 2023 18:14:09 -0400 Subject: [PATCH 064/314] clean up code --- src/main.rs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main.rs b/src/main.rs index 4da3e9c..9147594 100644 --- a/src/main.rs +++ b/src/main.rs @@ -336,18 +336,17 @@ pub fn build( println!("Unable to find docker image for Solana version {}.{}.{}", major, minor, patch); let prev = IMAGE_MAP.range(..(major, minor, patch)).next_back(); let next = IMAGE_MAP.range((major, minor, patch)..).next(); - if let Some((version, digest)) = prev { - println!("Using docker image for Solana version {}.{}.{}", version.0, version.1, version.2); - solana_version = Some(format!("v{}.{}.{}", version.0, version.1, version.2)); - format!("ellipsislabs/solana@{}", digest) + let (version, digest) = if let Some((version, digest)) = prev { + (version, digest) } else if let Some((version, digest)) = next { - println!("Using docker image for Solana version {}.{}.{}", version.0, version.1, version.2); - solana_version = Some(format!("v{}.{}.{}", version.0, version.1, version.2)); - format!("ellipsislabs/solana@{}", digest) + (version, digest) } else { - println!("Unable to find docker image for Solana version {}.{}.{}", major, minor, patch); + println!("Unable to find backup docker image for Solana version {}.{}.{}", major, minor, patch); std::process::exit(1); - } + }; + println!("Using backup docker image for Solana version {}.{}.{}", version.0, version.1, version.2); + solana_version = Some(format!("v{}.{}.{}", version.0, version.1, version.2)); + format!("ellipsislabs/solana@{}", digest) } } }); From 82fdeafac9d8cd8e1474c090d3b7f0eae0cba493 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Mon, 10 Jul 2023 18:15:03 -0400 Subject: [PATCH 065/314] bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 01c628c..8615c33 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3490,7 +3490,7 @@ dependencies = [ [[package]] name = "solana-verify" -version = "0.2.2" +version = "0.2.3" dependencies = [ "anyhow", "cargo-lock", diff --git a/Cargo.toml b/Cargo.toml index d7e06da..788d67f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "solana-verify" -version = "0.2.2" +version = "0.2.3" edition = "2021" description = "A CLI tool for building verifiable Solana programs" license = "MIT" From 0f6ecdb3d60c2e13dd716f001c111d4c93248eea Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Mon, 10 Jul 2023 18:33:53 -0400 Subject: [PATCH 066/314] Remove 1.15.x --- docker/v1.15.0.Dockerfile | 8 -------- docker/v1.15.1.Dockerfile | 8 -------- docker/v1.15.2.Dockerfile | 8 -------- generate_dockerfiles.py | 3 ++- src/image_config.rs | 3 --- 5 files changed, 2 insertions(+), 28 deletions(-) delete mode 100644 docker/v1.15.0.Dockerfile delete mode 100644 docker/v1.15.1.Dockerfile delete mode 100644 docker/v1.15.2.Dockerfile diff --git a/docker/v1.15.0.Dockerfile b/docker/v1.15.0.Dockerfile deleted file mode 100644 index 219d98a..0000000 --- a/docker/v1.15.0.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.15.0/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.15.1.Dockerfile b/docker/v1.15.1.Dockerfile deleted file mode 100644 index 05e799b..0000000 --- a/docker/v1.15.1.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.15.1/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.15.2.Dockerfile b/docker/v1.15.2.Dockerfile deleted file mode 100644 index 1000043..0000000 --- a/docker/v1.15.2.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.15.2/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/generate_dockerfiles.py b/generate_dockerfiles.py index 1e20576..a6d1532 100644 --- a/generate_dockerfiles.py +++ b/generate_dockerfiles.py @@ -32,7 +32,8 @@ def check_version(version_str): if version_str == "v1.14.0": return False [major, minor, _patch] = version_str.strip("v").split(".") - return int(major) >= 1 and int(minor) >= 14 + # Ignore 1.15.x + return int(major) >= 1 and int(minor) >= 14 and int(minor) != 15 except Exception as e: return False diff --git a/src/image_config.rs b/src/image_config.rs index 52922c9..004f9e8 100644 --- a/src/image_config.rs +++ b/src/image_config.rs @@ -25,9 +25,6 @@ lazy_static! { m.insert((1, 14, 18), "sha256:fe75071a171f817799cb33821f7d680d594d6f066440c9a4c3fd54b55b681439"); m.insert((1, 14, 19), "sha256:3e567c978dfc782f60c4ce768738cfacc5c36bd005becd1c14379b120d8f9174"); m.insert((1, 14, 20), "sha256:e9501544d3d085bbbff7c100898ce29bf085dd8c851fb85a73b00f72b2ce7c4c"); - m.insert((1, 15, 0), "sha256:a757e2fae64c17273a8ca4dbd4951c427a95df677fe180bbab9e14744aa3aa0b"); - m.insert((1, 15, 1), "sha256:bade492bb15e8485ff5a392146d38e4e655b656040b85ddd758eb7383d35e148"); - m.insert((1, 15, 2), "sha256:004336407be9e14a2ca84ba8a81ca4f585a354c0279c23dc3f141a4c53d7fdea"); m.insert((1, 16, 0), "sha256:eaf330939f614dab0c1daab2db65431753f114c82c62f9868f1993010db0e814"); m.insert((1, 16, 1), "sha256:0e0b25a58363ceacfa63130c220affde874a9fe6872c9bdeceef2a3ab20a0c62"); m.insert((1, 16, 2), "sha256:f18ea6e9f41e2cd23f1519ab0c327c671af697f14bcabfc7f86b14dee11e53f6"); From 83c5ec8c45991e862f77f17da5660d5cabb7de02 Mon Sep 17 00:00:00 2001 From: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> Date: Wed, 12 Jul 2023 01:08:39 -0400 Subject: [PATCH 067/314] Update README.md Signed-off-by: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 29b64c7..9c7d450 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,18 @@ On-chain Program Hash: 72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78f Program hash matches ✅ ``` +### Drift V2 +``` +solana-verify verify-from-repo -um --program-id dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH https://github.com/drift-labs/protocol-v2 --commit-hash 110d3ff4f8ba07c178d69f9bfc7b30194fac56d6 --library-name drift +``` + +Final Output: +``` +Executable Program Hash from repo: e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828 +On-chain Program Hash: e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828 +Program hash matches ✅ +``` + ## Example Walkthrough After installing the CLI, we can test the program verification against the following immutable mainnet program: `2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn` From 329bce69fcea6e5edf6c22ae79d7417e6297f5dc Mon Sep 17 00:00:00 2001 From: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> Date: Fri, 21 Jul 2023 13:39:11 -0400 Subject: [PATCH 068/314] Update README.md Signed-off-by: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9c7d450..091db86 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ When the build completes, the executable file in `target/deploy/$PROGRAM_LIB_NAM In order to directly upload the program to chain (NOT RECOMMENDED), run the following: ``` -solana program deploy -u $NETWORK_URL target/deploy/$PROGRAM_LIB_NAME.so --program-id $PROGRAM_ID --upgrade-authority $UPDGRADE_AUTHORITY +solana program deploy -u $NETWORK_URL target/deploy/$PROGRAM_LIB_NAME.so --program-id $PROGRAM_ID --upgrade-authority $UPGRADE_AUTHORITY ``` The same caveats apply as any normal deployment. See the Solana [docs](https://docs.solana.com/cli/deploy-a-program) for more details. From 9e5026540527e2bb0a8421fa1fd13c7027bb002a Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Wed, 26 Jul 2023 13:31:53 +0530 Subject: [PATCH 069/314] Added cli option to send job to Osec API --- Cargo.lock | 323 ++++++++++++++++++++++++++++++++++++---------------- Cargo.toml | 1 + README.md | 46 ++++++-- src/main.rs | 53 ++++++++- 4 files changed, 314 insertions(+), 109 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8615c33..45ce014 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12,6 +12,15 @@ dependencies = [ "regex", ] +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -147,8 +156,8 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", "synstructure", ] @@ -159,8 +168,8 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", ] @@ -199,8 +208,8 @@ version = "0.1.63" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eff18d764974428cf3a9328e23fc5c986f5fbed46e6cd4cdf42544df5d297ec1" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", ] @@ -221,6 +230,21 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide 0.7.1", + "object", + "rustc-demangle", +] + [[package]] name = "base64" version = "0.12.3" @@ -327,7 +351,7 @@ dependencies = [ "borsh-derive-internal", "borsh-schema-derive-internal", "proc-macro-crate 0.1.5", - "proc-macro2 1.0.50", + "proc-macro2 1.0.66", "syn 1.0.107", ] @@ -337,8 +361,8 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", ] @@ -348,8 +372,8 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", ] @@ -411,8 +435,8 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aca418a974d83d40a0c1f0c5cba6ff4bc28d8df099109ca459a2118d40b6322" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", ] @@ -564,8 +588,8 @@ checksum = "684a277d672e91966334af371f1a7b5833f9aa00b07c84e92fbce95e00208ce8" dependencies = [ "heck", "proc-macro-error", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", ] @@ -607,7 +631,7 @@ dependencies = [ "lazy_static", "libc", "unicode-width", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -789,8 +813,8 @@ dependencies = [ "cc", "codespan-reporting", "once_cell", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "scratch", "syn 1.0.107", ] @@ -807,8 +831,8 @@ version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357f40d1f06a24b60ae1fe122542c1fb05d28d32acb2aed064e84bc2ad1e252e" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", ] @@ -906,8 +930,8 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bf95dc3f046b9da4f2d51833c0d3547d8564ef6910f5c1ed130306a75b92886" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", ] @@ -1011,8 +1035,8 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8958699f9359f0b04e691a13850d48b7de329138023876d07cbd024c2c820598" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", ] @@ -1023,8 +1047,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11f36e95862220b211a6e2aa5eca09b4fa391b13cd52ceb8035a24bf65a79de2" dependencies = [ "once_cell", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", ] @@ -1090,7 +1114,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.6.2", ] [[package]] @@ -1177,8 +1201,8 @@ version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", ] @@ -1268,6 +1292,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + [[package]] name = "h2" version = "0.3.15" @@ -1564,7 +1594,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7d6c6f8c91b4b9ed43484ad1a938e393caf35960fce7f82a040497207bd8e9e" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -1582,7 +1612,7 @@ dependencies = [ "hermit-abi 0.2.6", "io-lifetimes", "rustix", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -1650,9 +1680,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.139" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "libloading" @@ -1818,16 +1848,24 @@ dependencies = [ "adler", ] +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + [[package]] name = "mio" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", - "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1931,8 +1969,8 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", ] @@ -2004,8 +2042,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2be1598bf1c313dcdd12092e3f1920f463462525a21b7b4e11b4168353d0123e" dependencies = [ "proc-macro-crate 1.3.0", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", ] @@ -2015,6 +2053,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + [[package]] name = "oid-registry" version = "0.6.1" @@ -2057,8 +2104,8 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", ] @@ -2106,7 +2153,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -2230,8 +2277,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", "version_check", ] @@ -2242,8 +2289,8 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "version_check", ] @@ -2258,9 +2305,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.50" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] @@ -2338,11 +2385,11 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.23" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ - "proc-macro2 1.0.50", + "proc-macro2 1.0.66", ] [[package]] @@ -2576,6 +2623,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustc-hash" version = "1.1.0" @@ -2611,7 +2664,7 @@ dependencies = [ "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -2696,7 +2749,7 @@ version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" dependencies = [ - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -2777,8 +2830,8 @@ version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", ] @@ -2951,9 +3004,9 @@ checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "socket2" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" dependencies = [ "libc", "winapi", @@ -3171,8 +3224,8 @@ version = "1.14.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be23cc7a382f54dfe1348edb94610e5cc146b8eb21563cdd04062a403c75ba62" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "rustc_version", "syn 1.0.107", ] @@ -3424,8 +3477,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d0acbad862093ea123f3a27364336dcb0c8373522cd6810496a34e932c56c1" dependencies = [ "bs58", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "rustversion", "syn 1.0.107", ] @@ -3506,6 +3559,7 @@ dependencies = [ "solana-cli-config", "solana-client", "solana-sdk", + "tokio", "uuid", ] @@ -3686,8 +3740,19 @@ version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" +dependencies = [ + "proc-macro2 1.0.66", + "quote 1.0.32", "unicode-ident", ] @@ -3697,8 +3762,8 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", "unicode-xid 0.2.4", ] @@ -3756,8 +3821,8 @@ version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", ] @@ -3835,14 +3900,14 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.24.2" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a12a59981d9e3c38d216785b0c37399f6e415e8d0712047620f189371b0bb" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ "autocfg", + "backtrace", "bytes", "libc", - "memchr", "mio", "num_cpus", "parking_lot", @@ -3850,18 +3915,18 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "tokio-macros" -version = "1.8.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", - "syn 1.0.107", + "proc-macro2 1.0.66", + "quote 1.0.32", + "syn 2.0.27", ] [[package]] @@ -4020,8 +4085,8 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", ] @@ -4167,8 +4232,8 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73bc89f2894593e665241e0052c3791999e6787b7c4831daa0a5c2e637e276d8" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", ] @@ -4237,8 +4302,8 @@ dependencies = [ "bumpalo", "log", "once_cell", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", "wasm-bindgen-shared", ] @@ -4261,7 +4326,7 @@ version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" dependencies = [ - "quote 1.0.23", + "quote 1.0.32", "wasm-bindgen-macro-support", ] @@ -4271,8 +4336,8 @@ version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", "wasm-bindgen-backend", "wasm-bindgen-shared", @@ -4350,13 +4415,37 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.42.1", + "windows_aarch64_msvc 0.42.1", + "windows_i686_gnu 0.42.1", + "windows_i686_msvc 0.42.1", + "windows_x86_64_gnu 0.42.1", + "windows_x86_64_gnullvm 0.42.1", + "windows_x86_64_msvc 0.42.1", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", ] [[package]] @@ -4365,42 +4454,84 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + [[package]] name = "windows_aarch64_msvc" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + [[package]] name = "windows_i686_gnu" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + [[package]] name = "windows_i686_msvc" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + [[package]] name = "windows_x86_64_gnu" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + [[package]] name = "windows_x86_64_msvc" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + [[package]] name = "winnow" version = "0.4.7" @@ -4470,8 +4601,8 @@ version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2 1.0.66", + "quote 1.0.32", "syn 1.0.107", "synstructure", ] diff --git a/Cargo.toml b/Cargo.toml index 788d67f..24271dc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,7 @@ license = "MIT" [dependencies] clap = { version = "4.1.4", features = ["derive"] } anyhow = "1.0.68" +tokio = { version = "1.29.1", features = ["macros"] } solana-client = "1.14.10" solana-cli-config = "1.14.10" solana-sdk = "1.14.10" diff --git a/README.md b/README.md index 091db86..83b2a74 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,17 @@ # Solana Verify CLI -A command line tool to build and verify solana programs. Users can ensure that the hash of the on-chain program matches the hash of the program of the given codebase. +A command line tool to build and verify solana programs. Users can ensure that the hash of the on-chain program matches the hash of the program of the given codebase. ## Installation -In order for this CLI to work properly, you must have `docker` installed on your computer. Follow the steps here: https://docs.docker.com/engine/install/ to install Docker (based on your platform) +In order for this CLI to work properly, you must have `docker` installed on your computer. Follow the steps here: to install Docker (based on your platform) -Once the installation is complete, make sure that the server has been started: (https://docs.docker.com/config/daemon/start/) +Once the installation is complete, make sure that the server has been started: () You will also need to install Cargo if you don't already have it. -Run the following command in your shell to install it (or visit https://rustup.rs/): +Run the following command in your shell to install it (or visit ): + ``` curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh ``` @@ -24,37 +25,42 @@ cargo install solana-verify ## Building Verifiable Programs To verifiably build your Solana program, go to the directory with the workspace Cargo.toml file and run the following: + ``` solana-verify build ``` If you're working in a repository with multiple programs, in order to build a specific program, `$PROGRAM_LIB_NAME`, run the following: + ``` solana-verify build --library-name $PROGRAM_LIB_NAME ``` + The string that's passed in must be the *lib* name and NOT the *package* name. These are usually the same, but the distinction is important. ![image](https://github.com/Ellipsis-Labs/solana-verifiable-build/assets/61092285/0427e88f-cc0f-465f-b2e9-747ea1b8d3af) - (NOTE: These commands can take up to 30 minutes if you're running on an M1 Macbook Pro. This has to do with the architecture emulation required to ensure build determinism. For best performance, it is recommended to run builds on a Linux machine running x86) You can now print the executable hash of the program by running the following: + ``` solana-verify get-executable-hash target/deploy/$PROGRAM_LIB_NAME.so ``` - ## Deploying Verifiable Programs When the build completes, the executable file in `target/deploy/$PROGRAM_LIB_NAME.so` will contain the buffer to upload to the network. In order to directly upload the program to chain (NOT RECOMMENDED), run the following: + ``` solana program deploy -u $NETWORK_URL target/deploy/$PROGRAM_LIB_NAME.so --program-id $PROGRAM_ID --upgrade-authority $UPGRADE_AUTHORITY ``` + The same caveats apply as any normal deployment. See the Solana [docs](https://docs.solana.com/cli/deploy-a-program) for more details. Once the upload is completed, you can verify that the program hash matches the executable hash computed in the previous step: + ``` solana-verify get-program-hash -u $NETWORK_URL $PROGRAM_ID ``` @@ -62,22 +68,27 @@ solana-verify get-program-hash -u $NETWORK_URL $PROGRAM_ID The recommended approach for deploying program is to use [Squads V3](https://docs.squads.so/squads-v3-docs/navigating-your-squad/developers/programs). To upgrade a verifiable build, run the following to upload the program buffer: + ``` solana program write-buffer -u $NETWORK_URL target/deploy/$PROGRAM_LIB_NAME.so ``` This command will output a `$BUFFER_ADDRESS`. Before voting to upgrade the program, verify that the following command produces an identical hash to executable hash (built from the previous step) + ``` solana-verify get-buffer-hash -u $NETWORK_URL $BUFFER_ADDRESS ``` - ## Mainnet Verified Programs + ### Phoenix + ``` solana-verify verify-from-repo -um --program-id PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY https://github.com/Ellipsis-Labs/phoenix-v1 ``` + Final Output: + ``` Executable Program Hash from repo: 7c76ba11f8742d040b1a874d943c2096f1b3a48db14d2a5b411fd5dad5d1bc2d On-chain Program Hash: 7c76ba11f8742d040b1a874d943c2096f1b3a48db14d2a5b411fd5dad5d1bc2d @@ -85,12 +96,15 @@ Program hash matches ✅ ``` ### Squads V3 + ``` solana-verify verify-from-repo https://github.com/Squads-Protocol/squads-mpl --commit-hash c95b7673d616c377a349ca424261872dfcf8b19d --program-id SMPLecH534NA9acpos4G6x7uf3LWbCAwZQE9e8ZekMu -um --library-name squads_mpl --bpf ``` + (Note: we needed to specify the `library-name` because the Squads repo includes multiple programs. We use the `--bpf` flag because `squads_mpl` was previously verified with Anchor.) Final Output: + ``` Executable Program Hash from repo: 72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205c On-chain Program Hash: 72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205c @@ -98,11 +112,13 @@ Program hash matches ✅ ``` ### Drift V2 + ``` solana-verify verify-from-repo -um --program-id dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH https://github.com/drift-labs/protocol-v2 --commit-hash 110d3ff4f8ba07c178d69f9bfc7b30194fac56d6 --library-name drift ``` Final Output: + ``` Executable Program Hash from repo: e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828 On-chain Program Hash: e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828 @@ -113,7 +129,7 @@ Program hash matches ✅ After installing the CLI, we can test the program verification against the following immutable mainnet program: `2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn` -Check it out here: https://solana.fm/address/2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn?cluster=mainnet-qn1 +Check it out here: ### Verification with Docker @@ -154,7 +170,7 @@ Which will return the following hash: By default, this command will strip any trailing zeros away from the program executable and run the sha256 algorithm against it to compute the hash. -To manually verify this program, one could run the following from the root of this repository, which builds a program from source code and computes a hash. _This command takes a long time because it is building the binary in a Docker container_ +To manually verify this program, one could run the following from the root of this repository, which builds a program from source code and computes a hash. *This command takes a long time because it is building the binary in a Docker container* ``` solana-verify build $PWD/examples/hello_world @@ -168,10 +184,20 @@ solana-verify get-executable-hash ./examples/hello_world/target/deploy/hello_wor ``` -This will return the hash of the stripped executable, which should match the hash of the program data retrieved from the blockchain. +This will return the hash of the stripped executable, which should match the hash of the program data retrieved from the blockchain. ``` 08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 ``` + +### To send verification to Osec API + +```bash +solana-verify verify-from-repo --remote -um --program-id PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY https://github.com/Ellipsis-Labs/phoenix-v1 +``` + +- This verification will be sent to the Osec API and will be available at [https://verify.osec.io/status](https://verify.osec.io/status/PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY) + +> Note: The `--remote` flag is required to send the verification to the Osec API. The `--remote` flag is not required for local verification. And this will take 5-10 minutes to complete. diff --git a/src/main.rs b/src/main.rs index 9147594..71ce46b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,8 @@ use anyhow::anyhow; use cargo_lock::Lockfile; use cargo_toml::Manifest; use clap::{Parser, Subcommand}; +use reqwest::Client; +use serde_json::json; use signal_hook::{ consts::{SIGINT, SIGTERM}, iterator::Signals, @@ -94,6 +96,9 @@ enum SubCommand { }, /// Builds and verifies a program from a given repository URL and a program ID VerifyFromRepo { + /// Send the verify command to a remote machine + #[clap(long, default_value = "false")] + remote: bool, /// Relative path to the root directory or the source code repository from which to build the program /// This should be the directory that contains the workspace Cargo.toml and the Cargo.lock file #[clap(long, default_value = "")] @@ -126,7 +131,8 @@ enum SubCommand { }, } -fn main() -> anyhow::Result<()> { +#[tokio::main] +async fn main() -> anyhow::Result<()> { // Handle SIGTERM and SIGINT gracefully by stopping the docker container let mut signals = Signals::new(&[SIGTERM, SIGINT])?; let mut container_id: Option = None; @@ -189,6 +195,7 @@ fn main() -> anyhow::Result<()> { Ok(()) } SubCommand::VerifyFromRepo { + remote, mount_path, repo_url, commit_hash, @@ -199,6 +206,7 @@ fn main() -> anyhow::Result<()> { cargo_args, current_dir, } => verify_from_repo( + remote, mount_path, args.url, repo_url, @@ -211,7 +219,7 @@ fn main() -> anyhow::Result<()> { current_dir, &mut container_id, &mut temp_dir, - ), + ).await, }; if caught_signal.load(Ordering::Relaxed) || res.is_err() { @@ -570,7 +578,8 @@ pub fn verify_from_image( Ok(()) } -pub fn verify_from_repo( +pub async fn verify_from_repo( + remote: bool, relative_mount_path: String, connection_url: Option, repo_url: String, @@ -584,6 +593,13 @@ pub fn verify_from_repo( container_id_opt: &mut Option, temp_dir_opt: &mut Option, ) -> anyhow::Result<()> { + + if remote { + println!("Sending verify command to remote machine"); + send_job_to_remote(&repo_url, &commit_hash, &program_id, &library_name_opt, bpf_flag).await?; + return Ok(()); + } + // Get source code from repo_url let base_name = std::process::Command::new("basename") .arg(&repo_url) @@ -808,3 +824,34 @@ pub fn get_pkg_name_from_cargo_toml(cargo_toml_file: &str) -> Option { let pkg = manifest.package?; Some(pkg.name) } + +pub async fn send_job_to_remote( + repo_url: &str, + commit_hash: &Option, + program_id: &Pubkey, + library_name: &Option, + bpf_flag: bool, +) -> anyhow::Result<()> { + let client = Client::new(); + + // Send the POST request + let response = client + .post("https://verify.osec.io/verify") + .json(&json!({ + "repository": repo_url, + "commit_hash": commit_hash, + "program_id": program_id.to_string(), + "lib_name": library_name, + "bpf_flag": bpf_flag, + }) + ) + .send() + .await?; + + if response.status().is_success() { + println!("Successfully sent job to remote"); + Ok(()) + } else { + Err(anyhow!("Encountered error while sending job to remote : {:?}", response.status()))? + } +} \ No newline at end of file From d34609ca0b5136c0f62a0a1236c9dd9cc4bbccb4 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Wed, 26 Jul 2023 16:09:33 +0530 Subject: [PATCH 070/314] Import tokio with full --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 24271dc..9b243f9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ license = "MIT" [dependencies] clap = { version = "4.1.4", features = ["derive"] } anyhow = "1.0.68" -tokio = { version = "1.29.1", features = ["macros"] } +tokio = { version = "1.29.1", features = ["full"] } solana-client = "1.14.10" solana-cli-config = "1.14.10" solana-sdk = "1.14.10" From 3b5d74e8f577bda9491aca4d6792ba5f8af61857 Mon Sep 17 00:00:00 2001 From: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> Date: Fri, 4 Aug 2023 13:03:51 -0400 Subject: [PATCH 071/314] Update README.md Signed-off-by: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 091db86..8446f03 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,18 @@ On-chain Program Hash: e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5a Program hash matches ✅ ``` +### Marginfi V2 +``` +solana-verify verify-from-repo -um --program-id MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA https://github.com/mrgnlabs/marginfi-v2 --library-name marginfi -- --features mainnet-beta +``` + +Final Output: +``` +Executable Program Hash from repo: 7b37482dd6b2159932b5c2595bc6ce62cf6e587ae67f237c8152b802bf7d7bb8 +On-chain Program Hash: 7b37482dd6b2159932b5c2595bc6ce62cf6e587ae67f237c8152b802bf7d7bb8 +Program hash matches ✅ +``` + ## Example Walkthrough After installing the CLI, we can test the program verification against the following immutable mainnet program: `2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn` From 020cfcf47d9ecf8f157519d47a8688f48dea041e Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Mon, 7 Aug 2023 19:19:48 +0530 Subject: [PATCH 072/314] Added optional args for verification --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/main.rs | 86 ++++++++++++++++++++++++++++++++++++----------------- 3 files changed, 60 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 45ce014..ba92619 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3543,7 +3543,7 @@ dependencies = [ [[package]] name = "solana-verify" -version = "0.2.3" +version = "0.2.4" dependencies = [ "anyhow", "cargo-lock", diff --git a/Cargo.toml b/Cargo.toml index 9b243f9..6022c20 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "solana-verify" -version = "0.2.3" +version = "0.2.4" edition = "2021" description = "A CLI tool for building verifiable Solana programs" license = "MIT" diff --git a/src/main.rs b/src/main.rs index 71ce46b..1e46dc3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -97,7 +97,7 @@ enum SubCommand { /// Builds and verifies a program from a given repository URL and a program ID VerifyFromRepo { /// Send the verify command to a remote machine - #[clap(long, default_value = "false")] + #[clap(long, default_value = "false")] remote: bool, /// Relative path to the root directory or the source code repository from which to build the program /// This should be the directory that contains the workspace Cargo.toml and the Cargo.lock file @@ -205,21 +205,24 @@ async fn main() -> anyhow::Result<()> { bpf: bpf_flag, cargo_args, current_dir, - } => verify_from_repo( - remote, - mount_path, - args.url, - repo_url, - commit_hash, - program_id, - base_image, - library_name, - bpf_flag, - cargo_args, - current_dir, - &mut container_id, - &mut temp_dir, - ).await, + } => { + verify_from_repo( + remote, + mount_path, + args.url, + repo_url, + commit_hash, + program_id, + base_image, + library_name, + bpf_flag, + cargo_args, + current_dir, + &mut container_id, + &mut temp_dir, + ) + .await + } }; if caught_signal.load(Ordering::Relaxed) || res.is_err() { @@ -456,7 +459,10 @@ pub fn build( .output()?; println!("Finished building program"); - println!("Program Solana version: {}", format!("v{}.{}.{}", major, minor, patch)); + println!( + "Program Solana version: {}", + format!("v{}.{}.{}", major, minor, patch) + ); if let Some(solana_version) = solana_version { println!("Docker image Solana version: {}", solana_version); } @@ -578,6 +584,7 @@ pub fn verify_from_image( Ok(()) } +#[allow(clippy::too_many_arguments)] pub async fn verify_from_repo( remote: bool, relative_mount_path: String, @@ -593,10 +600,19 @@ pub async fn verify_from_repo( container_id_opt: &mut Option, temp_dir_opt: &mut Option, ) -> anyhow::Result<()> { - if remote { println!("Sending verify command to remote machine"); - send_job_to_remote(&repo_url, &commit_hash, &program_id, &library_name_opt, bpf_flag).await?; + send_job_to_remote( + &repo_url, + &commit_hash, + &program_id, + &library_name_opt, + bpf_flag, + relative_mount_path, + base_image, + cargo_args, + ) + .await?; return Ok(()); } @@ -733,6 +749,7 @@ pub async fn verify_from_repo( } } +#[allow(clippy::too_many_arguments)] pub fn build_and_verify_repo( mount_path: String, base_image: Option, @@ -825,12 +842,16 @@ pub fn get_pkg_name_from_cargo_toml(cargo_toml_file: &str) -> Option { Some(pkg.name) } +#[allow(clippy::too_many_arguments)] pub async fn send_job_to_remote( repo_url: &str, commit_hash: &Option, program_id: &Pubkey, library_name: &Option, bpf_flag: bool, + relative_mount_path: String, + base_image: Option, + cargo_args: Vec, ) -> anyhow::Result<()> { let client = Client::new(); @@ -838,13 +859,19 @@ pub async fn send_job_to_remote( let response = client .post("https://verify.osec.io/verify") .json(&json!({ - "repository": repo_url, - "commit_hash": commit_hash, - "program_id": program_id.to_string(), - "lib_name": library_name, - "bpf_flag": bpf_flag, - }) - ) + "repository": repo_url, + "commit_hash": commit_hash, + "program_id": program_id.to_string(), + "lib_name": library_name, + "bpf_flag": bpf_flag, + "mount_path": if relative_mount_path.is_empty() { + None + } else { + Some(relative_mount_path) + }, + "base_image": base_image, + "cargo_args": cargo_args, + })) .send() .await?; @@ -852,6 +879,9 @@ pub async fn send_job_to_remote( println!("Successfully sent job to remote"); Ok(()) } else { - Err(anyhow!("Encountered error while sending job to remote : {:?}", response.status()))? + Err(anyhow!( + "Encountered an error while attempting to send the job to remote : {:?}", + response.status() + ))? } -} \ No newline at end of file +} From 740d8c6a56aff97b0f2c24742f0ece8dfa46b9bb Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Wed, 9 Aug 2023 11:41:39 +0530 Subject: [PATCH 073/314] Update response messages --- src/main.rs | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index 1e46dc3..dbd0986 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,7 @@ use cargo_lock::Lockfile; use cargo_toml::Manifest; use clap::{Parser, Subcommand}; use reqwest::Client; -use serde_json::json; +use serde_json::{json, Value}; use signal_hook::{ consts::{SIGINT, SIGTERM}, iterator::Signals, @@ -19,7 +19,7 @@ use std::{ path::PathBuf, process::Stdio, sync::atomic::AtomicBool, - sync::{atomic::Ordering, Arc}, + sync::{atomic::Ordering, Arc}, time::Duration, }; use uuid::Uuid; pub mod image_config; @@ -601,6 +601,9 @@ pub async fn verify_from_repo( temp_dir_opt: &mut Option, ) -> anyhow::Result<()> { if remote { + if connection_url != Some("m".to_string()) { + return Err(anyhow!("Remote verification only works with mainnet. Include -um flag to verify on mainnet.")); + } println!("Sending verify command to remote machine"); send_job_to_remote( &repo_url, @@ -853,7 +856,7 @@ pub async fn send_job_to_remote( base_image: Option, cargo_args: Vec, ) -> anyhow::Result<()> { - let client = Client::new(); + let client = Client::builder().timeout(Duration::from_secs(10)).build()?; // Send the POST request let response = client @@ -876,12 +879,28 @@ pub async fn send_job_to_remote( .await?; if response.status().is_success() { - println!("Successfully sent job to remote"); + println!("Successfully sent job to remote."); + Ok(()) + } else if response.status() == 409 { + let status_response:Value = serde_json::from_str(&response.text().await?)?; + + if let Some(is_verified) = status_response["is_verified"].as_bool() { + if is_verified { + println!("Program {} has already been verified. ✅", program_id); + println!("On Chain Hash: {}", status_response["on_chain_hash"].as_str().unwrap_or("")); + println!("Executable Hash: {}", status_response["executable_hash"].as_str().unwrap_or("")); + } else { + println!("We have already processed this request."); + println!("Program {} has not been verified. ❌", program_id); + } + } else { + println!("We have already processed this request."); + } Ok(()) } else { Err(anyhow!( "Encountered an error while attempting to send the job to remote : {:?}", - response.status() + response.text().await? ))? } } From a579824b8291d5f78cceaa009749dd918877b5f7 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Thu, 10 Aug 2023 09:11:38 +0530 Subject: [PATCH 074/314] Fix cluster verification --- src/main.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index dbd0986..419ea27 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,6 +26,8 @@ pub mod image_config; use image_config::IMAGE_MAP; +const MAINNET_GENESIS_HASH : &str = "5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d"; + pub fn get_network(network_str: &str) -> &str { match network_str { "devnet" | "dev" | "d" => "https://api.devnet.solana.com", @@ -305,6 +307,12 @@ pub fn get_program_hash(url: Option, program_id: Pubkey) -> anyhow::Resu Ok(program_hash) } +pub fn get_genesis_hash(url: Option) -> anyhow::Result { + let client = get_client(url); + let genesis_hash = client.get_genesis_hash()?; + Ok(genesis_hash.to_string()) +} + pub fn build( mount_directory: Option, library_name: Option, @@ -601,9 +609,12 @@ pub async fn verify_from_repo( temp_dir_opt: &mut Option, ) -> anyhow::Result<()> { if remote { - if connection_url != Some("m".to_string()) { - return Err(anyhow!("Remote verification only works with mainnet. Include -um flag to verify on mainnet.")); + + let genesis_hash = get_genesis_hash(connection_url)?; + if genesis_hash != MAINNET_GENESIS_HASH { + return Err(anyhow!("Remote verification only works with mainnet. Please omit the --remote flag to verify locally.")); } + println!("Sending verify command to remote machine"); send_job_to_remote( &repo_url, From d822287127630c870ae27f68d8f2610d6dd0cee2 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Thu, 17 Aug 2023 17:17:17 +0000 Subject: [PATCH 075/314] add solend to readme --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 62fe6c2..46c2c48 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,18 @@ On-chain Program Hash: 7b37482dd6b2159932b5c2595bc6ce62cf6e587ae67f237c8152b802b Program hash matches ✅ ``` +### Solend +``` +solana-verify verify-from-repo -um --program-id So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo https://github.com/solendprotocol/solana-program-library --library-name solend_program -b ellipsislabs/solana:1.14.10 --bpf +``` + +Final Output: +``` +Executable Program Hash from repo: f89a43677ab106d2e50d3c41b656d067b6142c02a2508caca1c11c0a963d3b17 +On-chain Program Hash: f89a43677ab106d2e50d3c41b656d067b6142c02a2508caca1c11c0a963d3b17 +Program hash matches ✅ +``` + ## Example Walkthrough After installing the CLI, we can test the program verification against the following immutable mainnet program: `2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn` From 582118e7f676840c01e359de6c507ef772c44582 Mon Sep 17 00:00:00 2001 From: Lucas B Date: Mon, 9 Oct 2023 17:42:02 -0500 Subject: [PATCH 076/314] add missing dockerfiles --- docker/v1.14.21.Dockerfile | 8 ++++++++ docker/v1.14.22.Dockerfile | 8 ++++++++ docker/v1.14.23.Dockerfile | 8 ++++++++ docker/v1.14.24.Dockerfile | 8 ++++++++ docker/v1.14.25.Dockerfile | 8 ++++++++ docker/v1.14.26.Dockerfile | 8 ++++++++ docker/v1.14.27.Dockerfile | 8 ++++++++ docker/v1.14.28.Dockerfile | 8 ++++++++ docker/v1.14.29.Dockerfile | 8 ++++++++ docker/v1.16.10.Dockerfile | 8 ++++++++ docker/v1.16.11.Dockerfile | 8 ++++++++ docker/v1.16.12.Dockerfile | 8 ++++++++ docker/v1.16.13.Dockerfile | 8 ++++++++ docker/v1.16.14.Dockerfile | 8 ++++++++ docker/v1.16.15.Dockerfile | 8 ++++++++ docker/v1.16.16.Dockerfile | 8 ++++++++ docker/v1.16.4.Dockerfile | 8 ++++++++ docker/v1.16.5.Dockerfile | 8 ++++++++ docker/v1.16.6.Dockerfile | 8 ++++++++ docker/v1.16.7.Dockerfile | 8 ++++++++ docker/v1.16.8.Dockerfile | 8 ++++++++ docker/v1.16.9.Dockerfile | 8 ++++++++ docker/v1.17.0.Dockerfile | 8 ++++++++ docker/v1.17.1.Dockerfile | 8 ++++++++ 24 files changed, 192 insertions(+) create mode 100644 docker/v1.14.21.Dockerfile create mode 100644 docker/v1.14.22.Dockerfile create mode 100644 docker/v1.14.23.Dockerfile create mode 100644 docker/v1.14.24.Dockerfile create mode 100644 docker/v1.14.25.Dockerfile create mode 100644 docker/v1.14.26.Dockerfile create mode 100644 docker/v1.14.27.Dockerfile create mode 100644 docker/v1.14.28.Dockerfile create mode 100644 docker/v1.14.29.Dockerfile create mode 100644 docker/v1.16.10.Dockerfile create mode 100644 docker/v1.16.11.Dockerfile create mode 100644 docker/v1.16.12.Dockerfile create mode 100644 docker/v1.16.13.Dockerfile create mode 100644 docker/v1.16.14.Dockerfile create mode 100644 docker/v1.16.15.Dockerfile create mode 100644 docker/v1.16.16.Dockerfile create mode 100644 docker/v1.16.4.Dockerfile create mode 100644 docker/v1.16.5.Dockerfile create mode 100644 docker/v1.16.6.Dockerfile create mode 100644 docker/v1.16.7.Dockerfile create mode 100644 docker/v1.16.8.Dockerfile create mode 100644 docker/v1.16.9.Dockerfile create mode 100644 docker/v1.17.0.Dockerfile create mode 100644 docker/v1.17.1.Dockerfile diff --git a/docker/v1.14.21.Dockerfile b/docker/v1.14.21.Dockerfile new file mode 100644 index 0000000..bc576a8 --- /dev/null +++ b/docker/v1.14.21.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.21/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.14.22.Dockerfile b/docker/v1.14.22.Dockerfile new file mode 100644 index 0000000..19b4fec --- /dev/null +++ b/docker/v1.14.22.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.22/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.14.23.Dockerfile b/docker/v1.14.23.Dockerfile new file mode 100644 index 0000000..d1b8dd2 --- /dev/null +++ b/docker/v1.14.23.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.23/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.14.24.Dockerfile b/docker/v1.14.24.Dockerfile new file mode 100644 index 0000000..970ee55 --- /dev/null +++ b/docker/v1.14.24.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.24/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.14.25.Dockerfile b/docker/v1.14.25.Dockerfile new file mode 100644 index 0000000..e1c35eb --- /dev/null +++ b/docker/v1.14.25.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.25/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.14.26.Dockerfile b/docker/v1.14.26.Dockerfile new file mode 100644 index 0000000..b3d8786 --- /dev/null +++ b/docker/v1.14.26.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.26/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.14.27.Dockerfile b/docker/v1.14.27.Dockerfile new file mode 100644 index 0000000..21eb082 --- /dev/null +++ b/docker/v1.14.27.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.27/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.14.28.Dockerfile b/docker/v1.14.28.Dockerfile new file mode 100644 index 0000000..8b52425 --- /dev/null +++ b/docker/v1.14.28.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.28/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.14.29.Dockerfile b/docker/v1.14.29.Dockerfile new file mode 100644 index 0000000..e899028 --- /dev/null +++ b/docker/v1.14.29.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.29/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.10.Dockerfile b/docker/v1.16.10.Dockerfile new file mode 100644 index 0000000..fd3f6f2 --- /dev/null +++ b/docker/v1.16.10.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.10/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.11.Dockerfile b/docker/v1.16.11.Dockerfile new file mode 100644 index 0000000..842766c --- /dev/null +++ b/docker/v1.16.11.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.11/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.12.Dockerfile b/docker/v1.16.12.Dockerfile new file mode 100644 index 0000000..17a4014 --- /dev/null +++ b/docker/v1.16.12.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.12/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.13.Dockerfile b/docker/v1.16.13.Dockerfile new file mode 100644 index 0000000..e8141d2 --- /dev/null +++ b/docker/v1.16.13.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.13/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.14.Dockerfile b/docker/v1.16.14.Dockerfile new file mode 100644 index 0000000..5ba75fa --- /dev/null +++ b/docker/v1.16.14.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.14/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.15.Dockerfile b/docker/v1.16.15.Dockerfile new file mode 100644 index 0000000..4908c73 --- /dev/null +++ b/docker/v1.16.15.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.15/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.16.Dockerfile b/docker/v1.16.16.Dockerfile new file mode 100644 index 0000000..e2be99c --- /dev/null +++ b/docker/v1.16.16.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.16/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.4.Dockerfile b/docker/v1.16.4.Dockerfile new file mode 100644 index 0000000..787a1a0 --- /dev/null +++ b/docker/v1.16.4.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.4/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.5.Dockerfile b/docker/v1.16.5.Dockerfile new file mode 100644 index 0000000..b725681 --- /dev/null +++ b/docker/v1.16.5.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.5/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.6.Dockerfile b/docker/v1.16.6.Dockerfile new file mode 100644 index 0000000..aae534f --- /dev/null +++ b/docker/v1.16.6.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.6/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.7.Dockerfile b/docker/v1.16.7.Dockerfile new file mode 100644 index 0000000..2e05559 --- /dev/null +++ b/docker/v1.16.7.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.7/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.8.Dockerfile b/docker/v1.16.8.Dockerfile new file mode 100644 index 0000000..8c898ca --- /dev/null +++ b/docker/v1.16.8.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.8/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.9.Dockerfile b/docker/v1.16.9.Dockerfile new file mode 100644 index 0000000..38baef7 --- /dev/null +++ b/docker/v1.16.9.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.9/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.0.Dockerfile b/docker/v1.17.0.Dockerfile new file mode 100644 index 0000000..cccd49d --- /dev/null +++ b/docker/v1.17.0.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.0/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.1.Dockerfile b/docker/v1.17.1.Dockerfile new file mode 100644 index 0000000..0bceb78 --- /dev/null +++ b/docker/v1.17.1.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.1/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash From 2dd499be582f5f5162e2333e2a20ec91d8cf4e72 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Tue, 10 Oct 2023 11:42:45 -0400 Subject: [PATCH 077/314] Add new Dockerfiles --- Cargo.lock | 2 +- Cargo.toml | 4 ++-- src/image_config.rs | 24 ++++++++++++++++++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ba92619..04fe25d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3543,7 +3543,7 @@ dependencies = [ [[package]] name = "solana-verify" -version = "0.2.4" +version = "0.2.5" dependencies = [ "anyhow", "cargo-lock", diff --git a/Cargo.toml b/Cargo.toml index 6022c20..de9829a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "solana-verify" -version = "0.2.4" +version = "0.2.5" edition = "2021" description = "A CLI tool for building verifiable Solana programs" license = "MIT" @@ -30,4 +30,4 @@ features = [ "v4", # Lets you generate random UUIDs "fast-rng", # Use a faster (but still sufficiently random) RNG "macro-diagnostics", # Enable better diagnostics for compile-time UUIDs -] \ No newline at end of file +] diff --git a/src/image_config.rs b/src/image_config.rs index 004f9e8..02bf3fb 100644 --- a/src/image_config.rs +++ b/src/image_config.rs @@ -25,10 +25,34 @@ lazy_static! { m.insert((1, 14, 18), "sha256:fe75071a171f817799cb33821f7d680d594d6f066440c9a4c3fd54b55b681439"); m.insert((1, 14, 19), "sha256:3e567c978dfc782f60c4ce768738cfacc5c36bd005becd1c14379b120d8f9174"); m.insert((1, 14, 20), "sha256:e9501544d3d085bbbff7c100898ce29bf085dd8c851fb85a73b00f72b2ce7c4c"); + m.insert((1, 14, 21), "sha256:1531e719c4b2675b59b4be410b4cb8d2ecfaf337b6e111dcaf986cf7c343b7e3"); + m.insert((1, 14, 22), "sha256:e6d6f1f095de3188bfcf9356f91102b85290ffeba6388debe11706e1d9a02826"); + m.insert((1, 14, 23), "sha256:f6193af3b4e86a5a40c77b6d4294fccb914c938ef16d8db1d67c7a571797345e"); + m.insert((1, 14, 24), "sha256:866488d56ec3f1a823cb9ecd7652effdc8746b96827209b5ea4ec78a1fa9d45b"); + m.insert((1, 14, 25), "sha256:a274e5245609baa175d2fcca93a6427c9f295cbbca7a705076d5f977db28d360"); + m.insert((1, 14, 26), "sha256:ee6ca9b4dcdb58413259545f833f3834733bb281790b6778099c1a586d267fa8"); + m.insert((1, 14, 27), "sha256:66beebc3bd73ad7b0c694dd0f7027f39e211932caecc0d908467bb00c8f83812"); + m.insert((1, 14, 28), "sha256:4b7a8fcc1d487fe80dfc152d1e49c6067025d5e44bd5d743869fe75b636e4907"); + m.insert((1, 14, 29), "sha256:2a38e78a1bcb369a6673b6442f1ee32f99e839445e426c4fdfdc48ee852e346e"); m.insert((1, 16, 0), "sha256:eaf330939f614dab0c1daab2db65431753f114c82c62f9868f1993010db0e814"); m.insert((1, 16, 1), "sha256:0e0b25a58363ceacfa63130c220affde874a9fe6872c9bdeceef2a3ab20a0c62"); m.insert((1, 16, 2), "sha256:f18ea6e9f41e2cd23f1519ab0c327c671af697f14bcabfc7f86b14dee11e53f6"); m.insert((1, 16, 3), "sha256:42bee5c9d5af3c9da1c9a1dee60edaa3f4015d1ee1cdb1b4f0706421d7efb554"); + m.insert((1, 16, 4), "sha256:7840a59861bce53dd4fc8b9bcd198dd210636ba645c532187b52d8e3f8356f86"); + m.insert((1, 16, 5), "sha256:bbe60168f1b8cab06020e48e1822d24423794b8acedada88c12c3e99e4d10bf1"); + m.insert((1, 16, 6), "sha256:b034ae5d7d9f3beb863e295172db28852e55d34f91712b5758d01681fb51c66b"); + m.insert((1, 16, 7), "sha256:c3c9043a2a6e5ac623d789c68ac2346e059009928d438f92d9e2de9b708f35e3"); + m.insert((1, 16, 8), "sha256:a377f19b7dd3dccc81b4dec69e8dae3b518bb6a058b27075f6078b264e4b4c5c"); + m.insert((1, 16, 9), "sha256:c40ff800cdfdb90700e7b34d6d30d5cfdf40570f7ff0b4694d2d5a26b8a55fa7"); + m.insert((1, 16, 10), "sha256:38f1c10abb3d274eef019bd5b726ad8aa6ff036959009959768ab2956eb749b0"); + m.insert((1, 16, 11), "sha256:a2788528b302c4c4144cfcaca35c978a1b420c936201b3b7b80977a289345914"); + m.insert((1, 16, 12), "sha256:7823267a7df4fb39cb7daf012416aab7dd3a5a7dec400a60bb02517a1d562c23"); + m.insert((1, 16, 13), "sha256:e36085bf68e25e538942ccb3cc1547189c63126fe2f6aeee711490b47dba7311"); + m.insert((1, 16, 14), "sha256:906c7d915dd87d099b03f78c7046ef1aa231cacb847e9d638cd0681e6549de2c"); + m.insert((1, 16, 15), "sha256:1b7e3ac6798829dee8dec42557af4824848fe9d3a2c43c31bca59aa6c63e510b"); + m.insert((1, 16, 16), "sha256:0ffcb49416f9e17c266e5b9b915f67e830e5c586921fb43aad98723346d0aba6"); + m.insert((1, 17, 0), "sha256:8e5593ea91d20e4ec24eda8ea2065333f6e7c4ae5496947b9910b93889c78a03"); + m.insert((1, 17, 1), "sha256:f11a7beb650e08ef0f14dd4c588ff9358a78deaf5f7ae13ba62c7a41dc2610ca"); m }; } From 2d316182e2411423e51d8535863a26ff63d253c0 Mon Sep 17 00:00:00 2001 From: Lucas B Date: Thu, 30 Nov 2023 09:03:27 -0600 Subject: [PATCH 078/314] Add more v1.16.x and v1.17.x dockerfiles --- docker/v1.16.17.Dockerfile | 8 ++++++++ docker/v1.16.18.Dockerfile | 8 ++++++++ docker/v1.16.19.Dockerfile | 8 ++++++++ docker/v1.16.20.Dockerfile | 8 ++++++++ docker/v1.17.2.Dockerfile | 8 ++++++++ docker/v1.17.3.Dockerfile | 8 ++++++++ docker/v1.17.4.Dockerfile | 8 ++++++++ docker/v1.17.5.Dockerfile | 8 ++++++++ docker/v1.17.6.Dockerfile | 8 ++++++++ 9 files changed, 72 insertions(+) create mode 100644 docker/v1.16.17.Dockerfile create mode 100644 docker/v1.16.18.Dockerfile create mode 100644 docker/v1.16.19.Dockerfile create mode 100644 docker/v1.16.20.Dockerfile create mode 100644 docker/v1.17.2.Dockerfile create mode 100644 docker/v1.17.3.Dockerfile create mode 100644 docker/v1.17.4.Dockerfile create mode 100644 docker/v1.17.5.Dockerfile create mode 100644 docker/v1.17.6.Dockerfile diff --git a/docker/v1.16.17.Dockerfile b/docker/v1.16.17.Dockerfile new file mode 100644 index 0000000..9bfffda --- /dev/null +++ b/docker/v1.16.17.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.17/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.18.Dockerfile b/docker/v1.16.18.Dockerfile new file mode 100644 index 0000000..bd04367 --- /dev/null +++ b/docker/v1.16.18.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.18/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.19.Dockerfile b/docker/v1.16.19.Dockerfile new file mode 100644 index 0000000..25e75e3 --- /dev/null +++ b/docker/v1.16.19.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.19/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.20.Dockerfile b/docker/v1.16.20.Dockerfile new file mode 100644 index 0000000..66b1786 --- /dev/null +++ b/docker/v1.16.20.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.20/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.2.Dockerfile b/docker/v1.17.2.Dockerfile new file mode 100644 index 0000000..c152d23 --- /dev/null +++ b/docker/v1.17.2.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.2/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.3.Dockerfile b/docker/v1.17.3.Dockerfile new file mode 100644 index 0000000..843c32a --- /dev/null +++ b/docker/v1.17.3.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.3/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.4.Dockerfile b/docker/v1.17.4.Dockerfile new file mode 100644 index 0000000..bbc45b8 --- /dev/null +++ b/docker/v1.17.4.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.4/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.5.Dockerfile b/docker/v1.17.5.Dockerfile new file mode 100644 index 0000000..9bdb504 --- /dev/null +++ b/docker/v1.17.5.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.5/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.6.Dockerfile b/docker/v1.17.6.Dockerfile new file mode 100644 index 0000000..a47fb6b --- /dev/null +++ b/docker/v1.17.6.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.6/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash From 49065d4d0a08a7b9848cf8705c4091df85a43b9a Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Thu, 30 Nov 2023 11:24:31 -0500 Subject: [PATCH 079/314] Add new Dockerfiles --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/image_config.rs | 8 ++++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 04fe25d..86717c4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3543,7 +3543,7 @@ dependencies = [ [[package]] name = "solana-verify" -version = "0.2.5" +version = "0.2.6" dependencies = [ "anyhow", "cargo-lock", diff --git a/Cargo.toml b/Cargo.toml index de9829a..c7adddf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "solana-verify" -version = "0.2.5" +version = "0.2.6" edition = "2021" description = "A CLI tool for building verifiable Solana programs" license = "MIT" diff --git a/src/image_config.rs b/src/image_config.rs index 02bf3fb..03c46c6 100644 --- a/src/image_config.rs +++ b/src/image_config.rs @@ -51,8 +51,16 @@ lazy_static! { m.insert((1, 16, 14), "sha256:906c7d915dd87d099b03f78c7046ef1aa231cacb847e9d638cd0681e6549de2c"); m.insert((1, 16, 15), "sha256:1b7e3ac6798829dee8dec42557af4824848fe9d3a2c43c31bca59aa6c63e510b"); m.insert((1, 16, 16), "sha256:0ffcb49416f9e17c266e5b9b915f67e830e5c586921fb43aad98723346d0aba6"); + m.insert((1, 16, 17), "sha256:957ab8d383501320ab8fd10636834f6bd637549e27dc7d9b2b8b60c76d32b9f7"); + m.insert((1, 16, 18), "sha256:a097a773a388d5fca9acb2153d8fdf8e6cb0c20bc0c18c38a1dadeb585a700e9"); + m.insert((1, 16, 19), "sha256:2ad77df7353772b8946fde3abb1418a45bc8fbcac1fde55d5ffc3a87c4f08c97"); + m.insert((1, 16, 20), "sha256:8b73b104354c82c86950060e3fd03578065d5452d563fc81852177b2ab565a3c"); m.insert((1, 17, 0), "sha256:8e5593ea91d20e4ec24eda8ea2065333f6e7c4ae5496947b9910b93889c78a03"); m.insert((1, 17, 1), "sha256:f11a7beb650e08ef0f14dd4c588ff9358a78deaf5f7ae13ba62c7a41dc2610ca"); + m.insert((1, 17, 2), "sha256:4d862e20ab6b1fafdc59cbb9b7cd3200b4c0e4c66de767fac3a49f871baa4e3d"); + m.insert((1, 17, 3), "sha256:c58cf31748b19f03aa21f2d677db0296d98ddc52889953096ab85586b537a770"); + m.insert((1, 17, 5), "sha256:ed9b2e489fdd33bf21e968050a9ce13f84579986577a6d4fbe7e70c94242d774"); + m.insert((1, 17, 6), "sha256:02a2f2eaf18a52eab14e0d8048b4ec561b667e7b5996fc406acb6bdb9ef8dadc"); m }; } From 9cd06f2677e3ff2cf2ee30feba2e3f2647fae325 Mon Sep 17 00:00:00 2001 From: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> Date: Sun, 3 Dec 2023 18:20:08 -0600 Subject: [PATCH 080/314] Update README.md Update README to be more description about the installation Signed-off-by: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 46c2c48..5441641 100644 --- a/README.md +++ b/README.md @@ -19,9 +19,22 @@ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh Finally, to install the Solana Verify cli, run the following in your shell: ``` +# Pulls the latest version from crates.io cargo install solana-verify ``` +If you want to pin the version: +``` +# Pulls the latest version from crates.io +cargo install solana-verify --version $VERSION +``` + +If you are extra cautious and want to install a version of the binary that maps 1-to-1 with a specific commit. The following example is install version 0.2.6 pull from revision `13a1db2`: +``` +# Pulls the latest version from git +cargo install solana-verify --git https://github.com/Ellipsis-Labs/solana-verifiable-build --rev 13a1db2 +``` + ## Building Verifiable Programs To verifiably build your Solana program, go to the directory with the workspace Cargo.toml file and run the following: From 8df13f0a06e3dfe1964de32d5f836f65da9d143e Mon Sep 17 00:00:00 2001 From: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> Date: Sun, 3 Dec 2023 18:21:03 -0600 Subject: [PATCH 081/314] Update README.md Signed-off-by: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5441641..64b5aed 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ If you want to pin the version: cargo install solana-verify --version $VERSION ``` -If you are extra cautious and want to install a version of the binary that maps 1-to-1 with a specific commit. The following example is install version 0.2.6 pull from revision `13a1db2`: +If you are extra cautious and want to install a version of the binary that maps 1-to-1 with a specific commit. The following example is installing version 0.2.6 from revision `13a1db2`: ``` # Pulls the latest version from git cargo install solana-verify --git https://github.com/Ellipsis-Labs/solana-verifiable-build --rev 13a1db2 From bb96b42209bd3aa5cdda6746a833d63cc7734ffa Mon Sep 17 00:00:00 2001 From: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> Date: Sun, 3 Dec 2023 18:22:06 -0600 Subject: [PATCH 082/314] Update README.md Signed-off-by: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 64b5aed..86cc46b 100644 --- a/README.md +++ b/README.md @@ -29,9 +29,9 @@ If you want to pin the version: cargo install solana-verify --version $VERSION ``` -If you are extra cautious and want to install a version of the binary that maps 1-to-1 with a specific commit. The following example is installing version 0.2.6 from revision `13a1db2`: +If you are extra cautious and want to install a version of the binary that maps 1-to-1 with a specific commit, run the following. This example is installing version 0.2.6 from revision `13a1db2`: ``` -# Pulls the latest version from git +# Pulls the latest version from git. Change the argument to --rev to the desired commit cargo install solana-verify --git https://github.com/Ellipsis-Labs/solana-verifiable-build --rev 13a1db2 ``` From 79e3101e2c9f653d90c259dad870701e9c0c76f8 Mon Sep 17 00:00:00 2001 From: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> Date: Sun, 3 Dec 2023 18:22:40 -0600 Subject: [PATCH 083/314] Update README.md Signed-off-by: Jarry Xiao <61092285+jarry-xiao@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 86cc46b..e703dbe 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ cargo install solana-verify --version $VERSION If you are extra cautious and want to install a version of the binary that maps 1-to-1 with a specific commit, run the following. This example is installing version 0.2.6 from revision `13a1db2`: ``` -# Pulls the latest version from git. Change the argument to --rev to the desired commit +# Pulls the source from git. Change the argument to --rev to the desired commit cargo install solana-verify --git https://github.com/Ellipsis-Labs/solana-verifiable-build --rev 13a1db2 ``` From 37ad2fa769f3aba95627ee554abf9f40e636f906 Mon Sep 17 00:00:00 2001 From: Jon C Date: Tue, 5 Dec 2023 00:19:10 +0100 Subject: [PATCH 084/314] Fix building with 1.17+ by using sparse index --- src/main.rs | 51 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/src/main.rs b/src/main.rs index 419ea27..27e7b1f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -361,7 +361,7 @@ pub fn build( (version, digest) } else { println!("Unable to find backup docker image for Solana version {}.{}.{}", major, minor, patch); - std::process::exit(1); + std::process::exit(1); }; println!("Using backup docker image for Solana version {}.{}.{}", version.0, version.1, version.2); solana_version = Some(format!("v{}.{}.{}", version.0, version.1, version.2)); @@ -439,27 +439,42 @@ pub fn build( // Set the container id so we can kill it later if the process is interrupted container_id_opt.replace(container_id.clone()); - // First, we resolve the dependencies and cache them in the Docker container - // ARM processors running Linux have a bug where the build fails if the dependencies are not preloaded. - // Running the build without the pre-fetch will cause the container to run out of memory. - // This is a workaround for that issue. - std::process::Command::new("docker") - .args(["exec", &container_id]) - .args([ - "cargo", + // Solana v1.17 uses Rust 1.73, which defaults to the sparse registry, making + // this fetch unnecessary, but requires us to omit the "frozen" argument + let locked_args = if major == 1 && minor < 17 { + // First, we resolve the dependencies and cache them in the Docker container + // ARM processors running Linux have a bug where the build fails if the dependencies are not preloaded. + // Running the build without the pre-fetch will cause the container to run out of memory. + // This is a workaround for that issue. + std::process::Command::new("docker") + .args(["exec", &container_id]) + .args([ + "cargo", + "--config", + "net.git-fetch-with-cli=true", + "fetch", + "--locked", + ]) + .stderr(Stdio::inherit()) + .stdout(Stdio::inherit()) + .output()?; + println!("Finished fetching build dependencies"); + + ["--frozen", "--locked"].as_slice() + } else { + // To be totally safe, force the build to use the sparse registry + [ "--config", - "net.git-fetch-with-cli=true", - "fetch", - "--locked", - ]) - .stderr(Stdio::inherit()) - .stdout(Stdio::inherit()) - .output()?; + "registries.crates-io.protocol=\"sparse\"", + "--locked" + ].as_slice() + }; - println!("Finished fetching build dependencies"); std::process::Command::new("docker") .args(["exec", "-w", &build_path, &container_id]) - .args(["cargo", build_command, "--", "--locked", "--frozen"]) + .args(["cargo", build_command]) + .args(["--"]) + .args(locked_args) .args(manifest_path_filter) .args(cargo_args) .stderr(Stdio::inherit()) From 3c086a8750604bed4004be3c20c9f0fd1b97f537 Mon Sep 17 00:00:00 2001 From: Jon C Date: Tue, 5 Dec 2023 11:31:57 +0100 Subject: [PATCH 085/314] Bump version to 0.2.7 --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 86717c4..907b2df 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3543,7 +3543,7 @@ dependencies = [ [[package]] name = "solana-verify" -version = "0.2.6" +version = "0.2.7" dependencies = [ "anyhow", "cargo-lock", diff --git a/Cargo.toml b/Cargo.toml index c7adddf..664f341 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "solana-verify" -version = "0.2.6" +version = "0.2.7" edition = "2021" description = "A CLI tool for building verifiable Solana programs" license = "MIT" From 1c565e48fc34cfec828da98ffb61ad963313356c Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Tue, 9 Jan 2024 22:30:35 +0530 Subject: [PATCH 086/314] Feat:loading animation for better UX --- Cargo.lock | 110 +++++++++++++++++++++++++++++++++++----- Cargo.toml | 3 ++ src/api_client.rs | 126 ++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 78 ++++------------------------ 4 files changed, 235 insertions(+), 82 deletions(-) create mode 100644 src/api_client.rs diff --git a/Cargo.lock b/Cargo.lock index 907b2df..f0731df 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -623,15 +623,15 @@ dependencies = [ [[package]] name = "console" -version = "0.15.5" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ "encode_unicode", "lazy_static", "libc", "unicode-width", - "windows-sys 0.42.0", + "windows-sys 0.52.0", ] [[package]] @@ -702,11 +702,10 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.6" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" +checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" dependencies = [ - "cfg-if", "crossbeam-utils", ] @@ -736,12 +735,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.14" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crunchy" @@ -1569,6 +1565,19 @@ dependencies = [ "regex", ] +[[package]] +name = "indicatif" +version = "0.17.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb28741c9db9a713d93deb3bb9515c20788cef5815265bee4980e87bde7e0f25" +dependencies = [ + "console", + "instant", + "number_prefix", + "portable-atomic", + "unicode-width", +] + [[package]] name = "inout" version = "0.1.3" @@ -2245,6 +2254,12 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "portable-atomic" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -3110,7 +3125,7 @@ dependencies = [ "futures", "futures-util", "indexmap", - "indicatif", + "indicatif 0.16.2", "itertools", "jsonrpc-core", "lazy_static", @@ -3549,7 +3564,10 @@ dependencies = [ "cargo-lock", "cargo_toml", "clap 4.1.4", + "console", + "crossbeam-channel", "hex 0.3.2", + "indicatif 0.17.7", "lazy_static", "pathdiff", "reqwest", @@ -4430,7 +4448,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.1", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", ] [[package]] @@ -4448,6 +4475,21 @@ dependencies = [ "windows_x86_64_msvc 0.48.0", ] +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.1" @@ -4460,6 +4502,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + [[package]] name = "windows_aarch64_msvc" version = "0.42.1" @@ -4472,6 +4520,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + [[package]] name = "windows_i686_gnu" version = "0.42.1" @@ -4484,6 +4538,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + [[package]] name = "windows_i686_msvc" version = "0.42.1" @@ -4496,6 +4556,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + [[package]] name = "windows_x86_64_gnu" version = "0.42.1" @@ -4508,6 +4574,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.1" @@ -4520,6 +4592,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + [[package]] name = "windows_x86_64_msvc" version = "0.42.1" @@ -4532,6 +4610,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + [[package]] name = "winnow" version = "0.4.7" diff --git a/Cargo.toml b/Cargo.toml index 664f341..6616f71 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,6 +23,9 @@ signal-hook = "0.3.15" reqwest = "0.11.18" cargo-lock = "9.0.0" lazy_static = "1.4.0" +indicatif = "0.17.7" +crossbeam-channel = "0.5.11" +console = "0.15.7" [dependencies.uuid] version = "1.2.2" diff --git a/src/api_client.rs b/src/api_client.rs new file mode 100644 index 0000000..60f02a9 --- /dev/null +++ b/src/api_client.rs @@ -0,0 +1,126 @@ +use anyhow::anyhow; +use console::Emoji; +use crossbeam_channel::{unbounded, Receiver}; +use indicatif::{HumanDuration, ProgressBar, ProgressStyle}; +use reqwest::Client; +use serde_json::{json, Value}; +use solana_sdk::pubkey::Pubkey; +use std::thread; +use std::time::{Duration, Instant}; + +// Emoji constants +static SPARKLE: Emoji<'_, '_> = Emoji("✨", ":-)"); +static DONE: Emoji<'_, '_> = Emoji("✅", ""); +static WAITING: Emoji<'_, '_> = Emoji("⏳", ""); +static ERROR: Emoji<'_, '_> = Emoji("❌", "X"); + +fn loading_animation(receiver: Receiver) { + let started = Instant::now(); + let spinner_style = + ProgressStyle::with_template("[{elapsed_precise}] {prefix:.bold.dim} {spinner} {wide_msg}") + .unwrap() + .tick_chars("⠁⠂⠄⡀⢀⠠⠐⠈ "); + + let pb = ProgressBar::new_spinner(); + pb.set_style(spinner_style); + pb.set_message(format!( + "Request sent. Awaiting server response. This may take a moment... {}", + WAITING + )); + loop { + match receiver.try_recv() { + Ok(result) => { + if result { + pb.finish_with_message(format!("{} Process completed.", DONE)); + println!("{} Done in {}", SPARKLE, HumanDuration(started.elapsed())); + } else { + pb.finish_with_message(format!("{} Request processing failed.", ERROR)); + println!( + "{} Time elapsed : {}", + ERROR, + HumanDuration(started.elapsed()) + ); + } + break; + } + + Err(_) => { + pb.inc(1); + thread::sleep(Duration::from_millis(100)); + } + } + } +} + +// Send a job to the remote server +#[allow(clippy::too_many_arguments)] +pub async fn send_job_to_remote( + repo_url: &str, + commit_hash: &Option, + program_id: &Pubkey, + library_name: &Option, + bpf_flag: bool, + relative_mount_path: String, + base_image: Option, + cargo_args: Vec, +) -> anyhow::Result<()> { + let client = Client::builder() + .timeout(Duration::from_secs(1800)) + .build()?; + + // Create a channel for communication between threads + let (sender, receiver) = unbounded(); + + let handle = thread::spawn(move || loading_animation(receiver)); + // Send the POST request + let response = client + .post("http://localhost:3000/verify_sync") + .json(&json!({ + "repository": repo_url, + "commit_hash": commit_hash, + "program_id": program_id.to_string(), + "lib_name": library_name, + "bpf_flag": bpf_flag, + "mount_path": if relative_mount_path.is_empty() { + None + } else { + Some(relative_mount_path) + }, + "base_image": base_image, + "cargo_args": cargo_args, + })) + .send() + .await?; + + if response.status().is_success() || response.status() == 409 { + sender.send(true)?; + handle.join().unwrap(); + let status_response: Value = serde_json::from_str(&response.text().await?)?; + if let Some(is_verified) = status_response["is_verified"].as_bool() { + if is_verified { + println!("Program {} has already been verified. {}", program_id, DONE); + println!( + "On Chain Hash: {}", + status_response["on_chain_hash"].as_str().unwrap_or("") + ); + println!( + "Executable Hash: {}", + status_response["executable_hash"].as_str().unwrap_or("") + ); + } else { + println!("We have already processed this request."); + println!("Program {} has not been verified. {}", program_id, ERROR); + } + } else { + println!("We have already processed this request."); + } + Ok(()) + } else { + sender.send(false)?; + handle.join().unwrap(); + Err(anyhow!( + "Encountered an error while attempting to send the job to remote : {:?}", + response.text().await? + ))? + } +} diff --git a/src/main.rs b/src/main.rs index 27e7b1f..cf881cf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,8 +2,6 @@ use anyhow::anyhow; use cargo_lock::Lockfile; use cargo_toml::Manifest; use clap::{Parser, Subcommand}; -use reqwest::Client; -use serde_json::{json, Value}; use signal_hook::{ consts::{SIGINT, SIGTERM}, iterator::Signals, @@ -19,14 +17,16 @@ use std::{ path::PathBuf, process::Stdio, sync::atomic::AtomicBool, - sync::{atomic::Ordering, Arc}, time::Duration, + sync::{atomic::Ordering, Arc}, }; use uuid::Uuid; +pub mod api_client; pub mod image_config; - use image_config::IMAGE_MAP; -const MAINNET_GENESIS_HASH : &str = "5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d"; +use crate::api_client::send_job_to_remote; + +const MAINNET_GENESIS_HASH: &str = "5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d"; pub fn get_network(network_str: &str) -> &str { match network_str { @@ -466,8 +466,9 @@ pub fn build( [ "--config", "registries.crates-io.protocol=\"sparse\"", - "--locked" - ].as_slice() + "--locked", + ] + .as_slice() }; std::process::Command::new("docker") @@ -624,13 +625,12 @@ pub async fn verify_from_repo( temp_dir_opt: &mut Option, ) -> anyhow::Result<()> { if remote { - let genesis_hash = get_genesis_hash(connection_url)?; if genesis_hash != MAINNET_GENESIS_HASH { return Err(anyhow!("Remote verification only works with mainnet. Please omit the --remote flag to verify locally.")); } - println!("Sending verify command to remote machine"); + println!("Sending verify command to remote machine..."); send_job_to_remote( &repo_url, &commit_hash, @@ -870,63 +870,3 @@ pub fn get_pkg_name_from_cargo_toml(cargo_toml_file: &str) -> Option { let pkg = manifest.package?; Some(pkg.name) } - -#[allow(clippy::too_many_arguments)] -pub async fn send_job_to_remote( - repo_url: &str, - commit_hash: &Option, - program_id: &Pubkey, - library_name: &Option, - bpf_flag: bool, - relative_mount_path: String, - base_image: Option, - cargo_args: Vec, -) -> anyhow::Result<()> { - let client = Client::builder().timeout(Duration::from_secs(10)).build()?; - - // Send the POST request - let response = client - .post("https://verify.osec.io/verify") - .json(&json!({ - "repository": repo_url, - "commit_hash": commit_hash, - "program_id": program_id.to_string(), - "lib_name": library_name, - "bpf_flag": bpf_flag, - "mount_path": if relative_mount_path.is_empty() { - None - } else { - Some(relative_mount_path) - }, - "base_image": base_image, - "cargo_args": cargo_args, - })) - .send() - .await?; - - if response.status().is_success() { - println!("Successfully sent job to remote."); - Ok(()) - } else if response.status() == 409 { - let status_response:Value = serde_json::from_str(&response.text().await?)?; - - if let Some(is_verified) = status_response["is_verified"].as_bool() { - if is_verified { - println!("Program {} has already been verified. ✅", program_id); - println!("On Chain Hash: {}", status_response["on_chain_hash"].as_str().unwrap_or("")); - println!("Executable Hash: {}", status_response["executable_hash"].as_str().unwrap_or("")); - } else { - println!("We have already processed this request."); - println!("Program {} has not been verified. ❌", program_id); - } - } else { - println!("We have already processed this request."); - } - Ok(()) - } else { - Err(anyhow!( - "Encountered an error while attempting to send the job to remote : {:?}", - response.text().await? - ))? - } -} From 0ffc2bda9eb4466ea16e91a2a84370cf0120cad8 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Tue, 9 Jan 2024 22:33:39 +0530 Subject: [PATCH 087/314] collapsed nested if block --- src/main.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index cf881cf..9984f15 100644 --- a/src/main.rs +++ b/src/main.rs @@ -346,8 +346,7 @@ pub fn build( // Use this for backwards compatibility with anchor verified builds solana_version = Some("v1.13.5".to_string()); "projectserum/build@sha256:75b75eab447ebcca1f471c98583d9b5d82c4be122c470852a022afcf9c98bead".to_string() - } else { - if let Some(digest) = IMAGE_MAP.get(&(major, minor, patch)) { + } else if let Some(digest) = IMAGE_MAP.get(&(major, minor, patch)) { println!("Found docker image for Solana version {}.{}.{}", major, minor, patch); solana_version = Some(format!("v{}.{}.{}", major, minor, patch)); format!("ellipsislabs/solana@{}", digest) @@ -367,7 +366,6 @@ pub fn build( solana_version = Some(format!("v{}.{}.{}", version.0, version.1, version.2)); format!("ellipsislabs/solana@{}", digest) } - } }); let mut manifest_path = None; From 3518b80d5e4d1c230942dcd35091776295e8b4c7 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Wed, 10 Jan 2024 11:49:33 +0530 Subject: [PATCH 088/314] cargo clippy --- src/main.rs | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/src/main.rs b/src/main.rs index 9984f15..d44633b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -136,7 +136,7 @@ enum SubCommand { #[tokio::main] async fn main() -> anyhow::Result<()> { // Handle SIGTERM and SIGINT gracefully by stopping the docker container - let mut signals = Signals::new(&[SIGTERM, SIGINT])?; + let mut signals = Signals::new([SIGTERM, SIGINT])?; let mut container_id: Option = None; let mut temp_dir: Option = None; let caught_signal = Arc::new(AtomicBool::new(false)); @@ -231,7 +231,7 @@ async fn main() -> anyhow::Result<()> { if let Some(container_id) = container_id.clone().take() { println!("Stopping container {}", container_id); if std::process::Command::new("docker") - .args(&["kill", &container_id]) + .args(["kill", &container_id]) .output() .is_err() { @@ -243,7 +243,7 @@ async fn main() -> anyhow::Result<()> { if let Some(temp_dir) = temp_dir.clone().take() { println!("Removing temp dir {}", temp_dir); if std::process::Command::new("rm") - .args(&["-rf", &temp_dir]) + .args(["-rf", &temp_dir]) .output() .is_err() { @@ -415,7 +415,7 @@ pub fn build( let manifest_path_filter = manifest_path .clone() .map(|m| vec!["--manifest-path".to_string(), format!("{}/{}", workdir, m)]) - .unwrap_or_else(|| vec![]); + .unwrap_or_else(Vec::new); if manifest_path.is_some() { println!( @@ -481,10 +481,8 @@ pub fn build( .output()?; println!("Finished building program"); - println!( - "Program Solana version: {}", - format!("v{}.{}.{}", major, minor, patch) - ); + println!("Program Solana version: v{}.{}.{}", major, minor, patch); + if let Some(solana_version) = solana_version { println!("Docker image Solana version: {}", solana_version); } @@ -503,7 +501,7 @@ pub fn build( println!("{}", executable_hash); } std::process::Command::new("docker") - .args(&["kill", &container_id]) + .args(["kill", &container_id]) .output()?; Ok(()) } @@ -550,8 +548,7 @@ pub fn verify_from_image( std::env::current_dir()? .as_os_str() .to_str() - .ok_or_else(|| anyhow::Error::msg("Invalid path string"))? - .to_string(), + .ok_or_else(|| anyhow::Error::msg("Invalid path string"))?, uuid.clone() ) } else { @@ -659,8 +656,7 @@ pub async fn verify_from_repo( std::env::current_dir()? .as_os_str() .to_str() - .ok_or_else(|| anyhow::Error::msg("Invalid path string"))? - .to_string(), + .ok_or_else(|| anyhow::Error::msg("Invalid path string"))?, uuid.clone() ) } else { @@ -700,8 +696,7 @@ pub async fn verify_from_repo( let library_name = match library_name_opt { Some(p) => p, - None => { - let name = + None => { std::process::Command::new("find") .args([mount_path.to_str().unwrap(), "-name", "Cargo.toml"]) .output() @@ -737,8 +732,7 @@ pub async fn verify_from_repo( } else { Ok(options[0].clone()) } - })?; - name + })? } }; println!("Verifying program: {}", library_name); @@ -837,7 +831,7 @@ pub fn get_pkg_version_from_cargo_lock( let res = lockfile .packages .iter() - .filter(|pkg| pkg.name.to_string() == package_name.to_string()) + .filter(|pkg| pkg.name.to_string() == *package_name) .filter_map(|pkg| { let version = pkg.version.clone().to_string(); let version_parts: Vec<&str> = version.split(".").collect(); @@ -847,7 +841,7 @@ pub fn get_pkg_version_from_cargo_lock( let patch = version_parts[2].parse::().unwrap_or(0); return Some((major, minor, patch)); } - return None; + None }) .next() .ok_or_else(|| anyhow!("Failed to parse solana-program version from Cargo.lock"))?; From b6708b7d202f3a8cc55796eb2bdc7cd538d71651 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Wed, 10 Jan 2024 11:50:04 +0530 Subject: [PATCH 089/314] Fix api url --- src/api_client.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/api_client.rs b/src/api_client.rs index 60f02a9..d230147 100644 --- a/src/api_client.rs +++ b/src/api_client.rs @@ -14,6 +14,9 @@ static DONE: Emoji<'_, '_> = Emoji("✅", ""); static WAITING: Emoji<'_, '_> = Emoji("⏳", ""); static ERROR: Emoji<'_, '_> = Emoji("❌", "X"); +// URL for the remote server +pub const REMOTE_SERVER_URL: &str = "https://verify.osec.io/verify_async"; + fn loading_animation(receiver: Receiver) { let started = Instant::now(); let spinner_style = @@ -74,7 +77,7 @@ pub async fn send_job_to_remote( let handle = thread::spawn(move || loading_animation(receiver)); // Send the POST request let response = client - .post("http://localhost:3000/verify_sync") + .post(REMOTE_SERVER_URL) .json(&json!({ "repository": repo_url, "commit_hash": commit_hash, @@ -96,6 +99,7 @@ pub async fn send_job_to_remote( sender.send(true)?; handle.join().unwrap(); let status_response: Value = serde_json::from_str(&response.text().await?)?; + if let Some(is_verified) = status_response["is_verified"].as_bool() { if is_verified { println!("Program {} has already been verified. {}", program_id, DONE); @@ -111,9 +115,16 @@ pub async fn send_job_to_remote( println!("We have already processed this request."); println!("Program {} has not been verified. {}", program_id, ERROR); } + } else if status_response["status"] == "error" { + println!("Error encountered while processing request."); + println!( + "Error message: {}", + status_response["error"].as_str().unwrap_or("") + ); } else { println!("We have already processed this request."); } + Ok(()) } else { sender.send(false)?; From b38a01e38cd6303ab03ee7bb5a59e917c97b76b6 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Wed, 10 Jan 2024 13:30:52 +0530 Subject: [PATCH 090/314] fix url --- src/api_client.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/api_client.rs b/src/api_client.rs index d230147..4cd0104 100644 --- a/src/api_client.rs +++ b/src/api_client.rs @@ -15,7 +15,7 @@ static WAITING: Emoji<'_, '_> = Emoji("⏳", ""); static ERROR: Emoji<'_, '_> = Emoji("❌", "X"); // URL for the remote server -pub const REMOTE_SERVER_URL: &str = "https://verify.osec.io/verify_async"; +pub const REMOTE_SERVER_URL: &str = "https://verify.osec.io/verify_sync"; fn loading_animation(receiver: Receiver) { let started = Instant::now(); @@ -68,7 +68,7 @@ pub async fn send_job_to_remote( cargo_args: Vec, ) -> anyhow::Result<()> { let client = Client::builder() - .timeout(Duration::from_secs(1800)) + .timeout(Duration::from_secs(18000)) .build()?; // Create a channel for communication between threads From 44442ea816f3197a0d66bbb38ef71faeed461ca7 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Thu, 11 Jan 2024 17:39:54 +0530 Subject: [PATCH 091/314] Update messages --- src/api_client.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/api_client.rs b/src/api_client.rs index 4cd0104..5ab08ce 100644 --- a/src/api_client.rs +++ b/src/api_client.rs @@ -112,7 +112,7 @@ pub async fn send_job_to_remote( status_response["executable_hash"].as_str().unwrap_or("") ); } else { - println!("We have already processed this request."); + println!("This request has already been processed."); println!("Program {} has not been verified. {}", program_id, ERROR); } } else if status_response["status"] == "error" { @@ -122,7 +122,7 @@ pub async fn send_job_to_remote( status_response["error"].as_str().unwrap_or("") ); } else { - println!("We have already processed this request."); + println!("This request has already been processed."); } Ok(()) From 3915464f41a7607cec5ae059ca71719a7db06fe2 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Fri, 12 Jan 2024 22:36:46 +0530 Subject: [PATCH 092/314] Polling for verification result --- Cargo.lock | 17 +++---- Cargo.toml | 1 + src/api_client.rs | 118 +++++++++++++++++++++++++++++++++++++++------- src/api_models.rs | 56 ++++++++++++++++++++++ src/main.rs | 1 + 5 files changed, 169 insertions(+), 24 deletions(-) create mode 100644 src/api_models.rs diff --git a/Cargo.lock b/Cargo.lock index f0731df..2e6bd95 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2823,9 +2823,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.152" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] @@ -2841,13 +2841,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.152" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2 1.0.66", "quote 1.0.32", - "syn 1.0.107", + "syn 2.0.32", ] [[package]] @@ -3571,6 +3571,7 @@ dependencies = [ "lazy_static", "pathdiff", "reqwest", + "serde", "serde_json", "sha256", "signal-hook", @@ -3765,9 +3766,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.27" +version = "2.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" +checksum = "239814284fd6f1a4ffe4ca893952cdd93c224b6a1571c9a9eadd670295c0c9e2" dependencies = [ "proc-macro2 1.0.66", "quote 1.0.32", @@ -3944,7 +3945,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2 1.0.66", "quote 1.0.32", - "syn 2.0.27", + "syn 2.0.32", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 6616f71..194fdd1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,6 +26,7 @@ lazy_static = "1.4.0" indicatif = "0.17.7" crossbeam-channel = "0.5.11" console = "0.15.7" +serde = { version = "1.0.166", features = ["derive"] } [dependencies.uuid] version = "1.2.2" diff --git a/src/api_client.rs b/src/api_client.rs index 5ab08ce..7b7f2e1 100644 --- a/src/api_client.rs +++ b/src/api_client.rs @@ -8,14 +8,15 @@ use solana_sdk::pubkey::Pubkey; use std::thread; use std::time::{Duration, Instant}; +use crate::api_models::{JobResponse, JobStatus, JobVerificationResponse, VerifyResponse}; + // Emoji constants -static SPARKLE: Emoji<'_, '_> = Emoji("✨", ":-)"); static DONE: Emoji<'_, '_> = Emoji("✅", ""); static WAITING: Emoji<'_, '_> = Emoji("⏳", ""); static ERROR: Emoji<'_, '_> = Emoji("❌", "X"); // URL for the remote server -pub const REMOTE_SERVER_URL: &str = "https://verify.osec.io/verify_sync"; +pub const REMOTE_SERVER_URL: &str = "https://verify.osec.io"; fn loading_animation(receiver: Receiver) { let started = Instant::now(); @@ -34,8 +35,11 @@ fn loading_animation(receiver: Receiver) { match receiver.try_recv() { Ok(result) => { if result { - pb.finish_with_message(format!("{} Process completed.", DONE)); - println!("{} Done in {}", SPARKLE, HumanDuration(started.elapsed())); + pb.finish_with_message(format!( + "{} Process completed. (Done in {})\n", + DONE, + HumanDuration(started.elapsed()) + )); } else { pb.finish_with_message(format!("{} Request processing failed.", ERROR)); println!( @@ -71,13 +75,9 @@ pub async fn send_job_to_remote( .timeout(Duration::from_secs(18000)) .build()?; - // Create a channel for communication between threads - let (sender, receiver) = unbounded(); - - let handle = thread::spawn(move || loading_animation(receiver)); // Send the POST request let response = client - .post(REMOTE_SERVER_URL) + .post(format!("{}/verify", REMOTE_SERVER_URL)) .json(&json!({ "repository": repo_url, "commit_hash": commit_hash, @@ -95,9 +95,60 @@ pub async fn send_job_to_remote( .send() .await?; - if response.status().is_success() || response.status() == 409 { - sender.send(true)?; - handle.join().unwrap(); + if response.status().is_success() { + let status_response: VerifyResponse = response.json().await?; + println!("Verification request sent. {}", DONE); + println!("Verification in progress... {}", WAITING); + // Span new thread for polling the server for status + // Create a channel for communication between threads + let (sender, receiver) = unbounded(); + + let handle = thread::spawn(move || loading_animation(receiver)); + + // Poll the server for status + loop { + let status = check_job_status(&client, &status_response.request_id).await?; + match status.status { + JobStatus::InProgress => { + thread::sleep(Duration::from_secs(10)); + } + JobStatus::Completed => { + let _ = sender.send(true); + handle.join().unwrap(); + let status_response = status.respose.unwrap(); + println!( + "Program {} has been successfully verified. {}", + program_id, DONE + ); + println!("\nThe provided GitHub build matches the on-chain hash:"); + println!("On Chain Hash: {}", status_response.on_chain_hash.as_str()); + println!( + "Executable Hash: {}", + status_response.executable_hash.as_str() + ); + println!("Repo URL: {}", status_response.repo_url.as_str()); + break; + } + JobStatus::Failed => { + let _ = sender.send(false); + + handle.join().unwrap(); + let status_response: JobVerificationResponse = status.respose.unwrap(); + println!("Program {} has not been verified. {}", program_id, ERROR); + eprintln!("Error message: {}", status_response.message.as_str()); + break; + } + JobStatus::Unknown => { + let _ = sender.send(false); + handle.join().unwrap(); + println!("Program {} has not been verified. {}", program_id, ERROR); + break; + } + } + } + + Ok(()) + } else if response.status() == 409 { let status_response: Value = serde_json::from_str(&response.text().await?)?; if let Some(is_verified) = status_response["is_verified"].as_bool() { @@ -116,7 +167,6 @@ pub async fn send_job_to_remote( println!("Program {} has not been verified. {}", program_id, ERROR); } } else if status_response["status"] == "error" { - println!("Error encountered while processing request."); println!( "Error message: {}", status_response["error"].as_str().unwrap_or("") @@ -127,10 +177,46 @@ pub async fn send_job_to_remote( Ok(()) } else { - sender.send(false)?; - handle.join().unwrap(); + eprintln!("Encountered an error while attempting to send the job to remote"); + Err(anyhow!("{:?}", response.text().await?))? + } +} + +async fn check_job_status(client: &Client, request_id: &str) -> anyhow::Result { + // Get /job/:id + let response = client + .get(&format!("{}/job/{}", REMOTE_SERVER_URL, request_id)) + .send() + .await + .unwrap(); + + if response.status().is_success() { + // Parse the response + let response: JobVerificationResponse = response.json().await?; + match response.status { + JobStatus::InProgress => { + thread::sleep(Duration::from_secs(5)); + Ok(JobResponse { + status: JobStatus::InProgress, + respose: None, + }) + } + JobStatus::Completed => Ok(JobResponse { + status: JobStatus::Completed, + respose: Some(response), + }), + JobStatus::Failed => Ok(JobResponse { + status: JobStatus::Failed, + respose: Some(response), + }), + JobStatus::Unknown => Ok(JobResponse { + status: JobStatus::Unknown, + respose: Some(response), + }), + } + } else { Err(anyhow!( - "Encountered an error while attempting to send the job to remote : {:?}", + "Encountered an error while attempting to check job status : {:?}", response.text().await? ))? } diff --git a/src/api_models.rs b/src/api_models.rs new file mode 100644 index 0000000..a3e9c83 --- /dev/null +++ b/src/api_models.rs @@ -0,0 +1,56 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum Status { + Success, + Error, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct VerifyResponse { + pub status: Status, + pub request_id: String, + pub message: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct StatusResponse { + pub is_verified: bool, + pub message: String, + pub on_chain_hash: String, + pub executable_hash: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct ErrorResponse { + pub status: Status, + pub error: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct JobResponse { + pub status: JobStatus, + pub respose: Option, +} + +#[derive(Debug, Serialize, Deserialize)] +pub enum JobStatus { + #[serde(rename = "in_progress")] + InProgress, + #[serde(rename = "completed")] + Completed, + #[serde(rename = "failed")] + Failed, + #[serde(rename = "unknown")] + Unknown, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct JobVerificationResponse { + pub status: JobStatus, + pub message: String, + pub on_chain_hash: String, + pub executable_hash: String, + pub repo_url: String, +} diff --git a/src/main.rs b/src/main.rs index d44633b..1e24b58 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,6 +22,7 @@ use std::{ use uuid::Uuid; pub mod api_client; pub mod image_config; +pub mod api_models; use image_config::IMAGE_MAP; use crate::api_client::send_job_to_remote; From 4b87d96e5486e641786236e2c1b5aa69c37f6dd9 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Sun, 14 Jan 2024 13:22:50 +0530 Subject: [PATCH 093/314] Fix bugs in polling --- src/api_client.rs | 35 ++++++----------------------------- src/api_models.rs | 2 +- 2 files changed, 7 insertions(+), 30 deletions(-) diff --git a/src/api_client.rs b/src/api_client.rs index 7b7f2e1..b51c20e 100644 --- a/src/api_client.rs +++ b/src/api_client.rs @@ -3,12 +3,14 @@ use console::Emoji; use crossbeam_channel::{unbounded, Receiver}; use indicatif::{HumanDuration, ProgressBar, ProgressStyle}; use reqwest::Client; -use serde_json::{json, Value}; +use serde_json::json; use solana_sdk::pubkey::Pubkey; use std::thread; use std::time::{Duration, Instant}; -use crate::api_models::{JobResponse, JobStatus, JobVerificationResponse, VerifyResponse}; +use crate::api_models::{ + ErrorResponse, JobResponse, JobStatus, JobVerificationResponse, VerifyResponse, +}; // Emoji constants static DONE: Emoji<'_, '_> = Emoji("✅", ""); @@ -104,7 +106,6 @@ pub async fn send_job_to_remote( let (sender, receiver) = unbounded(); let handle = thread::spawn(move || loading_animation(receiver)); - // Poll the server for status loop { let status = check_job_status(&client, &status_response.request_id).await?; @@ -149,32 +150,8 @@ pub async fn send_job_to_remote( Ok(()) } else if response.status() == 409 { - let status_response: Value = serde_json::from_str(&response.text().await?)?; - - if let Some(is_verified) = status_response["is_verified"].as_bool() { - if is_verified { - println!("Program {} has already been verified. {}", program_id, DONE); - println!( - "On Chain Hash: {}", - status_response["on_chain_hash"].as_str().unwrap_or("") - ); - println!( - "Executable Hash: {}", - status_response["executable_hash"].as_str().unwrap_or("") - ); - } else { - println!("This request has already been processed."); - println!("Program {} has not been verified. {}", program_id, ERROR); - } - } else if status_response["status"] == "error" { - println!( - "Error message: {}", - status_response["error"].as_str().unwrap_or("") - ); - } else { - println!("This request has already been processed."); - } - + let response = response.json::().await?; + eprintln!("Error: {}", response.error.as_str()); Ok(()) } else { eprintln!("Encountered an error while attempting to send the job to remote"); diff --git a/src/api_models.rs b/src/api_models.rs index a3e9c83..b8c9114 100644 --- a/src/api_models.rs +++ b/src/api_models.rs @@ -9,7 +9,7 @@ pub enum Status { #[derive(Debug, Serialize, Deserialize)] pub struct VerifyResponse { - pub status: Status, + pub status: JobStatus, pub request_id: String, pub message: String, } From 76479435d4263f46600fb8f7b3e3bc6859f04aba Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Mon, 15 Jan 2024 22:45:52 +0530 Subject: [PATCH 094/314] Remove console --- Cargo.lock | 1 - Cargo.toml | 1 - src/api_client.rs | 35 +++++++++-------------------------- 3 files changed, 9 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2e6bd95..1272de4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3564,7 +3564,6 @@ dependencies = [ "cargo-lock", "cargo_toml", "clap 4.1.4", - "console", "crossbeam-channel", "hex 0.3.2", "indicatif 0.17.7", diff --git a/Cargo.toml b/Cargo.toml index 194fdd1..b840d16 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,7 +25,6 @@ cargo-lock = "9.0.0" lazy_static = "1.4.0" indicatif = "0.17.7" crossbeam-channel = "0.5.11" -console = "0.15.7" serde = { version = "1.0.166", features = ["derive"] } [dependencies.uuid] diff --git a/src/api_client.rs b/src/api_client.rs index b51c20e..b298c85 100644 --- a/src/api_client.rs +++ b/src/api_client.rs @@ -1,5 +1,4 @@ use anyhow::anyhow; -use console::Emoji; use crossbeam_channel::{unbounded, Receiver}; use indicatif::{HumanDuration, ProgressBar, ProgressStyle}; use reqwest::Client; @@ -12,11 +11,6 @@ use crate::api_models::{ ErrorResponse, JobResponse, JobStatus, JobVerificationResponse, VerifyResponse, }; -// Emoji constants -static DONE: Emoji<'_, '_> = Emoji("✅", ""); -static WAITING: Emoji<'_, '_> = Emoji("⏳", ""); -static ERROR: Emoji<'_, '_> = Emoji("❌", "X"); - // URL for the remote server pub const REMOTE_SERVER_URL: &str = "https://verify.osec.io"; @@ -29,26 +23,18 @@ fn loading_animation(receiver: Receiver) { let pb = ProgressBar::new_spinner(); pb.set_style(spinner_style); - pb.set_message(format!( - "Request sent. Awaiting server response. This may take a moment... {}", - WAITING - )); + pb.set_message("Request sent. Awaiting server response. This may take a moment... ⏳"); loop { match receiver.try_recv() { Ok(result) => { if result { pb.finish_with_message(format!( - "{} Process completed. (Done in {})\n", - DONE, + "✅ Process completed. (Done in {})\n", HumanDuration(started.elapsed()) )); } else { - pb.finish_with_message(format!("{} Request processing failed.", ERROR)); - println!( - "{} Time elapsed : {}", - ERROR, - HumanDuration(started.elapsed()) - ); + pb.finish_with_message("❌ Request processing failed."); + println!("❌ Time elapsed : {}", HumanDuration(started.elapsed())); } break; } @@ -99,8 +85,8 @@ pub async fn send_job_to_remote( if response.status().is_success() { let status_response: VerifyResponse = response.json().await?; - println!("Verification request sent. {}", DONE); - println!("Verification in progress... {}", WAITING); + println!("Verification request sent. ✅"); + println!("Verification in progress... ⏳"); // Span new thread for polling the server for status // Create a channel for communication between threads let (sender, receiver) = unbounded(); @@ -117,10 +103,7 @@ pub async fn send_job_to_remote( let _ = sender.send(true); handle.join().unwrap(); let status_response = status.respose.unwrap(); - println!( - "Program {} has been successfully verified. {}", - program_id, DONE - ); + println!("Program {} has been successfully verified. ✅", program_id); println!("\nThe provided GitHub build matches the on-chain hash:"); println!("On Chain Hash: {}", status_response.on_chain_hash.as_str()); println!( @@ -135,14 +118,14 @@ pub async fn send_job_to_remote( handle.join().unwrap(); let status_response: JobVerificationResponse = status.respose.unwrap(); - println!("Program {} has not been verified. {}", program_id, ERROR); + println!("Program {} has not been verified. ❌", program_id); eprintln!("Error message: {}", status_response.message.as_str()); break; } JobStatus::Unknown => { let _ = sender.send(false); handle.join().unwrap(); - println!("Program {} has not been verified. {}", program_id, ERROR); + println!("Program {} has not been verified. ❌", program_id); break; } } From f3704f7c762e56067a26a8720e62ca5689e2684d Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Wed, 17 Jan 2024 09:24:07 +0530 Subject: [PATCH 095/314] bump version --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index b840d16..d6945b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "solana-verify" -version = "0.2.7" +version = "0.2.8" edition = "2021" description = "A CLI tool for building verifiable Solana programs" license = "MIT" From 5bc52a420de0df97f4192c6ddc7b1f52e3ed8c6c Mon Sep 17 00:00:00 2001 From: Lucas B Date: Mon, 5 Feb 2024 21:14:34 -0600 Subject: [PATCH 096/314] add more dockerfiles --- docker/v1.16.21.Dockerfile | 8 ++++++++ docker/v1.16.22.Dockerfile | 8 ++++++++ docker/v1.16.23.Dockerfile | 8 ++++++++ docker/v1.16.24.Dockerfile | 8 ++++++++ docker/v1.16.25.Dockerfile | 8 ++++++++ docker/v1.16.26.Dockerfile | 8 ++++++++ docker/v1.16.27.Dockerfile | 8 ++++++++ docker/v1.17.10.Dockerfile | 8 ++++++++ docker/v1.17.11.Dockerfile | 8 ++++++++ docker/v1.17.12.Dockerfile | 8 ++++++++ docker/v1.17.13.Dockerfile | 8 ++++++++ docker/v1.17.14.Dockerfile | 8 ++++++++ docker/v1.17.15.Dockerfile | 8 ++++++++ docker/v1.17.16.Dockerfile | 8 ++++++++ docker/v1.17.17.Dockerfile | 8 ++++++++ docker/v1.17.18.Dockerfile | 8 ++++++++ docker/v1.17.7.Dockerfile | 8 ++++++++ docker/v1.17.8.Dockerfile | 8 ++++++++ docker/v1.17.9.Dockerfile | 8 ++++++++ docker/v1.18.0.Dockerfile | 8 ++++++++ docker/v1.18.1.Dockerfile | 8 ++++++++ 21 files changed, 168 insertions(+) create mode 100644 docker/v1.16.21.Dockerfile create mode 100644 docker/v1.16.22.Dockerfile create mode 100644 docker/v1.16.23.Dockerfile create mode 100644 docker/v1.16.24.Dockerfile create mode 100644 docker/v1.16.25.Dockerfile create mode 100644 docker/v1.16.26.Dockerfile create mode 100644 docker/v1.16.27.Dockerfile create mode 100644 docker/v1.17.10.Dockerfile create mode 100644 docker/v1.17.11.Dockerfile create mode 100644 docker/v1.17.12.Dockerfile create mode 100644 docker/v1.17.13.Dockerfile create mode 100644 docker/v1.17.14.Dockerfile create mode 100644 docker/v1.17.15.Dockerfile create mode 100644 docker/v1.17.16.Dockerfile create mode 100644 docker/v1.17.17.Dockerfile create mode 100644 docker/v1.17.18.Dockerfile create mode 100644 docker/v1.17.7.Dockerfile create mode 100644 docker/v1.17.8.Dockerfile create mode 100644 docker/v1.17.9.Dockerfile create mode 100644 docker/v1.18.0.Dockerfile create mode 100644 docker/v1.18.1.Dockerfile diff --git a/docker/v1.16.21.Dockerfile b/docker/v1.16.21.Dockerfile new file mode 100644 index 0000000..ccd445e --- /dev/null +++ b/docker/v1.16.21.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.21/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.22.Dockerfile b/docker/v1.16.22.Dockerfile new file mode 100644 index 0000000..da2dbdc --- /dev/null +++ b/docker/v1.16.22.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.22/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.23.Dockerfile b/docker/v1.16.23.Dockerfile new file mode 100644 index 0000000..c1b3efb --- /dev/null +++ b/docker/v1.16.23.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.23/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.24.Dockerfile b/docker/v1.16.24.Dockerfile new file mode 100644 index 0000000..348364d --- /dev/null +++ b/docker/v1.16.24.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.24/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.25.Dockerfile b/docker/v1.16.25.Dockerfile new file mode 100644 index 0000000..9972c39 --- /dev/null +++ b/docker/v1.16.25.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.25/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.26.Dockerfile b/docker/v1.16.26.Dockerfile new file mode 100644 index 0000000..5939044 --- /dev/null +++ b/docker/v1.16.26.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.26/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.27.Dockerfile b/docker/v1.16.27.Dockerfile new file mode 100644 index 0000000..ec011cf --- /dev/null +++ b/docker/v1.16.27.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.27/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.10.Dockerfile b/docker/v1.17.10.Dockerfile new file mode 100644 index 0000000..1eb1abf --- /dev/null +++ b/docker/v1.17.10.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.10/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.11.Dockerfile b/docker/v1.17.11.Dockerfile new file mode 100644 index 0000000..8df4e37 --- /dev/null +++ b/docker/v1.17.11.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.11/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.12.Dockerfile b/docker/v1.17.12.Dockerfile new file mode 100644 index 0000000..bd3c3df --- /dev/null +++ b/docker/v1.17.12.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.12/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.13.Dockerfile b/docker/v1.17.13.Dockerfile new file mode 100644 index 0000000..b6b9043 --- /dev/null +++ b/docker/v1.17.13.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.13/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.14.Dockerfile b/docker/v1.17.14.Dockerfile new file mode 100644 index 0000000..70af896 --- /dev/null +++ b/docker/v1.17.14.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.14/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.15.Dockerfile b/docker/v1.17.15.Dockerfile new file mode 100644 index 0000000..3812dbb --- /dev/null +++ b/docker/v1.17.15.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.15/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.16.Dockerfile b/docker/v1.17.16.Dockerfile new file mode 100644 index 0000000..3380c5d --- /dev/null +++ b/docker/v1.17.16.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.16/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.17.Dockerfile b/docker/v1.17.17.Dockerfile new file mode 100644 index 0000000..b5770a1 --- /dev/null +++ b/docker/v1.17.17.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.17/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.18.Dockerfile b/docker/v1.17.18.Dockerfile new file mode 100644 index 0000000..071b41d --- /dev/null +++ b/docker/v1.17.18.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.18/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.7.Dockerfile b/docker/v1.17.7.Dockerfile new file mode 100644 index 0000000..f3a9783 --- /dev/null +++ b/docker/v1.17.7.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.7/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.8.Dockerfile b/docker/v1.17.8.Dockerfile new file mode 100644 index 0000000..587cd62 --- /dev/null +++ b/docker/v1.17.8.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.8/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.9.Dockerfile b/docker/v1.17.9.Dockerfile new file mode 100644 index 0000000..f211af4 --- /dev/null +++ b/docker/v1.17.9.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.9/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.0.Dockerfile b/docker/v1.18.0.Dockerfile new file mode 100644 index 0000000..3169742 --- /dev/null +++ b/docker/v1.18.0.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.0/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.1.Dockerfile b/docker/v1.18.1.Dockerfile new file mode 100644 index 0000000..82de5b3 --- /dev/null +++ b/docker/v1.18.1.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.1/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash From 5083bdfba28a4f8ee999ac03bc5bc1dbe1ab1dc8 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Fri, 16 Feb 2024 18:54:45 +0530 Subject: [PATCH 097/314] Added Hardcoded limits for now --- Cargo.lock | 2 +- src/main.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1272de4..7f78ffd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3558,7 +3558,7 @@ dependencies = [ [[package]] name = "solana-verify" -version = "0.2.7" +version = "0.2.8" dependencies = [ "anyhow", "cargo-lock", diff --git a/src/main.rs b/src/main.rs index 1e24b58..9933efb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -429,7 +429,7 @@ pub fn build( // change directory to program/build dir let mount_params = format!("{}:{}", mount_path, workdir); let container_id = std::process::Command::new("docker") - .args(["run", "--rm", "-v", &mount_params, "-dit", &image, "bash"]) + .args(["run", "--rm", "-v", &mount_params, "-dit","--memory=4g","--cpus=2", &image, "bash"]) .stderr(Stdio::inherit()) .output() .map_err(|e| anyhow::format_err!("Docker build failed: {}", e.to_string())) From f458f393447a4c98c42948d862cd5809feb47a40 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Mon, 19 Feb 2024 18:41:06 +0530 Subject: [PATCH 098/314] Use docker limits with Env --- src/main.rs | 58 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 47 insertions(+), 11 deletions(-) diff --git a/src/main.rs b/src/main.rs index 9933efb..b4c8e84 100644 --- a/src/main.rs +++ b/src/main.rs @@ -314,6 +314,21 @@ pub fn get_genesis_hash(url: Option) -> anyhow::Result { Ok(genesis_hash.to_string()) } + +pub fn get_docker_resource_limits() -> Option<(String, String)> { + let memory = std::env::var("SVB_DOCKER_MEMORY_LIMIT").ok(); + let cpus = std::env::var("SVB_DOCKER_CPU_LIMIT").ok(); + if memory.is_some() || cpus.is_some() { + println!("Using docker resource limits: memory: {:?}, cpus: {:?}", memory, cpus); + } else { + // Print message to user that they can set these environment variables to limit docker resources + println!("No Docker resource limits are set."); + println!("You can set the SVB_DOCKER_MEMORY_LIMIT and SVB_DOCKER_CPU_LIMIT environment variables to limit Docker resources."); + println!("For example: SVB_DOCKER_MEMORY_LIMIT=2g SVB_DOCKER_CPU_LIMIT=2."); + } + memory.zip(cpus) +} + pub fn build( mount_directory: Option, library_name: Option, @@ -428,12 +443,22 @@ pub fn build( // change directory to program/build dir let mount_params = format!("{}:{}", mount_path, workdir); - let container_id = std::process::Command::new("docker") - .args(["run", "--rm", "-v", &mount_params, "-dit","--memory=4g","--cpus=2", &image, "bash"]) - .stderr(Stdio::inherit()) - .output() - .map_err(|e| anyhow::format_err!("Docker build failed: {}", e.to_string())) - .and_then(|output| parse_output(output.stdout))?; + let container_id = { + let mut cmd = std::process::Command::new("docker"); + cmd.args(["run", "--rm", "-v", &mount_params, "-dit"]); + cmd.stderr(Stdio::inherit()); + + if let Some((memory_limit, cpu_limit)) = get_docker_resource_limits() { + cmd.arg("--memory").arg(memory_limit).arg("--cpus").arg(cpu_limit); + } + + let output = cmd + .args([&image, "bash"]) + .output() + .map_err(|e| anyhow!("Docker build failed: {}", e.to_string()))?; + + parse_output(output.stdout)? + }; // Set the container id so we can kill it later if the process is interrupted container_id_opt.replace(container_id.clone()); @@ -532,11 +557,22 @@ pub fn verify_from_image( println!("Workdir: {}", workdir); - let container_id = std::process::Command::new("docker") - .args(["run", "--rm", "-dit", image.as_str()]) - .output() - .map_err(|e| anyhow::format_err!("Failed to run image {}", e.to_string())) - .and_then(|output| parse_output(output.stdout))?; + + let container_id = { + let mut cmd = std::process::Command::new("docker"); + cmd.args(["run", "--rm", "-dit"]); + cmd.stderr(Stdio::inherit()); + + if let Some((memory_limit, cpu_limit)) = get_docker_resource_limits() { + cmd.arg("--memory").arg(memory_limit).arg("--cpus").arg(cpu_limit); + } + + let output = cmd + .args([&image]) + .output() + .map_err(|e| anyhow!("Docker build failed: {}", e.to_string()))?; + parse_output(output.stdout)? + }; container_id_opt.replace(container_id.clone()); From af608651c90767f61474d7d0cc350fe38e527c37 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Tue, 20 Feb 2024 13:15:02 +0530 Subject: [PATCH 099/314] Script to build all images --- build-all-images.sh | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 build-all-images.sh diff --git a/build-all-images.sh b/build-all-images.sh new file mode 100644 index 0000000..71398ff --- /dev/null +++ b/build-all-images.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# Change directory to where the Dockerfiles are located +cd ./docker + +# Iterate over each Dockerfile in the directory +for dockerfile in *; do + # Check if the file is actually a Dockerfile + if [ -f "$dockerfile" ] && [ "${dockerfile##*.}" == "Dockerfile" ]; then + # Extract image name from Dockerfile name + image_name="${dockerfile%Dockerfile}" + # Remove the last character from the image name + image_name="${image_name%?}" + # Interpolate image_name with "solana." + image_name="solana.$image_name" + echo "Building image: $image_name" + # Build the Docker image + docker build -t "$image_name" -f "$dockerfile" . + fi +done From fd4e147c2be28fc1926c013f5d482504be0d8342 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Wed, 21 Feb 2024 11:39:57 +0530 Subject: [PATCH 100/314] Update Readme --- README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e703dbe..c06d47e 100644 --- a/README.md +++ b/README.md @@ -24,12 +24,14 @@ cargo install solana-verify ``` If you want to pin the version: + ``` # Pulls the latest version from crates.io cargo install solana-verify --version $VERSION ``` If you are extra cautious and want to install a version of the binary that maps 1-to-1 with a specific commit, run the following. This example is installing version 0.2.6 from revision `13a1db2`: + ``` # Pulls the source from git. Change the argument to --rev to the desired commit cargo install solana-verify --git https://github.com/Ellipsis-Labs/solana-verifiable-build --rev 13a1db2 @@ -139,11 +141,13 @@ Program hash matches ✅ ``` ### Marginfi V2 + ``` solana-verify verify-from-repo -um --program-id MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA https://github.com/mrgnlabs/marginfi-v2 --library-name marginfi -- --features mainnet-beta ``` Final Output: + ``` Executable Program Hash from repo: 7b37482dd6b2159932b5c2595bc6ce62cf6e587ae67f237c8152b802bf7d7bb8 On-chain Program Hash: 7b37482dd6b2159932b5c2595bc6ce62cf6e587ae67f237c8152b802bf7d7bb8 @@ -151,11 +155,13 @@ Program hash matches ✅ ``` ### Solend + ``` solana-verify verify-from-repo -um --program-id So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo https://github.com/solendprotocol/solana-program-library --library-name solend_program -b ellipsislabs/solana:1.14.10 --bpf ``` Final Output: + ``` Executable Program Hash from repo: f89a43677ab106d2e50d3c41b656d067b6142c02a2508caca1c11c0a963d3b17 On-chain Program Hash: f89a43677ab106d2e50d3c41b656d067b6142c02a2508caca1c11c0a963d3b17 @@ -229,12 +235,12 @@ This will return the hash of the stripped executable, which should match the has ``` -### To send verification to Osec API +### To send verification to OtterSec API ```bash solana-verify verify-from-repo --remote -um --program-id PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY https://github.com/Ellipsis-Labs/phoenix-v1 ``` -- This verification will be sent to the Osec API and will be available at [https://verify.osec.io/status](https://verify.osec.io/status/PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY) +- This verification will be sent to the OtterSec API and will be available at [https://verify.osec.io/status](https://verify.osec.io/status/PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY) -> Note: The `--remote` flag is required to send the verification to the Osec API. The `--remote` flag is not required for local verification. And this will take 5-10 minutes to complete. +> Note: The `--remote` flag is required to send the verification to the OtterSec API. The `--remote` flag is not required for local verification. And this will take 5-10 minutes to complete. From f7366c0c6cb27439c0eb580fccfa9785c9bbefff Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Wed, 21 Feb 2024 10:39:54 -0500 Subject: [PATCH 101/314] update dockerfiles --- docker/v1.17.19.Dockerfile | 8 ++++++++ docker/v1.17.20.Dockerfile | 8 ++++++++ docker/v1.17.21.Dockerfile | 8 ++++++++ docker/v1.17.22.Dockerfile | 8 ++++++++ docker/v1.18.2.Dockerfile | 8 ++++++++ src/image_config.rs | 27 +++++++++++++++++++++++++++ 6 files changed, 67 insertions(+) create mode 100644 docker/v1.17.19.Dockerfile create mode 100644 docker/v1.17.20.Dockerfile create mode 100644 docker/v1.17.21.Dockerfile create mode 100644 docker/v1.17.22.Dockerfile create mode 100644 docker/v1.18.2.Dockerfile diff --git a/docker/v1.17.19.Dockerfile b/docker/v1.17.19.Dockerfile new file mode 100644 index 0000000..4806882 --- /dev/null +++ b/docker/v1.17.19.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.19/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.20.Dockerfile b/docker/v1.17.20.Dockerfile new file mode 100644 index 0000000..4da4664 --- /dev/null +++ b/docker/v1.17.20.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.20/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.21.Dockerfile b/docker/v1.17.21.Dockerfile new file mode 100644 index 0000000..b764ccc --- /dev/null +++ b/docker/v1.17.21.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.21/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.22.Dockerfile b/docker/v1.17.22.Dockerfile new file mode 100644 index 0000000..74ddbc7 --- /dev/null +++ b/docker/v1.17.22.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.22/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.2.Dockerfile b/docker/v1.18.2.Dockerfile new file mode 100644 index 0000000..a8f7310 --- /dev/null +++ b/docker/v1.18.2.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.2/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/src/image_config.rs b/src/image_config.rs index 03c46c6..d6c6d5c 100644 --- a/src/image_config.rs +++ b/src/image_config.rs @@ -55,12 +55,39 @@ lazy_static! { m.insert((1, 16, 18), "sha256:a097a773a388d5fca9acb2153d8fdf8e6cb0c20bc0c18c38a1dadeb585a700e9"); m.insert((1, 16, 19), "sha256:2ad77df7353772b8946fde3abb1418a45bc8fbcac1fde55d5ffc3a87c4f08c97"); m.insert((1, 16, 20), "sha256:8b73b104354c82c86950060e3fd03578065d5452d563fc81852177b2ab565a3c"); + m.insert((1, 16, 21), "sha256:f0e51b86976661ed92b9e62886798b976e34639a7693afad4aa9e5b773070a8f"); + m.insert((1, 16, 22), "sha256:3f4fdc0a74fd7d28363c21db09c1094a969c786756f764afbf9b8923ae2b19d4"); + m.insert((1, 16, 23), "sha256:6ef2655a1a345c51e862616adebf1108b108d5f827cb839c5edb463f4c43e777"); + m.insert((1, 16, 24), "sha256:11303db433cd2677bc6c646a4e8e2d0682e8d8cd70cc9ad7b51ccb19c87e9e66"); + m.insert((1, 16, 25), "sha256:32e3e55007f9628c4afc6c09083409ed5ee04f3e53c532796927e9e2e7037f5e"); + m.insert((1, 16, 26), "sha256:615d609998242d39975043393bf733b26b4759e340565705c1d0e843b2bd35af"); + m.insert((1, 16, 27), "sha256:d3f39f5e1d2fbf798149416bbcb050ae8c03ea8ce18c559fc64beb7547f5c96b"); m.insert((1, 17, 0), "sha256:8e5593ea91d20e4ec24eda8ea2065333f6e7c4ae5496947b9910b93889c78a03"); m.insert((1, 17, 1), "sha256:f11a7beb650e08ef0f14dd4c588ff9358a78deaf5f7ae13ba62c7a41dc2610ca"); m.insert((1, 17, 2), "sha256:4d862e20ab6b1fafdc59cbb9b7cd3200b4c0e4c66de767fac3a49f871baa4e3d"); m.insert((1, 17, 3), "sha256:c58cf31748b19f03aa21f2d677db0296d98ddc52889953096ab85586b537a770"); + m.insert((1, 17, 4), "sha256:d7cbe13c49ae3a23205d0a6c0d6410e2b4deb69c7b2d6ccc8bf9ca3fc322d649"); m.insert((1, 17, 5), "sha256:ed9b2e489fdd33bf21e968050a9ce13f84579986577a6d4fbe7e70c94242d774"); m.insert((1, 17, 6), "sha256:02a2f2eaf18a52eab14e0d8048b4ec561b667e7b5996fc406acb6bdb9ef8dadc"); + m.insert((1, 17, 7), "sha256:2e4ae35f2f66c9eacee5f2491952ef15ada0f3ddc9e7ad0bfef8ae3973f3cf46"); + m.insert((1, 17, 8), "sha256:f50c3b8eaf406a9e3b64cdac41a8f72b76c632a4c62c53abe409346b200dcfea"); + m.insert((1, 17, 9), "sha256:1cb9b38cc53127a06d9341ecd642f3dd3751f662488fa79b487c404caabb5910"); + m.insert((1, 17, 10), "sha256:85e85695a432d1b50303c9a8e3afb735831e8a73ec307dc1cceeb469fc7e603e"); + m.insert((1, 17, 11), "sha256:ea64b41ae4773f1734e36004425ceeb0d3c59aebba1f12ac20a031aa5a8ebd99"); + m.insert((1, 17, 12), "sha256:f0f4dfd83424786a64812a53d218264f7900e8cf3286124a071ffa141dfd6051"); + m.insert((1, 17, 13), "sha256:63ac4121ca405779d201227f9622e55b556f9d81fcf38c614d258b7802f6faf5"); + m.insert((1, 17, 14), "sha256:bd414c6bdeefa662ba17a0473df9648a3cc2795a9abb9dd1120aa50bc242d5b3"); + m.insert((1, 17, 15), "sha256:8f40b55086058db687e7eb1ebd1638d9a848e4443d5ee45af19ee245922bd8f4"); + m.insert((1, 17, 16), "sha256:7d6d95378cda2cd6866ae70563bf184e99d3d937632c0033797bcc483ae81597"); + m.insert((1, 17, 17), "sha256:495577d3de64e0829be1b67d631dea843635fa41ef23672048ec7eac628f753c"); + m.insert((1, 17, 18), "sha256:3c951af1c893a7d509872faed62410de33ff9fc41c2052a8c79f5e44840186d5"); + m.insert((1, 17, 19), "sha256:1dbdbe97e5c8a738cc4a9cd5d099126eb9b41a7034465d148e5bcebfc2dfc2ed"); + m.insert((1, 17, 20), "sha256:7914649a71b10819dbb1f9d5ae440217b83af3f55e8454ff3a1f92e5174148d5"); + m.insert((1, 17, 21), "sha256:6f8c4364e7bd95b08b341caf13046841d6fe2b7e41d8bb6ca89edea479b8d59d"); + m.insert((1, 17, 22), "sha256:73a7160507ba99b97948aae6c45bb19639e9b0be0885149927b1cd24e3541b53"); + m.insert((1, 18, 0), "sha256:9442baedec5e2589b1263e5d12363ef9b2e8e8ad289d2ea5cd0ee7584e479fae"); + m.insert((1, 18, 1), "sha256:b5865168f3177d3acbf4de12d296aa06fcd4911090c4fa3bcb41cf36e347a695"); + m.insert((1, 18, 2), "sha256:9c150a6cde88d65e75ceb08512e8c6a861b2dc84b34a579aac34ef3f9021c483"); m }; } From f9291639c2773a9253bd3bcdfcaa267fb8bf2e7e Mon Sep 17 00:00:00 2001 From: Jac0xb Date: Mon, 15 Apr 2024 14:23:59 -0400 Subject: [PATCH 102/314] Find correct version of rust for docker file generation --- docker/v1.16.0.Dockerfile | 2 +- docker/v1.16.1.Dockerfile | 2 +- docker/v1.16.10.Dockerfile | 2 +- docker/v1.16.11.Dockerfile | 2 +- docker/v1.16.12.Dockerfile | 2 +- docker/v1.16.13.Dockerfile | 2 +- docker/v1.16.14.Dockerfile | 2 +- docker/v1.16.15.Dockerfile | 2 +- docker/v1.16.16.Dockerfile | 2 +- docker/v1.16.17.Dockerfile | 2 +- docker/v1.16.18.Dockerfile | 2 +- docker/v1.16.19.Dockerfile | 2 +- docker/v1.16.2.Dockerfile | 2 +- docker/v1.16.20.Dockerfile | 2 +- docker/v1.16.21.Dockerfile | 2 +- docker/v1.16.22.Dockerfile | 2 +- docker/v1.16.23.Dockerfile | 2 +- docker/v1.16.24.Dockerfile | 2 +- docker/v1.16.25.Dockerfile | 2 +- docker/v1.16.26.Dockerfile | 2 +- docker/v1.16.27.Dockerfile | 2 +- docker/v1.16.3.Dockerfile | 2 +- docker/v1.16.4.Dockerfile | 2 +- docker/v1.16.5.Dockerfile | 2 +- docker/v1.16.6.Dockerfile | 2 +- docker/v1.16.7.Dockerfile | 2 +- docker/v1.16.8.Dockerfile | 2 +- docker/v1.16.9.Dockerfile | 2 +- docker/v1.17.0.Dockerfile | 2 +- docker/v1.17.1.Dockerfile | 2 +- docker/v1.17.10.Dockerfile | 2 +- docker/v1.17.11.Dockerfile | 2 +- docker/v1.17.12.Dockerfile | 2 +- docker/v1.17.13.Dockerfile | 2 +- docker/v1.17.14.Dockerfile | 2 +- docker/v1.17.15.Dockerfile | 2 +- docker/v1.17.16.Dockerfile | 2 +- docker/v1.17.17.Dockerfile | 2 +- docker/v1.17.18.Dockerfile | 2 +- docker/v1.17.19.Dockerfile | 2 +- docker/v1.17.2.Dockerfile | 2 +- docker/v1.17.20.Dockerfile | 2 +- docker/v1.17.21.Dockerfile | 2 +- docker/v1.17.22.Dockerfile | 2 +- docker/v1.17.23.Dockerfile | 8 ++++ docker/v1.17.24.Dockerfile | 8 ++++ docker/v1.17.25.Dockerfile | 8 ++++ docker/v1.17.26.Dockerfile | 8 ++++ docker/v1.17.27.Dockerfile | 8 ++++ docker/v1.17.28.Dockerfile | 8 ++++ docker/v1.17.29.Dockerfile | 8 ++++ docker/v1.17.3.Dockerfile | 2 +- docker/v1.17.30.Dockerfile | 8 ++++ docker/v1.17.31.Dockerfile | 8 ++++ docker/v1.17.4.Dockerfile | 2 +- docker/v1.17.5.Dockerfile | 2 +- docker/v1.17.6.Dockerfile | 2 +- docker/v1.17.7.Dockerfile | 2 +- docker/v1.17.8.Dockerfile | 2 +- docker/v1.17.9.Dockerfile | 2 +- docker/v1.18.0.Dockerfile | 2 +- docker/v1.18.1.Dockerfile | 2 +- docker/v1.18.10.Dockerfile | 8 ++++ docker/v1.18.11.Dockerfile | 8 ++++ docker/v1.18.2.Dockerfile | 2 +- docker/v1.18.3.Dockerfile | 8 ++++ docker/v1.18.4.Dockerfile | 8 ++++ docker/v1.18.5.Dockerfile | 8 ++++ docker/v1.18.6.Dockerfile | 8 ++++ docker/v1.18.7.Dockerfile | 8 ++++ docker/v1.18.8.Dockerfile | 8 ++++ docker/v1.18.9.Dockerfile | 8 ++++ generate_dockerfiles.py | 79 +++++++++++++++++++++++++++++++++++--- 73 files changed, 272 insertions(+), 59 deletions(-) create mode 100644 docker/v1.17.23.Dockerfile create mode 100644 docker/v1.17.24.Dockerfile create mode 100644 docker/v1.17.25.Dockerfile create mode 100644 docker/v1.17.26.Dockerfile create mode 100644 docker/v1.17.27.Dockerfile create mode 100644 docker/v1.17.28.Dockerfile create mode 100644 docker/v1.17.29.Dockerfile create mode 100644 docker/v1.17.30.Dockerfile create mode 100644 docker/v1.17.31.Dockerfile create mode 100644 docker/v1.18.10.Dockerfile create mode 100644 docker/v1.18.11.Dockerfile create mode 100644 docker/v1.18.3.Dockerfile create mode 100644 docker/v1.18.4.Dockerfile create mode 100644 docker/v1.18.5.Dockerfile create mode 100644 docker/v1.18.6.Dockerfile create mode 100644 docker/v1.18.7.Dockerfile create mode 100644 docker/v1.18.8.Dockerfile create mode 100644 docker/v1.18.9.Dockerfile diff --git a/docker/v1.16.0.Dockerfile b/docker/v1.16.0.Dockerfile index d7b107e..de23d08 100644 --- a/docker/v1.16.0.Dockerfile +++ b/docker/v1.16.0.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.0/install)" diff --git a/docker/v1.16.1.Dockerfile b/docker/v1.16.1.Dockerfile index 72a511a..6502147 100644 --- a/docker/v1.16.1.Dockerfile +++ b/docker/v1.16.1.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.1/install)" diff --git a/docker/v1.16.10.Dockerfile b/docker/v1.16.10.Dockerfile index fd3f6f2..8fe6d7c 100644 --- a/docker/v1.16.10.Dockerfile +++ b/docker/v1.16.10.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.10/install)" diff --git a/docker/v1.16.11.Dockerfile b/docker/v1.16.11.Dockerfile index 842766c..54b90ad 100644 --- a/docker/v1.16.11.Dockerfile +++ b/docker/v1.16.11.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.11/install)" diff --git a/docker/v1.16.12.Dockerfile b/docker/v1.16.12.Dockerfile index 17a4014..851d1fa 100644 --- a/docker/v1.16.12.Dockerfile +++ b/docker/v1.16.12.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.12/install)" diff --git a/docker/v1.16.13.Dockerfile b/docker/v1.16.13.Dockerfile index e8141d2..177b979 100644 --- a/docker/v1.16.13.Dockerfile +++ b/docker/v1.16.13.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.13/install)" diff --git a/docker/v1.16.14.Dockerfile b/docker/v1.16.14.Dockerfile index 5ba75fa..80e92a8 100644 --- a/docker/v1.16.14.Dockerfile +++ b/docker/v1.16.14.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.14/install)" diff --git a/docker/v1.16.15.Dockerfile b/docker/v1.16.15.Dockerfile index 4908c73..e0967f1 100644 --- a/docker/v1.16.15.Dockerfile +++ b/docker/v1.16.15.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.15/install)" diff --git a/docker/v1.16.16.Dockerfile b/docker/v1.16.16.Dockerfile index e2be99c..35bd54f 100644 --- a/docker/v1.16.16.Dockerfile +++ b/docker/v1.16.16.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.16/install)" diff --git a/docker/v1.16.17.Dockerfile b/docker/v1.16.17.Dockerfile index 9bfffda..2610e21 100644 --- a/docker/v1.16.17.Dockerfile +++ b/docker/v1.16.17.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.17/install)" diff --git a/docker/v1.16.18.Dockerfile b/docker/v1.16.18.Dockerfile index bd04367..7065fff 100644 --- a/docker/v1.16.18.Dockerfile +++ b/docker/v1.16.18.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.18/install)" diff --git a/docker/v1.16.19.Dockerfile b/docker/v1.16.19.Dockerfile index 25e75e3..57bacfa 100644 --- a/docker/v1.16.19.Dockerfile +++ b/docker/v1.16.19.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.19/install)" diff --git a/docker/v1.16.2.Dockerfile b/docker/v1.16.2.Dockerfile index 3019fb1..cadad9d 100644 --- a/docker/v1.16.2.Dockerfile +++ b/docker/v1.16.2.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.2/install)" diff --git a/docker/v1.16.20.Dockerfile b/docker/v1.16.20.Dockerfile index 66b1786..6ab94c9 100644 --- a/docker/v1.16.20.Dockerfile +++ b/docker/v1.16.20.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.20/install)" diff --git a/docker/v1.16.21.Dockerfile b/docker/v1.16.21.Dockerfile index ccd445e..92ddcfd 100644 --- a/docker/v1.16.21.Dockerfile +++ b/docker/v1.16.21.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.21/install)" diff --git a/docker/v1.16.22.Dockerfile b/docker/v1.16.22.Dockerfile index da2dbdc..8b1c66e 100644 --- a/docker/v1.16.22.Dockerfile +++ b/docker/v1.16.22.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.22/install)" diff --git a/docker/v1.16.23.Dockerfile b/docker/v1.16.23.Dockerfile index c1b3efb..6afef5a 100644 --- a/docker/v1.16.23.Dockerfile +++ b/docker/v1.16.23.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.23/install)" diff --git a/docker/v1.16.24.Dockerfile b/docker/v1.16.24.Dockerfile index 348364d..68a8b7b 100644 --- a/docker/v1.16.24.Dockerfile +++ b/docker/v1.16.24.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.24/install)" diff --git a/docker/v1.16.25.Dockerfile b/docker/v1.16.25.Dockerfile index 9972c39..02e3f9d 100644 --- a/docker/v1.16.25.Dockerfile +++ b/docker/v1.16.25.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.25/install)" diff --git a/docker/v1.16.26.Dockerfile b/docker/v1.16.26.Dockerfile index 5939044..ba34de3 100644 --- a/docker/v1.16.26.Dockerfile +++ b/docker/v1.16.26.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.26/install)" diff --git a/docker/v1.16.27.Dockerfile b/docker/v1.16.27.Dockerfile index ec011cf..277a476 100644 --- a/docker/v1.16.27.Dockerfile +++ b/docker/v1.16.27.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.27/install)" diff --git a/docker/v1.16.3.Dockerfile b/docker/v1.16.3.Dockerfile index 2b5792b..463716f 100644 --- a/docker/v1.16.3.Dockerfile +++ b/docker/v1.16.3.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.3/install)" diff --git a/docker/v1.16.4.Dockerfile b/docker/v1.16.4.Dockerfile index 787a1a0..929dd05 100644 --- a/docker/v1.16.4.Dockerfile +++ b/docker/v1.16.4.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.4/install)" diff --git a/docker/v1.16.5.Dockerfile b/docker/v1.16.5.Dockerfile index b725681..03f1dc3 100644 --- a/docker/v1.16.5.Dockerfile +++ b/docker/v1.16.5.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.5/install)" diff --git a/docker/v1.16.6.Dockerfile b/docker/v1.16.6.Dockerfile index aae534f..4eaf9c0 100644 --- a/docker/v1.16.6.Dockerfile +++ b/docker/v1.16.6.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.6/install)" diff --git a/docker/v1.16.7.Dockerfile b/docker/v1.16.7.Dockerfile index 2e05559..5c46eb5 100644 --- a/docker/v1.16.7.Dockerfile +++ b/docker/v1.16.7.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.7/install)" diff --git a/docker/v1.16.8.Dockerfile b/docker/v1.16.8.Dockerfile index 8c898ca..c134440 100644 --- a/docker/v1.16.8.Dockerfile +++ b/docker/v1.16.8.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.8/install)" diff --git a/docker/v1.16.9.Dockerfile b/docker/v1.16.9.Dockerfile index 38baef7..837689b 100644 --- a/docker/v1.16.9.Dockerfile +++ b/docker/v1.16.9.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.9/install)" diff --git a/docker/v1.17.0.Dockerfile b/docker/v1.17.0.Dockerfile index cccd49d..c93e341 100644 --- a/docker/v1.17.0.Dockerfile +++ b/docker/v1.17.0.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:6562d50b62366d5b9db92b34c6684fab5bf3b9f627e59a863c9c0675760feed4 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.0/install)" diff --git a/docker/v1.17.1.Dockerfile b/docker/v1.17.1.Dockerfile index 0bceb78..e2608a8 100644 --- a/docker/v1.17.1.Dockerfile +++ b/docker/v1.17.1.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.1/install)" diff --git a/docker/v1.17.10.Dockerfile b/docker/v1.17.10.Dockerfile index 1eb1abf..a75a01a 100644 --- a/docker/v1.17.10.Dockerfile +++ b/docker/v1.17.10.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.10/install)" diff --git a/docker/v1.17.11.Dockerfile b/docker/v1.17.11.Dockerfile index 8df4e37..3992f5b 100644 --- a/docker/v1.17.11.Dockerfile +++ b/docker/v1.17.11.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.11/install)" diff --git a/docker/v1.17.12.Dockerfile b/docker/v1.17.12.Dockerfile index bd3c3df..61f15c5 100644 --- a/docker/v1.17.12.Dockerfile +++ b/docker/v1.17.12.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.12/install)" diff --git a/docker/v1.17.13.Dockerfile b/docker/v1.17.13.Dockerfile index b6b9043..22040a9 100644 --- a/docker/v1.17.13.Dockerfile +++ b/docker/v1.17.13.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.13/install)" diff --git a/docker/v1.17.14.Dockerfile b/docker/v1.17.14.Dockerfile index 70af896..94f6e76 100644 --- a/docker/v1.17.14.Dockerfile +++ b/docker/v1.17.14.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.14/install)" diff --git a/docker/v1.17.15.Dockerfile b/docker/v1.17.15.Dockerfile index 3812dbb..4163e93 100644 --- a/docker/v1.17.15.Dockerfile +++ b/docker/v1.17.15.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.15/install)" diff --git a/docker/v1.17.16.Dockerfile b/docker/v1.17.16.Dockerfile index 3380c5d..78cc7ce 100644 --- a/docker/v1.17.16.Dockerfile +++ b/docker/v1.17.16.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.16/install)" diff --git a/docker/v1.17.17.Dockerfile b/docker/v1.17.17.Dockerfile index b5770a1..2ce7edf 100644 --- a/docker/v1.17.17.Dockerfile +++ b/docker/v1.17.17.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.17/install)" diff --git a/docker/v1.17.18.Dockerfile b/docker/v1.17.18.Dockerfile index 071b41d..8072ed9 100644 --- a/docker/v1.17.18.Dockerfile +++ b/docker/v1.17.18.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.18/install)" diff --git a/docker/v1.17.19.Dockerfile b/docker/v1.17.19.Dockerfile index 4806882..e2615e9 100644 --- a/docker/v1.17.19.Dockerfile +++ b/docker/v1.17.19.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.19/install)" diff --git a/docker/v1.17.2.Dockerfile b/docker/v1.17.2.Dockerfile index c152d23..d1760be 100644 --- a/docker/v1.17.2.Dockerfile +++ b/docker/v1.17.2.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.2/install)" diff --git a/docker/v1.17.20.Dockerfile b/docker/v1.17.20.Dockerfile index 4da4664..edb730c 100644 --- a/docker/v1.17.20.Dockerfile +++ b/docker/v1.17.20.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.20/install)" diff --git a/docker/v1.17.21.Dockerfile b/docker/v1.17.21.Dockerfile index b764ccc..baed4cc 100644 --- a/docker/v1.17.21.Dockerfile +++ b/docker/v1.17.21.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.21/install)" diff --git a/docker/v1.17.22.Dockerfile b/docker/v1.17.22.Dockerfile index 74ddbc7..c40f795 100644 --- a/docker/v1.17.22.Dockerfile +++ b/docker/v1.17.22.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.22/install)" diff --git a/docker/v1.17.23.Dockerfile b/docker/v1.17.23.Dockerfile new file mode 100644 index 0000000..ebcbbfa --- /dev/null +++ b/docker/v1.17.23.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.23/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.24.Dockerfile b/docker/v1.17.24.Dockerfile new file mode 100644 index 0000000..3d5b3e6 --- /dev/null +++ b/docker/v1.17.24.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.24/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.25.Dockerfile b/docker/v1.17.25.Dockerfile new file mode 100644 index 0000000..9e1bf0f --- /dev/null +++ b/docker/v1.17.25.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.25/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.26.Dockerfile b/docker/v1.17.26.Dockerfile new file mode 100644 index 0000000..a42b14b --- /dev/null +++ b/docker/v1.17.26.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.26/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.27.Dockerfile b/docker/v1.17.27.Dockerfile new file mode 100644 index 0000000..964d8b7 --- /dev/null +++ b/docker/v1.17.27.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.27/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.28.Dockerfile b/docker/v1.17.28.Dockerfile new file mode 100644 index 0000000..fb57315 --- /dev/null +++ b/docker/v1.17.28.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.28/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.29.Dockerfile b/docker/v1.17.29.Dockerfile new file mode 100644 index 0000000..c2aeb04 --- /dev/null +++ b/docker/v1.17.29.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.29/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.3.Dockerfile b/docker/v1.17.3.Dockerfile index 843c32a..3b63dd4 100644 --- a/docker/v1.17.3.Dockerfile +++ b/docker/v1.17.3.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.3/install)" diff --git a/docker/v1.17.30.Dockerfile b/docker/v1.17.30.Dockerfile new file mode 100644 index 0000000..958f60a --- /dev/null +++ b/docker/v1.17.30.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.30/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.31.Dockerfile b/docker/v1.17.31.Dockerfile new file mode 100644 index 0000000..a18c042 --- /dev/null +++ b/docker/v1.17.31.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.31/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.4.Dockerfile b/docker/v1.17.4.Dockerfile index bbc45b8..cf807f4 100644 --- a/docker/v1.17.4.Dockerfile +++ b/docker/v1.17.4.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.4/install)" diff --git a/docker/v1.17.5.Dockerfile b/docker/v1.17.5.Dockerfile index 9bdb504..ffbd22e 100644 --- a/docker/v1.17.5.Dockerfile +++ b/docker/v1.17.5.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.5/install)" diff --git a/docker/v1.17.6.Dockerfile b/docker/v1.17.6.Dockerfile index a47fb6b..1f654e0 100644 --- a/docker/v1.17.6.Dockerfile +++ b/docker/v1.17.6.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.6/install)" diff --git a/docker/v1.17.7.Dockerfile b/docker/v1.17.7.Dockerfile index f3a9783..4cd5861 100644 --- a/docker/v1.17.7.Dockerfile +++ b/docker/v1.17.7.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.7/install)" diff --git a/docker/v1.17.8.Dockerfile b/docker/v1.17.8.Dockerfile index 587cd62..6ab5c20 100644 --- a/docker/v1.17.8.Dockerfile +++ b/docker/v1.17.8.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.8/install)" diff --git a/docker/v1.17.9.Dockerfile b/docker/v1.17.9.Dockerfile index f211af4..86410a3 100644 --- a/docker/v1.17.9.Dockerfile +++ b/docker/v1.17.9.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.9/install)" diff --git a/docker/v1.18.0.Dockerfile b/docker/v1.18.0.Dockerfile index 3169742..1a98fda 100644 --- a/docker/v1.18.0.Dockerfile +++ b/docker/v1.18.0.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.0/install)" diff --git a/docker/v1.18.1.Dockerfile b/docker/v1.18.1.Dockerfile index 82de5b3..fa393ef 100644 --- a/docker/v1.18.1.Dockerfile +++ b/docker/v1.18.1.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.1/install)" diff --git a/docker/v1.18.10.Dockerfile b/docker/v1.18.10.Dockerfile new file mode 100644 index 0000000..54a9118 --- /dev/null +++ b/docker/v1.18.10.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.10/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.11.Dockerfile b/docker/v1.18.11.Dockerfile new file mode 100644 index 0000000..1a2f27c --- /dev/null +++ b/docker/v1.18.11.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.11/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.2.Dockerfile b/docker/v1.18.2.Dockerfile index a8f7310..3b85afa 100644 --- a/docker/v1.18.2.Dockerfile +++ b/docker/v1.18.2.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.2/install)" diff --git a/docker/v1.18.3.Dockerfile b/docker/v1.18.3.Dockerfile new file mode 100644 index 0000000..60d6de1 --- /dev/null +++ b/docker/v1.18.3.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.3/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.4.Dockerfile b/docker/v1.18.4.Dockerfile new file mode 100644 index 0000000..ca54c37 --- /dev/null +++ b/docker/v1.18.4.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.4/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.5.Dockerfile b/docker/v1.18.5.Dockerfile new file mode 100644 index 0000000..3b8bfdb --- /dev/null +++ b/docker/v1.18.5.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.5/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.6.Dockerfile b/docker/v1.18.6.Dockerfile new file mode 100644 index 0000000..f79098e --- /dev/null +++ b/docker/v1.18.6.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.6/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.7.Dockerfile b/docker/v1.18.7.Dockerfile new file mode 100644 index 0000000..193866c --- /dev/null +++ b/docker/v1.18.7.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.7/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.8.Dockerfile b/docker/v1.18.8.Dockerfile new file mode 100644 index 0000000..c5f3e7a --- /dev/null +++ b/docker/v1.18.8.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.8/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.9.Dockerfile b/docker/v1.18.9.Dockerfile new file mode 100644 index 0000000..caa30ad --- /dev/null +++ b/docker/v1.18.9.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.9/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/generate_dockerfiles.py b/generate_dockerfiles.py index a6d1532..8d93db7 100644 --- a/generate_dockerfiles.py +++ b/generate_dockerfiles.py @@ -1,20 +1,35 @@ +import json import subprocess import os import argparse +import time import requests +import tomllib + parser = argparse.ArgumentParser() parser.add_argument("--upload", action="store_true") parser.add_argument("--skip_cache", action="store_true") args = parser.parse_args() -VERSION_PLACEHOLDER = "$VERSION" +# Array of Solana version mapped to rust version hashes +RUST_DOCKER_IMAGESHA_MAP = { + "1.68.0": "79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39", + "1.69.0": "b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a", + "1.72.1": "6562d50b62366d5b9db92b34c6684fab5bf3b9f627e59a863c9c0675760feed4", + "1.73.0": "7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22", + "1.75.0": "b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e", +} + + +RUST_VERSION_PLACEHOLDER = "$RUST_VERSION" +SOLANA_VERSION_PLACEHOLDER = "$SOLANA_VERSION" base_dockerfile_text = f""" -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:{RUST_VERSION_PLACEHOLDER} RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/{VERSION_PLACEHOLDER}/install)" +RUN sh -c "$(curl -sSfL https://release.solana.com/{SOLANA_VERSION_PLACEHOLDER}/install)" ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build @@ -25,7 +40,6 @@ ["git", "ls-remote", "--tags", "https://github.com/solana-labs/solana"] ) - def check_version(version_str): try: # Ignore this one @@ -37,6 +51,49 @@ def check_version(version_str): except Exception as e: return False +def get_toolchain(version_tag): + if "v1.14" in version_tag: + return "1.68.0" + + attempt = 0 + max_attempts = 5 + + while attempt < max_attempts: + url = "https://api.github.com/repos/solana-labs/solana/contents/rust-toolchain.toml?ref=tags/" + version_tag + headers = {'Accept': 'application/vnd.github.v3.raw'} # Fetch the raw file content + + response = requests.get(url, headers=headers) + if response.status_code == 200: + parsed_data = tomllib.loads(response.text) + channel_version = parsed_data['toolchain']['channel'] + + # Strict rate limit for unauthenticated requests + time.sleep(2.5) + + return channel_version + + else: + # Parse error message to json + error = json.loads(response.text) + + print(response.text) + + if 'message' in error: + if "rate limit exceeded" in error['message']: + wait = 5 + 2 ** attempt # Exponential backoff factor + max_wait = 300 # Maximum waiting time in seconds + sleep_time = min(wait, max_wait) + print(f"Rate limit exceeded. Sleeping for {sleep_time} seconds.") + time.sleep(sleep_time) + attempt += 1 + elif error['message'] == "Not Found": + # If message is "Not Found" then default to 1.68.0 + print("Using default rust version 1.68.0 for Solana version", version_tag) + return "1.68.0" + else: + print("Failed to fetch the file") + print("Error message: " + error['message']) + return None tags = list( filter( @@ -52,7 +109,19 @@ def check_version(version_str): dockerfiles = {} for release in tags: - dockerfile = base_dockerfile_text.replace(VERSION_PLACEHOLDER, release).lstrip("\n") + rust_version = get_toolchain(release) + print(release + ", " + rust_version) + + if rust_version is None: + print(f"Failed to fetch rust version for {release}") + continue + + if rust_version not in RUST_DOCKER_IMAGESHA_MAP: + print(f"Rust version {rust_version} not found in the map") + continue + + dockerfile = base_dockerfile_text.replace(SOLANA_VERSION_PLACEHOLDER, release).lstrip("\n") + dockerfile = dockerfile.replace(RUST_VERSION_PLACEHOLDER, RUST_DOCKER_IMAGESHA_MAP[rust_version]) path = f"docker/{release}.Dockerfile" with open(path, "w") as f: f.write(dockerfile) From 9233c172f7ad2ebe25c46eb1765dc8f2b0e40723 Mon Sep 17 00:00:00 2001 From: Jac0xb Date: Mon, 15 Apr 2024 18:10:42 -0400 Subject: [PATCH 103/314] Fetch via githubusercontent for toolchain, fetch dockerfile tag for digest --- docker/v1.16.0.Dockerfile | 2 +- docker/v1.16.1.Dockerfile | 2 +- docker/v1.16.10.Dockerfile | 2 +- docker/v1.16.11.Dockerfile | 2 +- docker/v1.16.12.Dockerfile | 2 +- docker/v1.16.13.Dockerfile | 2 +- docker/v1.16.14.Dockerfile | 2 +- docker/v1.16.15.Dockerfile | 2 +- docker/v1.16.16.Dockerfile | 2 +- docker/v1.16.17.Dockerfile | 2 +- docker/v1.16.18.Dockerfile | 2 +- docker/v1.16.19.Dockerfile | 2 +- docker/v1.16.2.Dockerfile | 2 +- docker/v1.16.20.Dockerfile | 2 +- docker/v1.16.21.Dockerfile | 2 +- docker/v1.16.22.Dockerfile | 2 +- docker/v1.16.23.Dockerfile | 2 +- docker/v1.16.24.Dockerfile | 2 +- docker/v1.16.25.Dockerfile | 2 +- docker/v1.16.26.Dockerfile | 2 +- docker/v1.16.27.Dockerfile | 2 +- docker/v1.16.3.Dockerfile | 2 +- docker/v1.16.4.Dockerfile | 2 +- docker/v1.16.5.Dockerfile | 2 +- docker/v1.16.6.Dockerfile | 2 +- docker/v1.16.7.Dockerfile | 2 +- docker/v1.16.8.Dockerfile | 2 +- docker/v1.16.9.Dockerfile | 2 +- docker/v1.17.0.Dockerfile | 2 +- docker/v1.17.1.Dockerfile | 2 +- docker/v1.17.10.Dockerfile | 2 +- docker/v1.17.11.Dockerfile | 2 +- docker/v1.17.12.Dockerfile | 2 +- docker/v1.17.13.Dockerfile | 2 +- docker/v1.17.14.Dockerfile | 2 +- docker/v1.17.15.Dockerfile | 2 +- docker/v1.17.16.Dockerfile | 2 +- docker/v1.17.17.Dockerfile | 2 +- docker/v1.17.18.Dockerfile | 2 +- docker/v1.17.19.Dockerfile | 2 +- docker/v1.17.2.Dockerfile | 2 +- docker/v1.17.20.Dockerfile | 2 +- docker/v1.17.21.Dockerfile | 2 +- docker/v1.17.22.Dockerfile | 2 +- docker/v1.17.23.Dockerfile | 2 +- docker/v1.17.24.Dockerfile | 2 +- docker/v1.17.25.Dockerfile | 2 +- docker/v1.17.26.Dockerfile | 2 +- docker/v1.17.27.Dockerfile | 2 +- docker/v1.17.28.Dockerfile | 2 +- docker/v1.17.29.Dockerfile | 2 +- docker/v1.17.3.Dockerfile | 2 +- docker/v1.17.30.Dockerfile | 2 +- docker/v1.17.31.Dockerfile | 2 +- docker/v1.17.4.Dockerfile | 2 +- docker/v1.17.5.Dockerfile | 2 +- docker/v1.17.6.Dockerfile | 2 +- docker/v1.17.7.Dockerfile | 2 +- docker/v1.17.8.Dockerfile | 2 +- docker/v1.17.9.Dockerfile | 2 +- docker/v1.18.0.Dockerfile | 2 +- docker/v1.18.1.Dockerfile | 2 +- docker/v1.18.10.Dockerfile | 2 +- docker/v1.18.11.Dockerfile | 2 +- docker/v1.18.2.Dockerfile | 2 +- docker/v1.18.3.Dockerfile | 2 +- docker/v1.18.4.Dockerfile | 2 +- docker/v1.18.5.Dockerfile | 2 +- docker/v1.18.6.Dockerfile | 2 +- docker/v1.18.7.Dockerfile | 2 +- docker/v1.18.8.Dockerfile | 2 +- docker/v1.18.9.Dockerfile | 2 +- generate_dockerfiles.py | 79 +++++++++++++++----------------------- 73 files changed, 103 insertions(+), 120 deletions(-) diff --git a/docker/v1.16.0.Dockerfile b/docker/v1.16.0.Dockerfile index de23d08..d7b107e 100644 --- a/docker/v1.16.0.Dockerfile +++ b/docker/v1.16.0.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.0/install)" diff --git a/docker/v1.16.1.Dockerfile b/docker/v1.16.1.Dockerfile index 6502147..72a511a 100644 --- a/docker/v1.16.1.Dockerfile +++ b/docker/v1.16.1.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.1/install)" diff --git a/docker/v1.16.10.Dockerfile b/docker/v1.16.10.Dockerfile index 8fe6d7c..fd3f6f2 100644 --- a/docker/v1.16.10.Dockerfile +++ b/docker/v1.16.10.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.10/install)" diff --git a/docker/v1.16.11.Dockerfile b/docker/v1.16.11.Dockerfile index 54b90ad..842766c 100644 --- a/docker/v1.16.11.Dockerfile +++ b/docker/v1.16.11.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.11/install)" diff --git a/docker/v1.16.12.Dockerfile b/docker/v1.16.12.Dockerfile index 851d1fa..17a4014 100644 --- a/docker/v1.16.12.Dockerfile +++ b/docker/v1.16.12.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.12/install)" diff --git a/docker/v1.16.13.Dockerfile b/docker/v1.16.13.Dockerfile index 177b979..e8141d2 100644 --- a/docker/v1.16.13.Dockerfile +++ b/docker/v1.16.13.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.13/install)" diff --git a/docker/v1.16.14.Dockerfile b/docker/v1.16.14.Dockerfile index 80e92a8..5ba75fa 100644 --- a/docker/v1.16.14.Dockerfile +++ b/docker/v1.16.14.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.14/install)" diff --git a/docker/v1.16.15.Dockerfile b/docker/v1.16.15.Dockerfile index e0967f1..4908c73 100644 --- a/docker/v1.16.15.Dockerfile +++ b/docker/v1.16.15.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.15/install)" diff --git a/docker/v1.16.16.Dockerfile b/docker/v1.16.16.Dockerfile index 35bd54f..e2be99c 100644 --- a/docker/v1.16.16.Dockerfile +++ b/docker/v1.16.16.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.16/install)" diff --git a/docker/v1.16.17.Dockerfile b/docker/v1.16.17.Dockerfile index 2610e21..9bfffda 100644 --- a/docker/v1.16.17.Dockerfile +++ b/docker/v1.16.17.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.17/install)" diff --git a/docker/v1.16.18.Dockerfile b/docker/v1.16.18.Dockerfile index 7065fff..bd04367 100644 --- a/docker/v1.16.18.Dockerfile +++ b/docker/v1.16.18.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.18/install)" diff --git a/docker/v1.16.19.Dockerfile b/docker/v1.16.19.Dockerfile index 57bacfa..25e75e3 100644 --- a/docker/v1.16.19.Dockerfile +++ b/docker/v1.16.19.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.19/install)" diff --git a/docker/v1.16.2.Dockerfile b/docker/v1.16.2.Dockerfile index cadad9d..3019fb1 100644 --- a/docker/v1.16.2.Dockerfile +++ b/docker/v1.16.2.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.2/install)" diff --git a/docker/v1.16.20.Dockerfile b/docker/v1.16.20.Dockerfile index 6ab94c9..66b1786 100644 --- a/docker/v1.16.20.Dockerfile +++ b/docker/v1.16.20.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.20/install)" diff --git a/docker/v1.16.21.Dockerfile b/docker/v1.16.21.Dockerfile index 92ddcfd..ccd445e 100644 --- a/docker/v1.16.21.Dockerfile +++ b/docker/v1.16.21.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.21/install)" diff --git a/docker/v1.16.22.Dockerfile b/docker/v1.16.22.Dockerfile index 8b1c66e..da2dbdc 100644 --- a/docker/v1.16.22.Dockerfile +++ b/docker/v1.16.22.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.22/install)" diff --git a/docker/v1.16.23.Dockerfile b/docker/v1.16.23.Dockerfile index 6afef5a..c1b3efb 100644 --- a/docker/v1.16.23.Dockerfile +++ b/docker/v1.16.23.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.23/install)" diff --git a/docker/v1.16.24.Dockerfile b/docker/v1.16.24.Dockerfile index 68a8b7b..348364d 100644 --- a/docker/v1.16.24.Dockerfile +++ b/docker/v1.16.24.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.24/install)" diff --git a/docker/v1.16.25.Dockerfile b/docker/v1.16.25.Dockerfile index 02e3f9d..9972c39 100644 --- a/docker/v1.16.25.Dockerfile +++ b/docker/v1.16.25.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.25/install)" diff --git a/docker/v1.16.26.Dockerfile b/docker/v1.16.26.Dockerfile index ba34de3..5939044 100644 --- a/docker/v1.16.26.Dockerfile +++ b/docker/v1.16.26.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.26/install)" diff --git a/docker/v1.16.27.Dockerfile b/docker/v1.16.27.Dockerfile index 277a476..ec011cf 100644 --- a/docker/v1.16.27.Dockerfile +++ b/docker/v1.16.27.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.27/install)" diff --git a/docker/v1.16.3.Dockerfile b/docker/v1.16.3.Dockerfile index 463716f..2b5792b 100644 --- a/docker/v1.16.3.Dockerfile +++ b/docker/v1.16.3.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.3/install)" diff --git a/docker/v1.16.4.Dockerfile b/docker/v1.16.4.Dockerfile index 929dd05..787a1a0 100644 --- a/docker/v1.16.4.Dockerfile +++ b/docker/v1.16.4.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.4/install)" diff --git a/docker/v1.16.5.Dockerfile b/docker/v1.16.5.Dockerfile index 03f1dc3..b725681 100644 --- a/docker/v1.16.5.Dockerfile +++ b/docker/v1.16.5.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.5/install)" diff --git a/docker/v1.16.6.Dockerfile b/docker/v1.16.6.Dockerfile index 4eaf9c0..aae534f 100644 --- a/docker/v1.16.6.Dockerfile +++ b/docker/v1.16.6.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.6/install)" diff --git a/docker/v1.16.7.Dockerfile b/docker/v1.16.7.Dockerfile index 5c46eb5..2e05559 100644 --- a/docker/v1.16.7.Dockerfile +++ b/docker/v1.16.7.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.7/install)" diff --git a/docker/v1.16.8.Dockerfile b/docker/v1.16.8.Dockerfile index c134440..8c898ca 100644 --- a/docker/v1.16.8.Dockerfile +++ b/docker/v1.16.8.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.8/install)" diff --git a/docker/v1.16.9.Dockerfile b/docker/v1.16.9.Dockerfile index 837689b..38baef7 100644 --- a/docker/v1.16.9.Dockerfile +++ b/docker/v1.16.9.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.9/install)" diff --git a/docker/v1.17.0.Dockerfile b/docker/v1.17.0.Dockerfile index c93e341..cccd49d 100644 --- a/docker/v1.17.0.Dockerfile +++ b/docker/v1.17.0.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:6562d50b62366d5b9db92b34c6684fab5bf3b9f627e59a863c9c0675760feed4 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.0/install)" diff --git a/docker/v1.17.1.Dockerfile b/docker/v1.17.1.Dockerfile index e2608a8..0bceb78 100644 --- a/docker/v1.17.1.Dockerfile +++ b/docker/v1.17.1.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.1/install)" diff --git a/docker/v1.17.10.Dockerfile b/docker/v1.17.10.Dockerfile index a75a01a..1eb1abf 100644 --- a/docker/v1.17.10.Dockerfile +++ b/docker/v1.17.10.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.10/install)" diff --git a/docker/v1.17.11.Dockerfile b/docker/v1.17.11.Dockerfile index 3992f5b..8df4e37 100644 --- a/docker/v1.17.11.Dockerfile +++ b/docker/v1.17.11.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.11/install)" diff --git a/docker/v1.17.12.Dockerfile b/docker/v1.17.12.Dockerfile index 61f15c5..bd3c3df 100644 --- a/docker/v1.17.12.Dockerfile +++ b/docker/v1.17.12.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.12/install)" diff --git a/docker/v1.17.13.Dockerfile b/docker/v1.17.13.Dockerfile index 22040a9..b6b9043 100644 --- a/docker/v1.17.13.Dockerfile +++ b/docker/v1.17.13.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.13/install)" diff --git a/docker/v1.17.14.Dockerfile b/docker/v1.17.14.Dockerfile index 94f6e76..70af896 100644 --- a/docker/v1.17.14.Dockerfile +++ b/docker/v1.17.14.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.14/install)" diff --git a/docker/v1.17.15.Dockerfile b/docker/v1.17.15.Dockerfile index 4163e93..3812dbb 100644 --- a/docker/v1.17.15.Dockerfile +++ b/docker/v1.17.15.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.15/install)" diff --git a/docker/v1.17.16.Dockerfile b/docker/v1.17.16.Dockerfile index 78cc7ce..3380c5d 100644 --- a/docker/v1.17.16.Dockerfile +++ b/docker/v1.17.16.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.16/install)" diff --git a/docker/v1.17.17.Dockerfile b/docker/v1.17.17.Dockerfile index 2ce7edf..b5770a1 100644 --- a/docker/v1.17.17.Dockerfile +++ b/docker/v1.17.17.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.17/install)" diff --git a/docker/v1.17.18.Dockerfile b/docker/v1.17.18.Dockerfile index 8072ed9..071b41d 100644 --- a/docker/v1.17.18.Dockerfile +++ b/docker/v1.17.18.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.18/install)" diff --git a/docker/v1.17.19.Dockerfile b/docker/v1.17.19.Dockerfile index e2615e9..4806882 100644 --- a/docker/v1.17.19.Dockerfile +++ b/docker/v1.17.19.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.19/install)" diff --git a/docker/v1.17.2.Dockerfile b/docker/v1.17.2.Dockerfile index d1760be..c152d23 100644 --- a/docker/v1.17.2.Dockerfile +++ b/docker/v1.17.2.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.2/install)" diff --git a/docker/v1.17.20.Dockerfile b/docker/v1.17.20.Dockerfile index edb730c..4da4664 100644 --- a/docker/v1.17.20.Dockerfile +++ b/docker/v1.17.20.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.20/install)" diff --git a/docker/v1.17.21.Dockerfile b/docker/v1.17.21.Dockerfile index baed4cc..b764ccc 100644 --- a/docker/v1.17.21.Dockerfile +++ b/docker/v1.17.21.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.21/install)" diff --git a/docker/v1.17.22.Dockerfile b/docker/v1.17.22.Dockerfile index c40f795..74ddbc7 100644 --- a/docker/v1.17.22.Dockerfile +++ b/docker/v1.17.22.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.22/install)" diff --git a/docker/v1.17.23.Dockerfile b/docker/v1.17.23.Dockerfile index ebcbbfa..7337ad2 100644 --- a/docker/v1.17.23.Dockerfile +++ b/docker/v1.17.23.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.23/install)" diff --git a/docker/v1.17.24.Dockerfile b/docker/v1.17.24.Dockerfile index 3d5b3e6..7518fb7 100644 --- a/docker/v1.17.24.Dockerfile +++ b/docker/v1.17.24.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.24/install)" diff --git a/docker/v1.17.25.Dockerfile b/docker/v1.17.25.Dockerfile index 9e1bf0f..c8580de 100644 --- a/docker/v1.17.25.Dockerfile +++ b/docker/v1.17.25.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.25/install)" diff --git a/docker/v1.17.26.Dockerfile b/docker/v1.17.26.Dockerfile index a42b14b..ff56207 100644 --- a/docker/v1.17.26.Dockerfile +++ b/docker/v1.17.26.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.26/install)" diff --git a/docker/v1.17.27.Dockerfile b/docker/v1.17.27.Dockerfile index 964d8b7..16f5055 100644 --- a/docker/v1.17.27.Dockerfile +++ b/docker/v1.17.27.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.27/install)" diff --git a/docker/v1.17.28.Dockerfile b/docker/v1.17.28.Dockerfile index fb57315..8b6a52a 100644 --- a/docker/v1.17.28.Dockerfile +++ b/docker/v1.17.28.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.28/install)" diff --git a/docker/v1.17.29.Dockerfile b/docker/v1.17.29.Dockerfile index c2aeb04..4e10204 100644 --- a/docker/v1.17.29.Dockerfile +++ b/docker/v1.17.29.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.29/install)" diff --git a/docker/v1.17.3.Dockerfile b/docker/v1.17.3.Dockerfile index 3b63dd4..843c32a 100644 --- a/docker/v1.17.3.Dockerfile +++ b/docker/v1.17.3.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.3/install)" diff --git a/docker/v1.17.30.Dockerfile b/docker/v1.17.30.Dockerfile index 958f60a..f7629b2 100644 --- a/docker/v1.17.30.Dockerfile +++ b/docker/v1.17.30.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.30/install)" diff --git a/docker/v1.17.31.Dockerfile b/docker/v1.17.31.Dockerfile index a18c042..5556b01 100644 --- a/docker/v1.17.31.Dockerfile +++ b/docker/v1.17.31.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.31/install)" diff --git a/docker/v1.17.4.Dockerfile b/docker/v1.17.4.Dockerfile index cf807f4..bbc45b8 100644 --- a/docker/v1.17.4.Dockerfile +++ b/docker/v1.17.4.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.4/install)" diff --git a/docker/v1.17.5.Dockerfile b/docker/v1.17.5.Dockerfile index ffbd22e..9bdb504 100644 --- a/docker/v1.17.5.Dockerfile +++ b/docker/v1.17.5.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.5/install)" diff --git a/docker/v1.17.6.Dockerfile b/docker/v1.17.6.Dockerfile index 1f654e0..a47fb6b 100644 --- a/docker/v1.17.6.Dockerfile +++ b/docker/v1.17.6.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.6/install)" diff --git a/docker/v1.17.7.Dockerfile b/docker/v1.17.7.Dockerfile index 4cd5861..f3a9783 100644 --- a/docker/v1.17.7.Dockerfile +++ b/docker/v1.17.7.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.7/install)" diff --git a/docker/v1.17.8.Dockerfile b/docker/v1.17.8.Dockerfile index 6ab5c20..587cd62 100644 --- a/docker/v1.17.8.Dockerfile +++ b/docker/v1.17.8.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.8/install)" diff --git a/docker/v1.17.9.Dockerfile b/docker/v1.17.9.Dockerfile index 86410a3..f211af4 100644 --- a/docker/v1.17.9.Dockerfile +++ b/docker/v1.17.9.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.9/install)" diff --git a/docker/v1.18.0.Dockerfile b/docker/v1.18.0.Dockerfile index 1a98fda..3169742 100644 --- a/docker/v1.18.0.Dockerfile +++ b/docker/v1.18.0.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.0/install)" diff --git a/docker/v1.18.1.Dockerfile b/docker/v1.18.1.Dockerfile index fa393ef..82de5b3 100644 --- a/docker/v1.18.1.Dockerfile +++ b/docker/v1.18.1.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.1/install)" diff --git a/docker/v1.18.10.Dockerfile b/docker/v1.18.10.Dockerfile index 54a9118..97d1c0a 100644 --- a/docker/v1.18.10.Dockerfile +++ b/docker/v1.18.10.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.10/install)" diff --git a/docker/v1.18.11.Dockerfile b/docker/v1.18.11.Dockerfile index 1a2f27c..1558f2d 100644 --- a/docker/v1.18.11.Dockerfile +++ b/docker/v1.18.11.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.11/install)" diff --git a/docker/v1.18.2.Dockerfile b/docker/v1.18.2.Dockerfile index 3b85afa..a8f7310 100644 --- a/docker/v1.18.2.Dockerfile +++ b/docker/v1.18.2.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.2/install)" diff --git a/docker/v1.18.3.Dockerfile b/docker/v1.18.3.Dockerfile index 60d6de1..6e8a27b 100644 --- a/docker/v1.18.3.Dockerfile +++ b/docker/v1.18.3.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.3/install)" diff --git a/docker/v1.18.4.Dockerfile b/docker/v1.18.4.Dockerfile index ca54c37..987a4f0 100644 --- a/docker/v1.18.4.Dockerfile +++ b/docker/v1.18.4.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.4/install)" diff --git a/docker/v1.18.5.Dockerfile b/docker/v1.18.5.Dockerfile index 3b8bfdb..2d89549 100644 --- a/docker/v1.18.5.Dockerfile +++ b/docker/v1.18.5.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.5/install)" diff --git a/docker/v1.18.6.Dockerfile b/docker/v1.18.6.Dockerfile index f79098e..27d678a 100644 --- a/docker/v1.18.6.Dockerfile +++ b/docker/v1.18.6.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.6/install)" diff --git a/docker/v1.18.7.Dockerfile b/docker/v1.18.7.Dockerfile index 193866c..7e2686f 100644 --- a/docker/v1.18.7.Dockerfile +++ b/docker/v1.18.7.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.7/install)" diff --git a/docker/v1.18.8.Dockerfile b/docker/v1.18.8.Dockerfile index c5f3e7a..6878e53 100644 --- a/docker/v1.18.8.Dockerfile +++ b/docker/v1.18.8.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.8/install)" diff --git a/docker/v1.18.9.Dockerfile b/docker/v1.18.9.Dockerfile index caa30ad..489f2eb 100644 --- a/docker/v1.18.9.Dockerfile +++ b/docker/v1.18.9.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.9/install)" diff --git a/generate_dockerfiles.py b/generate_dockerfiles.py index 8d93db7..1a4d011 100644 --- a/generate_dockerfiles.py +++ b/generate_dockerfiles.py @@ -13,20 +13,14 @@ args = parser.parse_args() # Array of Solana version mapped to rust version hashes -RUST_DOCKER_IMAGESHA_MAP = { - "1.68.0": "79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39", - "1.69.0": "b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a", - "1.72.1": "6562d50b62366d5b9db92b34c6684fab5bf3b9f627e59a863c9c0675760feed4", - "1.73.0": "7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22", - "1.75.0": "b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e", -} +RUST_DOCKER_IMAGESHA_MAP = {} RUST_VERSION_PLACEHOLDER = "$RUST_VERSION" SOLANA_VERSION_PLACEHOLDER = "$SOLANA_VERSION" base_dockerfile_text = f""" -FROM --platform=linux/amd64 rust@sha256:{RUST_VERSION_PLACEHOLDER} +FROM --platform=linux/amd64 rust@{RUST_VERSION_PLACEHOLDER} RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/{SOLANA_VERSION_PLACEHOLDER}/install)" @@ -55,46 +49,20 @@ def get_toolchain(version_tag): if "v1.14" in version_tag: return "1.68.0" - attempt = 0 - max_attempts = 5 - while attempt < max_attempts: - url = "https://api.github.com/repos/solana-labs/solana/contents/rust-toolchain.toml?ref=tags/" + version_tag - headers = {'Accept': 'application/vnd.github.v3.raw'} # Fetch the raw file content + url = f"https://raw.githubusercontent.com/solana-labs/solana/{version_tag}/rust-toolchain.toml" + headers = {'Accept': 'application/vnd.github.v3.raw'} # Fetch the raw file content - response = requests.get(url, headers=headers) - if response.status_code == 200: - parsed_data = tomllib.loads(response.text) - channel_version = parsed_data['toolchain']['channel'] - - # Strict rate limit for unauthenticated requests - time.sleep(2.5) - - return channel_version - - else: - # Parse error message to json - error = json.loads(response.text) - - print(response.text) - - if 'message' in error: - if "rate limit exceeded" in error['message']: - wait = 5 + 2 ** attempt # Exponential backoff factor - max_wait = 300 # Maximum waiting time in seconds - sleep_time = min(wait, max_wait) - print(f"Rate limit exceeded. Sleeping for {sleep_time} seconds.") - time.sleep(sleep_time) - attempt += 1 - elif error['message'] == "Not Found": - # If message is "Not Found" then default to 1.68.0 - print("Using default rust version 1.68.0 for Solana version", version_tag) - return "1.68.0" - else: - print("Failed to fetch the file") - print("Error message: " + error['message']) - return None + response = requests.get(url, headers=headers) + if response.status_code == 200: + parsed_data = tomllib.loads(response.text) + channel_version = parsed_data['toolchain']['channel'] + return channel_version + else: + print(f"Failed to fetch rust-toolchain.toml for {version_tag}") + return None + tags = list( filter( check_version, @@ -110,15 +78,30 @@ def get_toolchain(version_tag): for release in tags: rust_version = get_toolchain(release) - print(release + ", " + rust_version) + print("Generating Dockerfile for " + release + ", rust version " + rust_version) if rust_version is None: print(f"Failed to fetch rust version for {release}") continue if rust_version not in RUST_DOCKER_IMAGESHA_MAP: - print(f"Rust version {rust_version} not found in the map") - continue + response = requests.get( + "https://hub.docker.com/v2/namespaces/library/repositories/rust/tags/1.68.0-bullseye" + ) + + if response.status_code == 200: + # JSONify response + response_json = response.json() + + # find amd64 image + for image in response_json["images"]: + if image["architecture"] == "amd64": + RUST_DOCKER_IMAGESHA_MAP[rust_version] = image["digest"] + break + + if rust_version not in RUST_DOCKER_IMAGESHA_MAP: + print(f"Failed to fetch rust image for {rust_version}") + continue dockerfile = base_dockerfile_text.replace(SOLANA_VERSION_PLACEHOLDER, release).lstrip("\n") dockerfile = dockerfile.replace(RUST_VERSION_PLACEHOLDER, RUST_DOCKER_IMAGESHA_MAP[rust_version]) From fd50e4e1db7573026a642bcc52d5b5623ae5299b Mon Sep 17 00:00:00 2001 From: Jac0xb Date: Mon, 15 Apr 2024 18:12:48 -0400 Subject: [PATCH 104/314] Fix hardcoded 1.68.0 for docker request --- docker/v1.16.0.Dockerfile | 2 +- docker/v1.16.1.Dockerfile | 2 +- docker/v1.16.10.Dockerfile | 2 +- docker/v1.16.11.Dockerfile | 2 +- docker/v1.16.12.Dockerfile | 2 +- docker/v1.16.13.Dockerfile | 2 +- docker/v1.16.14.Dockerfile | 2 +- docker/v1.16.15.Dockerfile | 2 +- docker/v1.16.16.Dockerfile | 2 +- docker/v1.16.17.Dockerfile | 2 +- docker/v1.16.18.Dockerfile | 2 +- docker/v1.16.19.Dockerfile | 2 +- docker/v1.16.2.Dockerfile | 2 +- docker/v1.16.20.Dockerfile | 2 +- docker/v1.16.21.Dockerfile | 2 +- docker/v1.16.22.Dockerfile | 2 +- docker/v1.16.23.Dockerfile | 2 +- docker/v1.16.24.Dockerfile | 2 +- docker/v1.16.25.Dockerfile | 2 +- docker/v1.16.26.Dockerfile | 2 +- docker/v1.16.27.Dockerfile | 2 +- docker/v1.16.3.Dockerfile | 2 +- docker/v1.16.4.Dockerfile | 2 +- docker/v1.16.5.Dockerfile | 2 +- docker/v1.16.6.Dockerfile | 2 +- docker/v1.16.7.Dockerfile | 2 +- docker/v1.16.8.Dockerfile | 2 +- docker/v1.16.9.Dockerfile | 2 +- docker/v1.17.0.Dockerfile | 2 +- docker/v1.17.1.Dockerfile | 2 +- docker/v1.17.10.Dockerfile | 2 +- docker/v1.17.11.Dockerfile | 2 +- docker/v1.17.12.Dockerfile | 2 +- docker/v1.17.13.Dockerfile | 2 +- docker/v1.17.14.Dockerfile | 2 +- docker/v1.17.15.Dockerfile | 2 +- docker/v1.17.16.Dockerfile | 2 +- docker/v1.17.17.Dockerfile | 2 +- docker/v1.17.18.Dockerfile | 2 +- docker/v1.17.19.Dockerfile | 2 +- docker/v1.17.2.Dockerfile | 2 +- docker/v1.17.20.Dockerfile | 2 +- docker/v1.17.21.Dockerfile | 2 +- docker/v1.17.22.Dockerfile | 2 +- docker/v1.17.23.Dockerfile | 2 +- docker/v1.17.24.Dockerfile | 2 +- docker/v1.17.25.Dockerfile | 2 +- docker/v1.17.26.Dockerfile | 2 +- docker/v1.17.27.Dockerfile | 2 +- docker/v1.17.28.Dockerfile | 2 +- docker/v1.17.29.Dockerfile | 2 +- docker/v1.17.3.Dockerfile | 2 +- docker/v1.17.30.Dockerfile | 2 +- docker/v1.17.31.Dockerfile | 2 +- docker/v1.17.4.Dockerfile | 2 +- docker/v1.17.5.Dockerfile | 2 +- docker/v1.17.6.Dockerfile | 2 +- docker/v1.17.7.Dockerfile | 2 +- docker/v1.17.8.Dockerfile | 2 +- docker/v1.17.9.Dockerfile | 2 +- docker/v1.18.0.Dockerfile | 2 +- docker/v1.18.1.Dockerfile | 2 +- docker/v1.18.10.Dockerfile | 2 +- docker/v1.18.11.Dockerfile | 2 +- docker/v1.18.2.Dockerfile | 2 +- docker/v1.18.3.Dockerfile | 2 +- docker/v1.18.4.Dockerfile | 2 +- docker/v1.18.5.Dockerfile | 2 +- docker/v1.18.6.Dockerfile | 2 +- docker/v1.18.7.Dockerfile | 2 +- docker/v1.18.8.Dockerfile | 2 +- docker/v1.18.9.Dockerfile | 2 +- generate_dockerfiles.py | 2 +- 73 files changed, 73 insertions(+), 73 deletions(-) diff --git a/docker/v1.16.0.Dockerfile b/docker/v1.16.0.Dockerfile index d7b107e..de23d08 100644 --- a/docker/v1.16.0.Dockerfile +++ b/docker/v1.16.0.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.0/install)" diff --git a/docker/v1.16.1.Dockerfile b/docker/v1.16.1.Dockerfile index 72a511a..6502147 100644 --- a/docker/v1.16.1.Dockerfile +++ b/docker/v1.16.1.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.1/install)" diff --git a/docker/v1.16.10.Dockerfile b/docker/v1.16.10.Dockerfile index fd3f6f2..8fe6d7c 100644 --- a/docker/v1.16.10.Dockerfile +++ b/docker/v1.16.10.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.10/install)" diff --git a/docker/v1.16.11.Dockerfile b/docker/v1.16.11.Dockerfile index 842766c..54b90ad 100644 --- a/docker/v1.16.11.Dockerfile +++ b/docker/v1.16.11.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.11/install)" diff --git a/docker/v1.16.12.Dockerfile b/docker/v1.16.12.Dockerfile index 17a4014..851d1fa 100644 --- a/docker/v1.16.12.Dockerfile +++ b/docker/v1.16.12.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.12/install)" diff --git a/docker/v1.16.13.Dockerfile b/docker/v1.16.13.Dockerfile index e8141d2..177b979 100644 --- a/docker/v1.16.13.Dockerfile +++ b/docker/v1.16.13.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.13/install)" diff --git a/docker/v1.16.14.Dockerfile b/docker/v1.16.14.Dockerfile index 5ba75fa..80e92a8 100644 --- a/docker/v1.16.14.Dockerfile +++ b/docker/v1.16.14.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.14/install)" diff --git a/docker/v1.16.15.Dockerfile b/docker/v1.16.15.Dockerfile index 4908c73..e0967f1 100644 --- a/docker/v1.16.15.Dockerfile +++ b/docker/v1.16.15.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.15/install)" diff --git a/docker/v1.16.16.Dockerfile b/docker/v1.16.16.Dockerfile index e2be99c..35bd54f 100644 --- a/docker/v1.16.16.Dockerfile +++ b/docker/v1.16.16.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.16/install)" diff --git a/docker/v1.16.17.Dockerfile b/docker/v1.16.17.Dockerfile index 9bfffda..2610e21 100644 --- a/docker/v1.16.17.Dockerfile +++ b/docker/v1.16.17.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.17/install)" diff --git a/docker/v1.16.18.Dockerfile b/docker/v1.16.18.Dockerfile index bd04367..7065fff 100644 --- a/docker/v1.16.18.Dockerfile +++ b/docker/v1.16.18.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.18/install)" diff --git a/docker/v1.16.19.Dockerfile b/docker/v1.16.19.Dockerfile index 25e75e3..57bacfa 100644 --- a/docker/v1.16.19.Dockerfile +++ b/docker/v1.16.19.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.19/install)" diff --git a/docker/v1.16.2.Dockerfile b/docker/v1.16.2.Dockerfile index 3019fb1..cadad9d 100644 --- a/docker/v1.16.2.Dockerfile +++ b/docker/v1.16.2.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.2/install)" diff --git a/docker/v1.16.20.Dockerfile b/docker/v1.16.20.Dockerfile index 66b1786..6ab94c9 100644 --- a/docker/v1.16.20.Dockerfile +++ b/docker/v1.16.20.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.20/install)" diff --git a/docker/v1.16.21.Dockerfile b/docker/v1.16.21.Dockerfile index ccd445e..92ddcfd 100644 --- a/docker/v1.16.21.Dockerfile +++ b/docker/v1.16.21.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.21/install)" diff --git a/docker/v1.16.22.Dockerfile b/docker/v1.16.22.Dockerfile index da2dbdc..8b1c66e 100644 --- a/docker/v1.16.22.Dockerfile +++ b/docker/v1.16.22.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.22/install)" diff --git a/docker/v1.16.23.Dockerfile b/docker/v1.16.23.Dockerfile index c1b3efb..6afef5a 100644 --- a/docker/v1.16.23.Dockerfile +++ b/docker/v1.16.23.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.23/install)" diff --git a/docker/v1.16.24.Dockerfile b/docker/v1.16.24.Dockerfile index 348364d..68a8b7b 100644 --- a/docker/v1.16.24.Dockerfile +++ b/docker/v1.16.24.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.24/install)" diff --git a/docker/v1.16.25.Dockerfile b/docker/v1.16.25.Dockerfile index 9972c39..02e3f9d 100644 --- a/docker/v1.16.25.Dockerfile +++ b/docker/v1.16.25.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.25/install)" diff --git a/docker/v1.16.26.Dockerfile b/docker/v1.16.26.Dockerfile index 5939044..ba34de3 100644 --- a/docker/v1.16.26.Dockerfile +++ b/docker/v1.16.26.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.26/install)" diff --git a/docker/v1.16.27.Dockerfile b/docker/v1.16.27.Dockerfile index ec011cf..277a476 100644 --- a/docker/v1.16.27.Dockerfile +++ b/docker/v1.16.27.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.27/install)" diff --git a/docker/v1.16.3.Dockerfile b/docker/v1.16.3.Dockerfile index 2b5792b..463716f 100644 --- a/docker/v1.16.3.Dockerfile +++ b/docker/v1.16.3.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.3/install)" diff --git a/docker/v1.16.4.Dockerfile b/docker/v1.16.4.Dockerfile index 787a1a0..929dd05 100644 --- a/docker/v1.16.4.Dockerfile +++ b/docker/v1.16.4.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.4/install)" diff --git a/docker/v1.16.5.Dockerfile b/docker/v1.16.5.Dockerfile index b725681..03f1dc3 100644 --- a/docker/v1.16.5.Dockerfile +++ b/docker/v1.16.5.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.5/install)" diff --git a/docker/v1.16.6.Dockerfile b/docker/v1.16.6.Dockerfile index aae534f..4eaf9c0 100644 --- a/docker/v1.16.6.Dockerfile +++ b/docker/v1.16.6.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.6/install)" diff --git a/docker/v1.16.7.Dockerfile b/docker/v1.16.7.Dockerfile index 2e05559..5c46eb5 100644 --- a/docker/v1.16.7.Dockerfile +++ b/docker/v1.16.7.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.7/install)" diff --git a/docker/v1.16.8.Dockerfile b/docker/v1.16.8.Dockerfile index 8c898ca..c134440 100644 --- a/docker/v1.16.8.Dockerfile +++ b/docker/v1.16.8.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.8/install)" diff --git a/docker/v1.16.9.Dockerfile b/docker/v1.16.9.Dockerfile index 38baef7..837689b 100644 --- a/docker/v1.16.9.Dockerfile +++ b/docker/v1.16.9.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.9/install)" diff --git a/docker/v1.17.0.Dockerfile b/docker/v1.17.0.Dockerfile index cccd49d..c93e341 100644 --- a/docker/v1.17.0.Dockerfile +++ b/docker/v1.17.0.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:6562d50b62366d5b9db92b34c6684fab5bf3b9f627e59a863c9c0675760feed4 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.0/install)" diff --git a/docker/v1.17.1.Dockerfile b/docker/v1.17.1.Dockerfile index 0bceb78..e2608a8 100644 --- a/docker/v1.17.1.Dockerfile +++ b/docker/v1.17.1.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.1/install)" diff --git a/docker/v1.17.10.Dockerfile b/docker/v1.17.10.Dockerfile index 1eb1abf..a75a01a 100644 --- a/docker/v1.17.10.Dockerfile +++ b/docker/v1.17.10.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.10/install)" diff --git a/docker/v1.17.11.Dockerfile b/docker/v1.17.11.Dockerfile index 8df4e37..3992f5b 100644 --- a/docker/v1.17.11.Dockerfile +++ b/docker/v1.17.11.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.11/install)" diff --git a/docker/v1.17.12.Dockerfile b/docker/v1.17.12.Dockerfile index bd3c3df..61f15c5 100644 --- a/docker/v1.17.12.Dockerfile +++ b/docker/v1.17.12.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.12/install)" diff --git a/docker/v1.17.13.Dockerfile b/docker/v1.17.13.Dockerfile index b6b9043..22040a9 100644 --- a/docker/v1.17.13.Dockerfile +++ b/docker/v1.17.13.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.13/install)" diff --git a/docker/v1.17.14.Dockerfile b/docker/v1.17.14.Dockerfile index 70af896..94f6e76 100644 --- a/docker/v1.17.14.Dockerfile +++ b/docker/v1.17.14.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.14/install)" diff --git a/docker/v1.17.15.Dockerfile b/docker/v1.17.15.Dockerfile index 3812dbb..4163e93 100644 --- a/docker/v1.17.15.Dockerfile +++ b/docker/v1.17.15.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.15/install)" diff --git a/docker/v1.17.16.Dockerfile b/docker/v1.17.16.Dockerfile index 3380c5d..78cc7ce 100644 --- a/docker/v1.17.16.Dockerfile +++ b/docker/v1.17.16.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.16/install)" diff --git a/docker/v1.17.17.Dockerfile b/docker/v1.17.17.Dockerfile index b5770a1..2ce7edf 100644 --- a/docker/v1.17.17.Dockerfile +++ b/docker/v1.17.17.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.17/install)" diff --git a/docker/v1.17.18.Dockerfile b/docker/v1.17.18.Dockerfile index 071b41d..8072ed9 100644 --- a/docker/v1.17.18.Dockerfile +++ b/docker/v1.17.18.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.18/install)" diff --git a/docker/v1.17.19.Dockerfile b/docker/v1.17.19.Dockerfile index 4806882..e2615e9 100644 --- a/docker/v1.17.19.Dockerfile +++ b/docker/v1.17.19.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.19/install)" diff --git a/docker/v1.17.2.Dockerfile b/docker/v1.17.2.Dockerfile index c152d23..d1760be 100644 --- a/docker/v1.17.2.Dockerfile +++ b/docker/v1.17.2.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.2/install)" diff --git a/docker/v1.17.20.Dockerfile b/docker/v1.17.20.Dockerfile index 4da4664..edb730c 100644 --- a/docker/v1.17.20.Dockerfile +++ b/docker/v1.17.20.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.20/install)" diff --git a/docker/v1.17.21.Dockerfile b/docker/v1.17.21.Dockerfile index b764ccc..baed4cc 100644 --- a/docker/v1.17.21.Dockerfile +++ b/docker/v1.17.21.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.21/install)" diff --git a/docker/v1.17.22.Dockerfile b/docker/v1.17.22.Dockerfile index 74ddbc7..c40f795 100644 --- a/docker/v1.17.22.Dockerfile +++ b/docker/v1.17.22.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.22/install)" diff --git a/docker/v1.17.23.Dockerfile b/docker/v1.17.23.Dockerfile index 7337ad2..ebcbbfa 100644 --- a/docker/v1.17.23.Dockerfile +++ b/docker/v1.17.23.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.23/install)" diff --git a/docker/v1.17.24.Dockerfile b/docker/v1.17.24.Dockerfile index 7518fb7..3d5b3e6 100644 --- a/docker/v1.17.24.Dockerfile +++ b/docker/v1.17.24.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.24/install)" diff --git a/docker/v1.17.25.Dockerfile b/docker/v1.17.25.Dockerfile index c8580de..9e1bf0f 100644 --- a/docker/v1.17.25.Dockerfile +++ b/docker/v1.17.25.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.25/install)" diff --git a/docker/v1.17.26.Dockerfile b/docker/v1.17.26.Dockerfile index ff56207..a42b14b 100644 --- a/docker/v1.17.26.Dockerfile +++ b/docker/v1.17.26.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.26/install)" diff --git a/docker/v1.17.27.Dockerfile b/docker/v1.17.27.Dockerfile index 16f5055..964d8b7 100644 --- a/docker/v1.17.27.Dockerfile +++ b/docker/v1.17.27.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.27/install)" diff --git a/docker/v1.17.28.Dockerfile b/docker/v1.17.28.Dockerfile index 8b6a52a..fb57315 100644 --- a/docker/v1.17.28.Dockerfile +++ b/docker/v1.17.28.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.28/install)" diff --git a/docker/v1.17.29.Dockerfile b/docker/v1.17.29.Dockerfile index 4e10204..c2aeb04 100644 --- a/docker/v1.17.29.Dockerfile +++ b/docker/v1.17.29.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.29/install)" diff --git a/docker/v1.17.3.Dockerfile b/docker/v1.17.3.Dockerfile index 843c32a..3b63dd4 100644 --- a/docker/v1.17.3.Dockerfile +++ b/docker/v1.17.3.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.3/install)" diff --git a/docker/v1.17.30.Dockerfile b/docker/v1.17.30.Dockerfile index f7629b2..958f60a 100644 --- a/docker/v1.17.30.Dockerfile +++ b/docker/v1.17.30.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.30/install)" diff --git a/docker/v1.17.31.Dockerfile b/docker/v1.17.31.Dockerfile index 5556b01..a18c042 100644 --- a/docker/v1.17.31.Dockerfile +++ b/docker/v1.17.31.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.31/install)" diff --git a/docker/v1.17.4.Dockerfile b/docker/v1.17.4.Dockerfile index bbc45b8..cf807f4 100644 --- a/docker/v1.17.4.Dockerfile +++ b/docker/v1.17.4.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.4/install)" diff --git a/docker/v1.17.5.Dockerfile b/docker/v1.17.5.Dockerfile index 9bdb504..ffbd22e 100644 --- a/docker/v1.17.5.Dockerfile +++ b/docker/v1.17.5.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.5/install)" diff --git a/docker/v1.17.6.Dockerfile b/docker/v1.17.6.Dockerfile index a47fb6b..1f654e0 100644 --- a/docker/v1.17.6.Dockerfile +++ b/docker/v1.17.6.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.6/install)" diff --git a/docker/v1.17.7.Dockerfile b/docker/v1.17.7.Dockerfile index f3a9783..4cd5861 100644 --- a/docker/v1.17.7.Dockerfile +++ b/docker/v1.17.7.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.7/install)" diff --git a/docker/v1.17.8.Dockerfile b/docker/v1.17.8.Dockerfile index 587cd62..6ab5c20 100644 --- a/docker/v1.17.8.Dockerfile +++ b/docker/v1.17.8.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.8/install)" diff --git a/docker/v1.17.9.Dockerfile b/docker/v1.17.9.Dockerfile index f211af4..86410a3 100644 --- a/docker/v1.17.9.Dockerfile +++ b/docker/v1.17.9.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.9/install)" diff --git a/docker/v1.18.0.Dockerfile b/docker/v1.18.0.Dockerfile index 3169742..1a98fda 100644 --- a/docker/v1.18.0.Dockerfile +++ b/docker/v1.18.0.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.0/install)" diff --git a/docker/v1.18.1.Dockerfile b/docker/v1.18.1.Dockerfile index 82de5b3..fa393ef 100644 --- a/docker/v1.18.1.Dockerfile +++ b/docker/v1.18.1.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.1/install)" diff --git a/docker/v1.18.10.Dockerfile b/docker/v1.18.10.Dockerfile index 97d1c0a..54a9118 100644 --- a/docker/v1.18.10.Dockerfile +++ b/docker/v1.18.10.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.10/install)" diff --git a/docker/v1.18.11.Dockerfile b/docker/v1.18.11.Dockerfile index 1558f2d..1a2f27c 100644 --- a/docker/v1.18.11.Dockerfile +++ b/docker/v1.18.11.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.11/install)" diff --git a/docker/v1.18.2.Dockerfile b/docker/v1.18.2.Dockerfile index a8f7310..3b85afa 100644 --- a/docker/v1.18.2.Dockerfile +++ b/docker/v1.18.2.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.2/install)" diff --git a/docker/v1.18.3.Dockerfile b/docker/v1.18.3.Dockerfile index 6e8a27b..60d6de1 100644 --- a/docker/v1.18.3.Dockerfile +++ b/docker/v1.18.3.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.3/install)" diff --git a/docker/v1.18.4.Dockerfile b/docker/v1.18.4.Dockerfile index 987a4f0..ca54c37 100644 --- a/docker/v1.18.4.Dockerfile +++ b/docker/v1.18.4.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.4/install)" diff --git a/docker/v1.18.5.Dockerfile b/docker/v1.18.5.Dockerfile index 2d89549..3b8bfdb 100644 --- a/docker/v1.18.5.Dockerfile +++ b/docker/v1.18.5.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.5/install)" diff --git a/docker/v1.18.6.Dockerfile b/docker/v1.18.6.Dockerfile index 27d678a..f79098e 100644 --- a/docker/v1.18.6.Dockerfile +++ b/docker/v1.18.6.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.6/install)" diff --git a/docker/v1.18.7.Dockerfile b/docker/v1.18.7.Dockerfile index 7e2686f..193866c 100644 --- a/docker/v1.18.7.Dockerfile +++ b/docker/v1.18.7.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.7/install)" diff --git a/docker/v1.18.8.Dockerfile b/docker/v1.18.8.Dockerfile index 6878e53..c5f3e7a 100644 --- a/docker/v1.18.8.Dockerfile +++ b/docker/v1.18.8.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.8/install)" diff --git a/docker/v1.18.9.Dockerfile b/docker/v1.18.9.Dockerfile index 489f2eb..caa30ad 100644 --- a/docker/v1.18.9.Dockerfile +++ b/docker/v1.18.9.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.9/install)" diff --git a/generate_dockerfiles.py b/generate_dockerfiles.py index 1a4d011..b322610 100644 --- a/generate_dockerfiles.py +++ b/generate_dockerfiles.py @@ -86,7 +86,7 @@ def get_toolchain(version_tag): if rust_version not in RUST_DOCKER_IMAGESHA_MAP: response = requests.get( - "https://hub.docker.com/v2/namespaces/library/repositories/rust/tags/1.68.0-bullseye" + f"https://hub.docker.com/v2/namespaces/library/repositories/rust/tags/{rust_version}-bullseye" ) if response.status_code == 200: From 25c1d282f6900906a67c9ee3d30a7f0df489e211 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Mon, 15 Apr 2024 21:20:40 -0500 Subject: [PATCH 105/314] Update images --- Cargo.lock | 2 +- Cargo.toml | 2 +- generate_dockerfiles.py | 33 ++++++++++++++++----- src/image_config.rs | 65 ++++++++++++++++++++++++++--------------- 4 files changed, 68 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7f78ffd..a0b0c94 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3558,7 +3558,7 @@ dependencies = [ [[package]] name = "solana-verify" -version = "0.2.8" +version = "0.2.9" dependencies = [ "anyhow", "cargo-lock", diff --git a/Cargo.toml b/Cargo.toml index d6945b6..f2251e2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "solana-verify" -version = "0.2.8" +version = "0.2.9" edition = "2021" description = "A CLI tool for building verifiable Solana programs" license = "MIT" diff --git a/generate_dockerfiles.py b/generate_dockerfiles.py index b322610..3556831 100644 --- a/generate_dockerfiles.py +++ b/generate_dockerfiles.py @@ -34,6 +34,7 @@ ["git", "ls-remote", "--tags", "https://github.com/solana-labs/solana"] ) + def check_version(version_str): try: # Ignore this one @@ -45,24 +46,25 @@ def check_version(version_str): except Exception as e: return False + def get_toolchain(version_tag): if "v1.14" in version_tag: return "1.68.0" - url = f"https://raw.githubusercontent.com/solana-labs/solana/{version_tag}/rust-toolchain.toml" - headers = {'Accept': 'application/vnd.github.v3.raw'} # Fetch the raw file content + headers = {"Accept": "application/vnd.github.v3.raw"} # Fetch the raw file content response = requests.get(url, headers=headers) if response.status_code == 200: parsed_data = tomllib.loads(response.text) - channel_version = parsed_data['toolchain']['channel'] + channel_version = parsed_data["toolchain"]["channel"] return channel_version else: print(f"Failed to fetch rust-toolchain.toml for {version_tag}") return None - + + tags = list( filter( check_version, @@ -76,6 +78,7 @@ def get_toolchain(version_tag): dockerfiles = {} +dirty_set = set() for release in tags: rust_version = get_toolchain(release) print("Generating Dockerfile for " + release + ", rust version " + rust_version) @@ -98,14 +101,26 @@ def get_toolchain(version_tag): if image["architecture"] == "amd64": RUST_DOCKER_IMAGESHA_MAP[rust_version] = image["digest"] break - + if rust_version not in RUST_DOCKER_IMAGESHA_MAP: print(f"Failed to fetch rust image for {rust_version}") continue - dockerfile = base_dockerfile_text.replace(SOLANA_VERSION_PLACEHOLDER, release).lstrip("\n") - dockerfile = dockerfile.replace(RUST_VERSION_PLACEHOLDER, RUST_DOCKER_IMAGESHA_MAP[rust_version]) + dockerfile = base_dockerfile_text.replace( + SOLANA_VERSION_PLACEHOLDER, release + ).lstrip("\n") + dockerfile = dockerfile.replace( + RUST_VERSION_PLACEHOLDER, RUST_DOCKER_IMAGESHA_MAP[rust_version] + ) + path = f"docker/{release}.Dockerfile" + with open(path, "r") as f: + prev = f.read() + + if prev != dockerfile: + dirty_set.add(release.strip("v")) + print(release) + with open(path, "w") as f: f.write(dockerfile) dockerfiles[release] = path @@ -129,9 +144,11 @@ def get_toolchain(version_tag): for tag, dockerfile in dockerfiles.items(): # Strip the `v` from the tag to keep the versions consistent in Docker stripped_tag = tag.strip("v") - if stripped_tag in digest_set: + if stripped_tag in digest_set and stripped_tag not in dirty_set: print(f"Already built image for {stripped_tag}, skipping") continue + if stripped_tag in dirty_set: + print(f"Dockerfile for {stripped_tag} needs to be modified") version_tag = f"solana:{stripped_tag}" print(version_tag) current_directory = os.getcwd() diff --git a/src/image_config.rs b/src/image_config.rs index d6c6d5c..fc8d0b9 100644 --- a/src/image_config.rs +++ b/src/image_config.rs @@ -5,7 +5,6 @@ use std::collections::BTreeMap; lazy_static! { pub static ref IMAGE_MAP: BTreeMap<(u32, u32, u32), &'static str> = { let mut m = BTreeMap::new(); - m.insert((1, 14, 1), "sha256:987d26c8f94115d9a1ab0543aa3336340e55c7799e6ddc716c1a9c963f0bd031"); m.insert((1, 14, 2), "sha256:d4bcffdb9403b154ceeab3063cc5a846a0b4d59a41a8b708249fcc4239b4129d"); m.insert((1, 14, 3), "sha256:4adf5dfa0812d3b6835f65fb19687d705d057b7e7cb0cfe14abd240679e12de2"); m.insert((1, 14, 4), "sha256:67cf2a1be16075ca0b53325212c03f48624ca68cdd86dcaaf5a06ff18e959fae"); @@ -35,35 +34,35 @@ lazy_static! { m.insert((1, 14, 28), "sha256:4b7a8fcc1d487fe80dfc152d1e49c6067025d5e44bd5d743869fe75b636e4907"); m.insert((1, 14, 29), "sha256:2a38e78a1bcb369a6673b6442f1ee32f99e839445e426c4fdfdc48ee852e346e"); m.insert((1, 16, 0), "sha256:eaf330939f614dab0c1daab2db65431753f114c82c62f9868f1993010db0e814"); - m.insert((1, 16, 1), "sha256:0e0b25a58363ceacfa63130c220affde874a9fe6872c9bdeceef2a3ab20a0c62"); - m.insert((1, 16, 2), "sha256:f18ea6e9f41e2cd23f1519ab0c327c671af697f14bcabfc7f86b14dee11e53f6"); - m.insert((1, 16, 3), "sha256:42bee5c9d5af3c9da1c9a1dee60edaa3f4015d1ee1cdb1b4f0706421d7efb554"); - m.insert((1, 16, 4), "sha256:7840a59861bce53dd4fc8b9bcd198dd210636ba645c532187b52d8e3f8356f86"); + m.insert((1, 16, 1), "sha256:1979f60e559498d29f2ea786229e59d082041b376fccd0f4c2b509acfcc5ca49"); + m.insert((1, 16, 2), "sha256:b2a53e3984aa39e16553f90b0e180e361bf3b76fea32ba11a07137aea41e0a42"); + m.insert((1, 16, 3), "sha256:87dc8f71a35c46c10cf170363adb4345742ccddf0bca0d89b66c573ed495d78f"); + m.insert((1, 16, 4), "sha256:36c5cb09802141adbb1ba2dc10c75b7915f601249edc89b208f1e9ec313ff008"); m.insert((1, 16, 5), "sha256:bbe60168f1b8cab06020e48e1822d24423794b8acedada88c12c3e99e4d10bf1"); - m.insert((1, 16, 6), "sha256:b034ae5d7d9f3beb863e295172db28852e55d34f91712b5758d01681fb51c66b"); - m.insert((1, 16, 7), "sha256:c3c9043a2a6e5ac623d789c68ac2346e059009928d438f92d9e2de9b708f35e3"); + m.insert((1, 16, 6), "sha256:81100154468537f4476ba8c2b42a43c3e9516ef2abc4d10cc439203d21ef4ba2"); + m.insert((1, 16, 7), "sha256:d500b3b1b324381715665e6afaaab8e3620a4d22c8f88fed4199e89bf784b878"); m.insert((1, 16, 8), "sha256:a377f19b7dd3dccc81b4dec69e8dae3b518bb6a058b27075f6078b264e4b4c5c"); - m.insert((1, 16, 9), "sha256:c40ff800cdfdb90700e7b34d6d30d5cfdf40570f7ff0b4694d2d5a26b8a55fa7"); + m.insert((1, 16, 9), "sha256:6a5e459a2f16c16068a3193a8d8d006ce071b8a84a1e188e7b06c994a04ed8fa"); m.insert((1, 16, 10), "sha256:38f1c10abb3d274eef019bd5b726ad8aa6ff036959009959768ab2956eb749b0"); m.insert((1, 16, 11), "sha256:a2788528b302c4c4144cfcaca35c978a1b420c936201b3b7b80977a289345914"); m.insert((1, 16, 12), "sha256:7823267a7df4fb39cb7daf012416aab7dd3a5a7dec400a60bb02517a1d562c23"); - m.insert((1, 16, 13), "sha256:e36085bf68e25e538942ccb3cc1547189c63126fe2f6aeee711490b47dba7311"); - m.insert((1, 16, 14), "sha256:906c7d915dd87d099b03f78c7046ef1aa231cacb847e9d638cd0681e6549de2c"); + m.insert((1, 16, 13), "sha256:c99927b38601ad619c3f2f08bbb51a50dd65dd90937a558f9f5676b243bcc964"); + m.insert((1, 16, 14), "sha256:4bc6e90953a69e9566416317485d437488c595c6d39d3bf163991ea80c79cb9f"); m.insert((1, 16, 15), "sha256:1b7e3ac6798829dee8dec42557af4824848fe9d3a2c43c31bca59aa6c63e510b"); - m.insert((1, 16, 16), "sha256:0ffcb49416f9e17c266e5b9b915f67e830e5c586921fb43aad98723346d0aba6"); - m.insert((1, 16, 17), "sha256:957ab8d383501320ab8fd10636834f6bd637549e27dc7d9b2b8b60c76d32b9f7"); - m.insert((1, 16, 18), "sha256:a097a773a388d5fca9acb2153d8fdf8e6cb0c20bc0c18c38a1dadeb585a700e9"); - m.insert((1, 16, 19), "sha256:2ad77df7353772b8946fde3abb1418a45bc8fbcac1fde55d5ffc3a87c4f08c97"); - m.insert((1, 16, 20), "sha256:8b73b104354c82c86950060e3fd03578065d5452d563fc81852177b2ab565a3c"); - m.insert((1, 16, 21), "sha256:f0e51b86976661ed92b9e62886798b976e34639a7693afad4aa9e5b773070a8f"); - m.insert((1, 16, 22), "sha256:3f4fdc0a74fd7d28363c21db09c1094a969c786756f764afbf9b8923ae2b19d4"); - m.insert((1, 16, 23), "sha256:6ef2655a1a345c51e862616adebf1108b108d5f827cb839c5edb463f4c43e777"); - m.insert((1, 16, 24), "sha256:11303db433cd2677bc6c646a4e8e2d0682e8d8cd70cc9ad7b51ccb19c87e9e66"); - m.insert((1, 16, 25), "sha256:32e3e55007f9628c4afc6c09083409ed5ee04f3e53c532796927e9e2e7037f5e"); - m.insert((1, 16, 26), "sha256:615d609998242d39975043393bf733b26b4759e340565705c1d0e843b2bd35af"); + m.insert((1, 16, 16), "sha256:0bf7a96764a57a2bc68ee0274ab098d6606d83e6315af1a1a8a21f346287a6a7"); + m.insert((1, 16, 17), "sha256:3ab3428a23620a2c6a250e6d592ada8012cb8b56b5789712171c4203d9cc3f61"); + m.insert((1, 16, 18), "sha256:d2a376b9134b698ac8b61ea4feaea016d5085f8fab61763a6541fe50e3771164"); + m.insert((1, 16, 19), "sha256:7fd9ecf02d378268fcea1ef7fe3b1906fc96e24a833529d3f54b1a16b55c592c"); + m.insert((1, 16, 20), "sha256:8dbb638f06642b0069d475083995ea45ab52f183d0e05987489567efca1e13e0"); + m.insert((1, 16, 21), "sha256:21d4f620cd144775b4d9af80b09584db49b106f67841d20415485eab6827069c"); + m.insert((1, 16, 22), "sha256:6837018a2e35edc9c9b955536973934b45517a87888c18875919f072c9085d50"); + m.insert((1, 16, 23), "sha256:9bdda2f4ca4628183a9c39f5a11ae66eee0e49b457439f5c487962c5917146ad"); + m.insert((1, 16, 24), "sha256:8d28e0ac1a0f929c2f8bf323df2bcf324b5dc4d2e0aac089096759f457963c46"); + m.insert((1, 16, 25), "sha256:c48298cbb97dbd6a493ee9592d4c3700e214b34788ea67e0bca58ff388179340"); + m.insert((1, 16, 26), "sha256:9a28b2961396c1fba8855744eaea125640b3dbda7a86fc0a7ae375824338144d"); m.insert((1, 16, 27), "sha256:d3f39f5e1d2fbf798149416bbcb050ae8c03ea8ce18c559fc64beb7547f5c96b"); m.insert((1, 17, 0), "sha256:8e5593ea91d20e4ec24eda8ea2065333f6e7c4ae5496947b9910b93889c78a03"); - m.insert((1, 17, 1), "sha256:f11a7beb650e08ef0f14dd4c588ff9358a78deaf5f7ae13ba62c7a41dc2610ca"); + m.insert((1, 17, 1), "sha256:3a522b734f7a260769d9daf2049c70172808285aedd3700d7f73ba5164e0b939"); m.insert((1, 17, 2), "sha256:4d862e20ab6b1fafdc59cbb9b7cd3200b4c0e4c66de767fac3a49f871baa4e3d"); m.insert((1, 17, 3), "sha256:c58cf31748b19f03aa21f2d677db0296d98ddc52889953096ab85586b537a770"); m.insert((1, 17, 4), "sha256:d7cbe13c49ae3a23205d0a6c0d6410e2b4deb69c7b2d6ccc8bf9ca3fc322d649"); @@ -72,7 +71,7 @@ lazy_static! { m.insert((1, 17, 7), "sha256:2e4ae35f2f66c9eacee5f2491952ef15ada0f3ddc9e7ad0bfef8ae3973f3cf46"); m.insert((1, 17, 8), "sha256:f50c3b8eaf406a9e3b64cdac41a8f72b76c632a4c62c53abe409346b200dcfea"); m.insert((1, 17, 9), "sha256:1cb9b38cc53127a06d9341ecd642f3dd3751f662488fa79b487c404caabb5910"); - m.insert((1, 17, 10), "sha256:85e85695a432d1b50303c9a8e3afb735831e8a73ec307dc1cceeb469fc7e603e"); + m.insert((1, 17, 10), "sha256:66e24ed2b7a2a1e91f951f5124fe906f8e2cbc1a8bc31f2a535a95530667f918"); m.insert((1, 17, 11), "sha256:ea64b41ae4773f1734e36004425ceeb0d3c59aebba1f12ac20a031aa5a8ebd99"); m.insert((1, 17, 12), "sha256:f0f4dfd83424786a64812a53d218264f7900e8cf3286124a071ffa141dfd6051"); m.insert((1, 17, 13), "sha256:63ac4121ca405779d201227f9622e55b556f9d81fcf38c614d258b7802f6faf5"); @@ -81,13 +80,31 @@ lazy_static! { m.insert((1, 17, 16), "sha256:7d6d95378cda2cd6866ae70563bf184e99d3d937632c0033797bcc483ae81597"); m.insert((1, 17, 17), "sha256:495577d3de64e0829be1b67d631dea843635fa41ef23672048ec7eac628f753c"); m.insert((1, 17, 18), "sha256:3c951af1c893a7d509872faed62410de33ff9fc41c2052a8c79f5e44840186d5"); - m.insert((1, 17, 19), "sha256:1dbdbe97e5c8a738cc4a9cd5d099126eb9b41a7034465d148e5bcebfc2dfc2ed"); + m.insert((1, 17, 19), "sha256:f2fbc2131c5edc8f9debc00aeb2e121bbe5aa8523c7c311aa205910dda61d0f7"); m.insert((1, 17, 20), "sha256:7914649a71b10819dbb1f9d5ae440217b83af3f55e8454ff3a1f92e5174148d5"); m.insert((1, 17, 21), "sha256:6f8c4364e7bd95b08b341caf13046841d6fe2b7e41d8bb6ca89edea479b8d59d"); m.insert((1, 17, 22), "sha256:73a7160507ba99b97948aae6c45bb19639e9b0be0885149927b1cd24e3541b53"); + m.insert((1, 17, 23), "sha256:51784aead1d36253443a7b23cbf7f8b949a1f88926edfa9bb3931fce2da45a66"); + m.insert((1, 17, 24), "sha256:113205a16988d9d5201d5be0a325bbaa7bf951198b64bde0889eb666ca8d25be"); + m.insert((1, 17, 25), "sha256:6b6a24b4f7bf9a4ec1a01a836fd225fea7acecf7a5ddb69789175ba394e11bcd"); + m.insert((1, 17, 26), "sha256:f4dd1b25607cc26c3831b4585171dffce69cd29350548cc3680e598200901c50"); + m.insert((1, 17, 27), "sha256:09b65863f3edf0ad538c30f7f25aff87da27cc2d2bf1c1040d9a1ae25a7ba64a"); + m.insert((1, 17, 28), "sha256:e53f8847a65d7b63c4b7b8de4d7be5e62e6dc8c77bcc95d467e0bfeb6a79ba1c"); + m.insert((1, 17, 29), "sha256:2dd7508c8ec56323ec2aae4a0d6dbd41b05f8341e6d916c5d06450983648c06e"); + m.insert((1, 17, 30), "sha256:2ff30514c86609913c5911d00e1a8a2a4a4057aec4b59e0b61bf9e3969a9f540"); + m.insert((1, 17, 31), "sha256:2195a51d6ae8be894ea06e2b7da4f9d98354919766ddd63b62440420b72499cb"); m.insert((1, 18, 0), "sha256:9442baedec5e2589b1263e5d12363ef9b2e8e8ad289d2ea5cd0ee7584e479fae"); m.insert((1, 18, 1), "sha256:b5865168f3177d3acbf4de12d296aa06fcd4911090c4fa3bcb41cf36e347a695"); m.insert((1, 18, 2), "sha256:9c150a6cde88d65e75ceb08512e8c6a861b2dc84b34a579aac34ef3f9021c483"); + m.insert((1, 18, 3), "sha256:b34788e5c8df22f2cd0643a0d15a96a2174821d5b02b8a33f4644dc160cd5cd2"); + m.insert((1, 18, 4), "sha256:2680be153b67f762ace21c0c1c55ff250e829748b357ef72d980b772863ad566"); + m.insert((1, 18, 5), "sha256:3baad00634f112e64889a840fa7da87c095b40927eb3d8bfb1972a50c6cdb141"); + m.insert((1, 18, 6), "sha256:5474b807c760b33ea93ed3fe9fdabca737d69a4e43ed31f1398777411e345dd3"); + m.insert((1, 18, 7), "sha256:b92d6e6b8e23bd6a52063e5d6b3b920751b6dc79be55acb7f474ac064de4dbc8"); + m.insert((1, 18, 8), "sha256:4982b38a4efd9de89bc72e62777982298e6b9bce3e0ffa3613dc105b52bd252d"); + m.insert((1, 18, 9), "sha256:008c69f4da34cca15cfa1bd7486800af192138dccc2603e7fb93fd3bd209e86e"); + m.insert((1, 18, 10), "sha256:4f045c3ebc78140d93ea23696a1479c3eeefcf7fad8fa10975eaaa975dffd83d"); + m.insert((1, 18, 11), "sha256:70eb2dc290cdf1336f9b4aeba666a96eb2d271d812216f4885ecc75bd44e9bde"); m }; } From d01590447469c67cf14cd4717e078ec45a44e142 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Tue, 16 Apr 2024 09:12:06 -0500 Subject: [PATCH 106/314] update 1.17.23 --- Cargo.lock | 2 +- Cargo.toml | 2 +- docker/v1.17.0.Dockerfile | 2 +- docker/v1.17.1.Dockerfile | 2 +- docker/v1.17.10.Dockerfile | 2 +- docker/v1.17.11.Dockerfile | 2 +- docker/v1.17.12.Dockerfile | 2 +- docker/v1.17.13.Dockerfile | 2 +- docker/v1.17.14.Dockerfile | 2 +- docker/v1.17.15.Dockerfile | 2 +- docker/v1.17.16.Dockerfile | 2 +- docker/v1.17.17.Dockerfile | 2 +- docker/v1.17.18.Dockerfile | 2 +- docker/v1.17.19.Dockerfile | 2 +- docker/v1.17.2.Dockerfile | 2 +- docker/v1.17.20.Dockerfile | 2 +- docker/v1.17.21.Dockerfile | 2 +- docker/v1.17.22.Dockerfile | 2 +- docker/v1.17.23.Dockerfile | 2 +- docker/v1.17.24.Dockerfile | 2 +- docker/v1.17.25.Dockerfile | 2 +- docker/v1.17.26.Dockerfile | 2 +- docker/v1.17.27.Dockerfile | 2 +- docker/v1.17.28.Dockerfile | 2 +- docker/v1.17.29.Dockerfile | 2 +- docker/v1.17.3.Dockerfile | 2 +- docker/v1.17.30.Dockerfile | 2 +- docker/v1.17.31.Dockerfile | 2 +- docker/v1.17.4.Dockerfile | 2 +- docker/v1.17.5.Dockerfile | 2 +- docker/v1.17.6.Dockerfile | 2 +- docker/v1.17.7.Dockerfile | 2 +- docker/v1.17.8.Dockerfile | 2 +- docker/v1.17.9.Dockerfile | 2 +- docker/v1.18.0.Dockerfile | 2 +- docker/v1.18.1.Dockerfile | 2 +- docker/v1.18.10.Dockerfile | 2 +- docker/v1.18.11.Dockerfile | 2 +- docker/v1.18.2.Dockerfile | 2 +- docker/v1.18.3.Dockerfile | 2 +- docker/v1.18.4.Dockerfile | 2 +- docker/v1.18.5.Dockerfile | 2 +- docker/v1.18.6.Dockerfile | 2 +- docker/v1.18.7.Dockerfile | 2 +- docker/v1.18.8.Dockerfile | 2 +- docker/v1.18.9.Dockerfile | 2 +- generate_dockerfiles.py | 27 ++++++++++++++++++++++++--- src/image_config.rs | 6 +++--- 48 files changed, 73 insertions(+), 52 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a0b0c94..153eafe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3558,7 +3558,7 @@ dependencies = [ [[package]] name = "solana-verify" -version = "0.2.9" +version = "0.2.10" dependencies = [ "anyhow", "cargo-lock", diff --git a/Cargo.toml b/Cargo.toml index f2251e2..cffd63d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "solana-verify" -version = "0.2.9" +version = "0.2.10" edition = "2021" description = "A CLI tool for building verifiable Solana programs" license = "MIT" diff --git a/docker/v1.17.0.Dockerfile b/docker/v1.17.0.Dockerfile index c93e341..867396f 100644 --- a/docker/v1.17.0.Dockerfile +++ b/docker/v1.17.0.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:6562d50b62366d5b9db92b34c6684fab5bf3b9f627e59a863c9c0675760feed4 +FROM --platform=linux/amd64 rust@sha256:6a2ac38604fce995fd586c8d760147f71d9113dcbe84a7fcddcb30c60a1ec7ee RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.0/install)" diff --git a/docker/v1.17.1.Dockerfile b/docker/v1.17.1.Dockerfile index e2608a8..25d717f 100644 --- a/docker/v1.17.1.Dockerfile +++ b/docker/v1.17.1.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.1/install)" diff --git a/docker/v1.17.10.Dockerfile b/docker/v1.17.10.Dockerfile index a75a01a..398c08b 100644 --- a/docker/v1.17.10.Dockerfile +++ b/docker/v1.17.10.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.10/install)" diff --git a/docker/v1.17.11.Dockerfile b/docker/v1.17.11.Dockerfile index 3992f5b..bf05503 100644 --- a/docker/v1.17.11.Dockerfile +++ b/docker/v1.17.11.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.11/install)" diff --git a/docker/v1.17.12.Dockerfile b/docker/v1.17.12.Dockerfile index 61f15c5..08e8c78 100644 --- a/docker/v1.17.12.Dockerfile +++ b/docker/v1.17.12.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.12/install)" diff --git a/docker/v1.17.13.Dockerfile b/docker/v1.17.13.Dockerfile index 22040a9..256d5f7 100644 --- a/docker/v1.17.13.Dockerfile +++ b/docker/v1.17.13.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.13/install)" diff --git a/docker/v1.17.14.Dockerfile b/docker/v1.17.14.Dockerfile index 94f6e76..6ebad52 100644 --- a/docker/v1.17.14.Dockerfile +++ b/docker/v1.17.14.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.14/install)" diff --git a/docker/v1.17.15.Dockerfile b/docker/v1.17.15.Dockerfile index 4163e93..3159683 100644 --- a/docker/v1.17.15.Dockerfile +++ b/docker/v1.17.15.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.15/install)" diff --git a/docker/v1.17.16.Dockerfile b/docker/v1.17.16.Dockerfile index 78cc7ce..e9f7b76 100644 --- a/docker/v1.17.16.Dockerfile +++ b/docker/v1.17.16.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.16/install)" diff --git a/docker/v1.17.17.Dockerfile b/docker/v1.17.17.Dockerfile index 2ce7edf..08cfeae 100644 --- a/docker/v1.17.17.Dockerfile +++ b/docker/v1.17.17.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.17/install)" diff --git a/docker/v1.17.18.Dockerfile b/docker/v1.17.18.Dockerfile index 8072ed9..3d2ef51 100644 --- a/docker/v1.17.18.Dockerfile +++ b/docker/v1.17.18.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.18/install)" diff --git a/docker/v1.17.19.Dockerfile b/docker/v1.17.19.Dockerfile index e2615e9..6ff8ae6 100644 --- a/docker/v1.17.19.Dockerfile +++ b/docker/v1.17.19.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.19/install)" diff --git a/docker/v1.17.2.Dockerfile b/docker/v1.17.2.Dockerfile index d1760be..55c479b 100644 --- a/docker/v1.17.2.Dockerfile +++ b/docker/v1.17.2.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.2/install)" diff --git a/docker/v1.17.20.Dockerfile b/docker/v1.17.20.Dockerfile index edb730c..b81d2cc 100644 --- a/docker/v1.17.20.Dockerfile +++ b/docker/v1.17.20.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.20/install)" diff --git a/docker/v1.17.21.Dockerfile b/docker/v1.17.21.Dockerfile index baed4cc..92dafac 100644 --- a/docker/v1.17.21.Dockerfile +++ b/docker/v1.17.21.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.21/install)" diff --git a/docker/v1.17.22.Dockerfile b/docker/v1.17.22.Dockerfile index c40f795..82372a5 100644 --- a/docker/v1.17.22.Dockerfile +++ b/docker/v1.17.22.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.22/install)" diff --git a/docker/v1.17.23.Dockerfile b/docker/v1.17.23.Dockerfile index ebcbbfa..04b40e3 100644 --- a/docker/v1.17.23.Dockerfile +++ b/docker/v1.17.23.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.23/install)" diff --git a/docker/v1.17.24.Dockerfile b/docker/v1.17.24.Dockerfile index 3d5b3e6..d8859e8 100644 --- a/docker/v1.17.24.Dockerfile +++ b/docker/v1.17.24.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.24/install)" diff --git a/docker/v1.17.25.Dockerfile b/docker/v1.17.25.Dockerfile index 9e1bf0f..7a1fd7a 100644 --- a/docker/v1.17.25.Dockerfile +++ b/docker/v1.17.25.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.25/install)" diff --git a/docker/v1.17.26.Dockerfile b/docker/v1.17.26.Dockerfile index a42b14b..78178ea 100644 --- a/docker/v1.17.26.Dockerfile +++ b/docker/v1.17.26.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.26/install)" diff --git a/docker/v1.17.27.Dockerfile b/docker/v1.17.27.Dockerfile index 964d8b7..d73b7a7 100644 --- a/docker/v1.17.27.Dockerfile +++ b/docker/v1.17.27.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.27/install)" diff --git a/docker/v1.17.28.Dockerfile b/docker/v1.17.28.Dockerfile index fb57315..17914cf 100644 --- a/docker/v1.17.28.Dockerfile +++ b/docker/v1.17.28.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.28/install)" diff --git a/docker/v1.17.29.Dockerfile b/docker/v1.17.29.Dockerfile index c2aeb04..ce1c707 100644 --- a/docker/v1.17.29.Dockerfile +++ b/docker/v1.17.29.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.29/install)" diff --git a/docker/v1.17.3.Dockerfile b/docker/v1.17.3.Dockerfile index 3b63dd4..f607ab2 100644 --- a/docker/v1.17.3.Dockerfile +++ b/docker/v1.17.3.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.3/install)" diff --git a/docker/v1.17.30.Dockerfile b/docker/v1.17.30.Dockerfile index 958f60a..20b0ed2 100644 --- a/docker/v1.17.30.Dockerfile +++ b/docker/v1.17.30.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.30/install)" diff --git a/docker/v1.17.31.Dockerfile b/docker/v1.17.31.Dockerfile index a18c042..57f84c0 100644 --- a/docker/v1.17.31.Dockerfile +++ b/docker/v1.17.31.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.31/install)" diff --git a/docker/v1.17.4.Dockerfile b/docker/v1.17.4.Dockerfile index cf807f4..7872a6e 100644 --- a/docker/v1.17.4.Dockerfile +++ b/docker/v1.17.4.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.4/install)" diff --git a/docker/v1.17.5.Dockerfile b/docker/v1.17.5.Dockerfile index ffbd22e..e3ffd8c 100644 --- a/docker/v1.17.5.Dockerfile +++ b/docker/v1.17.5.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.5/install)" diff --git a/docker/v1.17.6.Dockerfile b/docker/v1.17.6.Dockerfile index 1f654e0..fe361da 100644 --- a/docker/v1.17.6.Dockerfile +++ b/docker/v1.17.6.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.6/install)" diff --git a/docker/v1.17.7.Dockerfile b/docker/v1.17.7.Dockerfile index 4cd5861..566091c 100644 --- a/docker/v1.17.7.Dockerfile +++ b/docker/v1.17.7.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.7/install)" diff --git a/docker/v1.17.8.Dockerfile b/docker/v1.17.8.Dockerfile index 6ab5c20..6cb0a23 100644 --- a/docker/v1.17.8.Dockerfile +++ b/docker/v1.17.8.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.8/install)" diff --git a/docker/v1.17.9.Dockerfile b/docker/v1.17.9.Dockerfile index 86410a3..fd6d016 100644 --- a/docker/v1.17.9.Dockerfile +++ b/docker/v1.17.9.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.9/install)" diff --git a/docker/v1.18.0.Dockerfile b/docker/v1.18.0.Dockerfile index 1a98fda..9b21b3c 100644 --- a/docker/v1.18.0.Dockerfile +++ b/docker/v1.18.0.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.0/install)" diff --git a/docker/v1.18.1.Dockerfile b/docker/v1.18.1.Dockerfile index fa393ef..424a993 100644 --- a/docker/v1.18.1.Dockerfile +++ b/docker/v1.18.1.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.1/install)" diff --git a/docker/v1.18.10.Dockerfile b/docker/v1.18.10.Dockerfile index 54a9118..93cd410 100644 --- a/docker/v1.18.10.Dockerfile +++ b/docker/v1.18.10.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.10/install)" diff --git a/docker/v1.18.11.Dockerfile b/docker/v1.18.11.Dockerfile index 1a2f27c..841c7cd 100644 --- a/docker/v1.18.11.Dockerfile +++ b/docker/v1.18.11.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.11/install)" diff --git a/docker/v1.18.2.Dockerfile b/docker/v1.18.2.Dockerfile index 3b85afa..c6cae02 100644 --- a/docker/v1.18.2.Dockerfile +++ b/docker/v1.18.2.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.2/install)" diff --git a/docker/v1.18.3.Dockerfile b/docker/v1.18.3.Dockerfile index 60d6de1..0288196 100644 --- a/docker/v1.18.3.Dockerfile +++ b/docker/v1.18.3.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.3/install)" diff --git a/docker/v1.18.4.Dockerfile b/docker/v1.18.4.Dockerfile index ca54c37..c743285 100644 --- a/docker/v1.18.4.Dockerfile +++ b/docker/v1.18.4.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.4/install)" diff --git a/docker/v1.18.5.Dockerfile b/docker/v1.18.5.Dockerfile index 3b8bfdb..fa5a4e8 100644 --- a/docker/v1.18.5.Dockerfile +++ b/docker/v1.18.5.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.5/install)" diff --git a/docker/v1.18.6.Dockerfile b/docker/v1.18.6.Dockerfile index f79098e..f3df9ee 100644 --- a/docker/v1.18.6.Dockerfile +++ b/docker/v1.18.6.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.6/install)" diff --git a/docker/v1.18.7.Dockerfile b/docker/v1.18.7.Dockerfile index 193866c..adc6829 100644 --- a/docker/v1.18.7.Dockerfile +++ b/docker/v1.18.7.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.7/install)" diff --git a/docker/v1.18.8.Dockerfile b/docker/v1.18.8.Dockerfile index c5f3e7a..cb5742f 100644 --- a/docker/v1.18.8.Dockerfile +++ b/docker/v1.18.8.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.8/install)" diff --git a/docker/v1.18.9.Dockerfile b/docker/v1.18.9.Dockerfile index caa30ad..a6419ef 100644 --- a/docker/v1.18.9.Dockerfile +++ b/docker/v1.18.9.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.9/install)" diff --git a/generate_dockerfiles.py b/generate_dockerfiles.py index 3556831..0933512 100644 --- a/generate_dockerfiles.py +++ b/generate_dockerfiles.py @@ -10,10 +10,13 @@ parser = argparse.ArgumentParser() parser.add_argument("--upload", action="store_true") parser.add_argument("--skip_cache", action="store_true") +parser.add_argument("--version") args = parser.parse_args() # Array of Solana version mapped to rust version hashes -RUST_DOCKER_IMAGESHA_MAP = {} +RUST_DOCKER_IMAGESHA_MAP = { + "1.68.0": "sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39" +} RUST_VERSION_PLACEHOLDER = "$RUST_VERSION" @@ -87,9 +90,9 @@ def get_toolchain(version_tag): print(f"Failed to fetch rust version for {release}") continue - if rust_version not in RUST_DOCKER_IMAGESHA_MAP: + if rust_version not in RUST_DOCKER_IMAGESHA_MAP and rust_version != "1.68.0": response = requests.get( - f"https://hub.docker.com/v2/namespaces/library/repositories/rust/tags/{rust_version}-bullseye" + f"https://hub.docker.com/v2/namespaces/library/repositories/rust/tags/{rust_version}" ) if response.status_code == 200: @@ -125,6 +128,8 @@ def get_toolchain(version_tag): f.write(dockerfile) dockerfiles[release] = path +print(RUST_DOCKER_IMAGESHA_MAP) + if args.upload: digest_set = set() if not args.skip_cache: @@ -144,6 +149,22 @@ def get_toolchain(version_tag): for tag, dockerfile in dockerfiles.items(): # Strip the `v` from the tag to keep the versions consistent in Docker stripped_tag = tag.strip("v") + + (major, minor, patch) = stripped_tag.split(".") + + print(stripped_tag, args.version) + + if args.version is not None: + ver = args.version.split(".") + if len(ver) == 2: + a_major, a_minor = ver + a_patch = patch + if len(ver) == 3: + a_major, a_minor, a_patch = ver + if major != a_major or minor != a_minor or a_patch != patch: + print(f"Skipping {stripped_tag}") + continue + if stripped_tag in digest_set and stripped_tag not in dirty_set: print(f"Already built image for {stripped_tag}, skipping") continue diff --git a/src/image_config.rs b/src/image_config.rs index fc8d0b9..9370999 100644 --- a/src/image_config.rs +++ b/src/image_config.rs @@ -61,8 +61,8 @@ lazy_static! { m.insert((1, 16, 25), "sha256:c48298cbb97dbd6a493ee9592d4c3700e214b34788ea67e0bca58ff388179340"); m.insert((1, 16, 26), "sha256:9a28b2961396c1fba8855744eaea125640b3dbda7a86fc0a7ae375824338144d"); m.insert((1, 16, 27), "sha256:d3f39f5e1d2fbf798149416bbcb050ae8c03ea8ce18c559fc64beb7547f5c96b"); - m.insert((1, 17, 0), "sha256:8e5593ea91d20e4ec24eda8ea2065333f6e7c4ae5496947b9910b93889c78a03"); - m.insert((1, 17, 1), "sha256:3a522b734f7a260769d9daf2049c70172808285aedd3700d7f73ba5164e0b939"); + m.insert((1, 17, 0), "sha256:5384f5ba77081d57e5b9c925bf1143315141fccd4fa19bb76210d50ad0a87c9d"); + m.insert((1, 17, 1), "sha256:33a99de6e0441b5e40bc74c37201f69e6d94225f3df12ab492f41c2372d919ce"); m.insert((1, 17, 2), "sha256:4d862e20ab6b1fafdc59cbb9b7cd3200b4c0e4c66de767fac3a49f871baa4e3d"); m.insert((1, 17, 3), "sha256:c58cf31748b19f03aa21f2d677db0296d98ddc52889953096ab85586b537a770"); m.insert((1, 17, 4), "sha256:d7cbe13c49ae3a23205d0a6c0d6410e2b4deb69c7b2d6ccc8bf9ca3fc322d649"); @@ -84,7 +84,7 @@ lazy_static! { m.insert((1, 17, 20), "sha256:7914649a71b10819dbb1f9d5ae440217b83af3f55e8454ff3a1f92e5174148d5"); m.insert((1, 17, 21), "sha256:6f8c4364e7bd95b08b341caf13046841d6fe2b7e41d8bb6ca89edea479b8d59d"); m.insert((1, 17, 22), "sha256:73a7160507ba99b97948aae6c45bb19639e9b0be0885149927b1cd24e3541b53"); - m.insert((1, 17, 23), "sha256:51784aead1d36253443a7b23cbf7f8b949a1f88926edfa9bb3931fce2da45a66"); + m.insert((1, 17, 23), "sha256:be370005dedc49f5997beffe2fe628e1337601836a25d9ef38f5d1cc39f086f7"); m.insert((1, 17, 24), "sha256:113205a16988d9d5201d5be0a325bbaa7bf951198b64bde0889eb666ca8d25be"); m.insert((1, 17, 25), "sha256:6b6a24b4f7bf9a4ec1a01a836fd225fea7acecf7a5ddb69789175ba394e11bcd"); m.insert((1, 17, 26), "sha256:f4dd1b25607cc26c3831b4585171dffce69cd29350548cc3680e598200901c50"); From bd0cdbc2aedee8ca48c17ef783c177ef44ccef86 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Tue, 16 Apr 2024 09:12:44 -0500 Subject: [PATCH 107/314] remove other dockerfiles --- docker/v1.17.0.Dockerfile | 2 +- docker/v1.17.1.Dockerfile | 2 +- docker/v1.17.10.Dockerfile | 2 +- docker/v1.17.11.Dockerfile | 2 +- docker/v1.17.12.Dockerfile | 2 +- docker/v1.17.13.Dockerfile | 2 +- docker/v1.17.14.Dockerfile | 2 +- docker/v1.17.15.Dockerfile | 2 +- docker/v1.17.16.Dockerfile | 2 +- docker/v1.17.17.Dockerfile | 2 +- docker/v1.17.18.Dockerfile | 2 +- docker/v1.17.19.Dockerfile | 2 +- docker/v1.17.2.Dockerfile | 2 +- docker/v1.17.20.Dockerfile | 2 +- docker/v1.17.21.Dockerfile | 2 +- docker/v1.17.22.Dockerfile | 2 +- docker/v1.17.23.Dockerfile | 2 +- docker/v1.17.24.Dockerfile | 2 +- docker/v1.17.25.Dockerfile | 2 +- docker/v1.17.26.Dockerfile | 2 +- docker/v1.17.27.Dockerfile | 2 +- docker/v1.17.28.Dockerfile | 2 +- docker/v1.17.29.Dockerfile | 2 +- docker/v1.17.3.Dockerfile | 2 +- docker/v1.17.30.Dockerfile | 2 +- docker/v1.17.31.Dockerfile | 2 +- docker/v1.17.4.Dockerfile | 2 +- docker/v1.17.5.Dockerfile | 2 +- docker/v1.17.6.Dockerfile | 2 +- docker/v1.17.7.Dockerfile | 2 +- docker/v1.17.8.Dockerfile | 2 +- docker/v1.17.9.Dockerfile | 2 +- docker/v1.18.0.Dockerfile | 2 +- docker/v1.18.1.Dockerfile | 2 +- docker/v1.18.10.Dockerfile | 2 +- docker/v1.18.11.Dockerfile | 2 +- docker/v1.18.2.Dockerfile | 2 +- docker/v1.18.3.Dockerfile | 2 +- docker/v1.18.4.Dockerfile | 2 +- docker/v1.18.5.Dockerfile | 2 +- docker/v1.18.6.Dockerfile | 2 +- docker/v1.18.7.Dockerfile | 2 +- docker/v1.18.8.Dockerfile | 2 +- docker/v1.18.9.Dockerfile | 2 +- 44 files changed, 44 insertions(+), 44 deletions(-) diff --git a/docker/v1.17.0.Dockerfile b/docker/v1.17.0.Dockerfile index 867396f..c93e341 100644 --- a/docker/v1.17.0.Dockerfile +++ b/docker/v1.17.0.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:6a2ac38604fce995fd586c8d760147f71d9113dcbe84a7fcddcb30c60a1ec7ee +FROM --platform=linux/amd64 rust@sha256:6562d50b62366d5b9db92b34c6684fab5bf3b9f627e59a863c9c0675760feed4 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.0/install)" diff --git a/docker/v1.17.1.Dockerfile b/docker/v1.17.1.Dockerfile index 25d717f..e2608a8 100644 --- a/docker/v1.17.1.Dockerfile +++ b/docker/v1.17.1.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.1/install)" diff --git a/docker/v1.17.10.Dockerfile b/docker/v1.17.10.Dockerfile index 398c08b..a75a01a 100644 --- a/docker/v1.17.10.Dockerfile +++ b/docker/v1.17.10.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.10/install)" diff --git a/docker/v1.17.11.Dockerfile b/docker/v1.17.11.Dockerfile index bf05503..3992f5b 100644 --- a/docker/v1.17.11.Dockerfile +++ b/docker/v1.17.11.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.11/install)" diff --git a/docker/v1.17.12.Dockerfile b/docker/v1.17.12.Dockerfile index 08e8c78..61f15c5 100644 --- a/docker/v1.17.12.Dockerfile +++ b/docker/v1.17.12.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.12/install)" diff --git a/docker/v1.17.13.Dockerfile b/docker/v1.17.13.Dockerfile index 256d5f7..22040a9 100644 --- a/docker/v1.17.13.Dockerfile +++ b/docker/v1.17.13.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.13/install)" diff --git a/docker/v1.17.14.Dockerfile b/docker/v1.17.14.Dockerfile index 6ebad52..94f6e76 100644 --- a/docker/v1.17.14.Dockerfile +++ b/docker/v1.17.14.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.14/install)" diff --git a/docker/v1.17.15.Dockerfile b/docker/v1.17.15.Dockerfile index 3159683..4163e93 100644 --- a/docker/v1.17.15.Dockerfile +++ b/docker/v1.17.15.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.15/install)" diff --git a/docker/v1.17.16.Dockerfile b/docker/v1.17.16.Dockerfile index e9f7b76..78cc7ce 100644 --- a/docker/v1.17.16.Dockerfile +++ b/docker/v1.17.16.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.16/install)" diff --git a/docker/v1.17.17.Dockerfile b/docker/v1.17.17.Dockerfile index 08cfeae..2ce7edf 100644 --- a/docker/v1.17.17.Dockerfile +++ b/docker/v1.17.17.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.17/install)" diff --git a/docker/v1.17.18.Dockerfile b/docker/v1.17.18.Dockerfile index 3d2ef51..8072ed9 100644 --- a/docker/v1.17.18.Dockerfile +++ b/docker/v1.17.18.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.18/install)" diff --git a/docker/v1.17.19.Dockerfile b/docker/v1.17.19.Dockerfile index 6ff8ae6..e2615e9 100644 --- a/docker/v1.17.19.Dockerfile +++ b/docker/v1.17.19.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.19/install)" diff --git a/docker/v1.17.2.Dockerfile b/docker/v1.17.2.Dockerfile index 55c479b..d1760be 100644 --- a/docker/v1.17.2.Dockerfile +++ b/docker/v1.17.2.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.2/install)" diff --git a/docker/v1.17.20.Dockerfile b/docker/v1.17.20.Dockerfile index b81d2cc..edb730c 100644 --- a/docker/v1.17.20.Dockerfile +++ b/docker/v1.17.20.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.20/install)" diff --git a/docker/v1.17.21.Dockerfile b/docker/v1.17.21.Dockerfile index 92dafac..baed4cc 100644 --- a/docker/v1.17.21.Dockerfile +++ b/docker/v1.17.21.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.21/install)" diff --git a/docker/v1.17.22.Dockerfile b/docker/v1.17.22.Dockerfile index 82372a5..c40f795 100644 --- a/docker/v1.17.22.Dockerfile +++ b/docker/v1.17.22.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.22/install)" diff --git a/docker/v1.17.23.Dockerfile b/docker/v1.17.23.Dockerfile index 04b40e3..ebcbbfa 100644 --- a/docker/v1.17.23.Dockerfile +++ b/docker/v1.17.23.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.23/install)" diff --git a/docker/v1.17.24.Dockerfile b/docker/v1.17.24.Dockerfile index d8859e8..3d5b3e6 100644 --- a/docker/v1.17.24.Dockerfile +++ b/docker/v1.17.24.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.24/install)" diff --git a/docker/v1.17.25.Dockerfile b/docker/v1.17.25.Dockerfile index 7a1fd7a..9e1bf0f 100644 --- a/docker/v1.17.25.Dockerfile +++ b/docker/v1.17.25.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.25/install)" diff --git a/docker/v1.17.26.Dockerfile b/docker/v1.17.26.Dockerfile index 78178ea..a42b14b 100644 --- a/docker/v1.17.26.Dockerfile +++ b/docker/v1.17.26.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.26/install)" diff --git a/docker/v1.17.27.Dockerfile b/docker/v1.17.27.Dockerfile index d73b7a7..964d8b7 100644 --- a/docker/v1.17.27.Dockerfile +++ b/docker/v1.17.27.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.27/install)" diff --git a/docker/v1.17.28.Dockerfile b/docker/v1.17.28.Dockerfile index 17914cf..fb57315 100644 --- a/docker/v1.17.28.Dockerfile +++ b/docker/v1.17.28.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.28/install)" diff --git a/docker/v1.17.29.Dockerfile b/docker/v1.17.29.Dockerfile index ce1c707..c2aeb04 100644 --- a/docker/v1.17.29.Dockerfile +++ b/docker/v1.17.29.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.29/install)" diff --git a/docker/v1.17.3.Dockerfile b/docker/v1.17.3.Dockerfile index f607ab2..3b63dd4 100644 --- a/docker/v1.17.3.Dockerfile +++ b/docker/v1.17.3.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.3/install)" diff --git a/docker/v1.17.30.Dockerfile b/docker/v1.17.30.Dockerfile index 20b0ed2..958f60a 100644 --- a/docker/v1.17.30.Dockerfile +++ b/docker/v1.17.30.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.30/install)" diff --git a/docker/v1.17.31.Dockerfile b/docker/v1.17.31.Dockerfile index 57f84c0..a18c042 100644 --- a/docker/v1.17.31.Dockerfile +++ b/docker/v1.17.31.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.31/install)" diff --git a/docker/v1.17.4.Dockerfile b/docker/v1.17.4.Dockerfile index 7872a6e..cf807f4 100644 --- a/docker/v1.17.4.Dockerfile +++ b/docker/v1.17.4.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.4/install)" diff --git a/docker/v1.17.5.Dockerfile b/docker/v1.17.5.Dockerfile index e3ffd8c..ffbd22e 100644 --- a/docker/v1.17.5.Dockerfile +++ b/docker/v1.17.5.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.5/install)" diff --git a/docker/v1.17.6.Dockerfile b/docker/v1.17.6.Dockerfile index fe361da..1f654e0 100644 --- a/docker/v1.17.6.Dockerfile +++ b/docker/v1.17.6.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.6/install)" diff --git a/docker/v1.17.7.Dockerfile b/docker/v1.17.7.Dockerfile index 566091c..4cd5861 100644 --- a/docker/v1.17.7.Dockerfile +++ b/docker/v1.17.7.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.7/install)" diff --git a/docker/v1.17.8.Dockerfile b/docker/v1.17.8.Dockerfile index 6cb0a23..6ab5c20 100644 --- a/docker/v1.17.8.Dockerfile +++ b/docker/v1.17.8.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.8/install)" diff --git a/docker/v1.17.9.Dockerfile b/docker/v1.17.9.Dockerfile index fd6d016..86410a3 100644 --- a/docker/v1.17.9.Dockerfile +++ b/docker/v1.17.9.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 +FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.9/install)" diff --git a/docker/v1.18.0.Dockerfile b/docker/v1.18.0.Dockerfile index 9b21b3c..1a98fda 100644 --- a/docker/v1.18.0.Dockerfile +++ b/docker/v1.18.0.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.0/install)" diff --git a/docker/v1.18.1.Dockerfile b/docker/v1.18.1.Dockerfile index 424a993..fa393ef 100644 --- a/docker/v1.18.1.Dockerfile +++ b/docker/v1.18.1.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.1/install)" diff --git a/docker/v1.18.10.Dockerfile b/docker/v1.18.10.Dockerfile index 93cd410..54a9118 100644 --- a/docker/v1.18.10.Dockerfile +++ b/docker/v1.18.10.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.10/install)" diff --git a/docker/v1.18.11.Dockerfile b/docker/v1.18.11.Dockerfile index 841c7cd..1a2f27c 100644 --- a/docker/v1.18.11.Dockerfile +++ b/docker/v1.18.11.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.11/install)" diff --git a/docker/v1.18.2.Dockerfile b/docker/v1.18.2.Dockerfile index c6cae02..3b85afa 100644 --- a/docker/v1.18.2.Dockerfile +++ b/docker/v1.18.2.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.2/install)" diff --git a/docker/v1.18.3.Dockerfile b/docker/v1.18.3.Dockerfile index 0288196..60d6de1 100644 --- a/docker/v1.18.3.Dockerfile +++ b/docker/v1.18.3.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.3/install)" diff --git a/docker/v1.18.4.Dockerfile b/docker/v1.18.4.Dockerfile index c743285..ca54c37 100644 --- a/docker/v1.18.4.Dockerfile +++ b/docker/v1.18.4.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.4/install)" diff --git a/docker/v1.18.5.Dockerfile b/docker/v1.18.5.Dockerfile index fa5a4e8..3b8bfdb 100644 --- a/docker/v1.18.5.Dockerfile +++ b/docker/v1.18.5.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.5/install)" diff --git a/docker/v1.18.6.Dockerfile b/docker/v1.18.6.Dockerfile index f3df9ee..f79098e 100644 --- a/docker/v1.18.6.Dockerfile +++ b/docker/v1.18.6.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.6/install)" diff --git a/docker/v1.18.7.Dockerfile b/docker/v1.18.7.Dockerfile index adc6829..193866c 100644 --- a/docker/v1.18.7.Dockerfile +++ b/docker/v1.18.7.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.7/install)" diff --git a/docker/v1.18.8.Dockerfile b/docker/v1.18.8.Dockerfile index cb5742f..c5f3e7a 100644 --- a/docker/v1.18.8.Dockerfile +++ b/docker/v1.18.8.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.8/install)" diff --git a/docker/v1.18.9.Dockerfile b/docker/v1.18.9.Dockerfile index a6419ef..caa30ad 100644 --- a/docker/v1.18.9.Dockerfile +++ b/docker/v1.18.9.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f +FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.9/install)" From 612dd4936cd1532f33751167c1bd363aa87e2027 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Tue, 16 Apr 2024 09:16:39 -0500 Subject: [PATCH 108/314] update generate_dockerfiles --- generate_dockerfiles.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/generate_dockerfiles.py b/generate_dockerfiles.py index 0933512..e927101 100644 --- a/generate_dockerfiles.py +++ b/generate_dockerfiles.py @@ -1,8 +1,6 @@ -import json import subprocess import os import argparse -import time import requests import tomllib From 575bbe6d04e85e082ece2cc9dae33f6d71db4198 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Tue, 16 Apr 2024 13:57:39 -0500 Subject: [PATCH 109/314] Publish functional dockerfiles --- docker/v1.17.0.Dockerfile | 2 +- docker/v1.17.1.Dockerfile | 2 +- docker/v1.17.10.Dockerfile | 2 +- docker/v1.17.11.Dockerfile | 2 +- docker/v1.17.12.Dockerfile | 2 +- docker/v1.17.13.Dockerfile | 2 +- docker/v1.17.14.Dockerfile | 2 +- docker/v1.17.15.Dockerfile | 2 +- docker/v1.17.16.Dockerfile | 2 +- docker/v1.17.17.Dockerfile | 2 +- docker/v1.17.18.Dockerfile | 2 +- docker/v1.17.19.Dockerfile | 2 +- docker/v1.17.2.Dockerfile | 2 +- docker/v1.17.20.Dockerfile | 2 +- docker/v1.17.21.Dockerfile | 2 +- docker/v1.17.22.Dockerfile | 2 +- docker/v1.17.23.Dockerfile | 2 +- docker/v1.17.24.Dockerfile | 2 +- docker/v1.17.25.Dockerfile | 2 +- docker/v1.17.26.Dockerfile | 2 +- docker/v1.17.27.Dockerfile | 2 +- docker/v1.17.28.Dockerfile | 2 +- docker/v1.17.29.Dockerfile | 2 +- docker/v1.17.3.Dockerfile | 2 +- docker/v1.17.30.Dockerfile | 2 +- docker/v1.17.31.Dockerfile | 2 +- docker/v1.17.4.Dockerfile | 2 +- docker/v1.17.5.Dockerfile | 2 +- docker/v1.17.6.Dockerfile | 2 +- docker/v1.17.7.Dockerfile | 2 +- docker/v1.17.8.Dockerfile | 2 +- docker/v1.17.9.Dockerfile | 2 +- docker/v1.18.0.Dockerfile | 2 +- docker/v1.18.1.Dockerfile | 2 +- docker/v1.18.10.Dockerfile | 2 +- docker/v1.18.11.Dockerfile | 2 +- docker/v1.18.2.Dockerfile | 2 +- docker/v1.18.3.Dockerfile | 2 +- docker/v1.18.4.Dockerfile | 2 +- docker/v1.18.5.Dockerfile | 2 +- docker/v1.18.6.Dockerfile | 2 +- docker/v1.18.7.Dockerfile | 2 +- docker/v1.18.8.Dockerfile | 2 +- docker/v1.18.9.Dockerfile | 2 +- generate_dockerfiles.py | 37 ++++++----- src/image_config.rs | 126 ++++++++++++++++++------------------- 46 files changed, 129 insertions(+), 122 deletions(-) diff --git a/docker/v1.17.0.Dockerfile b/docker/v1.17.0.Dockerfile index c93e341..867396f 100644 --- a/docker/v1.17.0.Dockerfile +++ b/docker/v1.17.0.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:6562d50b62366d5b9db92b34c6684fab5bf3b9f627e59a863c9c0675760feed4 +FROM --platform=linux/amd64 rust@sha256:6a2ac38604fce995fd586c8d760147f71d9113dcbe84a7fcddcb30c60a1ec7ee RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.0/install)" diff --git a/docker/v1.17.1.Dockerfile b/docker/v1.17.1.Dockerfile index e2608a8..25d717f 100644 --- a/docker/v1.17.1.Dockerfile +++ b/docker/v1.17.1.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.1/install)" diff --git a/docker/v1.17.10.Dockerfile b/docker/v1.17.10.Dockerfile index a75a01a..398c08b 100644 --- a/docker/v1.17.10.Dockerfile +++ b/docker/v1.17.10.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.10/install)" diff --git a/docker/v1.17.11.Dockerfile b/docker/v1.17.11.Dockerfile index 3992f5b..bf05503 100644 --- a/docker/v1.17.11.Dockerfile +++ b/docker/v1.17.11.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.11/install)" diff --git a/docker/v1.17.12.Dockerfile b/docker/v1.17.12.Dockerfile index 61f15c5..08e8c78 100644 --- a/docker/v1.17.12.Dockerfile +++ b/docker/v1.17.12.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.12/install)" diff --git a/docker/v1.17.13.Dockerfile b/docker/v1.17.13.Dockerfile index 22040a9..256d5f7 100644 --- a/docker/v1.17.13.Dockerfile +++ b/docker/v1.17.13.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.13/install)" diff --git a/docker/v1.17.14.Dockerfile b/docker/v1.17.14.Dockerfile index 94f6e76..6ebad52 100644 --- a/docker/v1.17.14.Dockerfile +++ b/docker/v1.17.14.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.14/install)" diff --git a/docker/v1.17.15.Dockerfile b/docker/v1.17.15.Dockerfile index 4163e93..3159683 100644 --- a/docker/v1.17.15.Dockerfile +++ b/docker/v1.17.15.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.15/install)" diff --git a/docker/v1.17.16.Dockerfile b/docker/v1.17.16.Dockerfile index 78cc7ce..e9f7b76 100644 --- a/docker/v1.17.16.Dockerfile +++ b/docker/v1.17.16.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.16/install)" diff --git a/docker/v1.17.17.Dockerfile b/docker/v1.17.17.Dockerfile index 2ce7edf..08cfeae 100644 --- a/docker/v1.17.17.Dockerfile +++ b/docker/v1.17.17.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.17/install)" diff --git a/docker/v1.17.18.Dockerfile b/docker/v1.17.18.Dockerfile index 8072ed9..3d2ef51 100644 --- a/docker/v1.17.18.Dockerfile +++ b/docker/v1.17.18.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.18/install)" diff --git a/docker/v1.17.19.Dockerfile b/docker/v1.17.19.Dockerfile index e2615e9..6ff8ae6 100644 --- a/docker/v1.17.19.Dockerfile +++ b/docker/v1.17.19.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.19/install)" diff --git a/docker/v1.17.2.Dockerfile b/docker/v1.17.2.Dockerfile index d1760be..55c479b 100644 --- a/docker/v1.17.2.Dockerfile +++ b/docker/v1.17.2.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.2/install)" diff --git a/docker/v1.17.20.Dockerfile b/docker/v1.17.20.Dockerfile index edb730c..b81d2cc 100644 --- a/docker/v1.17.20.Dockerfile +++ b/docker/v1.17.20.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.20/install)" diff --git a/docker/v1.17.21.Dockerfile b/docker/v1.17.21.Dockerfile index baed4cc..92dafac 100644 --- a/docker/v1.17.21.Dockerfile +++ b/docker/v1.17.21.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.21/install)" diff --git a/docker/v1.17.22.Dockerfile b/docker/v1.17.22.Dockerfile index c40f795..82372a5 100644 --- a/docker/v1.17.22.Dockerfile +++ b/docker/v1.17.22.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.22/install)" diff --git a/docker/v1.17.23.Dockerfile b/docker/v1.17.23.Dockerfile index ebcbbfa..04b40e3 100644 --- a/docker/v1.17.23.Dockerfile +++ b/docker/v1.17.23.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.23/install)" diff --git a/docker/v1.17.24.Dockerfile b/docker/v1.17.24.Dockerfile index 3d5b3e6..d8859e8 100644 --- a/docker/v1.17.24.Dockerfile +++ b/docker/v1.17.24.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.24/install)" diff --git a/docker/v1.17.25.Dockerfile b/docker/v1.17.25.Dockerfile index 9e1bf0f..7a1fd7a 100644 --- a/docker/v1.17.25.Dockerfile +++ b/docker/v1.17.25.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.25/install)" diff --git a/docker/v1.17.26.Dockerfile b/docker/v1.17.26.Dockerfile index a42b14b..78178ea 100644 --- a/docker/v1.17.26.Dockerfile +++ b/docker/v1.17.26.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.26/install)" diff --git a/docker/v1.17.27.Dockerfile b/docker/v1.17.27.Dockerfile index 964d8b7..d73b7a7 100644 --- a/docker/v1.17.27.Dockerfile +++ b/docker/v1.17.27.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.27/install)" diff --git a/docker/v1.17.28.Dockerfile b/docker/v1.17.28.Dockerfile index fb57315..17914cf 100644 --- a/docker/v1.17.28.Dockerfile +++ b/docker/v1.17.28.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.28/install)" diff --git a/docker/v1.17.29.Dockerfile b/docker/v1.17.29.Dockerfile index c2aeb04..ce1c707 100644 --- a/docker/v1.17.29.Dockerfile +++ b/docker/v1.17.29.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.29/install)" diff --git a/docker/v1.17.3.Dockerfile b/docker/v1.17.3.Dockerfile index 3b63dd4..f607ab2 100644 --- a/docker/v1.17.3.Dockerfile +++ b/docker/v1.17.3.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.3/install)" diff --git a/docker/v1.17.30.Dockerfile b/docker/v1.17.30.Dockerfile index 958f60a..20b0ed2 100644 --- a/docker/v1.17.30.Dockerfile +++ b/docker/v1.17.30.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.30/install)" diff --git a/docker/v1.17.31.Dockerfile b/docker/v1.17.31.Dockerfile index a18c042..57f84c0 100644 --- a/docker/v1.17.31.Dockerfile +++ b/docker/v1.17.31.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.31/install)" diff --git a/docker/v1.17.4.Dockerfile b/docker/v1.17.4.Dockerfile index cf807f4..7872a6e 100644 --- a/docker/v1.17.4.Dockerfile +++ b/docker/v1.17.4.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.4/install)" diff --git a/docker/v1.17.5.Dockerfile b/docker/v1.17.5.Dockerfile index ffbd22e..e3ffd8c 100644 --- a/docker/v1.17.5.Dockerfile +++ b/docker/v1.17.5.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.5/install)" diff --git a/docker/v1.17.6.Dockerfile b/docker/v1.17.6.Dockerfile index 1f654e0..fe361da 100644 --- a/docker/v1.17.6.Dockerfile +++ b/docker/v1.17.6.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.6/install)" diff --git a/docker/v1.17.7.Dockerfile b/docker/v1.17.7.Dockerfile index 4cd5861..566091c 100644 --- a/docker/v1.17.7.Dockerfile +++ b/docker/v1.17.7.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.7/install)" diff --git a/docker/v1.17.8.Dockerfile b/docker/v1.17.8.Dockerfile index 6ab5c20..6cb0a23 100644 --- a/docker/v1.17.8.Dockerfile +++ b/docker/v1.17.8.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.8/install)" diff --git a/docker/v1.17.9.Dockerfile b/docker/v1.17.9.Dockerfile index 86410a3..fd6d016 100644 --- a/docker/v1.17.9.Dockerfile +++ b/docker/v1.17.9.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:7ec316528af3582341280f667be6cfd93062a10d104f3b1ea72cd1150c46ef22 +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.9/install)" diff --git a/docker/v1.18.0.Dockerfile b/docker/v1.18.0.Dockerfile index 1a98fda..9b21b3c 100644 --- a/docker/v1.18.0.Dockerfile +++ b/docker/v1.18.0.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.0/install)" diff --git a/docker/v1.18.1.Dockerfile b/docker/v1.18.1.Dockerfile index fa393ef..424a993 100644 --- a/docker/v1.18.1.Dockerfile +++ b/docker/v1.18.1.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.1/install)" diff --git a/docker/v1.18.10.Dockerfile b/docker/v1.18.10.Dockerfile index 54a9118..93cd410 100644 --- a/docker/v1.18.10.Dockerfile +++ b/docker/v1.18.10.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.10/install)" diff --git a/docker/v1.18.11.Dockerfile b/docker/v1.18.11.Dockerfile index 1a2f27c..841c7cd 100644 --- a/docker/v1.18.11.Dockerfile +++ b/docker/v1.18.11.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.11/install)" diff --git a/docker/v1.18.2.Dockerfile b/docker/v1.18.2.Dockerfile index 3b85afa..c6cae02 100644 --- a/docker/v1.18.2.Dockerfile +++ b/docker/v1.18.2.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.2/install)" diff --git a/docker/v1.18.3.Dockerfile b/docker/v1.18.3.Dockerfile index 60d6de1..0288196 100644 --- a/docker/v1.18.3.Dockerfile +++ b/docker/v1.18.3.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.3/install)" diff --git a/docker/v1.18.4.Dockerfile b/docker/v1.18.4.Dockerfile index ca54c37..c743285 100644 --- a/docker/v1.18.4.Dockerfile +++ b/docker/v1.18.4.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.4/install)" diff --git a/docker/v1.18.5.Dockerfile b/docker/v1.18.5.Dockerfile index 3b8bfdb..fa5a4e8 100644 --- a/docker/v1.18.5.Dockerfile +++ b/docker/v1.18.5.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.5/install)" diff --git a/docker/v1.18.6.Dockerfile b/docker/v1.18.6.Dockerfile index f79098e..f3df9ee 100644 --- a/docker/v1.18.6.Dockerfile +++ b/docker/v1.18.6.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.6/install)" diff --git a/docker/v1.18.7.Dockerfile b/docker/v1.18.7.Dockerfile index 193866c..adc6829 100644 --- a/docker/v1.18.7.Dockerfile +++ b/docker/v1.18.7.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.7/install)" diff --git a/docker/v1.18.8.Dockerfile b/docker/v1.18.8.Dockerfile index c5f3e7a..cb5742f 100644 --- a/docker/v1.18.8.Dockerfile +++ b/docker/v1.18.8.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.8/install)" diff --git a/docker/v1.18.9.Dockerfile b/docker/v1.18.9.Dockerfile index caa30ad..a6419ef 100644 --- a/docker/v1.18.9.Dockerfile +++ b/docker/v1.18.9.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=linux/amd64 rust@sha256:b7f381685785bb4192e53995d6ad1dec70954e682e18e06a4c8c02011ab2f32e +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.9/install)" diff --git a/generate_dockerfiles.py b/generate_dockerfiles.py index e927101..691c052 100644 --- a/generate_dockerfiles.py +++ b/generate_dockerfiles.py @@ -128,21 +128,22 @@ def get_toolchain(version_tag): print(RUST_DOCKER_IMAGESHA_MAP) -if args.upload: - digest_set = set() - if not args.skip_cache: - print("Fetching existing images") - response = requests.get( - "https://hub.docker.com/v2/namespaces/ellipsislabs/repositories/solana/tags?page_size=1000" - ) - for result in response.json()["results"]: - if result["name"] != "latest": - try: - digest_set.add(result["name"]) - except Exception as e: - print(e) - continue +digest_set = set() +if not args.skip_cache: + print("Fetching existing images") + response = requests.get( + "https://hub.docker.com/v2/namespaces/ellipsislabs/repositories/solana/tags?page_size=1000" + ) + for result in response.json()["results"]: + print(result) + if result["name"] != "latest": + try: + digest_set.add(result["name"]) + except Exception as e: + print(e) + continue +if args.upload: print("Uploading all Dockerfiles") for tag, dockerfile in dockerfiles.items(): # Strip the `v` from the tag to keep the versions consistent in Docker @@ -152,6 +153,7 @@ def get_toolchain(version_tag): print(stripped_tag, args.version) + force_build = False if args.version is not None: ver = args.version.split(".") if len(ver) == 2: @@ -162,8 +164,13 @@ def get_toolchain(version_tag): if major != a_major or minor != a_minor or a_patch != patch: print(f"Skipping {stripped_tag}") continue + force_build = True - if stripped_tag in digest_set and stripped_tag not in dirty_set: + if ( + stripped_tag in digest_set + and stripped_tag not in dirty_set + and not force_build + ): print(f"Already built image for {stripped_tag}, skipping") continue if stripped_tag in dirty_set: diff --git a/src/image_config.rs b/src/image_config.rs index 9370999..309ae6b 100644 --- a/src/image_config.rs +++ b/src/image_config.rs @@ -33,78 +33,78 @@ lazy_static! { m.insert((1, 14, 27), "sha256:66beebc3bd73ad7b0c694dd0f7027f39e211932caecc0d908467bb00c8f83812"); m.insert((1, 14, 28), "sha256:4b7a8fcc1d487fe80dfc152d1e49c6067025d5e44bd5d743869fe75b636e4907"); m.insert((1, 14, 29), "sha256:2a38e78a1bcb369a6673b6442f1ee32f99e839445e426c4fdfdc48ee852e346e"); - m.insert((1, 16, 0), "sha256:eaf330939f614dab0c1daab2db65431753f114c82c62f9868f1993010db0e814"); - m.insert((1, 16, 1), "sha256:1979f60e559498d29f2ea786229e59d082041b376fccd0f4c2b509acfcc5ca49"); - m.insert((1, 16, 2), "sha256:b2a53e3984aa39e16553f90b0e180e361bf3b76fea32ba11a07137aea41e0a42"); - m.insert((1, 16, 3), "sha256:87dc8f71a35c46c10cf170363adb4345742ccddf0bca0d89b66c573ed495d78f"); - m.insert((1, 16, 4), "sha256:36c5cb09802141adbb1ba2dc10c75b7915f601249edc89b208f1e9ec313ff008"); + m.insert((1, 16, 0), "sha256:63b59011d4451d461cc1ce3beddc627c648209e151022938a43eafcaa06861b5"); + m.insert((1, 16, 1), "sha256:b923575721bc729e529368af6ddb0a05971c85a69dca9d86517c635a0bf1350e"); + m.insert((1, 16, 2), "sha256:3989c28d287659d38a1b3b92d261c7bd7fc92499fe87e1f88cfeb27296dfbfae"); + m.insert((1, 16, 3), "sha256:324aee788745b7b06807d34363e16caa766a9ccb1f68f6b5d6f43581119cfd26"); + m.insert((1, 16, 4), "sha256:04cb2437921aff3d3b65055742c36efd80f27ba1deeb5740d9758d5d2a7cd143"); m.insert((1, 16, 5), "sha256:bbe60168f1b8cab06020e48e1822d24423794b8acedada88c12c3e99e4d10bf1"); - m.insert((1, 16, 6), "sha256:81100154468537f4476ba8c2b42a43c3e9516ef2abc4d10cc439203d21ef4ba2"); - m.insert((1, 16, 7), "sha256:d500b3b1b324381715665e6afaaab8e3620a4d22c8f88fed4199e89bf784b878"); + m.insert((1, 16, 6), "sha256:4982358e725da47f890ff090322aceabbd1619342d9b0173a935a77f0f25dd99"); + m.insert((1, 16, 7), "sha256:bfaf53054066a45def524c3f7aa5699407dc01cf74b1d7060b223753d08e83b4"); m.insert((1, 16, 8), "sha256:a377f19b7dd3dccc81b4dec69e8dae3b518bb6a058b27075f6078b264e4b4c5c"); - m.insert((1, 16, 9), "sha256:6a5e459a2f16c16068a3193a8d8d006ce071b8a84a1e188e7b06c994a04ed8fa"); - m.insert((1, 16, 10), "sha256:38f1c10abb3d274eef019bd5b726ad8aa6ff036959009959768ab2956eb749b0"); + m.insert((1, 16, 9), "sha256:c504b12273774f904ba32f51ba1edb369ac3226802b5d0d3e2b03bba486a3143"); + m.insert((1, 16, 10), "sha256:ef6901ebabf174eb4a8a4874df6426647663fde723b1092eaa3b7cc464dffd2b"); m.insert((1, 16, 11), "sha256:a2788528b302c4c4144cfcaca35c978a1b420c936201b3b7b80977a289345914"); - m.insert((1, 16, 12), "sha256:7823267a7df4fb39cb7daf012416aab7dd3a5a7dec400a60bb02517a1d562c23"); - m.insert((1, 16, 13), "sha256:c99927b38601ad619c3f2f08bbb51a50dd65dd90937a558f9f5676b243bcc964"); - m.insert((1, 16, 14), "sha256:4bc6e90953a69e9566416317485d437488c595c6d39d3bf163991ea80c79cb9f"); - m.insert((1, 16, 15), "sha256:1b7e3ac6798829dee8dec42557af4824848fe9d3a2c43c31bca59aa6c63e510b"); - m.insert((1, 16, 16), "sha256:0bf7a96764a57a2bc68ee0274ab098d6606d83e6315af1a1a8a21f346287a6a7"); - m.insert((1, 16, 17), "sha256:3ab3428a23620a2c6a250e6d592ada8012cb8b56b5789712171c4203d9cc3f61"); - m.insert((1, 16, 18), "sha256:d2a376b9134b698ac8b61ea4feaea016d5085f8fab61763a6541fe50e3771164"); - m.insert((1, 16, 19), "sha256:7fd9ecf02d378268fcea1ef7fe3b1906fc96e24a833529d3f54b1a16b55c592c"); - m.insert((1, 16, 20), "sha256:8dbb638f06642b0069d475083995ea45ab52f183d0e05987489567efca1e13e0"); - m.insert((1, 16, 21), "sha256:21d4f620cd144775b4d9af80b09584db49b106f67841d20415485eab6827069c"); - m.insert((1, 16, 22), "sha256:6837018a2e35edc9c9b955536973934b45517a87888c18875919f072c9085d50"); - m.insert((1, 16, 23), "sha256:9bdda2f4ca4628183a9c39f5a11ae66eee0e49b457439f5c487962c5917146ad"); - m.insert((1, 16, 24), "sha256:8d28e0ac1a0f929c2f8bf323df2bcf324b5dc4d2e0aac089096759f457963c46"); - m.insert((1, 16, 25), "sha256:c48298cbb97dbd6a493ee9592d4c3700e214b34788ea67e0bca58ff388179340"); - m.insert((1, 16, 26), "sha256:9a28b2961396c1fba8855744eaea125640b3dbda7a86fc0a7ae375824338144d"); + m.insert((1, 16, 12), "sha256:fa0ddf49a29261a672bce0ab5340d9a4ad45197ba975ad325ed5ecbef9a7a51e"); + m.insert((1, 16, 13), "sha256:255b263d58826d51d00adac9b23f4ea8b7e1e4bc2d13d608c884a260819cfca6"); + m.insert((1, 16, 14), "sha256:0d8df94267a54d944816ccf470cdeed3a7a8a4b430e25e656a30446a1218fe16"); + m.insert((1, 16, 15), "sha256:f1077fd6d8bbfbb7bb74d011943840ab477b18a3c4a34def590599ae91dc5ced"); + m.insert((1, 16, 16), "sha256:6516d9dd7de0ff660a85b06e7991b61b55980fc48b0301dc2fd464357be6c630"); + m.insert((1, 16, 17), "sha256:c07ac629b03108e4a0d072b52bf1122c93dc922275d1522294726db162bc1d82"); + m.insert((1, 16, 18), "sha256:82254c5155ef6f26de62b16176cd66c41a05aacdf7236ec9038c2248a954a545"); + m.insert((1, 16, 19), "sha256:fa23ec387643045a01b5f879edfbe8f3e01c8047c1e48ba161571f0ec279ca4d"); + m.insert((1, 16, 20), "sha256:4077c6626a605f9b9d2f050744fc5495cfa5dbf11948e6760a8c5055364bfcdb"); + m.insert((1, 16, 21), "sha256:f05e41fb520a6651c31217e7bd77e4bb5e63328dd33e98cb340e624639aca640"); + m.insert((1, 16, 22), "sha256:6cd9b344886876f13cb0ea047f58bfcb745d33e0383d420f45f0229e3d7611b8"); + m.insert((1, 16, 23), "sha256:742d8eb1267f09c0cc8ec84676f6d28eaa44a1f3a338b6d91af1b40a22074be3"); + m.insert((1, 16, 24), "sha256:e4734c729e784fba9ad9dc70f274d847074a961f103600c9a504395b6cdc9475"); + m.insert((1, 16, 25), "sha256:8b23dfcc9ea37cb0a275d965cbc729eaf339872759ce63d462401f0485ab9a50"); + m.insert((1, 16, 26), "sha256:b1399b7bff5f37abd52bd1f70a1e14279bddbe68d7a381c30af7a390f2a2b681"); m.insert((1, 16, 27), "sha256:d3f39f5e1d2fbf798149416bbcb050ae8c03ea8ce18c559fc64beb7547f5c96b"); - m.insert((1, 17, 0), "sha256:5384f5ba77081d57e5b9c925bf1143315141fccd4fa19bb76210d50ad0a87c9d"); - m.insert((1, 17, 1), "sha256:33a99de6e0441b5e40bc74c37201f69e6d94225f3df12ab492f41c2372d919ce"); - m.insert((1, 17, 2), "sha256:4d862e20ab6b1fafdc59cbb9b7cd3200b4c0e4c66de767fac3a49f871baa4e3d"); + m.insert((1, 17, 0), "sha256:b6a15120904aa5c3d5b2404349478c7577fb25dfd73349829f629b81cd21757d"); + m.insert((1, 17, 1), "sha256:b22eb6d5b64cddf98435a38c0cec4e6702015a63c9cc2d2e8353214a21a13407"); + m.insert((1, 17, 2), "sha256:10e43778cfb4a1c57c33c4781b0e51874752ab46ed97e3418d058ba27ee3c813"); m.insert((1, 17, 3), "sha256:c58cf31748b19f03aa21f2d677db0296d98ddc52889953096ab85586b537a770"); - m.insert((1, 17, 4), "sha256:d7cbe13c49ae3a23205d0a6c0d6410e2b4deb69c7b2d6ccc8bf9ca3fc322d649"); - m.insert((1, 17, 5), "sha256:ed9b2e489fdd33bf21e968050a9ce13f84579986577a6d4fbe7e70c94242d774"); - m.insert((1, 17, 6), "sha256:02a2f2eaf18a52eab14e0d8048b4ec561b667e7b5996fc406acb6bdb9ef8dadc"); - m.insert((1, 17, 7), "sha256:2e4ae35f2f66c9eacee5f2491952ef15ada0f3ddc9e7ad0bfef8ae3973f3cf46"); - m.insert((1, 17, 8), "sha256:f50c3b8eaf406a9e3b64cdac41a8f72b76c632a4c62c53abe409346b200dcfea"); - m.insert((1, 17, 9), "sha256:1cb9b38cc53127a06d9341ecd642f3dd3751f662488fa79b487c404caabb5910"); - m.insert((1, 17, 10), "sha256:66e24ed2b7a2a1e91f951f5124fe906f8e2cbc1a8bc31f2a535a95530667f918"); - m.insert((1, 17, 11), "sha256:ea64b41ae4773f1734e36004425ceeb0d3c59aebba1f12ac20a031aa5a8ebd99"); + m.insert((1, 17, 4), "sha256:cc0e73a825f4688ed897bc4b3e8cd3426e90cba0d53254b19dd93ac49c2eea53"); + m.insert((1, 17, 5), "sha256:91e50b5c06b5844a41ac9303e9f54aecfa2386e02bcb229c97e3604fbac012f1"); + m.insert((1, 17, 6), "sha256:6ab8b019f8e3556d5e05ebff7100a533078dd7b37309de5f0c8ee24ffb699a24"); + m.insert((1, 17, 7), "sha256:bf95031bb8dc2cd7ac0b9d05b5656a33d5188723859bddfb1dfa5031e04348f2"); + m.insert((1, 17, 8), "sha256:007edb91a663b86a5bded18d8db8efb559f89941f51c54fb1f9044c350980c37"); + m.insert((1, 17, 9), "sha256:3305eda13a0ed63ddf0a8bb9fb2e8c9a01ba23136f3504da275322efac86d2d7"); + m.insert((1, 17, 10), "sha256:aa33671fa2c90306ce0224bc1676c138a3d867a5cb389a935fad9e48082f0a5c"); + m.insert((1, 17, 11), "sha256:bbaec57b323f0eaa86ef00fb612a60d6093d27e559f2769b1a6be061a52336e5"); m.insert((1, 17, 12), "sha256:f0f4dfd83424786a64812a53d218264f7900e8cf3286124a071ffa141dfd6051"); - m.insert((1, 17, 13), "sha256:63ac4121ca405779d201227f9622e55b556f9d81fcf38c614d258b7802f6faf5"); - m.insert((1, 17, 14), "sha256:bd414c6bdeefa662ba17a0473df9648a3cc2795a9abb9dd1120aa50bc242d5b3"); - m.insert((1, 17, 15), "sha256:8f40b55086058db687e7eb1ebd1638d9a848e4443d5ee45af19ee245922bd8f4"); + m.insert((1, 17, 13), "sha256:21706ce972b8676c37a743cb1fafb471bdaafa42e8c7aed19944966e2dcb63c9"); + m.insert((1, 17, 14), "sha256:e2ffac03523f37a4bb95c41d974bea6f6678d629ff9fb33b84dd65412bc48152"); + m.insert((1, 17, 15), "sha256:27e10d218351b6afa6338a36f045a8334f64c710f58f8753ae15fd3a8e0ad22f"); m.insert((1, 17, 16), "sha256:7d6d95378cda2cd6866ae70563bf184e99d3d937632c0033797bcc483ae81597"); - m.insert((1, 17, 17), "sha256:495577d3de64e0829be1b67d631dea843635fa41ef23672048ec7eac628f753c"); + m.insert((1, 17, 17), "sha256:b8024cdf9e196490328e4ea0721e403396a6f16a5e825a9af63ced7c703ce9c4"); m.insert((1, 17, 18), "sha256:3c951af1c893a7d509872faed62410de33ff9fc41c2052a8c79f5e44840186d5"); - m.insert((1, 17, 19), "sha256:f2fbc2131c5edc8f9debc00aeb2e121bbe5aa8523c7c311aa205910dda61d0f7"); + m.insert((1, 17, 19), "sha256:c0144fd11e72568d8ae4a7311c08871275bff41c6af8984ca7301c84d286e84b"); m.insert((1, 17, 20), "sha256:7914649a71b10819dbb1f9d5ae440217b83af3f55e8454ff3a1f92e5174148d5"); - m.insert((1, 17, 21), "sha256:6f8c4364e7bd95b08b341caf13046841d6fe2b7e41d8bb6ca89edea479b8d59d"); - m.insert((1, 17, 22), "sha256:73a7160507ba99b97948aae6c45bb19639e9b0be0885149927b1cd24e3541b53"); - m.insert((1, 17, 23), "sha256:be370005dedc49f5997beffe2fe628e1337601836a25d9ef38f5d1cc39f086f7"); - m.insert((1, 17, 24), "sha256:113205a16988d9d5201d5be0a325bbaa7bf951198b64bde0889eb666ca8d25be"); - m.insert((1, 17, 25), "sha256:6b6a24b4f7bf9a4ec1a01a836fd225fea7acecf7a5ddb69789175ba394e11bcd"); - m.insert((1, 17, 26), "sha256:f4dd1b25607cc26c3831b4585171dffce69cd29350548cc3680e598200901c50"); - m.insert((1, 17, 27), "sha256:09b65863f3edf0ad538c30f7f25aff87da27cc2d2bf1c1040d9a1ae25a7ba64a"); - m.insert((1, 17, 28), "sha256:e53f8847a65d7b63c4b7b8de4d7be5e62e6dc8c77bcc95d467e0bfeb6a79ba1c"); - m.insert((1, 17, 29), "sha256:2dd7508c8ec56323ec2aae4a0d6dbd41b05f8341e6d916c5d06450983648c06e"); - m.insert((1, 17, 30), "sha256:2ff30514c86609913c5911d00e1a8a2a4a4057aec4b59e0b61bf9e3969a9f540"); - m.insert((1, 17, 31), "sha256:2195a51d6ae8be894ea06e2b7da4f9d98354919766ddd63b62440420b72499cb"); - m.insert((1, 18, 0), "sha256:9442baedec5e2589b1263e5d12363ef9b2e8e8ad289d2ea5cd0ee7584e479fae"); - m.insert((1, 18, 1), "sha256:b5865168f3177d3acbf4de12d296aa06fcd4911090c4fa3bcb41cf36e347a695"); - m.insert((1, 18, 2), "sha256:9c150a6cde88d65e75ceb08512e8c6a861b2dc84b34a579aac34ef3f9021c483"); - m.insert((1, 18, 3), "sha256:b34788e5c8df22f2cd0643a0d15a96a2174821d5b02b8a33f4644dc160cd5cd2"); - m.insert((1, 18, 4), "sha256:2680be153b67f762ace21c0c1c55ff250e829748b357ef72d980b772863ad566"); - m.insert((1, 18, 5), "sha256:3baad00634f112e64889a840fa7da87c095b40927eb3d8bfb1972a50c6cdb141"); - m.insert((1, 18, 6), "sha256:5474b807c760b33ea93ed3fe9fdabca737d69a4e43ed31f1398777411e345dd3"); - m.insert((1, 18, 7), "sha256:b92d6e6b8e23bd6a52063e5d6b3b920751b6dc79be55acb7f474ac064de4dbc8"); - m.insert((1, 18, 8), "sha256:4982b38a4efd9de89bc72e62777982298e6b9bce3e0ffa3613dc105b52bd252d"); - m.insert((1, 18, 9), "sha256:008c69f4da34cca15cfa1bd7486800af192138dccc2603e7fb93fd3bd209e86e"); - m.insert((1, 18, 10), "sha256:4f045c3ebc78140d93ea23696a1479c3eeefcf7fad8fa10975eaaa975dffd83d"); - m.insert((1, 18, 11), "sha256:70eb2dc290cdf1336f9b4aeba666a96eb2d271d812216f4885ecc75bd44e9bde"); + m.insert((1, 17, 21), "sha256:0a874df16407f8f440d3e647f65047135dd17bfa526eea21d9010e4933214058"); + m.insert((1, 17, 22), "sha256:89e8f58ee9fe5c1dbaf5a6852a61423680804ccf0a7b4bad95770e329fb8ef84"); + m.insert((1, 17, 23), "sha256:45b7610a69b8ea0bdc759ac8a273923b84fb6f014a80a3ae1ea741b378324f50"); + m.insert((1, 17, 24), "sha256:096223fcbd814cb1a6270e41a8c5e83931b9e501e38c95ff75e724fc902bd5dc"); + m.insert((1, 17, 25), "sha256:748d59cfc5465456240c80c8878c5074e46c652b21810579258bcb5ad98d3a65"); + m.insert((1, 17, 26), "sha256:9873c36bd51ca6ba8477acd9ada0a341c148d4dd6473625f41ad69638012863d"); + m.insert((1, 17, 27), "sha256:31c406d1e64801ed4092790a627c1b36d4407b00d8a90022dacec85ff131c4ae"); + m.insert((1, 17, 28), "sha256:7972c577ff51404e4cead30987df19365425ad722756333dd049684c8c2a189c"); + m.insert((1, 17, 29), "sha256:74efa6a72d82ce2b74f2b5642d4293fa5a302d6d82017e6ad67223dbf3102d58"); + m.insert((1, 17, 30), "sha256:f4cf3feeb3ce190608cf00fde565bba4fe4c3e14d7b52e915a89fcf90516f7af"); + m.insert((1, 17, 31), "sha256:318cd840f9e31a11560946af222339556925e149b2d7d25cd6f85b07c247e9e3"); + m.insert((1, 18, 0), "sha256:1eda60c966a4da71d5a0d8d1600439aa303561f29068801a8e0e2b34f121f7ab"); + m.insert((1, 18, 1), "sha256:0c15cf35e58a43972475bc96de47b5b51805548a16d1e97ec6c1947c98770d22"); + m.insert((1, 18, 2), "sha256:5c7bda6b3d0b23ea36fc47363b5d9e534caec7b7f5f3d0e063681a3105e8de88"); + m.insert((1, 18, 3), "sha256:810b023c358e4ead1f8bbc65568fec75875c7e44a44a51ed2cd02b92a8633368"); + m.insert((1, 18, 4), "sha256:30a7c92c6249a99d14d742bb08fe5d3d5275aaba39625aca56019e80ea970e63"); + m.insert((1, 18, 5), "sha256:5fafa571776d6eb07916114a150311ed4e4a99f28d82bb51bb0ac34d1c71c31c"); + m.insert((1, 18, 6), "sha256:cd66fcd774f1ed500868554836cc025891de2df32e4487067f61b07edf4b4b46"); + m.insert((1, 18, 7), "sha256:8a6dfe988debf999d2f3d5db3ee1c7297d010bb0102a45fc3c0c413978c02f51"); + m.insert((1, 18, 8), "sha256:d3b35657294579f520c270da3fdc6cba5fd6b08e945c16c0b977e86c981f41d9"); + m.insert((1, 18, 9), "sha256:7de18750a50fd49ad71b14a0189ba6d203ee66b01326570d5df483368bfbc296"); + m.insert((1, 18, 10), "sha256:c2c93b0b02086198909e0c0fb8aea3ca110586085f3b4dbd72cf1ff32ad73d84"); + m.insert((1, 18, 11), "sha256:0a41f973bf8207261b39d5e50d5d66f97f203d83de123033624d3e5f7dc41ee5"); m }; } From 4225f8cdb4734185830a2d22037bddbdfebcef13 Mon Sep 17 00:00:00 2001 From: Jarry Xiao Date: Tue, 16 Apr 2024 13:59:18 -0500 Subject: [PATCH 110/314] cargo --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 153eafe..2ed19e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3558,7 +3558,7 @@ dependencies = [ [[package]] name = "solana-verify" -version = "0.2.10" +version = "0.2.11" dependencies = [ "anyhow", "cargo-lock", diff --git a/Cargo.toml b/Cargo.toml index cffd63d..7acdcf3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "solana-verify" -version = "0.2.10" +version = "0.2.11" edition = "2021" description = "A CLI tool for building verifiable Solana programs" license = "MIT" From 8c254919f6dcb61fcec7a580d82af0b6ca1b1c52 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Sat, 11 May 2024 16:16:36 +0530 Subject: [PATCH 111/314] Feat Otter Verify upload_program ix --- Cargo.lock | 135 +++++++++++++++++++++++++++++++++++------- Cargo.toml | 2 + src/main.rs | 19 +++--- src/solana_program.rs | 132 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 261 insertions(+), 27 deletions(-) create mode 100644 src/solana_program.rs diff --git a/Cargo.lock b/Cargo.lock index 2ed19e6..4d0696d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -338,10 +338,20 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa" dependencies = [ - "borsh-derive", + "borsh-derive 0.9.3", "hashbrown 0.11.2", ] +[[package]] +name = "borsh" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe5b10e214954177fb1dc9fbd20a1a2608fe99e6c832033bdc7cea287a20d77" +dependencies = [ + "borsh-derive 1.5.0", + "cfg_aliases", +] + [[package]] name = "borsh-derive" version = "0.9.3" @@ -355,6 +365,20 @@ dependencies = [ "syn 1.0.107", ] +[[package]] +name = "borsh-derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a8646f94ab393e43e8b35a2558b1624bed28b97ee09c5d15456e3c9463f46d" +dependencies = [ + "once_cell", + "proc-macro-crate 3.1.0", + "proc-macro2 1.0.66", + "quote 1.0.32", + "syn 2.0.32", + "syn_derive", +] + [[package]] name = "borsh-derive-internal" version = "0.9.3" @@ -499,6 +523,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + [[package]] name = "chrono" version = "0.4.23" @@ -558,7 +588,7 @@ dependencies = [ "atty", "bitflags", "clap_lex 0.2.4", - "indexmap", + "indexmap 1.9.2", "once_cell", "strsim 0.10.0", "termcolor", @@ -1061,6 +1091,12 @@ dependencies = [ "termcolor", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "errno" version = "0.2.8" @@ -1306,7 +1342,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 1.9.2", "slab", "tokio", "tokio-util", @@ -1331,6 +1367,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + [[package]] name = "heck" version = "0.4.0" @@ -1553,6 +1595,16 @@ dependencies = [ "hashbrown 0.12.3", ] +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.5", +] + [[package]] name = "indicatif" version = "0.16.2" @@ -2082,9 +2134,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -2285,6 +2337,15 @@ dependencies = [ "toml_edit 0.18.1", ] +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit 0.21.1", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -2888,7 +2949,7 @@ version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" dependencies = [ - "indexmap", + "indexmap 1.9.2", "ryu", "serde", "yaml-rust", @@ -3124,7 +3185,7 @@ dependencies = [ "enum_dispatch", "futures", "futures-util", - "indexmap", + "indexmap 1.9.2", "indicatif 0.16.2", "itertools", "jsonrpc-core", @@ -3339,8 +3400,8 @@ dependencies = [ "bincode", "bitflags", "blake3", - "borsh", - "borsh-derive", + "borsh 0.9.3", + "borsh-derive 0.9.3", "bs58", "bv", "bytemuck", @@ -3444,7 +3505,7 @@ dependencies = [ "base64 0.13.1", "bincode", "bitflags", - "borsh", + "borsh 0.9.3", "bs58", "bytemuck", "byteorder", @@ -3507,7 +3568,7 @@ dependencies = [ "crossbeam-channel", "futures-util", "histogram", - "indexmap", + "indexmap 1.9.2", "itertools", "libc", "log", @@ -3536,7 +3597,7 @@ dependencies = [ "Inflector", "base64 0.13.1", "bincode", - "borsh", + "borsh 0.9.3", "bs58", "lazy_static", "log", @@ -3561,6 +3622,7 @@ name = "solana-verify" version = "0.2.11" dependencies = [ "anyhow", + "borsh 1.5.0", "cargo-lock", "cargo_toml", "clap 4.1.4", @@ -3574,6 +3636,7 @@ dependencies = [ "serde_json", "sha256", "signal-hook", + "solana-clap-utils", "solana-cli-config", "solana-client", "solana-sdk", @@ -3672,7 +3735,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbc000f0fdf1f12f99d77d398137c1751345b18c88258ce0f99b7872cf6c9bd6" dependencies = [ "assert_matches", - "borsh", + "borsh 0.9.3", "num-derive", "num-traits", "solana-program", @@ -3774,6 +3837,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +dependencies = [ + "proc-macro-error", + "proc-macro2 1.0.66", + "quote 1.0.32", + "syn 2.0.32", +] + [[package]] name = "synstructure" version = "0.12.6" @@ -4036,7 +4111,7 @@ checksum = "d6135d499e69981f9ff0ef2167955a5333c35e36f6937d382974566b3d5b94ec" dependencies = [ "serde", "serde_spanned", - "toml_datetime 0.6.2", + "toml_datetime 0.6.5", "toml_edit 0.19.10", ] @@ -4048,9 +4123,9 @@ checksum = "4553f467ac8e3d374bc9a177a26801e5d0f9b211aa1673fb137a403afd1c9cf5" [[package]] name = "toml_datetime" -version = "0.6.2" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a76a9312f5ba4c2dec6b9161fdf25d87ad8a09256ccea5a556fef03c706a10f" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" dependencies = [ "serde", ] @@ -4061,7 +4136,7 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56c59d8dd7d0dcbc6428bf7aa2f0e823e26e43b3c9aca15bbc9475d23e5fa12b" dependencies = [ - "indexmap", + "indexmap 1.9.2", "nom8", "toml_datetime 0.5.1", ] @@ -4072,11 +4147,22 @@ version = "0.19.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2380d56e8670370eee6566b0bfd4265f65b3f432e8c6d85623f728d4fa31f739" dependencies = [ - "indexmap", + "indexmap 1.9.2", "serde", "serde_spanned", - "toml_datetime 0.6.2", - "winnow", + "toml_datetime 0.6.5", + "winnow 0.4.7", +] + +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap 2.2.6", + "toml_datetime 0.6.5", + "winnow 0.5.40", ] [[package]] @@ -4625,6 +4711,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.10.1" diff --git a/Cargo.toml b/Cargo.toml index 7acdcf3..ca2e03a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,7 @@ anyhow = "1.0.68" tokio = { version = "1.29.1", features = ["full"] } solana-client = "1.14.10" solana-cli-config = "1.14.10" +solana-clap-utils = "1.14.10" solana-sdk = "1.14.10" sha256 = "1.1.1" hex = "0.3.1" @@ -26,6 +27,7 @@ lazy_static = "1.4.0" indicatif = "0.17.7" crossbeam-channel = "0.5.11" serde = { version = "1.0.166", features = ["derive"] } +borsh = {version = "1.2.0", features = ["derive"] } [dependencies.uuid] version = "1.2.2" diff --git a/src/main.rs b/src/main.rs index b4c8e84..a85122b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,19 +13,16 @@ use solana_sdk::{ pubkey::Pubkey, }; use std::{ - io::Read, - path::PathBuf, - process::Stdio, - sync::atomic::AtomicBool, - sync::{atomic::Ordering, Arc}, + io::Read, path::PathBuf, process::{exit, Stdio}, sync::{atomic::{AtomicBool, Ordering}, Arc} }; use uuid::Uuid; pub mod api_client; pub mod image_config; pub mod api_models; +pub mod solana_program; use image_config::IMAGE_MAP; -use crate::api_client::send_job_to_remote; +use crate::{api_client::send_job_to_remote, solana_program::upload_program}; const MAINNET_GENESIS_HASH: &str = "5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d"; @@ -711,7 +708,7 @@ pub async fn verify_from_repo( .output()?; // Checkout a specific commit hash, if provided - if let Some(commit_hash) = commit_hash { + if let Some(commit_hash) = commit_hash.as_ref() { let result = std::process::Command::new("git") .args(["-C", &verify_tmp_root_path]) .args(["checkout", &commit_hash]) @@ -797,6 +794,14 @@ pub async fn verify_from_repo( if build_hash == program_hash { println!("Program hash matches ✅"); + // TODO : FIX Args Param + let x = upload_program(repo_url, &commit_hash.clone(), [].into(), program_id).await; + if x.is_err() { + println!("Error uploading program: {:?}", x); + exit(1); + } else { + println!("Program uploaded successfully"); + } } else { println!("Program hashes do not match ❌"); } diff --git a/src/solana_program.rs b/src/solana_program.rs new file mode 100644 index 0000000..c61b678 --- /dev/null +++ b/src/solana_program.rs @@ -0,0 +1,132 @@ +use anyhow::anyhow; +use solana_cli_config::Config; +use solana_client::rpc_client::RpcClient; +use std::{ + io::{self, Read, Write}, + str::FromStr, +}; + +use borsh::{to_vec, BorshDeserialize, BorshSerialize}; +use solana_sdk::{ + instruction::AccountMeta, message::Message, pubkey::Pubkey, signer::Signer, system_program, + transaction::Transaction, +}; + +const OTTER_VERIFY_PROGRAMID: &str = "EngB3ANqXh8nDFhzZYJkCfpCHWCHkTrJTCWKEuSFCh7B"; + +pub fn prompt_user_input() -> bool { + let mut buffer = [0; 1]; + print!("Do you want to update it to On-Chain Program ?. (Y/n) "); + // Read a single character from standard input + let _ = io::stdout().flush(); + io::stdin() + .read_exact(&mut buffer) + .expect("Unable to read user input"); + matches!(buffer[0] as char, 'Y' | 'y') +} + +#[derive(BorshSerialize, BorshDeserialize)] +pub struct InputParams { + pub version: String, + pub git_url: String, + pub commit: String, + pub args: Vec, +} + +pub enum OtterVerifyInstructions { + Initialize, + Update, + Close, +} + +impl OtterVerifyInstructions { + fn get_discriminant(&self) -> Vec { + match self { + OtterVerifyInstructions::Initialize => vec![175, 175, 109, 31, 13, 152, 155, 237], + OtterVerifyInstructions::Update => vec![219, 200, 88, 176, 158, 63, 253, 127], + OtterVerifyInstructions::Close => vec![98, 165, 201, 177, 108, 65, 206, 96], + } + } +} +fn create_ix_data(params: &InputParams, ix: OtterVerifyInstructions) -> Vec { + let mut data = ix.get_discriminant(); // Discriminant for the instruction + let params_data = to_vec(¶ms).expect("Unable to serialize params"); + data.extend_from_slice(¶ms_data); + data +} + +pub async fn upload_program( + git_url: String, + commit: &Option, + args: Vec, + other_program_address: Pubkey, +) -> anyhow::Result<()> { + if true { + println!("Uploading the program to the Solana blockchain..."); + + let config_file = solana_cli_config::CONFIG_FILE + .as_ref() + .ok_or_else(|| anyhow!("unable to get config file path"))?; + let cli_config: Config = Config::load(config_file)?; + + println!("RPC URL: {}", cli_config.json_rpc_url); + let connection = RpcClient::new(cli_config.json_rpc_url); + + let signer = solana_clap_utils::keypair::keypair_from_path( + &Default::default(), + &cli_config.keypair_path, + "keypair", + false, + ) + .map_err(|err| anyhow!("Unable to get signer from path: {}", err))?; + let signer_pubkey = signer.pubkey(); + + let program_id = Pubkey::from_str(OTTER_VERIFY_PROGRAMID).unwrap(); + + let seeds: &[&[u8]; 3] = &[ + b"otter_verify", + &signer_pubkey.to_bytes(), + &other_program_address.to_bytes(), + ]; + + let (pda_account, _) = Pubkey::find_program_address(seeds, &program_id); + + // TODO: Need to get Version from Cargo.toml + let input_params = InputParams { + version: "0.2.11".to_string(), + git_url, + commit: commit.clone().unwrap_or_default(), + args, + }; + + let ix_data = create_ix_data(&input_params, OtterVerifyInstructions::Initialize); + + let ix = solana_sdk::instruction::Instruction::new_with_bytes( + program_id, + &ix_data, + vec![ + AccountMeta::new(pda_account, false), + AccountMeta::new_readonly(signer_pubkey, true), + AccountMeta::new_readonly(other_program_address, false), + AccountMeta::new_readonly(system_program::ID, false), + ], + ); + let message = Message::new(&[ix], Some(&signer_pubkey)); + + let mut tx = Transaction::new_unsigned(message); + + tx.sign(&[&signer], connection.get_latest_blockhash()?); + + let tx_id = connection + .send_and_confirm_transaction_with_spinner(&tx) + .map_err(|err| { + println!("{:?}", err); + anyhow!("Failed to send transaction to the network.",) + })?; + println!("Program uploaded successfully. Transaction ID: {}", tx_id); + } else { + println!("Exiting without uploading the program."); + } + + Ok(()) +} From f0fbd9dad261ef9fd785b118c0fbf3941d14bb1b Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Sat, 11 May 2024 16:42:30 +0530 Subject: [PATCH 112/314] Rm print --- src/solana_program.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/solana_program.rs b/src/solana_program.rs index c61b678..eb31068 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -69,7 +69,6 @@ pub async fn upload_program( .ok_or_else(|| anyhow!("unable to get config file path"))?; let cli_config: Config = Config::load(config_file)?; - println!("RPC URL: {}", cli_config.json_rpc_url); let connection = RpcClient::new(cli_config.json_rpc_url); let signer = solana_clap_utils::keypair::keypair_from_path( From 6fbea5fea7127d9b56b4e86ddcbac8ce9f1cc890 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Mon, 13 May 2024 11:06:17 +0530 Subject: [PATCH 113/314] Fix version arg --- src/solana_program.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/solana_program.rs b/src/solana_program.rs index eb31068..13e7f2a 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -90,9 +90,8 @@ pub async fn upload_program( let (pda_account, _) = Pubkey::find_program_address(seeds, &program_id); - // TODO: Need to get Version from Cargo.toml let input_params = InputParams { - version: "0.2.11".to_string(), + version: env!("CARGO_PKG_VERSION").to_string(), git_url, commit: commit.clone().unwrap_or_default(), args, From 699d763cbeb661eafe851f63b6e89b5b1b883d7c Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Mon, 13 May 2024 11:15:00 +0530 Subject: [PATCH 114/314] Update variable names --- src/solana_program.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/solana_program.rs b/src/solana_program.rs index 13e7f2a..393a3fe 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -59,7 +59,7 @@ pub async fn upload_program( git_url: String, commit: &Option, args: Vec, - other_program_address: Pubkey, + program_address: Pubkey, ) -> anyhow::Result<()> { if true { println!("Uploading the program to the Solana blockchain..."); @@ -80,15 +80,15 @@ pub async fn upload_program( .map_err(|err| anyhow!("Unable to get signer from path: {}", err))?; let signer_pubkey = signer.pubkey(); - let program_id = Pubkey::from_str(OTTER_VERIFY_PROGRAMID).unwrap(); + let otter_verify_program_id = Pubkey::from_str(OTTER_VERIFY_PROGRAMID).unwrap(); let seeds: &[&[u8]; 3] = &[ b"otter_verify", &signer_pubkey.to_bytes(), - &other_program_address.to_bytes(), + &program_address.to_bytes(), ]; - let (pda_account, _) = Pubkey::find_program_address(seeds, &program_id); + let (pda_account, _) = Pubkey::find_program_address(seeds, &otter_verify_program_id); let input_params = InputParams { version: env!("CARGO_PKG_VERSION").to_string(), @@ -100,12 +100,12 @@ pub async fn upload_program( let ix_data = create_ix_data(&input_params, OtterVerifyInstructions::Initialize); let ix = solana_sdk::instruction::Instruction::new_with_bytes( - program_id, + otter_verify_program_id, &ix_data, vec![ AccountMeta::new(pda_account, false), AccountMeta::new_readonly(signer_pubkey, true), - AccountMeta::new_readonly(other_program_address, false), + AccountMeta::new_readonly(program_address, false), AccountMeta::new_readonly(system_program::ID, false), ], ); From ca1ce908d671ef701c4f0563b6d7b3d22c73752b Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Tue, 14 May 2024 23:45:54 +0530 Subject: [PATCH 115/314] Update add and update ixs --- src/main.rs | 40 ++++++---- src/solana_program.rs | 170 ++++++++++++++++++++++++++++-------------- 2 files changed, 143 insertions(+), 67 deletions(-) diff --git a/src/main.rs b/src/main.rs index a85122b..4df4f35 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,12 +13,19 @@ use solana_sdk::{ pubkey::Pubkey, }; use std::{ - io::Read, path::PathBuf, process::{exit, Stdio}, sync::{atomic::{AtomicBool, Ordering}, Arc} + io::Read, + path::PathBuf, + process::{exit, Stdio}, + str::FromStr, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, + }, }; use uuid::Uuid; pub mod api_client; -pub mod image_config; pub mod api_models; +pub mod image_config; pub mod solana_program; use image_config::IMAGE_MAP; @@ -311,12 +318,14 @@ pub fn get_genesis_hash(url: Option) -> anyhow::Result { Ok(genesis_hash.to_string()) } - pub fn get_docker_resource_limits() -> Option<(String, String)> { let memory = std::env::var("SVB_DOCKER_MEMORY_LIMIT").ok(); let cpus = std::env::var("SVB_DOCKER_CPU_LIMIT").ok(); if memory.is_some() || cpus.is_some() { - println!("Using docker resource limits: memory: {:?}, cpus: {:?}", memory, cpus); + println!( + "Using docker resource limits: memory: {:?}, cpus: {:?}", + memory, cpus + ); } else { // Print message to user that they can set these environment variables to limit docker resources println!("No Docker resource limits are set."); @@ -442,11 +451,14 @@ pub fn build( let mount_params = format!("{}:{}", mount_path, workdir); let container_id = { let mut cmd = std::process::Command::new("docker"); - cmd.args(["run", "--rm", "-v", &mount_params, "-dit"]); - cmd.stderr(Stdio::inherit()); + cmd.args(["run", "--rm", "-v", &mount_params, "-dit"]); + cmd.stderr(Stdio::inherit()); if let Some((memory_limit, cpu_limit)) = get_docker_resource_limits() { - cmd.arg("--memory").arg(memory_limit).arg("--cpus").arg(cpu_limit); + cmd.arg("--memory") + .arg(memory_limit) + .arg("--cpus") + .arg(cpu_limit); } let output = cmd @@ -554,14 +566,16 @@ pub fn verify_from_image( println!("Workdir: {}", workdir); - let container_id = { let mut cmd = std::process::Command::new("docker"); - cmd.args(["run", "--rm", "-dit"]); - cmd.stderr(Stdio::inherit()); + cmd.args(["run", "--rm", "-dit"]); + cmd.stderr(Stdio::inherit()); if let Some((memory_limit, cpu_limit)) = get_docker_resource_limits() { - cmd.arg("--memory").arg(memory_limit).arg("--cpus").arg(cpu_limit); + cmd.arg("--memory") + .arg(memory_limit) + .arg("--cpus") + .arg(cpu_limit); } let output = cmd @@ -730,7 +744,7 @@ pub async fn verify_from_repo( let library_name = match library_name_opt { Some(p) => p, - None => { + None => { std::process::Command::new("find") .args([mount_path.to_str().unwrap(), "-name", "Cargo.toml"]) .output() @@ -794,7 +808,7 @@ pub async fn verify_from_repo( if build_hash == program_hash { println!("Program hash matches ✅"); - // TODO : FIX Args Param + // TODO : FIX Args Param let x = upload_program(repo_url, &commit_hash.clone(), [].into(), program_id).await; if x.is_err() { println!("Error uploading program: {:?}", x); diff --git a/src/solana_program.rs b/src/solana_program.rs index 393a3fe..5f820bf 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -8,16 +8,16 @@ use std::{ use borsh::{to_vec, BorshDeserialize, BorshSerialize}; use solana_sdk::{ - instruction::AccountMeta, message::Message, pubkey::Pubkey, signer::Signer, system_program, - transaction::Transaction, + instruction::AccountMeta, message::Message, pubkey::Pubkey, signature::Keypair, signer::Signer, + system_program, transaction::Transaction, }; const OTTER_VERIFY_PROGRAMID: &str = "EngB3ANqXh8nDFhzZYJkCfpCHWCHkTrJTCWKEuSFCh7B"; +const OTTER_SIGNER: &str = "HUUEmwc1rjh748XF2MrYLNHS4zE2D56yT9pBAaj9ggWM"; -pub fn prompt_user_input() -> bool { +pub fn prompt_user_input(message: &str) -> bool { let mut buffer = [0; 1]; - print!("Do you want to update it to On-Chain Program ?. (Y/n) "); - // Read a single character from standard input + print!("{}", message); let _ = io::stdout().flush(); io::stdin() .read_exact(&mut buffer) @@ -48,6 +48,7 @@ impl OtterVerifyInstructions { } } } + fn create_ix_data(params: &InputParams, ix: OtterVerifyInstructions) -> Vec { let mut data = ix.get_discriminant(); // Discriminant for the instruction let params_data = to_vec(¶ms).expect("Unable to serialize params"); @@ -55,73 +56,134 @@ fn create_ix_data(params: &InputParams, ix: OtterVerifyInstructions) -> Vec data } +fn get_user_config() -> anyhow::Result<(Keypair, RpcClient)> { + let config_file = solana_cli_config::CONFIG_FILE + .as_ref() + .ok_or_else(|| anyhow!("unable to get config file path"))?; + let cli_config: Config = Config::load(config_file)?; + + let signer = solana_clap_utils::keypair::keypair_from_path( + &Default::default(), + &cli_config.keypair_path, + "keypair", + false, + ) + .map_err(|err| anyhow!("Unable to get signer from path: {}", err))?; + + let rpc_client = RpcClient::new(cli_config.json_rpc_url.clone()); + Ok((signer, rpc_client)) +} + +fn process_otter_verify_ixs( + params: &InputParams, + pda_account: Pubkey, + program_address: Pubkey, + instruction: OtterVerifyInstructions, +) -> anyhow::Result<()> { + let user_config = get_user_config()?; + let signer = user_config.0; + let signer_pubkey = signer.pubkey(); + let connection = user_config.1; + + let ix_data = create_ix_data(params, instruction); + let otter_verify_program_id = Pubkey::from_str(OTTER_VERIFY_PROGRAMID)?; + + let ix = solana_sdk::instruction::Instruction::new_with_bytes( + otter_verify_program_id, + &ix_data, + vec![ + AccountMeta::new(pda_account, false), + AccountMeta::new_readonly(signer_pubkey, true), + AccountMeta::new_readonly(program_address, false), + AccountMeta::new_readonly(system_program::ID, false), + ], + ); + let message = Message::new(&[ix], Some(&signer_pubkey)); + + let mut tx = Transaction::new_unsigned(message); + + tx.sign(&[&signer], connection.get_latest_blockhash()?); + + let tx_id = connection + .send_and_confirm_transaction_with_spinner(&tx) + .map_err(|err| { + println!("{:?}", err); + anyhow!("Failed to send transaction to the network.",) + })?; + println!("Program uploaded successfully. Transaction ID: {}", tx_id); + Ok(()) +} + pub async fn upload_program( git_url: String, commit: &Option, args: Vec, program_address: Pubkey, ) -> anyhow::Result<()> { - if true { + if prompt_user_input("Do you want to update it to On-Chain Program ?. (Y/n) ") { println!("Uploading the program to the Solana blockchain..."); - let config_file = solana_cli_config::CONFIG_FILE - .as_ref() - .ok_or_else(|| anyhow!("unable to get config file path"))?; - let cli_config: Config = Config::load(config_file)?; - - let connection = RpcClient::new(cli_config.json_rpc_url); + let input_params = InputParams { + version: env!("CARGO_PKG_VERSION").to_string(), + git_url, + commit: commit.clone().unwrap_or_default(), + args, + }; - let signer = solana_clap_utils::keypair::keypair_from_path( - &Default::default(), - &cli_config.keypair_path, - "keypair", - false, - ) - .map_err(|err| anyhow!("Unable to get signer from path: {}", err))?; - let signer_pubkey = signer.pubkey(); + let cli_config = get_user_config()?; + let signer_pubkey = cli_config.0.pubkey(); + let connection = cli_config.1; - let otter_verify_program_id = Pubkey::from_str(OTTER_VERIFY_PROGRAMID).unwrap(); + let otter_verify_program_id = Pubkey::from_str(OTTER_VERIFY_PROGRAMID)?; + // Possible PDA 1 signer is current signer then we can update the program let seeds: &[&[u8]; 3] = &[ b"otter_verify", &signer_pubkey.to_bytes(), &program_address.to_bytes(), ]; - let (pda_account, _) = Pubkey::find_program_address(seeds, &otter_verify_program_id); + let (pda_account_1, _) = Pubkey::find_program_address(seeds, &otter_verify_program_id); - let input_params = InputParams { - version: env!("CARGO_PKG_VERSION").to_string(), - git_url, - commit: commit.clone().unwrap_or_default(), - args, - }; - - let ix_data = create_ix_data(&input_params, OtterVerifyInstructions::Initialize); - - let ix = solana_sdk::instruction::Instruction::new_with_bytes( - otter_verify_program_id, - &ix_data, - vec![ - AccountMeta::new(pda_account, false), - AccountMeta::new_readonly(signer_pubkey, true), - AccountMeta::new_readonly(program_address, false), - AccountMeta::new_readonly(system_program::ID, false), - ], - ); - let message = Message::new(&[ix], Some(&signer_pubkey)); - - let mut tx = Transaction::new_unsigned(message); - - tx.sign(&[&signer], connection.get_latest_blockhash()?); - - let tx_id = connection - .send_and_confirm_transaction_with_spinner(&tx) - .map_err(|err| { - println!("{:?}", err); - anyhow!("Failed to send transaction to the network.",) - })?; - println!("Program uploaded successfully. Transaction ID: {}", tx_id); + // Possible PDA 2 signer is otter signer + let otter_signer = Pubkey::from_str(OTTER_SIGNER)?; + let seeds: &[&[u8]; 3] = &[ + b"otter_verify", + &otter_signer.to_bytes(), + &program_address.to_bytes(), + ]; + let (pda_account_2, _) = Pubkey::find_program_address(seeds, &otter_verify_program_id); + + if connection.get_account(&pda_account_1).is_ok() { + println!("Program already uploaded by the current signer. Updating the program."); + process_otter_verify_ixs( + &input_params, + pda_account_1, + program_address, + OtterVerifyInstructions::Update, + )?; + } else if connection.get_account(&pda_account_2).is_ok() { + let wanna_create_new_pda = prompt_user_input( + "Program already uploaded by another signer. Do you want to upload a new program? (Y/n)" + ); + if wanna_create_new_pda { + process_otter_verify_ixs( + &input_params, + pda_account_1, + program_address, + OtterVerifyInstructions::Initialize, + )?; + } + return Ok(()); + } else { + // Else Create new PDA and upload the program + process_otter_verify_ixs( + &input_params, + pda_account_1, + program_address, + OtterVerifyInstructions::Initialize, + )?; + } } else { println!("Exiting without uploading the program."); } From 1eefbac8ab132ff2da1ef33c02b86915d17571db Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Wed, 15 May 2024 16:03:24 +0530 Subject: [PATCH 116/314] Rm unused import --- src/main.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 4df4f35..7c3e27d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,7 +16,6 @@ use std::{ io::Read, path::PathBuf, process::{exit, Stdio}, - str::FromStr, sync::{ atomic::{AtomicBool, Ordering}, Arc, From 799aa06f73c6764d2a87e982097e7d32b9bc8667 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Thu, 16 May 2024 10:04:49 +0530 Subject: [PATCH 117/314] Fix cargo args --- src/main.rs | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/src/main.rs b/src/main.rs index 7c3e27d..7a26641 100644 --- a/src/main.rs +++ b/src/main.rs @@ -686,6 +686,8 @@ pub async fn verify_from_repo( .await?; return Ok(()); } + // Create a Vec to store solana-verify args + let mut args: Vec<&str> = Vec::new(); // Get source code from repo_url let base_name = std::process::Command::new("basename") @@ -737,10 +739,15 @@ pub async fn verify_from_repo( } } + if !relative_mount_path.is_empty() { + args.push("--mount-path"); + args.push(&relative_mount_path); + } // Get the absolute build path to the solana program directory to build inside docker - let mount_path = PathBuf::from(verify_tmp_root_path.clone()).join(relative_mount_path); + let mount_path = PathBuf::from(verify_tmp_root_path.clone()).join(&relative_mount_path); println!("Build path: {:?}", mount_path); + args.push("--library-name"); let library_name = match library_name_opt { Some(p) => p, None => { @@ -782,16 +789,33 @@ pub async fn verify_from_repo( })? } }; + args.push(&library_name); println!("Verifying program: {}", library_name); + if let Some(base_image) = &base_image { + args.push("--base-image"); + args.push(base_image); + } + + if bpf_flag { + args.push("--bpf"); + } + + if !cargo_args.is_empty() { + args.push("--"); + for arg in &cargo_args { + args.push(arg); + } + } + let result = build_and_verify_repo( mount_path.to_str().unwrap().to_string(), - base_image, + base_image.clone(), bpf_flag, - library_name, + library_name.clone(), connection_url, program_id, - cargo_args, + cargo_args.clone(), container_id_opt, ); @@ -807,8 +831,13 @@ pub async fn verify_from_repo( if build_hash == program_hash { println!("Program hash matches ✅"); - // TODO : FIX Args Param - let x = upload_program(repo_url, &commit_hash.clone(), [].into(), program_id).await; + let x = upload_program( + repo_url, + &commit_hash.clone(), + args.iter().map(|&s| s.into()).collect(), + program_id, + ) + .await; if x.is_err() { println!("Error uploading program: {:?}", x); exit(1); From 77e6f024861913bb85aec7713b59ad18da0acf59 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Thu, 16 May 2024 10:42:45 +0530 Subject: [PATCH 118/314] Added close ix --- src/main.rs | 11 +++++++- src/solana_program.rs | 64 +++++++++++++++++++++++++++++++++++++------ 2 files changed, 66 insertions(+), 9 deletions(-) diff --git a/src/main.rs b/src/main.rs index 7a26641..088550b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -28,7 +28,10 @@ pub mod image_config; pub mod solana_program; use image_config::IMAGE_MAP; -use crate::{api_client::send_job_to_remote, solana_program::upload_program}; +use crate::{ + api_client::send_job_to_remote, + solana_program::{process_close, upload_program}, +}; const MAINNET_GENESIS_HASH: &str = "5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d"; @@ -135,6 +138,11 @@ enum SubCommand { #[clap(required = false, last = true)] cargo_args: Vec, }, + Close { + /// Close the Otter Verify PDA + #[clap(long)] + program_id: Pubkey, + }, } #[tokio::main] @@ -229,6 +237,7 @@ async fn main() -> anyhow::Result<()> { ) .await } + SubCommand::Close { program_id } => process_close(program_id).await, }; if caught_signal.load(Ordering::Relaxed) || res.is_err() { diff --git a/src/solana_program.rs b/src/solana_program.rs index 5f820bf..ef5b24f 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -33,6 +33,7 @@ pub struct InputParams { pub args: Vec, } +#[derive(PartialEq)] pub enum OtterVerifyInstructions { Initialize, Update, @@ -49,7 +50,7 @@ impl OtterVerifyInstructions { } } -fn create_ix_data(params: &InputParams, ix: OtterVerifyInstructions) -> Vec { +fn create_ix_data(params: &InputParams, ix: &OtterVerifyInstructions) -> Vec { let mut data = ix.get_discriminant(); // Discriminant for the instruction let params_data = to_vec(¶ms).expect("Unable to serialize params"); data.extend_from_slice(¶ms_data); @@ -85,19 +86,29 @@ fn process_otter_verify_ixs( let signer_pubkey = signer.pubkey(); let connection = user_config.1; - let ix_data = create_ix_data(params, instruction); + let ix_data = if instruction != OtterVerifyInstructions::Close { + create_ix_data(params, &instruction) + } else { + instruction.get_discriminant() + }; let otter_verify_program_id = Pubkey::from_str(OTTER_VERIFY_PROGRAMID)?; + let mut accounts_meta_vec = vec![ + AccountMeta::new(pda_account, false), + AccountMeta::new_readonly(signer_pubkey, true), + AccountMeta::new_readonly(program_address, false), + ]; + + if instruction != OtterVerifyInstructions::Close { + accounts_meta_vec.push(AccountMeta::new_readonly(system_program::ID, false)); + } + let ix = solana_sdk::instruction::Instruction::new_with_bytes( otter_verify_program_id, &ix_data, - vec![ - AccountMeta::new(pda_account, false), - AccountMeta::new_readonly(signer_pubkey, true), - AccountMeta::new_readonly(program_address, false), - AccountMeta::new_readonly(system_program::ID, false), - ], + accounts_meta_vec, ); + println!("{:?}", ix); let message = Message::new(&[ix], Some(&signer_pubkey)); let mut tx = Transaction::new_unsigned(message); @@ -190,3 +201,40 @@ pub async fn upload_program( Ok(()) } + +pub async fn process_close(program_address: Pubkey) -> anyhow::Result<()> { + let user_config = get_user_config()?; + let signer = user_config.0; + let signer_pubkey = signer.pubkey(); + let connection = user_config.1; + + let otter_verify_program_id = Pubkey::from_str(OTTER_VERIFY_PROGRAMID)?; + + let seeds: &[&[u8]; 3] = &[ + b"otter_verify", + &signer_pubkey.to_bytes(), + &program_address.to_bytes(), + ]; + + let (pda_account, _) = Pubkey::find_program_address(seeds, &otter_verify_program_id); + + if connection.get_account(&pda_account).is_ok() { + process_otter_verify_ixs( + &InputParams { + version: "".to_string(), + git_url: "".to_string(), + commit: "".to_string(), + args: vec![], + }, + pda_account, + program_address, + OtterVerifyInstructions::Close, + )?; + } else { + return Err(anyhow!( + "Program account does not exist. Please provide the program address not PDA address." + )); + } + + Ok(()) +} From 405ad0886ae4d4918752c9b18604da44aa9caf12 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Tue, 21 May 2024 19:34:50 +0530 Subject: [PATCH 119/314] Update pubkeys --- src/solana_program.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/solana_program.rs b/src/solana_program.rs index ef5b24f..3512957 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -12,8 +12,8 @@ use solana_sdk::{ system_program, transaction::Transaction, }; -const OTTER_VERIFY_PROGRAMID: &str = "EngB3ANqXh8nDFhzZYJkCfpCHWCHkTrJTCWKEuSFCh7B"; -const OTTER_SIGNER: &str = "HUUEmwc1rjh748XF2MrYLNHS4zE2D56yT9pBAaj9ggWM"; +const OTTER_VERIFY_PROGRAMID: &str = "verifycLy8mB96wd9wqq3WDXQwM4oU6r42Th37Db9fC"; +const OTTER_SIGNER: &str = "9VWiUUhgNoRwTH5NVehYJEDwcotwYX3VgW4MChiHPAqU"; pub fn prompt_user_input(message: &str) -> bool { let mut buffer = [0; 1]; From cc651492786b02ba0ad2a95f2ae48e864f3717cd Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Wed, 22 May 2024 13:46:39 +0530 Subject: [PATCH 120/314] Rm unwanted prints --- src/main.rs | 2 -- src/solana_program.rs | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 088550b..b8e541b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -850,8 +850,6 @@ pub async fn verify_from_repo( if x.is_err() { println!("Error uploading program: {:?}", x); exit(1); - } else { - println!("Program uploaded successfully"); } } else { println!("Program hashes do not match ❌"); diff --git a/src/solana_program.rs b/src/solana_program.rs index 3512957..8969775 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -108,7 +108,6 @@ fn process_otter_verify_ixs( &ix_data, accounts_meta_vec, ); - println!("{:?}", ix); let message = Message::new(&[ix], Some(&signer_pubkey)); let mut tx = Transaction::new_unsigned(message); @@ -119,7 +118,7 @@ fn process_otter_verify_ixs( .send_and_confirm_transaction_with_spinner(&tx) .map_err(|err| { println!("{:?}", err); - anyhow!("Failed to send transaction to the network.",) + anyhow!("Failed to send transaction to the network.") })?; println!("Program uploaded successfully. Transaction ID: {}", tx_id); Ok(()) From 81684c37a485e4b8a30139dbef4c6e4d74171c58 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Mon, 27 May 2024 15:44:56 +0530 Subject: [PATCH 121/314] Update comments --- src/solana_program.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/solana_program.rs b/src/solana_program.rs index 8969775..86a9f14 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -131,7 +131,7 @@ pub async fn upload_program( program_address: Pubkey, ) -> anyhow::Result<()> { if prompt_user_input("Do you want to update it to On-Chain Program ?. (Y/n) ") { - println!("Uploading the program to the Solana blockchain..."); + println!("Uploading the program verification params to the Solana blockchain..."); let input_params = InputParams { version: env!("CARGO_PKG_VERSION").to_string(), @@ -146,7 +146,7 @@ pub async fn upload_program( let otter_verify_program_id = Pubkey::from_str(OTTER_VERIFY_PROGRAMID)?; - // Possible PDA 1 signer is current signer then we can update the program + // Possible PDA-1: Signer is current signer then we can update the program let seeds: &[&[u8]; 3] = &[ b"otter_verify", &signer_pubkey.to_bytes(), @@ -155,7 +155,7 @@ pub async fn upload_program( let (pda_account_1, _) = Pubkey::find_program_address(seeds, &otter_verify_program_id); - // Possible PDA 2 signer is otter signer + // Possible PDA-2: signer is otter signer let otter_signer = Pubkey::from_str(OTTER_SIGNER)?; let seeds: &[&[u8]; 3] = &[ b"otter_verify", From 9cd526fc877045d514f3a40b06eb29ad666ae526 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Tue, 28 May 2024 11:31:59 +0530 Subject: [PATCH 122/314] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4d0696d..86f6487 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3619,7 +3619,7 @@ dependencies = [ [[package]] name = "solana-verify" -version = "0.2.11" +version = "0.2.12" dependencies = [ "anyhow", "borsh 1.5.0", diff --git a/Cargo.toml b/Cargo.toml index ca2e03a..33bd56a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "solana-verify" -version = "0.2.11" +version = "0.2.12" edition = "2021" description = "A CLI tool for building verifiable Solana programs" license = "MIT" From acc7e1c791dccdde5bea879fbba40308949725c4 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Thu, 26 Sep 2024 23:05:22 +0530 Subject: [PATCH 123/314] Trim / at end to fix paths --- src/main.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index b8e541b..c493ee0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -351,13 +351,14 @@ pub fn build( cargo_args: Vec, container_id_opt: &mut Option, ) -> anyhow::Result<()> { - let mount_path = mount_directory.unwrap_or( + let mut mount_path = mount_directory.unwrap_or( std::env::current_dir()? .as_os_str() .to_str() .ok_or_else(|| anyhow::Error::msg("Invalid path string"))? .to_string(), ); + mount_path = mount_path.trim_end_matches('/').to_string(); println!("Mounting path: {}", mount_path); let lockfile = format!("{}/Cargo.lock", mount_path); From 8fcef838ca9b10f83007b97a8d99823544db9563 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Thu, 26 Sep 2024 23:08:27 +0530 Subject: [PATCH 124/314] Fix verification status message --- src/api_client.rs | 47 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/src/api_client.rs b/src/api_client.rs index b298c85..fed6b8d 100644 --- a/src/api_client.rs +++ b/src/api_client.rs @@ -47,6 +47,31 @@ fn loading_animation(receiver: Receiver) { } } +fn print_verification_status( + program_id: &str, + status: bool, + status_response: &JobVerificationResponse, +) { + let status_message = if status { + format!("Program {} has been verified. ✅", program_id) + } else { + format!("Program {} has not been verified. ❌", program_id) + }; + let message = if status { + "The provided GitHub build matches the on-chain hash." + } else { + "The provided GitHub build does not match the on-chain hash." + }; + println!("{}", status_message); + println!("{}", message); + println!("On Chain Hash: {}", status_response.on_chain_hash.as_str()); + println!( + "Executable Hash: {}", + status_response.executable_hash.as_str() + ); + println!("Repo URL: {}", status_response.repo_url.as_str()); +} + // Send a job to the remote server #[allow(clippy::too_many_arguments)] pub async fn send_job_to_remote( @@ -103,14 +128,20 @@ pub async fn send_job_to_remote( let _ = sender.send(true); handle.join().unwrap(); let status_response = status.respose.unwrap(); - println!("Program {} has been successfully verified. ✅", program_id); - println!("\nThe provided GitHub build matches the on-chain hash:"); - println!("On Chain Hash: {}", status_response.on_chain_hash.as_str()); - println!( - "Executable Hash: {}", - status_response.executable_hash.as_str() - ); - println!("Repo URL: {}", status_response.repo_url.as_str()); + + if status_response.executable_hash == status_response.on_chain_hash { + print_verification_status( + program_id.to_string().as_str(), + true, + &status_response, + ); + } else { + print_verification_status( + program_id.to_string().as_str(), + false, + &status_response, + ); + } break; } JobStatus::Failed => { From 5804dcf4b0df347bc2ad6822a5f76e9a2d45bc93 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Fri, 27 Sep 2024 14:22:06 +0530 Subject: [PATCH 125/314] Update: send last_deployed_slot to otter_verify program --- src/{api_client.rs => api/client.rs} | 2 +- src/api/mod.rs | 6 ++ src/{api_models.rs => api/models.rs} | 0 src/api/solana.rs | 120 +++++++++++++++++++++++++++ src/main.rs | 5 +- src/solana_program.rs | 21 ++++- 6 files changed, 146 insertions(+), 8 deletions(-) rename src/{api_client.rs => api/client.rs} (99%) create mode 100644 src/api/mod.rs rename src/{api_models.rs => api/models.rs} (100%) create mode 100644 src/api/solana.rs diff --git a/src/api_client.rs b/src/api/client.rs similarity index 99% rename from src/api_client.rs rename to src/api/client.rs index fed6b8d..59a7859 100644 --- a/src/api_client.rs +++ b/src/api/client.rs @@ -7,7 +7,7 @@ use solana_sdk::pubkey::Pubkey; use std::thread; use std::time::{Duration, Instant}; -use crate::api_models::{ +use crate::api::models::{ ErrorResponse, JobResponse, JobStatus, JobVerificationResponse, VerifyResponse, }; diff --git a/src/api/mod.rs b/src/api/mod.rs new file mode 100644 index 0000000..f8c489b --- /dev/null +++ b/src/api/mod.rs @@ -0,0 +1,6 @@ +mod client; +mod solana; +mod models; + +pub use client::send_job_to_remote; +pub use solana::get_last_deployed_slot; \ No newline at end of file diff --git a/src/api_models.rs b/src/api/models.rs similarity index 100% rename from src/api_models.rs rename to src/api/models.rs diff --git a/src/api/solana.rs b/src/api/solana.rs new file mode 100644 index 0000000..7863309 --- /dev/null +++ b/src/api/solana.rs @@ -0,0 +1,120 @@ +#![allow(dead_code)] + +use reqwest::Client; +use serde::Deserialize; +use std::error::Error; + +#[derive(Deserialize)] +struct RpcResponse { + result: Option, + id: u64, +} + +#[derive(Deserialize)] +struct AccountInfoResponse { + context: Context, + value: Option, +} + +#[derive(Deserialize)] +struct Context { + slot: u64, +} + +#[derive(Deserialize)] +struct AccountValue { + data: AccountData, + executable: bool, + lamports: u64, + owner: String, + #[serde(rename = "rentEpoch")] + rent_epoch: u64, + space: u64, +} + +#[derive(Deserialize)] +struct AccountData { + parsed: ParsedData, + program: String, + space: u64, +} + +#[derive(Deserialize)] +struct ParsedData { + info: ProgramInfo, + #[serde(rename = "type")] + data_type: String, +} + +#[derive(Deserialize)] +struct ProgramInfo { + #[serde(rename = "programData")] + program_data: Option, + data: Option>, + slot: Option, +} + +async fn get_account_info(client: &Client, rpc_url: &str, address: &str) -> anyhow::Result { + let body = serde_json::json!({ + "jsonrpc": "2.0", + "id": 1, + "method": "getAccountInfo", + "params": [ + address, + { + "encoding": "jsonParsed" + } + ] + }); + + + let response = client + .post(rpc_url) + .json(&body) + .send() + .await?; + + let response: RpcResponse = response.json().await?; + if let Some(value) = response.result { + return value.value.ok_or_else(|| anyhow::anyhow!("No value found in account info response")); + } + anyhow::bail!("No result found in account info response"); +} + +pub async fn get_last_deployed_slot(rpc_url: &str, program_address: &str) -> Result> { + let client = Client::new(); + + // Step 1: Get account info for the program address + let account_info = get_account_info(&client, rpc_url, program_address).await?; + let program_data_address = account_info + .data + .parsed + .info + .program_data + .ok_or("No programData found in program account response")?; + + // Step 2: Get account info for the program data address + let program_data_info = get_account_info(&client, rpc_url, &program_data_address).await?; + let last_deployed_slot = program_data_info + .data + .parsed + .info + .slot + .ok_or("No slot found in program data account response")?; + + Ok(last_deployed_slot) +} + + +#[cfg(test)] +mod tests { + use super::*; + + #[tokio::test] + async fn test_get_last_deployed_slot() { + let rpc_url = "https://docs-demo.solana-mainnet.quiknode.pro"; + let program_address = "verifycLy8mB96wd9wqq3WDXQwM4oU6r42Th37Db9fC"; + let last_deployed_slot = get_last_deployed_slot(rpc_url, program_address).await; + println!("Last deployed slot: {:?}", last_deployed_slot); + } +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index c493ee0..d99b891 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,14 +22,13 @@ use std::{ }, }; use uuid::Uuid; -pub mod api_client; -pub mod api_models; +pub mod api; pub mod image_config; pub mod solana_program; use image_config::IMAGE_MAP; use crate::{ - api_client::send_job_to_remote, + api::send_job_to_remote, solana_program::{process_close, upload_program}, }; diff --git a/src/solana_program.rs b/src/solana_program.rs index 86a9f14..38e9f47 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -12,6 +12,8 @@ use solana_sdk::{ system_program, transaction::Transaction, }; +use crate::api::get_last_deployed_slot; + const OTTER_VERIFY_PROGRAMID: &str = "verifycLy8mB96wd9wqq3WDXQwM4oU6r42Th37Db9fC"; const OTTER_SIGNER: &str = "9VWiUUhgNoRwTH5NVehYJEDwcotwYX3VgW4MChiHPAqU"; @@ -31,6 +33,7 @@ pub struct InputParams { pub git_url: String, pub commit: String, pub args: Vec, + pub deployed_slot: u64, } #[derive(PartialEq)] @@ -132,18 +135,23 @@ pub async fn upload_program( ) -> anyhow::Result<()> { if prompt_user_input("Do you want to update it to On-Chain Program ?. (Y/n) ") { println!("Uploading the program verification params to the Solana blockchain..."); + + let cli_config = get_user_config()?; + let signer_pubkey = cli_config.0.pubkey(); + let connection = cli_config.1; + let rpc_url = connection.url(); + + let last_deployed_slot = get_last_deployed_slot(&rpc_url, &program_address.to_string()).await + .map_err(|err| anyhow!("Unable to get last deployed slot: {}", err))?; let input_params = InputParams { version: env!("CARGO_PKG_VERSION").to_string(), git_url, commit: commit.clone().unwrap_or_default(), args, + deployed_slot: last_deployed_slot, }; - let cli_config = get_user_config()?; - let signer_pubkey = cli_config.0.pubkey(); - let connection = cli_config.1; - let otter_verify_program_id = Pubkey::from_str(OTTER_VERIFY_PROGRAMID)?; // Possible PDA-1: Signer is current signer then we can update the program @@ -206,6 +214,10 @@ pub async fn process_close(program_address: Pubkey) -> anyhow::Result<()> { let signer = user_config.0; let signer_pubkey = signer.pubkey(); let connection = user_config.1; + let rpc_url = connection.url(); + + let last_deployed_slot = get_last_deployed_slot(&rpc_url, &program_address.to_string()).await + .map_err(|err| anyhow!("Unable to get last deployed slot: {}", err))?; let otter_verify_program_id = Pubkey::from_str(OTTER_VERIFY_PROGRAMID)?; @@ -224,6 +236,7 @@ pub async fn process_close(program_address: Pubkey) -> anyhow::Result<()> { git_url: "".to_string(), commit: "".to_string(), args: vec![], + deployed_slot: last_deployed_slot, }, pda_account, program_address, From b3e00ec84e145def1a80e6efccc571f5af7acc86 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Tue, 1 Oct 2024 00:41:11 +0530 Subject: [PATCH 126/314] update test with assert --- src/api/solana.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/solana.rs b/src/api/solana.rs index 7863309..537a5c4 100644 --- a/src/api/solana.rs +++ b/src/api/solana.rs @@ -115,6 +115,6 @@ mod tests { let rpc_url = "https://docs-demo.solana-mainnet.quiknode.pro"; let program_address = "verifycLy8mB96wd9wqq3WDXQwM4oU6r42Th37Db9fC"; let last_deployed_slot = get_last_deployed_slot(rpc_url, program_address).await; - println!("Last deployed slot: {:?}", last_deployed_slot); + assert!(last_deployed_slot.is_ok()); } } \ No newline at end of file From a5aadcc528e7665b188d8a5e1c772988227b5cb3 Mon Sep 17 00:00:00 2001 From: ASCorreia <36857753+ASCorreia@users.noreply.github.com> Date: Fri, 4 Oct 2024 00:32:35 +0100 Subject: [PATCH 127/314] updating dependencies --- Cargo.lock | 2339 ++++++++++++++++++++++++++++++++++------------------ Cargo.toml | 32 +- 2 files changed, 1534 insertions(+), 837 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 86f6487..9c80471 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -43,7 +43,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" dependencies = [ "cfg-if", - "cipher 0.3.0", + "cipher", "cpufeatures", "opaque-debug", ] @@ -56,7 +56,7 @@ checksum = "589c637f0e68c877bbd59a4599bbe849cac8e5f3e4b5a3ebae8f528cd218dcdc" dependencies = [ "aead", "aes", - "cipher 0.3.0", + "cipher", "ctr", "polyval", "subtle", @@ -69,11 +69,24 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom 0.2.8", + "getrandom 0.2.15", "once_cell", "version_check", ] +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom 0.2.15", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "0.7.20" @@ -98,6 +111,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -116,23 +135,195 @@ dependencies = [ "winapi", ] +[[package]] +name = "anstream" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" + +[[package]] +name = "anstyle-parse" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + [[package]] name = "anyhow" -version = "1.0.68" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest 0.10.7", + "itertools", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.107", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.107", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.107", +] + +[[package]] +name = "ark-std" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] [[package]] name = "arrayref" -version = "0.3.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" -version = "0.7.2" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" [[package]] name = "asn1-rs" @@ -147,7 +338,7 @@ dependencies = [ "num-traits", "rusticata-macros", "thiserror", - "time 0.3.17", + "time", ] [[package]] @@ -156,8 +347,8 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", + "proc-macro2", + "quote", "syn 1.0.107", "synstructure", ] @@ -168,8 +359,8 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", + "proc-macro2", + "quote", "syn 1.0.107", ] @@ -179,6 +370,17 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + [[package]] name = "async-compression" version = "0.4.0" @@ -204,13 +406,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.63" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff18d764974428cf3a9328e23fc5c986f5fbed46e6cd4cdf42544df5d297ec1" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", - "syn 1.0.107", + "proc-macro2", + "quote", + "syn 2.0.79", ] [[package]] @@ -259,9 +461,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.0" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64ct" @@ -284,6 +486,15 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] + [[package]] name = "bitmaps" version = "2.1.0" @@ -295,16 +506,16 @@ dependencies = [ [[package]] name = "blake3" -version = "1.3.3" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ae2468a89544a466886840aa467a25b766499f4f04bf7d9fcd10ecee9fccef" +checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if", "constant_time_eq", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -319,9 +530,9 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] @@ -342,6 +553,16 @@ dependencies = [ "hashbrown 0.11.2", ] +[[package]] +name = "borsh" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115e54d64eb62cdebad391c19efc9dce4981c690c85a33a12199d99bb9546fee" +dependencies = [ + "borsh-derive 0.10.4", + "hashbrown 0.13.2", +] + [[package]] name = "borsh" version = "1.5.0" @@ -358,10 +579,23 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" dependencies = [ - "borsh-derive-internal", - "borsh-schema-derive-internal", + "borsh-derive-internal 0.9.3", + "borsh-schema-derive-internal 0.9.3", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.107", +] + +[[package]] +name = "borsh-derive" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831213f80d9423998dd696e2c5345aba6be7a0bd8cd19e31c5243e13df1cef89" +dependencies = [ + "borsh-derive-internal 0.10.4", + "borsh-schema-derive-internal 0.10.4", "proc-macro-crate 0.1.5", - "proc-macro2 1.0.66", + "proc-macro2", "syn 1.0.107", ] @@ -373,9 +607,9 @@ checksum = "d7a8646f94ab393e43e8b35a2558b1624bed28b97ee09c5d15456e3c9463f46d" dependencies = [ "once_cell", "proc-macro-crate 3.1.0", - "proc-macro2 1.0.66", - "quote 1.0.32", - "syn 2.0.32", + "proc-macro2", + "quote", + "syn 2.0.79", "syn_derive", ] @@ -385,8 +619,19 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", + "proc-macro2", + "quote", + "syn 1.0.107", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65d6ba50644c98714aa2a70d13d7df3cd75cd2b523a2b452bf010443800976b3" +dependencies = [ + "proc-macro2", + "quote", "syn 1.0.107", ] @@ -396,8 +641,19 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", + "proc-macro2", + "quote", + "syn 1.0.107", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276691d96f063427be83e6692b86148e488ebba9f48f77788724ca027ba3b6d4" +dependencies = [ + "proc-macro2", + "quote", "syn 1.0.107", ] @@ -446,9 +702,9 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.13.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c041d3eab048880cb0b86b256447da3f18859a163c3b8d8893f4e6368abe6393" +checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" dependencies = [ "bytemuck_derive", ] @@ -459,22 +715,22 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aca418a974d83d40a0c1f0c5cba6ff4bc28d8df099109ca459a2118d40b6322" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", + "proc-macro2", + "quote", "syn 1.0.107", ] [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.3.0" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" [[package]] name = "caps" @@ -510,11 +766,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.78" +version = "1.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" +checksum = "812acba72f0a070b003d3697490d2b55b837230ae7c6c6497f05cc2ddbb8d938" dependencies = [ "jobserver", + "libc", + "shlex", ] [[package]] @@ -531,18 +789,17 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "chrono" -version = "0.4.23" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ + "android-tzdata", "iana-time-zone", "js-sys", - "num-integer", "num-traits", "serde", - "time 0.1.45", "wasm-bindgen", - "winapi", + "windows-targets 0.52.0", ] [[package]] @@ -554,16 +811,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "cipher" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1873270f8f7942c191139cb8a40fd228da6c3fd2fc376d7e92d47aa14aeb59e" -dependencies = [ - "crypto-common", - "inout", -] - [[package]] name = "clap" version = "2.34.0" @@ -572,7 +819,7 @@ checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" dependencies = [ "ansi_term", "atty", - "bitflags", + "bitflags 1.3.2", "strsim 0.8.0", "textwrap 0.11.0", "unicode-width", @@ -586,7 +833,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5" dependencies = [ "atty", - "bitflags", + "bitflags 1.3.2", "clap_lex 0.2.4", "indexmap 1.9.2", "once_cell", @@ -597,30 +844,36 @@ dependencies = [ [[package]] name = "clap" -version = "4.1.4" +version = "4.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f13b9c79b5d1dd500d20ef541215a6423c75829ef43117e1b4d17fd8af0b5d76" +checksum = "7be5744db7978a28d9df86a214130d106a89ce49644cbc4e3f0c22c3fba30615" dependencies = [ - "bitflags", + "clap_builder", "clap_derive", - "clap_lex 0.3.1", - "is-terminal", - "once_cell", - "strsim 0.10.0", - "termcolor", +] + +[[package]] +name = "clap_builder" +version = "4.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5fbc17d3ef8278f55b282b2a2e75ae6f6c7d4bb70ed3d0382375104bfafdb4b" +dependencies = [ + "anstream", + "anstyle", + "clap_lex 0.7.2", + "strsim 0.11.1", ] [[package]] name = "clap_derive" -version = "4.1.0" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "684a277d672e91966334af371f1a7b5833f9aa00b07c84e92fbce95e00208ce8" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck", - "proc-macro-error", - "proc-macro2 1.0.66", - "quote 1.0.32", - "syn 1.0.107", + "proc-macro2", + "quote", + "syn 2.0.79", ] [[package]] @@ -634,12 +887,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.3.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "783fe232adfca04f90f56201b26d79682d4cd2625e0bc7290b95123afe558ade" -dependencies = [ - "os_str_bytes", -] +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "codespan-reporting" @@ -651,6 +901,34 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "colorchoice" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" + +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "console" version = "0.15.8" @@ -676,9 +954,9 @@ dependencies = [ [[package]] name = "console_log" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501a375961cef1a0d44767200e66e4a559283097e91d0730b1d75dfb2f8a1494" +checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" dependencies = [ "log", "web-sys", @@ -692,9 +970,9 @@ checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" [[package]] name = "constant_time_eq" -version = "0.2.4" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3ad85c1f65dc7b37604eb0e89748faf0b9653065f2a8ef69f96a687ec1e9279" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" [[package]] name = "core-foundation" @@ -801,7 +1079,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" dependencies = [ - "cipher 0.3.0", + "cipher", ] [[package]] @@ -839,8 +1117,8 @@ dependencies = [ "cc", "codespan-reporting", "once_cell", - "proc-macro2 1.0.66", - "quote 1.0.32", + "proc-macro2", + "quote", "scratch", "syn 1.0.107", ] @@ -857,11 +1135,59 @@ version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357f40d1f06a24b60ae1fe122542c1fb05d28d32acb2aed064e84bc2ad1e252e" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", + "proc-macro2", + "quote", "syn 1.0.107", ] +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.79", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "data-encoding" version = "2.3.3" @@ -886,7 +1212,7 @@ dependencies = [ "asn1-rs", "displaydoc", "nom", - "num-bigint 0.4.3", + "num-bigint 0.4.6", "num-traits", "rusticata-macros", ] @@ -897,11 +1223,22 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.107", +] + [[package]] name = "dialoguer" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af3c796f3b0b408d9fd581611b47fa850821fcb84aa640b83a3c1a5be2d691f2" +checksum = "59c6f2989294b9a498d3ad5491a79c6deb604617378e1cdc4bfc1c1361fe2f87" dependencies = [ "console", "shell-words", @@ -920,11 +1257,11 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.3", + "block-buffer 0.10.4", "crypto-common", "subtle", ] @@ -956,32 +1293,32 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bf95dc3f046b9da4f2d51833c0d3547d8564ef6910f5c1ed130306a75b92886" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", + "proc-macro2", + "quote", "syn 1.0.107", ] [[package]] -name = "dlopen" -version = "0.1.8" +name = "dlopen2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e80ad39f814a9abe68583cd50a2d45c8a67561c3361ab8da240587dda80937" +checksum = "09b4f5f101177ff01b8ec4ecc81eead416a8aa42819a2869311b3420fa114ffa" dependencies = [ - "dlopen_derive", - "lazy_static", + "dlopen2_derive", "libc", + "once_cell", "winapi", ] [[package]] -name = "dlopen_derive" -version = "0.1.4" +name = "dlopen2_derive" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f236d9e1b1fbd81cea0f9cbdc8dcc7e8ebcd80e6659cd7cb2ad5f6c05946c581" +checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" dependencies = [ - "libc", - "quote 0.6.13", - "syn 0.15.44", + "proc-macro2", + "quote", + "syn 2.0.79", ] [[package]] @@ -1022,14 +1359,14 @@ dependencies = [ "derivation-path", "ed25519-dalek", "hmac 0.12.1", - "sha2 0.10.6", + "sha2 0.10.8", ] [[package]] name = "either" -version = "1.8.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "encode_unicode" @@ -1048,34 +1385,22 @@ dependencies = [ [[package]] name = "enum-iterator" -version = "0.8.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2953d1df47ac0eb70086ccabf0275aa8da8591a28bd358ee2b52bd9f9e3ff9e9" +checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" dependencies = [ "enum-iterator-derive", ] [[package]] name = "enum-iterator-derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8958699f9359f0b04e691a13850d48b7de329138023876d07cbd024c2c820598" -dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", - "syn 1.0.107", -] - -[[package]] -name = "enum_dispatch" -version = "0.3.11" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f36e95862220b211a6e2aa5eca09b4fa391b13cd52ceb8035a24bf65a79de2" +checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" dependencies = [ - "once_cell", - "proc-macro2 1.0.66", - "quote 1.0.32", - "syn 1.0.107", + "proc-macro2", + "quote", + "syn 2.0.79", ] [[package]] @@ -1097,27 +1422,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" -[[package]] -name = "errno" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" -dependencies = [ - "errno-dragonfly", - "libc", - "winapi", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "event-listener" version = "2.5.3" @@ -1172,18 +1476,18 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] [[package]] name = "futures" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -1196,9 +1500,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -1206,15 +1510,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -1223,38 +1527,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-macro" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", - "syn 1.0.107", + "proc-macro2", + "quote", + "syn 2.0.79", ] [[package]] name = "futures-sink" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -1268,20 +1572,11 @@ dependencies = [ "slab", ] -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - [[package]] name = "generic-array" -version = "0.14.6" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "serde", "typenum", @@ -1313,9 +1608,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", @@ -1330,6 +1625,17 @@ version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +[[package]] +name = "goblin" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7666983ed0dd8d21a6f6576ee00053ca0926fb281a5522577a4dbd0f1b54143" +dependencies = [ + "log", + "plain", + "scroll", +] + [[package]] name = "h2" version = "0.3.15" @@ -1349,13 +1655,22 @@ dependencies = [ "tracing", ] +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + [[package]] name = "hashbrown" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" dependencies = [ - "ahash", + "ahash 0.7.6", ] [[package]] @@ -1363,8 +1678,14 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash", + "ahash 0.8.11", ] [[package]] @@ -1375,9 +1696,9 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "heck" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" @@ -1390,18 +1711,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - -[[package]] -name = "hex" -version = "0.3.2" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -1431,7 +1743,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -1502,7 +1814,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.4.9", "tokio", "tower-service", "tracing", @@ -1517,9 +1829,9 @@ checksum = "0646026eb1b3eea4cd9ba47912ea5ce9cc07713d105b1a14698f4e6433d348b7" dependencies = [ "http", "hyper", - "rustls 0.21.2", + "rustls", "tokio", - "tokio-rustls 0.24.1", + "tokio-rustls", ] [[package]] @@ -1559,11 +1871,17 @@ dependencies = [ "cxx-build", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" -version = "0.3.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -1605,18 +1923,6 @@ dependencies = [ "hashbrown 0.14.5", ] -[[package]] -name = "indicatif" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d207dc617c7a380ab07ff572a6e52fa202a2a8f355860ac9c38e23f8196be1b" -dependencies = [ - "console", - "lazy_static", - "number_prefix", - "regex", -] - [[package]] name = "indicatif" version = "0.17.7" @@ -1630,15 +1936,6 @@ dependencies = [ "unicode-width", ] -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array", -] - [[package]] name = "instant" version = "0.1.12" @@ -1648,16 +1945,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "io-lifetimes" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d6c6f8c91b4b9ed43484ad1a938e393caf35960fce7f82a040497207bd8e9e" -dependencies = [ - "libc", - "windows-sys 0.42.0", -] - [[package]] name = "ipnet" version = "2.7.1" @@ -1665,16 +1952,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146" [[package]] -name = "is-terminal" -version = "0.4.2" +name = "is_terminal_polyfill" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dfb6c8100ccc63462345b67d1bbc3679177c75ee4bf59bf29c8b1d110b8189" -dependencies = [ - "hermit-abi 0.2.6", - "io-lifetimes", - "rustix", - "windows-sys 0.42.0", -] +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itertools" @@ -1693,18 +1974,18 @@ checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" [[package]] name = "jobserver" -version = "0.1.25" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.60" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] @@ -1741,19 +2022,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.147" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" - -[[package]] -name = "libloading" -version = "0.7.4" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if", - "winapi", -] +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libsecp256k1" @@ -1803,6 +2074,18 @@ dependencies = [ "libsecp256k1-core", ] +[[package]] +name = "light-poseidon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" +dependencies = [ + "ark-bn254", + "ark-ff", + "num-bigint 0.4.6", + "thiserror", +] + [[package]] name = "link-cplusplus" version = "1.0.8" @@ -1812,23 +2095,11 @@ dependencies = [ "cc", ] -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - -[[package]] -name = "linux-raw-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" - [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -1836,12 +2107,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "memchr" @@ -1851,27 +2119,27 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memmap2" -version = "0.5.8" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b182332558b18d807c4ce1ca8ca983b34c3ee32765e47b3f0f69b90355cc1dc" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" dependencies = [ "libc", ] [[package]] name = "memoffset" -version = "0.6.5" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" dependencies = [ "autocfg", ] [[package]] name = "memoffset" -version = "0.7.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] @@ -1949,14 +2217,15 @@ dependencies = [ [[package]] name = "nix" -version = "0.24.3" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "libc", - "memoffset 0.6.5", + "memoffset 0.7.1", + "pin-utils", ] [[package]] @@ -2005,11 +2274,10 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -2030,18 +2298,28 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", + "proc-macro2", + "quote", "syn 1.0.107", ] +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] @@ -2070,42 +2348,63 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi 0.3.9", "libc", ] [[package]] name = "num_enum" -version = "0.5.9" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive 0.6.1", +] + +[[package]] +name = "num_enum" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d829733185c1ca374f17e52b762f24f535ec625d2cc1f070e34c8a9068f341b" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ - "num_enum_derive", + "num_enum_derive 0.7.3", ] [[package]] name = "num_enum_derive" -version = "0.5.9" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2be1598bf1c313dcdd12092e3f1920f463462525a21b7b4e11b4168353d0123e" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" dependencies = [ "proc-macro-crate 1.3.0", - "proc-macro2 1.0.66", - "quote 1.0.32", - "syn 1.0.107", + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.79", ] [[package]] @@ -2150,7 +2449,7 @@ version = "0.10.55" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "foreign-types", "libc", @@ -2165,8 +2464,8 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", + "proc-macro2", + "quote", "syn 1.0.107", ] @@ -2206,17 +2505,23 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.6" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1ef8814b5c993410bb3adfad7a5ed269563e4a2f90c41f5d85be7fb47133bf" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.7", "smallvec", - "windows-sys 0.42.0", + "windows-targets 0.52.0", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "pathdiff" version = "0.2.1" @@ -2238,7 +2543,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -2252,9 +2557,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "percentage" @@ -2267,9 +2572,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -2294,6 +2599,12 @@ version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + [[package]] name = "polyval" version = "0.5.3" @@ -2353,9 +2664,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.66", - "quote 1.0.32", - "syn 1.0.107", + "proc-macro2", + "quote", "version_check", ] @@ -2365,25 +2675,16 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", + "proc-macro2", + "quote", "version_check", ] [[package]] name = "proc-macro2" -version = "0.4.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -dependencies = [ - "unicode-xid 0.1.0", -] - -[[package]] -name = "proc-macro2" -version = "1.0.66" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -2397,75 +2698,72 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "qualifier_attr" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + [[package]] name = "quinn" -version = "0.8.5" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b435e71d9bfa0d8889927231970c51fb89c58fa63bffcab117c9c7a41e5ef8f" +checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75" dependencies = [ "bytes", - "futures-channel", - "futures-util", - "fxhash", + "pin-project-lite", "quinn-proto", "quinn-udp", - "rustls 0.20.8", + "rustc-hash", + "rustls", "thiserror", "tokio", "tracing", - "webpki", ] [[package]] name = "quinn-proto" -version = "0.8.4" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fce546b9688f767a57530652488420d419a8b1f44a478b451c3d1ab6d992a55" +checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a" dependencies = [ "bytes", - "fxhash", "rand 0.8.5", - "ring", - "rustls 0.20.8", + "ring 0.16.20", + "rustc-hash", + "rustls", "rustls-native-certs", - "rustls-pemfile 0.2.1", "slab", "thiserror", "tinyvec", "tracing", - "webpki", ] [[package]] name = "quinn-udp" -version = "0.1.4" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b07946277141531aea269befd949ed16b2c85a780ba1043244eda0969e538e54" +checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7" dependencies = [ - "futures-util", + "bytes", "libc", - "quinn-proto", - "socket2", - "tokio", + "socket2 0.5.7", "tracing", + "windows-sys 0.48.0", ] [[package]] name = "quote" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" -dependencies = [ - "proc-macro2 0.4.30", -] - -[[package]] -name = "quote" -version = "1.0.32" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ - "proc-macro2 1.0.66", + "proc-macro2", ] [[package]] @@ -2527,7 +2825,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.8", + "getrandom 0.2.15", ] [[package]] @@ -2550,9 +2848,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.6.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db3a213adf02b3bcfd2d3846bb41cb22857d131789e01df434fb7e7bc0759b7" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -2560,25 +2858,23 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.10.2" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "356a0625f1954f730c0201cdab48611198dc6ce21f4acff55089b5a78e6e835b" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ - "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "num_cpus", ] [[package]] name = "rcgen" -version = "0.9.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6413f3de1edee53342e6138e75b56d32e7bc6e332b3bd62d497b1929d4cfbcdd" +checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" dependencies = [ "pem", - "ring", - "time 0.3.17", + "ring 0.16.20", + "time", "yasna", ] @@ -2588,7 +2884,16 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags 2.6.0", ] [[package]] @@ -2597,8 +2902,8 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "getrandom 0.2.8", - "redox_syscall", + "getrandom 0.2.15", + "redox_syscall 0.2.16", "thiserror", ] @@ -2630,12 +2935,12 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.18" +version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ "async-compression", - "base64 0.21.0", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", @@ -2654,21 +2959,23 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.2", - "rustls-pemfile 1.0.2", + "rustls", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", + "system-configuration", "tokio", "tokio-native-tls", - "tokio-rustls 0.24.1", + "tokio-rustls", "tokio-util", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots", + "webpki-roots 0.25.4", "winreg", ] @@ -2681,22 +2988,46 @@ dependencies = [ "cc", "libc", "once_cell", - "spin", - "untrusted", + "spin 0.5.2", + "untrusted 0.7.1", "web-sys", "winapi", ] +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.15", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + [[package]] name = "rpassword" -version = "6.0.1" +version = "7.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf099a1888612545b683d2661a1940089f6c2e5a8e38979b2159da876bfd956" +checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" dependencies = [ "libc", - "serde", - "serde_json", - "winapi", + "rtoolbox", + "windows-sys 0.48.0", +] + +[[package]] +name = "rtoolbox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" +dependencies = [ + "libc", + "windows-sys 0.48.0", ] [[package]] @@ -2729,41 +3060,15 @@ dependencies = [ "nom", ] -[[package]] -name = "rustix" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fdebc4b395b7fbb9ab11e462e20ed9051e7b16e42d24042c776eca0ac81b03" -dependencies = [ - "bitflags", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys", - "windows-sys 0.42.0", -] - [[package]] name = "rustls" -version = "0.20.8" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", - "ring", - "sct", - "webpki", -] - -[[package]] -name = "rustls" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e32ca28af694bc1bbf399c33a516dbdf1c90090b8ab23c2bc24f834aa2247f5f" -dependencies = [ - "log", - "ring", - "rustls-webpki", + "ring 0.17.8", + "rustls-webpki", "sct", ] @@ -2774,44 +3079,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" dependencies = [ "openssl-probe", - "rustls-pemfile 1.0.2", + "rustls-pemfile", "schannel", "security-framework", ] -[[package]] -name = "rustls-pemfile" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eebeaeb360c87bfb72e84abdb3447159c0eaececf1bef2aecd65a8be949d1c9" -dependencies = [ - "base64 0.13.1", -] - [[package]] name = "rustls-pemfile" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" dependencies = [ - "base64 0.21.0", + "base64 0.21.7", ] [[package]] name = "rustls-webpki" -version = "0.100.1" +version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring", - "untrusted", + "ring 0.17.8", + "untrusted 0.9.0", ] [[package]] name = "rustversion" -version = "1.0.11" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" @@ -2840,14 +3136,34 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2" +[[package]] +name = "scroll" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + [[package]] name = "sct" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" dependencies = [ - "ring", - "untrusted", + "ring 0.16.20", + "untrusted 0.7.1", ] [[package]] @@ -2856,7 +3172,7 @@ version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c4437699b6d34972de58652c68b98cb5b53a4199ab126db8e20ec8ded29a721" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -2875,49 +3191,50 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.16" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.193" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_bytes" -version = "0.11.8" +version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718dc5fff5b36f99093fc49b280cfc96ce6fc824317783bff5a1fed0c7a64819" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", - "syn 2.0.32", + "proc-macro2", + "quote", + "syn 2.0.79", ] [[package]] name = "serde_json" -version = "1.0.91" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -2943,27 +3260,50 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" +dependencies = [ + "serde", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.79", +] + [[package]] name = "serde_yaml" -version = "0.8.26" +version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 1.9.2", + "indexmap 2.2.6", + "itoa", "ryu", "serde", - "yaml-rust", + "unsafe-libyaml", ] [[package]] -name = "sha-1" -version = "0.10.1" +name = "sha1" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -2981,13 +3321,13 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -2996,7 +3336,7 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e334db67871c14c18fc066ad14af13f9fdf5f9a91c61af432d1e3a39c8c6a141" dependencies = [ - "hex 0.4.3", + "hex", "sha2 0.9.9", ] @@ -3018,7 +3358,7 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bdf0c33fae925bdc080598b84bc15c55e7b9a4a43b3c704da051f977469691c9" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "keccak", ] @@ -3028,11 +3368,17 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "732768f1176d21d09e076c23a93123d40bba92d50c4058da34d45c8de8e682b9" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" dependencies = [ "libc", "signal-hook-registry", @@ -3053,6 +3399,12 @@ version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + [[package]] name = "sized-chunks" version = "0.6.5" @@ -3074,9 +3426,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.10.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" @@ -3088,14 +3440,24 @@ dependencies = [ "winapi", ] +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "solana-account-decoder" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b04c1316932017ae5f947e83d77cc0356c4a395130a480cdc17ffb0570a0c115" +checksum = "f5e54ec43b0262c19a3c87bf2dbd52c6bc6d4f9307246fe4b666fd87f06305e5" dependencies = [ "Inflector", - "base64 0.13.1", + "base64 0.21.7", "bincode", "bs58", "bv", @@ -3103,47 +3465,25 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "solana-address-lookup-table-program", "solana-config-program", "solana-sdk", - "solana-vote-program", "spl-token", "spl-token-2022", + "spl-token-group-interface", + "spl-token-metadata-interface", "thiserror", "zstd", ] -[[package]] -name = "solana-address-lookup-table-program" -version = "1.14.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be490ed850c99286a4e4ba169ce20695336fe666c56bd823bfd8db689d23a58" -dependencies = [ - "bincode", - "bytemuck", - "log", - "num-derive", - "num-traits", - "rustc_version", - "serde", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-program", - "solana-program-runtime", - "solana-sdk", - "thiserror", -] - [[package]] name = "solana-clap-utils" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36228e03e14bc7d7707189b66f625981993f1a000b0b192d5b42367349901d91" +checksum = "117bf11e4d15b529dd9dfa2680abaf8bd3c1d8f7cb0586a5accdac5a2ecc7cc5" dependencies = [ "chrono", "clap 2.34.0", "rpassword", - "solana-perf", "solana-remote-wallet", "solana-sdk", "thiserror", @@ -3154,9 +3494,9 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c43b08f24fd605eaeaafe0e834dc9b209137ac253bc874d32a5bdd791cbd318" +checksum = "884f604b0ebb6572103b92b043cfe977ad13137f54c307e9d2c14b8b5079d150" dependencies = [ "dirs-next", "lazy_static", @@ -3170,63 +3510,42 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e270b1afd0b360c2aec42ae302ae7980ebb226017275b32a6156ab2ccbdad9" +checksum = "1501330d85c1a790f45f11330616bd6f0b9acd2193477268a65a38ce3b7cfdd0" dependencies = [ - "async-mutex", "async-trait", - "base64 0.13.1", "bincode", - "bs58", - "bytes", - "clap 2.34.0", - "crossbeam-channel", - "enum_dispatch", + "dashmap", "futures", "futures-util", - "indexmap 1.9.2", - "indicatif 0.16.2", - "itertools", - "jsonrpc-core", - "lazy_static", + "indexmap 2.2.6", + "indicatif", "log", "quinn", - "quinn-proto", - "rand 0.7.3", - "rand_chacha 0.2.2", "rayon", - "reqwest", - "rustls 0.20.8", - "semver", - "serde", - "serde_derive", - "serde_json", - "solana-account-decoder", - "solana-clap-utils", - "solana-faucet", + "solana-connection-cache", "solana-measure", "solana-metrics", - "solana-net-utils", + "solana-pubsub-client", + "solana-quic-client", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-rpc-client-nonce-utils", "solana-sdk", "solana-streamer", - "solana-transaction-status", - "solana-version", - "solana-vote-program", - "spl-token-2022", + "solana-thin-client", + "solana-tpu-client", + "solana-udp-client", "thiserror", "tokio", - "tokio-stream", - "tokio-tungstenite", - "tungstenite", - "url", ] [[package]] name = "solana-config-program" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb275d80a482134f0f0c5439b0c40ba3f04bef70dbc46c0e47f6107f6ae482a8" +checksum = "d00d0d031f3d97e3f59305c4aabf9da7359fad86dbaeb43b61a1ea13224e0b8a" dependencies = [ "bincode", "chrono", @@ -3237,58 +3556,47 @@ dependencies = [ ] [[package]] -name = "solana-faucet" -version = "1.14.13" +name = "solana-connection-cache" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3ef95ad1f87b8c011d0e4d85a46f4a703e9dd7e722459659b395ed70d6ba924" +checksum = "90fa9ff6c33772441670e446b1d43e787aa315e95f2f9c14e3e9508b814bc8e5" dependencies = [ + "async-trait", "bincode", - "byteorder", - "clap 2.34.0", "crossbeam-channel", + "futures-util", + "indexmap 2.2.6", "log", - "serde", - "serde_derive", - "solana-clap-utils", - "solana-cli-config", - "solana-logger", + "rand 0.8.5", + "rayon", + "rcgen", + "solana-measure", "solana-metrics", "solana-sdk", - "solana-version", - "spl-memo", "thiserror", "tokio", ] [[package]] name = "solana-frozen-abi" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f44a019070a6cec4d3ad8605c5caa65bdaa13f00b5f1849340f44ffea63b625b" +checksum = "4bfcde2fc6946c99c7e3400fadd04d1628d675bfd66cb34d461c0f3224bd27d1" dependencies = [ - "ahash", - "blake3", - "block-buffer 0.9.0", + "block-buffer 0.10.4", "bs58", "bv", - "byteorder", - "cc", "either", "generic-array", - "getrandom 0.1.16", - "hashbrown 0.12.3", "im", "lazy_static", "log", "memmap2", - "once_cell", - "rand_core 0.6.4", "rustc_version", "serde", "serde_bytes", "serde_derive", - "serde_json", - "sha2 0.10.6", + "sha2 0.10.8", "solana-frozen-abi-macro", "subtle", "thiserror", @@ -3296,21 +3604,21 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be23cc7a382f54dfe1348edb94610e5cc146b8eb21563cdd04062a403c75ba62" +checksum = "d5024d241425f4e99f112ee03bfa89e526c86c7ca9bd7e13448a7f2dffb7e060" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", + "proc-macro2", + "quote", "rustc_version", - "syn 1.0.107", + "syn 2.0.79", ] [[package]] name = "solana-logger" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447d16a70a1b5383736ef44801050c0e1affd022303b22ed899352f958c2de4b" +checksum = "10948c30d138d6fbfc2ae78a4882be5a9ebffa4bb1239c4efc386104ebc35b7f" dependencies = [ "env_logger", "lazy_static", @@ -3319,9 +3627,9 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2400d2534a19f7605c5059060edea0499600a223f1a1f6a4b172666c04946a77" +checksum = "379355a731abf50bb5ef1e4afba02ac8c835c25bb18e32229bb481657d5c9eca" dependencies = [ "log", "solana-sdk", @@ -3329,9 +3637,9 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68aaa3d683945dc3b6ca38923ef952ca1f96a27b61f898a1ddf9f4cd79f2df92" +checksum = "82a6f767cf39d69104bff52602f3141d6abfbdd55b4eb310f8fbbbf862b27e6f" dependencies = [ "crossbeam-channel", "gethostname", @@ -3339,23 +3647,24 @@ dependencies = [ "log", "reqwest", "solana-sdk", + "thiserror", ] [[package]] name = "solana-net-utils" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6d7093739e143d5e2edf3e81e523d47228adb802b847d66f4ab819be7ad6dc8" +checksum = "c81ade42b553c7de08fb97cf3cfe44545f59a247e90042a67d224d62a8a189d7" dependencies = [ "bincode", "clap 3.2.23", "crossbeam-channel", "log", "nix", - "rand 0.7.3", + "rand 0.8.5", "serde", "serde_derive", - "socket2", + "socket2 0.5.7", "solana-logger", "solana-sdk", "solana-version", @@ -3365,25 +3674,27 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc742f8d53f0a6e6f3a27ed11c1d0764b5486813c721d625c56094fcd14e984" +checksum = "9ecdf31e535743515d31392f210d132463300b5d3de7c3e26f6b344b6c941c42" dependencies = [ - "ahash", + "ahash 0.8.11", "bincode", "bv", "caps", "curve25519-dalek", - "dlopen", - "dlopen_derive", + "dlopen2", "fnv", "lazy_static", "libc", "log", "nix", - "rand 0.7.3", + "rand 0.8.5", "rayon", + "rustc_version", "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", "solana-metrics", "solana-rayon-threadlimit", "solana-sdk", @@ -3392,16 +3703,21 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0937481f080f5dd495fae456c94718a7bacf30fb5fdabb02dcb8a9622e446d5" +checksum = "76056fecde0fe0ece8b457b719729c17173333471c72ad41969982975a10d6e0" dependencies = [ - "base64 0.13.1", + "ark-bn254", + "ark-ec", + "ark-ff", + "ark-serialize", + "base64 0.21.7", "bincode", - "bitflags", + "bitflags 2.6.0", "blake3", + "borsh 0.10.4", "borsh 0.9.3", - "borsh-derive 0.9.3", + "borsh 1.5.0", "bs58", "bv", "bytemuck", @@ -3409,26 +3725,27 @@ dependencies = [ "console_error_panic_hook", "console_log", "curve25519-dalek", - "getrandom 0.2.8", + "getrandom 0.2.15", "itertools", "js-sys", "lazy_static", "libc", "libsecp256k1", + "light-poseidon", "log", - "memoffset 0.6.5", - "num-derive", + "memoffset 0.9.1", + "num-bigint 0.4.6", + "num-derive 0.4.2", "num-traits", "parking_lot", - "rand 0.7.3", - "rand_chacha 0.2.2", + "rand 0.8.5", "rustc_version", "rustversion", "serde", "serde_bytes", "serde_derive", "serde_json", - "sha2 0.10.6", + "sha2 0.10.8", "sha3 0.10.6", "solana-frozen-abi", "solana-frozen-abi-macro", @@ -3441,21 +3758,21 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4d12047608bac77fca000e18f7a2df3c7fa90656d7c7d387b1cd7faf18b238c" +checksum = "e566a9e61ecdc250824314864654dd370abf561fa8328f6e08b3bc96ccc5b80d" dependencies = [ - "base64 0.13.1", + "base64 0.21.7", "bincode", "eager", "enum-iterator", "itertools", "libc", - "libloading", "log", - "num-derive", + "num-derive 0.4.2", "num-traits", - "rand 0.7.3", + "percentage", + "rand 0.8.5", "rustc_version", "serde", "solana-frozen-abi", @@ -3463,14 +3780,67 @@ dependencies = [ "solana-measure", "solana-metrics", "solana-sdk", + "solana_rbpf", "thiserror", ] +[[package]] +name = "solana-pubsub-client" +version = "1.18.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d997840e6d033edc4fca8f06b920726dc18d3a5bbc1e538b2154cc3b71acd1" +dependencies = [ + "crossbeam-channel", + "futures-util", + "log", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-rpc-client-api", + "solana-sdk", + "thiserror", + "tokio", + "tokio-stream", + "tokio-tungstenite", + "tungstenite", + "url", +] + +[[package]] +name = "solana-quic-client" +version = "1.18.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e689a97cefa6a005cd305210234f3dc78aacc934c0f76d210a264fae36ee432" +dependencies = [ + "async-mutex", + "async-trait", + "futures", + "itertools", + "lazy_static", + "log", + "quinn", + "quinn-proto", + "rcgen", + "rustls", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-rpc-client-api", + "solana-sdk", + "solana-streamer", + "thiserror", + "tokio", +] + [[package]] name = "solana-rayon-threadlimit" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6eca67181e0381532db4bc69a625b1f96a047be461ff9050c451add0165424f" +checksum = "bbf70f0441603e553fc3db30c1eec9f10cecc27849e7dc74d5f692d5a41a56ca" dependencies = [ "lazy_static", "num_cpus", @@ -3478,14 +3848,14 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b83d035ee90035ebcb07ec73672fdc0272e5b98899846dd29fcb31f856ac78c" +checksum = "9651b3f2c3df39a1a6fc87fe792bdb3ec3d84a8169c0a57c86335b48d6cb1491" dependencies = [ "console", "dialoguer", "log", - "num-derive", + "num-derive 0.4.2", "num-traits", "parking_lot", "qstring", @@ -3495,23 +3865,84 @@ dependencies = [ "uriparse", ] +[[package]] +name = "solana-rpc-client" +version = "1.18.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d753d116aacc43ef64a2bc8d25f8b20af47c366b29aa859186124e226d6e3819" +dependencies = [ + "async-trait", + "base64 0.21.7", + "bincode", + "bs58", + "indicatif", + "log", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-rpc-client-api", + "solana-sdk", + "solana-transaction-status", + "solana-version", + "solana-vote-program", + "tokio", +] + +[[package]] +name = "solana-rpc-client-api" +version = "1.18.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617df2c53f948c821cefca6824e376aac04ff0d844bb27f4d3ada9e211bcffe7" +dependencies = [ + "base64 0.21.7", + "bs58", + "jsonrpc-core", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-sdk", + "solana-transaction-status", + "solana-version", + "spl-token-2022", + "thiserror", +] + +[[package]] +name = "solana-rpc-client-nonce-utils" +version = "1.18.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2d34cf36289cc35a0b18cd518a256312090368a37f40b448520e260923558a9" +dependencies = [ + "clap 2.34.0", + "solana-clap-utils", + "solana-rpc-client", + "solana-sdk", + "thiserror", +] + [[package]] name = "solana-sdk" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "390e7481c56dda2ceab2652beeda30a533e9667b34861a2eb4eec92fa1d826d7" +checksum = "b4b3f2080eddef6552fde7f149c429cf05b9bb0605a068b0d28e19d793e24df4" dependencies = [ "assert_matches", - "base64 0.13.1", + "base64 0.21.7", "bincode", - "bitflags", - "borsh 0.9.3", + "bitflags 2.6.0", + "borsh 1.5.0", "bs58", "bytemuck", "byteorder", "chrono", "derivation-path", - "digest 0.10.6", + "digest 0.10.7", "ed25519-dalek", "ed25519-dalek-bip32", "generic-array", @@ -3522,20 +3953,24 @@ dependencies = [ "libsecp256k1", "log", "memmap2", - "num-derive", + "num-derive 0.4.2", "num-traits", + "num_enum 0.7.3", "pbkdf2 0.11.0", "qstring", + "qualifier_attr", "rand 0.7.3", - "rand_chacha 0.2.2", + "rand 0.8.5", "rustc_version", "rustversion", "serde", "serde_bytes", "serde_derive", "serde_json", - "sha2 0.10.6", + "serde_with", + "sha2 0.10.8", "sha3 0.10.6", + "siphasher", "solana-frozen-abi", "solana-frozen-abi-macro", "solana-logger", @@ -3548,56 +3983,105 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d0acbad862093ea123f3a27364336dcb0c8373522cd6810496a34e932c56c1" +checksum = "2a8613ca80150f7e277e773620ba65d2c5fcc3a08eb8026627d601421ab43aef" dependencies = [ "bs58", - "proc-macro2 1.0.66", - "quote 1.0.32", + "proc-macro2", + "quote", "rustversion", - "syn 1.0.107", + "syn 2.0.79", +] + +[[package]] +name = "solana-security-txt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" + +[[package]] +name = "solana-streamer" +version = "1.18.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "979d470dd7c589679a2e036078921989a2563f333b73b31e2fdceb09a6d55a29" +dependencies = [ + "async-channel", + "bytes", + "crossbeam-channel", + "futures-util", + "histogram", + "indexmap 2.2.6", + "itertools", + "libc", + "log", + "nix", + "pem", + "percentage", + "pkcs8", + "quinn", + "quinn-proto", + "rand 0.8.5", + "rcgen", + "rustls", + "smallvec", + "solana-metrics", + "solana-perf", + "solana-sdk", + "thiserror", + "tokio", + "x509-parser", +] + +[[package]] +name = "solana-thin-client" +version = "1.18.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "851b9ae239d098c766aee3558330cc16edd0524c9cf3f9cf7c64f53b1024d507" +dependencies = [ + "bincode", + "log", + "rayon", + "solana-connection-cache", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-sdk", ] [[package]] -name = "solana-streamer" -version = "1.14.13" +name = "solana-tpu-client" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "853b0187fdf233c13e8b7ba76e61d0c7cb49ca92c5fdb3b7568ad5ca30e2cf88" +checksum = "6a7a7e5a522fe5333fcb47e02fb7da73ff614d917754167937b5523c383ce161" dependencies = [ - "crossbeam-channel", + "async-trait", + "bincode", "futures-util", - "histogram", - "indexmap 1.9.2", - "itertools", - "libc", + "indexmap 2.2.6", + "indicatif", "log", - "nix", - "pem", - "percentage", - "pkcs8", - "quinn", - "rand 0.7.3", - "rcgen", - "rustls 0.20.8", + "rayon", + "solana-connection-cache", + "solana-measure", "solana-metrics", - "solana-perf", + "solana-pubsub-client", + "solana-rpc-client", + "solana-rpc-client-api", "solana-sdk", "thiserror", "tokio", - "x509-parser", ] [[package]] name = "solana-transaction-status" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5bbdaed99403e4a17763bee60c1e0e3418524503c72b514ebff62efbcc9d33" +checksum = "51be349fb9301d2a0fdd0b9ba5341e5f72bf4900ca4c0ede04748bc9038d15e8" dependencies = [ "Inflector", - "base64 0.13.1", + "base64 0.21.7", "bincode", - "borsh 0.9.3", + "borsh 0.10.4", "bs58", "lazy_static", "log", @@ -3605,11 +4089,7 @@ dependencies = [ "serde_derive", "serde_json", "solana-account-decoder", - "solana-address-lookup-table-program", - "solana-measure", - "solana-metrics", "solana-sdk", - "solana-vote-program", "spl-associated-token-account", "spl-memo", "spl-token", @@ -3617,6 +4097,21 @@ dependencies = [ "thiserror", ] +[[package]] +name = "solana-udp-client" +version = "1.18.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3274b4bfccd57ecffcf4037cd09fc61777633e0d0c5f8b76abcaa10ee83f3ae5" +dependencies = [ + "async-trait", + "solana-connection-cache", + "solana-net-utils", + "solana-sdk", + "solana-streamer", + "thiserror", + "tokio", +] + [[package]] name = "solana-verify" version = "0.2.12" @@ -3625,10 +4120,10 @@ dependencies = [ "borsh 1.5.0", "cargo-lock", "cargo_toml", - "clap 4.1.4", + "clap 4.5.19", "crossbeam-channel", - "hex 0.3.2", - "indicatif 0.17.7", + "hex", + "indicatif", "lazy_static", "pathdiff", "reqwest", @@ -3646,9 +4141,9 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a46c9ecb15ccd5388511cec0c5bfb989589425f8286ce432ff64b55dc7bf61e" +checksum = "aaf45873439f73420f60a5e0f87b529923c3489d24a228d5eb8f5ce6955bdc1b" dependencies = [ "log", "rustc_version", @@ -3662,13 +4157,13 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81ab9ff8928282cb42871a370435dd4713f700854801afb476cf63066f1337db" +checksum = "0e7c7525bda137bbb9bc0dc967a4ffca82786147eb2d1efbf76a8dc52978f0b8" dependencies = [ "bincode", "log", - "num-derive", + "num-derive 0.4.2", "num-traits", "rustc_version", "serde", @@ -3676,6 +4171,7 @@ dependencies = [ "solana-frozen-abi", "solana-frozen-abi-macro", "solana-metrics", + "solana-program", "solana-program-runtime", "solana-sdk", "thiserror", @@ -3683,23 +4179,21 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cebca4083e982ae01583d1a590c4d679e6f648a4761364ddfb43026d2c433142" +checksum = "39a57b2f269f24088b6b8e426de05e5c1faa6b5d6f26175c06eb80df96ec685e" dependencies = [ "aes-gcm-siv", - "arrayref", - "base64 0.13.1", + "base64 0.21.7", "bincode", "bytemuck", "byteorder", - "cipher 0.4.3", "curve25519-dalek", "getrandom 0.1.16", "itertools", "lazy_static", "merlin", - "num-derive", + "num-derive 0.4.2", "num-traits", "rand 0.7.3", "serde", @@ -3712,12 +4206,37 @@ dependencies = [ "zeroize", ] +[[package]] +name = "solana_rbpf" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da5d083187e3b3f453e140f292c09186881da8a02a7b5e27f645ee26de3d9cc5" +dependencies = [ + "byteorder", + "combine", + "goblin", + "hash32", + "libc", + "log", + "rand 0.8.5", + "rustc-demangle", + "scroll", + "thiserror", + "winapi", +] + [[package]] name = "spin" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "spki" version = "0.5.4" @@ -3730,13 +4249,13 @@ dependencies = [ [[package]] name = "spl-associated-token-account" -version = "1.1.2" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc000f0fdf1f12f99d77d398137c1751345b18c88258ce0f99b7872cf6c9bd6" +checksum = "992d9c64c2564cc8f63a4b508bf3ebcdf2254b0429b13cd1d31adb6162432a5f" dependencies = [ "assert_matches", - "borsh 0.9.3", - "num-derive", + "borsh 0.10.4", + "num-derive 0.4.2", "num-traits", "solana-program", "spl-token", @@ -3744,48 +4263,197 @@ dependencies = [ "thiserror", ] +[[package]] +name = "spl-discriminator" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator-derive", +] + +[[package]] +name = "spl-discriminator-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" +dependencies = [ + "quote", + "spl-discriminator-syn", + "syn 2.0.79", +] + +[[package]] +name = "spl-discriminator-syn" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fea7be851bd98d10721782ea958097c03a0c2a07d8d4997041d0ece6319a63" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.79", + "thiserror", +] + [[package]] name = "spl-memo" -version = "3.0.1" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f180b03318c3dbab3ef4e1e4d46d5211ae3c780940dd0a28695aba4b59a75a" +dependencies = [ + "solana-program", +] + +[[package]] +name = "spl-pod" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2881dddfca792737c0706fa0175345ab282b1b0879c7d877bad129645737c079" +dependencies = [ + "borsh 0.10.4", + "bytemuck", + "solana-program", + "solana-zk-token-sdk", + "spl-program-error", +] + +[[package]] +name = "spl-program-error" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "249e0318493b6bcf27ae9902600566c689b7dfba9f1bdff5893e92253374e78c" +dependencies = [ + "num-derive 0.4.2", + "num-traits", + "solana-program", + "spl-program-error-derive", + "thiserror", +] + +[[package]] +name = "spl-program-error-derive" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1845dfe71fd68f70382232742e758557afe973ae19e6c06807b2c30f5d5cb474" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.79", +] + +[[package]] +name = "spl-tlv-account-resolution" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0dc6f70db6bacea7ff25870b016a65ba1d1b6013536f08e4fd79a8f9005325" +checksum = "615d381f48ddd2bb3c57c7f7fb207591a2a05054639b18a62e785117dd7a8683" dependencies = [ + "bytemuck", "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", ] [[package]] name = "spl-token" -version = "3.5.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +checksum = "08459ba1b8f7c1020b4582c4edf0f5c7511a5e099a7a97570c9698d4f2337060" dependencies = [ "arrayref", "bytemuck", - "num-derive", + "num-derive 0.3.3", "num-traits", - "num_enum", + "num_enum 0.6.1", "solana-program", "thiserror", ] [[package]] name = "spl-token-2022" -version = "0.5.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0edb869dbe159b018f17fb9bfa67118c30f232d7f54a73742bc96794dff77ed8" +checksum = "d697fac19fd74ff472dfcc13f0b442dd71403178ce1de7b5d16f83a33561c059" dependencies = [ "arrayref", "bytemuck", - "num-derive", + "num-derive 0.4.2", "num-traits", - "num_enum", + "num_enum 0.7.3", "solana-program", + "solana-security-txt", "solana-zk-token-sdk", "spl-memo", + "spl-pod", "spl-token", + "spl-token-group-interface", + "spl-token-metadata-interface", + "spl-transfer-hook-interface", + "spl-type-length-value", "thiserror", ] +[[package]] +name = "spl-token-group-interface" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b889509d49fa74a4a033ca5dae6c2307e9e918122d97e58562f5c4ffa795c75d" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", +] + +[[package]] +name = "spl-token-metadata-interface" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f" +dependencies = [ + "borsh 0.10.4", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", +] + +[[package]] +name = "spl-transfer-hook-interface" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aabdb7c471566f6ddcee724beb8618449ea24b399e58d464d6b5bc7db550259" +dependencies = [ + "arrayref", + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-tlv-account-resolution", + "spl-type-length-value", +] + +[[package]] +name = "spl-type-length-value" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a468e6f6371f9c69aae760186ea9f1a01c2908351b06a5e0026d21cfc4d7ecac" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", +] + [[package]] name = "strsim" version = "0.8.0" @@ -3799,21 +4467,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] -name = "subtle" -version = "2.4.1" +name = "strsim" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] -name = "syn" -version = "0.15.44" +name = "subtle" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" -dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "unicode-xid 0.1.0", -] +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" @@ -3821,19 +4484,19 @@ version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", + "proc-macro2", + "quote", "unicode-ident", ] [[package]] name = "syn" -version = "2.0.32" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "239814284fd6f1a4ffe4ca893952cdd93c224b6a1571c9a9eadd670295c0c9e2" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", + "proc-macro2", + "quote", "unicode-ident", ] @@ -3844,21 +4507,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" dependencies = [ "proc-macro-error", - "proc-macro2 1.0.66", - "quote 1.0.32", - "syn 2.0.32", + "proc-macro2", + "quote", + "syn 2.0.79", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "synstructure" version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", + "proc-macro2", + "quote", "syn 1.0.107", - "unicode-xid 0.2.4", + "unicode-xid", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", ] [[package]] @@ -3870,7 +4560,7 @@ dependencies = [ "cfg-if", "fastrand", "libc", - "redox_syscall", + "redox_syscall 0.2.16", "remove_dir_all", "winapi", ] @@ -3901,33 +4591,22 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.38" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" -dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", - "syn 1.0.107", -] - -[[package]] -name = "time" -version = "0.1.45" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", + "proc-macro2", + "quote", + "syn 2.0.79", ] [[package]] @@ -4006,7 +4685,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.4.9", "tokio-macros", "windows-sys 0.48.0", ] @@ -4017,9 +4696,9 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", - "syn 2.0.32", + "proc-macro2", + "quote", + "syn 2.0.79", ] [[package]] @@ -4032,32 +4711,21 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-rustls" -version = "0.23.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" -dependencies = [ - "rustls 0.20.8", - "tokio", - "webpki", -] - [[package]] name = "tokio-rustls" version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.2", + "rustls", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.11" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" dependencies = [ "futures-core", "pin-project-lite", @@ -4066,18 +4734,17 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.17.2" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f714dd15bead90401d77e04243611caec13726c2408afd5b31901dfcdcb3b181" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" dependencies = [ "futures-util", "log", - "rustls 0.20.8", + "rustls", "tokio", - "tokio-rustls 0.23.4", + "tokio-rustls", "tungstenite", - "webpki", - "webpki-roots", + "webpki-roots 0.25.4", ] [[package]] @@ -4178,6 +4845,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if", + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -4189,8 +4857,8 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", + "proc-macro2", + "quote", "syn 1.0.107", ] @@ -4211,24 +4879,23 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "tungstenite" -version = "0.17.3" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" dependencies = [ - "base64 0.13.1", "byteorder", "bytes", + "data-encoding", "http", "httparse", "log", "rand 0.8.5", - "rustls 0.20.8", - "sha-1", + "rustls", + "sha1", "thiserror", "url", "utf-8", - "webpki", - "webpki-roots", + "webpki-roots 0.24.0", ] [[package]] @@ -4264,12 +4931,6 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" -[[package]] -name = "unicode-xid" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" - [[package]] name = "unicode-xid" version = "0.2.4" @@ -4286,12 +4947,33 @@ dependencies = [ "subtle", ] +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + [[package]] name = "untrusted" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "uriparse" version = "0.6.4" @@ -4304,9 +4986,9 @@ dependencies = [ [[package]] name = "url" -version = "2.3.1" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -4319,13 +5001,19 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "uuid" version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c" dependencies = [ - "getrandom 0.2.8", + "getrandom 0.2.15", "rand 0.8.5", "uuid-macro-internal", ] @@ -4336,8 +5024,8 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73bc89f2894593e665241e0052c3791999e6787b7c4831daa0a5c2e637e276d8" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", + "proc-macro2", + "quote", "syn 1.0.107", ] @@ -4359,6 +5047,12 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + [[package]] name = "want" version = "0.3.0" @@ -4375,12 +5069,6 @@ version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -4389,26 +5077,27 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.83" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.83" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", "once_cell", - "proc-macro2 1.0.66", - "quote 1.0.32", - "syn 1.0.107", + "proc-macro2", + "quote", + "syn 2.0.79", "wasm-bindgen-shared", ] @@ -4426,32 +5115,32 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.83" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ - "quote 1.0.32", + "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.83" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", - "syn 1.0.107", + "proc-macro2", + "quote", + "syn 2.0.79", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.83" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "web-sys" @@ -4464,23 +5153,19 @@ dependencies = [ ] [[package]] -name = "webpki" -version = "0.22.0" +name = "webpki-roots" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888" dependencies = [ - "ring", - "untrusted", + "rustls-webpki", ] [[package]] name = "webpki-roots" -version = "0.22.6" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki", -] +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "winapi" @@ -4722,11 +5407,12 @@ dependencies = [ [[package]] name = "winreg" -version = "0.10.1" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "winapi", + "cfg-if", + "windows-sys 0.48.0", ] [[package]] @@ -4744,25 +5430,36 @@ dependencies = [ "oid-registry", "rusticata-macros", "thiserror", - "time 0.3.17", + "time", ] [[package]] -name = "yaml-rust" -version = "0.4.5" +name = "yasna" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aed2e7a52e3744ab4d0c05c20aa065258e84c49fd4226f5191b2ed29712710b4" +dependencies = [ + "time", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "linked-hash-map", + "zerocopy-derive", ] [[package]] -name = "yasna" -version = "0.5.1" +name = "zerocopy-derive" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aed2e7a52e3744ab4d0c05c20aa065258e84c49fd4226f5191b2ed29712710b4" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ - "time 0.3.17", + "proc-macro2", + "quote", + "syn 2.0.79", ] [[package]] @@ -4780,8 +5477,8 @@ version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c" dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.32", + "proc-macro2", + "quote", "syn 1.0.107", "synstructure", ] diff --git a/Cargo.toml b/Cargo.toml index 33bd56a..53af84b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,26 +8,26 @@ license = "MIT" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -clap = { version = "4.1.4", features = ["derive"] } -anyhow = "1.0.68" +clap = { version = "4.1.4", features = ["derive"] } # version of v1.18 does not support derive +anyhow = "1.0.79" tokio = { version = "1.29.1", features = ["full"] } -solana-client = "1.14.10" -solana-cli-config = "1.14.10" -solana-clap-utils = "1.14.10" -solana-sdk = "1.14.10" -sha256 = "1.1.1" -hex = "0.3.1" -serde_json = "1.0" -cargo_toml = "0.15.3" -pathdiff = "0.2.0" -signal-hook = "0.3.15" -reqwest = "0.11.18" -cargo-lock = "9.0.0" +solana-client = "=1.18.23" +solana-cli-config = "=1.18.23" +solana-clap-utils = "=1.18.23" +solana-sdk = "=1.18.23" +sha256 = "1.1.1" # missing in workspace +hex = "0.4.3" +serde_json = "1.0.111" +cargo_toml = "0.15.3" # missing in workspace +pathdiff = "0.2.0" # missing in workspace +signal-hook = "0.3.17" +reqwest = "0.11.23" +cargo-lock = "9.0.0" # missing in workspace lazy_static = "1.4.0" indicatif = "0.17.7" crossbeam-channel = "0.5.11" -serde = { version = "1.0.166", features = ["derive"] } -borsh = {version = "1.2.0", features = ["derive"] } +serde = { version = "1.0.195", features = ["derive"] } +borsh = {version = "1.2.1", features = ["derive"] } [dependencies.uuid] version = "1.2.2" From a899ab3ea08cae6c4e21fea85642f95d091946b0 Mon Sep 17 00:00:00 2001 From: ASCorreia <36857753+ASCorreia@users.noreply.github.com> Date: Fri, 4 Oct 2024 00:53:51 +0100 Subject: [PATCH 128/314] Downgrading to clap 2.33.1 --- Cargo.lock | 117 +------------------ Cargo.toml | 2 +- src/main.rs | 320 ++++++++++++++++++++++++---------------------------- 3 files changed, 148 insertions(+), 291 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9c80471..0526ad7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -135,55 +135,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "anstream" -version = "0.6.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" - -[[package]] -name = "anstyle-parse" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" -dependencies = [ - "anstyle", - "windows-sys 0.52.0", -] - [[package]] name = "anyhow" version = "1.0.89" @@ -834,7 +785,7 @@ checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5" dependencies = [ "atty", "bitflags 1.3.2", - "clap_lex 0.2.4", + "clap_lex", "indexmap 1.9.2", "once_cell", "strsim 0.10.0", @@ -842,40 +793,6 @@ dependencies = [ "textwrap 0.16.0", ] -[[package]] -name = "clap" -version = "4.5.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be5744db7978a28d9df86a214130d106a89ce49644cbc4e3f0c22c3fba30615" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5fbc17d3ef8278f55b282b2a2e75ae6f6c7d4bb70ed3d0382375104bfafdb4b" -dependencies = [ - "anstream", - "anstyle", - "clap_lex 0.7.2", - "strsim 0.11.1", -] - -[[package]] -name = "clap_derive" -version = "4.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.79", -] - [[package]] name = "clap_lex" version = "0.2.4" @@ -885,12 +802,6 @@ dependencies = [ "os_str_bytes", ] -[[package]] -name = "clap_lex" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" - [[package]] name = "codespan-reporting" version = "0.11.1" @@ -901,12 +812,6 @@ dependencies = [ "unicode-width", ] -[[package]] -name = "colorchoice" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" - [[package]] name = "combine" version = "3.8.1" @@ -1694,12 +1599,6 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - [[package]] name = "hermit-abi" version = "0.1.19" @@ -1951,12 +1850,6 @@ version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146" -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - [[package]] name = "itertools" version = "0.10.5" @@ -4120,7 +4013,7 @@ dependencies = [ "borsh 1.5.0", "cargo-lock", "cargo_toml", - "clap 4.5.19", + "clap 2.34.0", "crossbeam-channel", "hex", "indicatif", @@ -5001,12 +4894,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - [[package]] name = "uuid" version = "1.2.2" diff --git a/Cargo.toml b/Cargo.toml index 53af84b..0f49655 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ license = "MIT" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -clap = { version = "4.1.4", features = ["derive"] } # version of v1.18 does not support derive +clap = "2.33.1" # version of v1.18 does not support derive anyhow = "1.0.79" tokio = { version = "1.29.1", features = ["full"] } solana-client = "=1.18.23" diff --git a/src/main.rs b/src/main.rs index d99b891..01ca1f6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ use anyhow::anyhow; use cargo_lock::Lockfile; use cargo_toml::Manifest; -use clap::{Parser, Subcommand}; +use clap::{App, Arg, SubCommand}; use signal_hook::{ consts::{SIGINT, SIGTERM}, iterator::Signals, @@ -43,107 +43,6 @@ pub fn get_network(network_str: &str) -> &str { } } -#[derive(Parser, Debug)] -#[clap(author = "Ellipsis", version, about)] -struct Arguments { - #[clap(subcommand)] - subcommand: SubCommand, - /// Optionally include your RPC endpoint. Use "local", "dev", "main" for default endpoints. Defaults to your Solana CLI config file. - #[clap(global = true, short, long)] - url: Option, -} - -#[derive(Subcommand, Debug)] -enum SubCommand { - /// Deterministically build the program in an Docker container - Build { - /// Path to mount to the docker image - mount_directory: Option, - /// Which binary file to build (applies to repositories with multiple programs) - #[clap(long)] - library_name: Option, - /// Optionally specify a custom base docker image to use for building the program repository - #[clap(short, long)] - base_image: Option, - /// If the program requires cargo build-bpf (instead of cargo build-sbf), as for anchor program, set this flag - #[clap(long, default_value = "false")] - bpf: bool, - /// Arguments to pass to the underlying `cargo build-bpf` command - #[clap(required = false, last = true)] - cargo_args: Vec, - }, - /// Verifies a cached build from a docker image - VerifyFromImage { - /// Path to the executable solana program within the source code repository in the docker image - #[clap(short, long)] - executable_path_in_image: String, - /// Image that contains the source code to be verified - #[clap(short, long)] - image: String, - /// The Program ID of the program to verify - #[clap(short, long)] - program_id: Pubkey, - /// Verify in current directory - #[clap(long, default_value = "false")] - current_dir: bool, - }, - /// Get the hash of a program binary from an executable file - GetExecutableHash { - /// Path to the executable solana program - filepath: String, - }, - /// Get the hash of a program binary from the deployed on-chain program - GetProgramHash { - /// The Program ID of the program to verify - program_id: Pubkey, - }, - /// Get the hash of a program binary from the deployed buffer address - GetBufferHash { - /// Address of the buffer account containing the deployed program data - buffer_address: Pubkey, - }, - /// Builds and verifies a program from a given repository URL and a program ID - VerifyFromRepo { - /// Send the verify command to a remote machine - #[clap(long, default_value = "false")] - remote: bool, - /// Relative path to the root directory or the source code repository from which to build the program - /// This should be the directory that contains the workspace Cargo.toml and the Cargo.lock file - #[clap(long, default_value = "")] - mount_path: String, - /// The HTTPS URL of the repo to clone - repo_url: String, - /// Optional commit hash to checkout - #[clap(long)] - commit_hash: Option, - /// The Program ID of the program to verify - #[clap(long)] - program_id: Pubkey, - /// Optionally specify a custom base docker image to use for building the program repository - #[clap(short, long)] - base_image: Option, - /// If the repo_url points to a repo that contains multiple programs, specify the name of the library name of the program to - /// build and verify. You will also need to specify the library_name if the program is not part of the top-level Cargo.toml - /// Otherwise it will be inferred from the Cargo.toml file - #[clap(long)] - library_name: Option, - /// If the program requires cargo build-bpf (instead of cargo build-sbf), as for an Anchor program, set this flag - #[clap(long, default_value = "false")] - bpf: bool, - /// Verify in current directory - #[clap(long, default_value = "false")] - current_dir: bool, - /// Arguments to pass to the underlying `cargo build-bpf` command - #[clap(required = false, last = true)] - cargo_args: Vec, - }, - Close { - /// Close the Otter Verify PDA - #[clap(long)] - program_id: Pubkey, - }, -} - #[tokio::main] async fn main() -> anyhow::Result<()> { // Handle SIGTERM and SIGINT gracefully by stopping the docker container @@ -161,82 +60,153 @@ async fn main() -> anyhow::Result<()> { } }); - let args = Arguments::parse(); - let res = match args.subcommand { - SubCommand::Build { - // mount directory - mount_directory, - library_name, - base_image, - bpf: bpf_flag, - cargo_args, - } => build( - mount_directory, - library_name, - base_image, - bpf_flag, - cargo_args, - &mut container_id, - ), - SubCommand::VerifyFromImage { - executable_path_in_image: executable_path, - image, - program_id, - current_dir, - } => verify_from_image( - executable_path, - image, - args.url, - program_id, - current_dir, - &mut temp_dir, - &mut container_id, - ), - SubCommand::GetExecutableHash { filepath } => { - let program_hash = get_file_hash(&filepath)?; - println!("{}", program_hash); - Ok(()) - } - SubCommand::GetBufferHash { buffer_address } => { - let buffer_hash = get_buffer_hash(args.url, buffer_address)?; - println!("{}", buffer_hash); - Ok(()) - } - SubCommand::GetProgramHash { program_id } => { - let program_hash = get_program_hash(args.url, program_id)?; - println!("{}", program_hash); - Ok(()) - } - SubCommand::VerifyFromRepo { - remote, - mount_path, - repo_url, - commit_hash, - program_id, - base_image, - library_name, - bpf: bpf_flag, - cargo_args, - current_dir, - } => { - verify_from_repo( - remote, - mount_path, - args.url, - repo_url, - commit_hash, - program_id, - base_image, - library_name, - bpf_flag, - cargo_args, + let matches = App::new("solana-verifier") + .author("Ellipsis") + .version("0.1.0") + .about("Solana Verifiable Build Tool") + .arg(Arg::with_name("url") + .short("u") + .long("url") + .global(true) + .takes_value(true) + .help("Optionally include your RPC endpoint. Defaults to Solana CLI config file")) + .subcommand(SubCommand::with_name("build") + .about("Deterministically build the program in a Docker container") + .arg(Arg::with_name("mount_directory") + .help("Path to mount to the docker image") + .takes_value(true)) + .arg(Arg::with_name("library_name") + .long("library_name") + .takes_value(true) + .help("Which binary file to build")) + .arg(Arg::with_name("base_image") + .short("b") + .long("base_image") + .takes_value(true) + .help("Optionally specify a custom base docker image to use for building")) + .arg(Arg::with_name("bpf") + .long("bpf") + .help("If the program requires cargo build-bpf (instead of cargo build-sbf), set this flag")) + .arg(Arg::with_name("cargo_args") + .multiple(true) + .last(true) + .help("Arguments to pass to the underlying `cargo build-bpf` command"))) + .subcommand(SubCommand::with_name("verifyfromimage") + .about("Verifies a cached build from a docker image") + .arg(Arg::with_name("executable_path_in_image") + .short("e") + .long("executable_path_in_image") + .takes_value(true) + .required(true) + .help("Path to the executable solana program within the source code repository in the docker image")) + .arg(Arg::with_name("image") + .short("i") + .long("image") + .takes_value(true) + .required(true) + .help("Image that contains the source code to be verified")) + .arg(Arg::with_name("program_id") + .short("p") + .long("program_id") + .takes_value(true) + .required(true) + .help("The Program ID of the program to verify")) + .arg(Arg::with_name("current_dir") + .long("current_dir") + .help("Verify in current directory"))) + .subcommand(SubCommand::with_name("getexecutablehash") + .about("Get the hash of a program binary from an executable file") + .arg(Arg::with_name("filepath") + .required(true) + .help("Path to the executable solana program"))) + .subcommand(SubCommand::with_name("getprogramhash") + .about("Get the hash of a program binary from the deployed on-chain program") + .arg(Arg::with_name("program_id") + .required(true) + .help("The Program ID of the program to verify"))) + .subcommand(SubCommand::with_name("getbufferhash") + .about("Get the hash of a program binary from the deployed buffer address") + .arg(Arg::with_name("buffer_address") + .required(true) + .help("Address of the buffer account containing the deployed program data"))) + .subcommand(SubCommand::with_name("verifyfromrepo") + .about("Builds and verifies a program from a given repository URL and a program ID") + .arg(Arg::with_name("remote") + .long("remote") + .help("Send the verify command to a remote machine") + .default_value("false") + .takes_value(false)) + .arg(Arg::with_name("mount_path") + .long("mount_path") + .takes_value(true) + .default_value("") + .help("Relative path to the root directory or the source code repository from which to build the program")) + .arg(Arg::with_name("repo_url") + .required(true) + .help("The HTTPS URL of the repo to clone")) + .arg(Arg::with_name("commit_hash") + .long("commit_hash") + .takes_value(true) + .help("Optional commit hash to checkout")) + .arg(Arg::with_name("program_id") + .long("program_id") + .required(true) + .takes_value(true) + .help("The Program ID of the program to verify")) + .arg(Arg::with_name("base_image") + .short("b") + .long("base_image") + .takes_value(true) + .help("Optionally specify a custom base docker image to use for building")) + .arg(Arg::with_name("library_name") + .long("library_name") + .takes_value(true) + .help("Specify the name of the library to build and verify")) + .arg(Arg::with_name("bpf") + .long("bpf") + .help("If the program requires cargo build-bpf (instead of cargo build-sbf), set this flag")) + .arg(Arg::with_name("current_dir") + .long("current_dir") + .help("Verify in current directory")) + .arg(Arg::with_name("cargo_args") + .multiple(true) + .last(true) + .help("Arguments to pass to the underlying `cargo build-bpf` command"))) + .subcommand(SubCommand::with_name("close") + .about("Close the Otter Verify PDA") + .arg(Arg::with_name("program_id") + .long("program_id") + .required(true) + .takes_value(true) + .help("Close the Otter Verify PDA"))) + .get_matches(); + + let res = match matches.subcommand() { + ("build", Some(sub_m)) => { + let mount_directory = sub_m.value_of("mount_directory").map(|s| s.to_string()); + let library_name = sub_m.value_of("library_name").map(|s| s.to_string()); + let base_image = sub_m.value_of("base_image").map(|s| s.to_string()); + let bpf_flag = sub_m.is_present("bpf"); + let cargo_args = sub_m.values_of("cargo_args").unwrap_or_default().map(|s| s.to_string()).collect(); + build(mount_directory, library_name, base_image, bpf_flag, cargo_args, &mut container_id) + }, + ("verifyfromimage", Some(sub_m)) => { + let executable_path = sub_m.value_of("executable_path_in_image").unwrap(); + let image = sub_m.value_of("image").unwrap(); + let program_id = sub_m.value_of("program_id").unwrap(); + let current_dir = sub_m.is_present("current_dir"); + verify_from_image( + executable_path.to_string(), + image.to_string(), + matches.value_of("url").map(|s| s.to_string()), + Pubkey::try_from(program_id)?, current_dir, - &mut container_id, &mut temp_dir, + &mut container_id, ) - .await - } - SubCommand::Close { program_id } => process_close(program_id).await, + }, + // Handle other subcommands in a similar manner, for now let's panic + _ => panic!("Unknown subcommand"), }; if caught_signal.load(Ordering::Relaxed) || res.is_err() { From ae06f71214105a1f4e18dd33c9af031ff001ebd5 Mon Sep 17 00:00:00 2001 From: ASCorreia <36857753+ASCorreia@users.noreply.github.com> Date: Fri, 4 Oct 2024 01:09:03 +0100 Subject: [PATCH 129/314] added remaining subcommands --- src/main.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/main.rs b/src/main.rs index 01ca1f6..9be0d6e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -205,6 +205,52 @@ async fn main() -> anyhow::Result<()> { &mut container_id, ) }, + ("getexecutablehash", Some(sub_m)) => { + let filepath = sub_m.value_of("filepath").map(|s| s.to_string()).unwrap(); + let program_hash = get_file_hash(&filepath)?; + println!("{}", program_hash); + Ok(()) + }, + ("getbufferhash", Some(sub_m)) => { + let buffer_address = sub_m.value_of("buffer_address").unwrap(); + let buffer_hash = get_buffer_hash(matches.value_of("url").map(|s| s.to_string()), Pubkey::try_from(buffer_address)?)?; + println!("{}", buffer_hash); + Ok(()) + }, + ("getprogramhash", Some(sub_m)) => { + let program_id = sub_m.value_of("program_id").unwrap(); + let program_hash = get_program_hash(matches.value_of("url").map(|s| s.to_string()), Pubkey::try_from(program_id)?)?; + println!("{}", program_hash); + Ok(()) + }, + ("verifyfromrepo", Some(sub_m)) => { + let remote = sub_m.is_present("remote"); + let mount_path = sub_m.value_of("mount_path").map(|s| s.to_string()).unwrap(); + let repo_url = sub_m.value_of("repo_url").map(|s| s.to_string()).unwrap(); + let commit_hash = sub_m.value_of("commit_hash").map(|s| s.to_string()); + let program_id = sub_m.value_of("program_id").unwrap(); + let base_image = sub_m.value_of("base_image").map(|s| s.to_string()); + let library_name = sub_m.value_of("library_name").map(|s| s.to_string()); + let bpf_flag = sub_m.is_present("bpf"); + let current_dir = sub_m.is_present("current_dir"); + let cargo_args: Vec = sub_m.values_of("cargo_args").unwrap_or_default().map(|s| s.to_string()).collect(); + + verify_from_repo( + remote, + mount_path, + matches.value_of("url").map(|s| s.to_string()), + repo_url, + commit_hash, + Pubkey::try_from(program_id)?, + base_image, + library_name, + bpf_flag, + cargo_args, + current_dir, + &mut container_id, + &mut temp_dir, + ).await + } // Handle other subcommands in a similar manner, for now let's panic _ => panic!("Unknown subcommand"), }; From 3e70d7e21d0d7084577bd38abb964c86c1353c81 Mon Sep 17 00:00:00 2001 From: ASCorreia <36857753+ASCorreia@users.noreply.github.com> Date: Fri, 4 Oct 2024 01:41:51 +0100 Subject: [PATCH 130/314] fixed subcommand names --- src/main.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main.rs b/src/main.rs index 9be0d6e..2928746 100644 --- a/src/main.rs +++ b/src/main.rs @@ -91,7 +91,7 @@ async fn main() -> anyhow::Result<()> { .multiple(true) .last(true) .help("Arguments to pass to the underlying `cargo build-bpf` command"))) - .subcommand(SubCommand::with_name("verifyfromimage") + .subcommand(SubCommand::with_name("verify-from-image") .about("Verifies a cached build from a docker image") .arg(Arg::with_name("executable_path_in_image") .short("e") @@ -114,22 +114,22 @@ async fn main() -> anyhow::Result<()> { .arg(Arg::with_name("current_dir") .long("current_dir") .help("Verify in current directory"))) - .subcommand(SubCommand::with_name("getexecutablehash") + .subcommand(SubCommand::with_name("get-executable-hash") .about("Get the hash of a program binary from an executable file") .arg(Arg::with_name("filepath") .required(true) .help("Path to the executable solana program"))) - .subcommand(SubCommand::with_name("getprogramhash") + .subcommand(SubCommand::with_name("get-program-hash") .about("Get the hash of a program binary from the deployed on-chain program") .arg(Arg::with_name("program_id") .required(true) .help("The Program ID of the program to verify"))) - .subcommand(SubCommand::with_name("getbufferhash") + .subcommand(SubCommand::with_name("get-buffer-hash") .about("Get the hash of a program binary from the deployed buffer address") .arg(Arg::with_name("buffer_address") .required(true) .help("Address of the buffer account containing the deployed program data"))) - .subcommand(SubCommand::with_name("verifyfromrepo") + .subcommand(SubCommand::with_name("verify-from-repo") .about("Builds and verifies a program from a given repository URL and a program ID") .arg(Arg::with_name("remote") .long("remote") @@ -173,12 +173,12 @@ async fn main() -> anyhow::Result<()> { .last(true) .help("Arguments to pass to the underlying `cargo build-bpf` command"))) .subcommand(SubCommand::with_name("close") - .about("Close the Otter Verify PDA") + .about("") .arg(Arg::with_name("program_id") .long("program_id") .required(true) .takes_value(true) - .help("Close the Otter Verify PDA"))) + .help(""))) .get_matches(); let res = match matches.subcommand() { From 680b3663aa2f9d344d73b6f5717a4d1fe58daeff Mon Sep 17 00:00:00 2001 From: ASCorreia <36857753+ASCorreia@users.noreply.github.com> Date: Fri, 4 Oct 2024 02:37:37 +0100 Subject: [PATCH 131/314] minor changes --- src/main.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index 2928746..b8c3a87 100644 --- a/src/main.rs +++ b/src/main.rs @@ -190,7 +190,7 @@ async fn main() -> anyhow::Result<()> { let cargo_args = sub_m.values_of("cargo_args").unwrap_or_default().map(|s| s.to_string()).collect(); build(mount_directory, library_name, base_image, bpf_flag, cargo_args, &mut container_id) }, - ("verifyfromimage", Some(sub_m)) => { + ("verify-from-image", Some(sub_m)) => { let executable_path = sub_m.value_of("executable_path_in_image").unwrap(); let image = sub_m.value_of("image").unwrap(); let program_id = sub_m.value_of("program_id").unwrap(); @@ -205,25 +205,25 @@ async fn main() -> anyhow::Result<()> { &mut container_id, ) }, - ("getexecutablehash", Some(sub_m)) => { + ("get-executable-hash", Some(sub_m)) => { let filepath = sub_m.value_of("filepath").map(|s| s.to_string()).unwrap(); let program_hash = get_file_hash(&filepath)?; println!("{}", program_hash); Ok(()) }, - ("getbufferhash", Some(sub_m)) => { + ("get-buffer-hash", Some(sub_m)) => { let buffer_address = sub_m.value_of("buffer_address").unwrap(); let buffer_hash = get_buffer_hash(matches.value_of("url").map(|s| s.to_string()), Pubkey::try_from(buffer_address)?)?; println!("{}", buffer_hash); Ok(()) }, - ("getprogramhash", Some(sub_m)) => { + ("get-program-hash", Some(sub_m)) => { let program_id = sub_m.value_of("program_id").unwrap(); let program_hash = get_program_hash(matches.value_of("url").map(|s| s.to_string()), Pubkey::try_from(program_id)?)?; println!("{}", program_hash); Ok(()) }, - ("verifyfromrepo", Some(sub_m)) => { + ("verify-from-repo", Some(sub_m)) => { let remote = sub_m.is_present("remote"); let mount_path = sub_m.value_of("mount_path").map(|s| s.to_string()).unwrap(); let repo_url = sub_m.value_of("repo_url").map(|s| s.to_string()).unwrap(); From 0631359acaa25cb2cc027024c25f89263f96cce7 Mon Sep 17 00:00:00 2001 From: ASCorreia <36857753+ASCorreia@users.noreply.github.com> Date: Fri, 4 Oct 2024 02:48:31 +0100 Subject: [PATCH 132/314] minor changes --- src/main.rs | 94 ++++++++++++++++++++++++++--------------------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/src/main.rs b/src/main.rs index b8c3a87..148b37f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -72,30 +72,30 @@ async fn main() -> anyhow::Result<()> { .help("Optionally include your RPC endpoint. Defaults to Solana CLI config file")) .subcommand(SubCommand::with_name("build") .about("Deterministically build the program in a Docker container") - .arg(Arg::with_name("mount_directory") + .arg(Arg::with_name("mount-directory") .help("Path to mount to the docker image") .takes_value(true)) - .arg(Arg::with_name("library_name") - .long("library_name") + .arg(Arg::with_name("library-name") + .long("library-name") .takes_value(true) .help("Which binary file to build")) - .arg(Arg::with_name("base_image") + .arg(Arg::with_name("base-image") .short("b") - .long("base_image") + .long("base-image") .takes_value(true) .help("Optionally specify a custom base docker image to use for building")) .arg(Arg::with_name("bpf") .long("bpf") .help("If the program requires cargo build-bpf (instead of cargo build-sbf), set this flag")) - .arg(Arg::with_name("cargo_args") + .arg(Arg::with_name("cargo-args") .multiple(true) .last(true) .help("Arguments to pass to the underlying `cargo build-bpf` command"))) .subcommand(SubCommand::with_name("verify-from-image") .about("Verifies a cached build from a docker image") - .arg(Arg::with_name("executable_path_in_image") + .arg(Arg::with_name("executable-path-in-image") .short("e") - .long("executable_path_in_image") + .long("executable-path-in-image") .takes_value(true) .required(true) .help("Path to the executable solana program within the source code repository in the docker image")) @@ -105,14 +105,14 @@ async fn main() -> anyhow::Result<()> { .takes_value(true) .required(true) .help("Image that contains the source code to be verified")) - .arg(Arg::with_name("program_id") + .arg(Arg::with_name("program-id") .short("p") - .long("program_id") + .long("program-id") .takes_value(true) .required(true) .help("The Program ID of the program to verify")) - .arg(Arg::with_name("current_dir") - .long("current_dir") + .arg(Arg::with_name("current-dir") + .long("current-dir") .help("Verify in current directory"))) .subcommand(SubCommand::with_name("get-executable-hash") .about("Get the hash of a program binary from an executable file") @@ -121,12 +121,12 @@ async fn main() -> anyhow::Result<()> { .help("Path to the executable solana program"))) .subcommand(SubCommand::with_name("get-program-hash") .about("Get the hash of a program binary from the deployed on-chain program") - .arg(Arg::with_name("program_id") + .arg(Arg::with_name("program-id") .required(true) .help("The Program ID of the program to verify"))) .subcommand(SubCommand::with_name("get-buffer-hash") .about("Get the hash of a program binary from the deployed buffer address") - .arg(Arg::with_name("buffer_address") + .arg(Arg::with_name("buffer-address") .required(true) .help("Address of the buffer account containing the deployed program data"))) .subcommand(SubCommand::with_name("verify-from-repo") @@ -136,46 +136,46 @@ async fn main() -> anyhow::Result<()> { .help("Send the verify command to a remote machine") .default_value("false") .takes_value(false)) - .arg(Arg::with_name("mount_path") - .long("mount_path") + .arg(Arg::with_name("mount-path") + .long("mount-path") .takes_value(true) .default_value("") .help("Relative path to the root directory or the source code repository from which to build the program")) - .arg(Arg::with_name("repo_url") + .arg(Arg::with_name("repo-url") .required(true) .help("The HTTPS URL of the repo to clone")) - .arg(Arg::with_name("commit_hash") - .long("commit_hash") + .arg(Arg::with_name("commit-hash") + .long("commit-hash") .takes_value(true) .help("Optional commit hash to checkout")) - .arg(Arg::with_name("program_id") - .long("program_id") + .arg(Arg::with_name("program-id") + .long("program-id") .required(true) .takes_value(true) .help("The Program ID of the program to verify")) - .arg(Arg::with_name("base_image") + .arg(Arg::with_name("base-image") .short("b") - .long("base_image") + .long("base-image") .takes_value(true) .help("Optionally specify a custom base docker image to use for building")) - .arg(Arg::with_name("library_name") - .long("library_name") + .arg(Arg::with_name("library-name") + .long("library-name") .takes_value(true) .help("Specify the name of the library to build and verify")) .arg(Arg::with_name("bpf") .long("bpf") .help("If the program requires cargo build-bpf (instead of cargo build-sbf), set this flag")) - .arg(Arg::with_name("current_dir") - .long("current_dir") + .arg(Arg::with_name("current-dir") + .long("current-dir") .help("Verify in current directory")) - .arg(Arg::with_name("cargo_args") + .arg(Arg::with_name("cargo-args") .multiple(true) .last(true) .help("Arguments to pass to the underlying `cargo build-bpf` command"))) .subcommand(SubCommand::with_name("close") .about("") - .arg(Arg::with_name("program_id") - .long("program_id") + .arg(Arg::with_name("program-id") + .long("program-id") .required(true) .takes_value(true) .help(""))) @@ -183,18 +183,18 @@ async fn main() -> anyhow::Result<()> { let res = match matches.subcommand() { ("build", Some(sub_m)) => { - let mount_directory = sub_m.value_of("mount_directory").map(|s| s.to_string()); - let library_name = sub_m.value_of("library_name").map(|s| s.to_string()); - let base_image = sub_m.value_of("base_image").map(|s| s.to_string()); + let mount_directory = sub_m.value_of("mount-directory").map(|s| s.to_string()); + let library_name = sub_m.value_of("library-name").map(|s| s.to_string()); + let base_image = sub_m.value_of("base-image").map(|s| s.to_string()); let bpf_flag = sub_m.is_present("bpf"); - let cargo_args = sub_m.values_of("cargo_args").unwrap_or_default().map(|s| s.to_string()).collect(); + let cargo_args = sub_m.values_of("cargo-args").unwrap_or_default().map(|s| s.to_string()).collect(); build(mount_directory, library_name, base_image, bpf_flag, cargo_args, &mut container_id) }, ("verify-from-image", Some(sub_m)) => { - let executable_path = sub_m.value_of("executable_path_in_image").unwrap(); + let executable_path = sub_m.value_of("executable-path-in-image").unwrap(); let image = sub_m.value_of("image").unwrap(); - let program_id = sub_m.value_of("program_id").unwrap(); - let current_dir = sub_m.is_present("current_dir"); + let program_id = sub_m.value_of("program-id").unwrap(); + let current_dir = sub_m.is_present("current-dir"); verify_from_image( executable_path.to_string(), image.to_string(), @@ -212,28 +212,28 @@ async fn main() -> anyhow::Result<()> { Ok(()) }, ("get-buffer-hash", Some(sub_m)) => { - let buffer_address = sub_m.value_of("buffer_address").unwrap(); + let buffer_address = sub_m.value_of("buffer-address").unwrap(); let buffer_hash = get_buffer_hash(matches.value_of("url").map(|s| s.to_string()), Pubkey::try_from(buffer_address)?)?; println!("{}", buffer_hash); Ok(()) }, ("get-program-hash", Some(sub_m)) => { - let program_id = sub_m.value_of("program_id").unwrap(); + let program_id = sub_m.value_of("program-id").unwrap(); let program_hash = get_program_hash(matches.value_of("url").map(|s| s.to_string()), Pubkey::try_from(program_id)?)?; println!("{}", program_hash); Ok(()) }, ("verify-from-repo", Some(sub_m)) => { let remote = sub_m.is_present("remote"); - let mount_path = sub_m.value_of("mount_path").map(|s| s.to_string()).unwrap(); - let repo_url = sub_m.value_of("repo_url").map(|s| s.to_string()).unwrap(); - let commit_hash = sub_m.value_of("commit_hash").map(|s| s.to_string()); - let program_id = sub_m.value_of("program_id").unwrap(); - let base_image = sub_m.value_of("base_image").map(|s| s.to_string()); - let library_name = sub_m.value_of("library_name").map(|s| s.to_string()); + let mount_path = sub_m.value_of("mount-path").map(|s| s.to_string()).unwrap(); + let repo_url = sub_m.value_of("repo-url").map(|s| s.to_string()).unwrap(); + let commit_hash = sub_m.value_of("commit-hash").map(|s| s.to_string()); + let program_id = sub_m.value_of("program-id").unwrap(); + let base_image = sub_m.value_of("base-image").map(|s| s.to_string()); + let library_name = sub_m.value_of("library-name").map(|s| s.to_string()); let bpf_flag = sub_m.is_present("bpf"); - let current_dir = sub_m.is_present("current_dir"); - let cargo_args: Vec = sub_m.values_of("cargo_args").unwrap_or_default().map(|s| s.to_string()).collect(); + let current_dir = sub_m.is_present("current-dir"); + let cargo_args: Vec = sub_m.values_of("cargo-args").unwrap_or_default().map(|s| s.to_string()).collect(); verify_from_repo( remote, From d8d2122b51473902835e52f2d2225856a9a406bd Mon Sep 17 00:00:00 2001 From: ASCorreia <36857753+ASCorreia@users.noreply.github.com> Date: Fri, 4 Oct 2024 21:34:36 +0100 Subject: [PATCH 133/314] added connection_url to uplaod_program --- src/main.rs | 3 ++- src/solana_program.rs | 11 ++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 148b37f..31ac7c1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -838,7 +838,7 @@ pub async fn verify_from_repo( base_image.clone(), bpf_flag, library_name.clone(), - connection_url, + connection_url.clone(), program_id, cargo_args.clone(), container_id_opt, @@ -861,6 +861,7 @@ pub async fn verify_from_repo( &commit_hash.clone(), args.iter().map(|&s| s.into()).collect(), program_id, + connection_url, ) .await; if x.is_err() { diff --git a/src/solana_program.rs b/src/solana_program.rs index 38e9f47..23f089d 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -2,8 +2,7 @@ use anyhow::anyhow; use solana_cli_config::Config; use solana_client::rpc_client::RpcClient; use std::{ - io::{self, Read, Write}, - str::FromStr, + io::{self, Read, Write}, str::FromStr }; use borsh::{to_vec, BorshDeserialize, BorshSerialize}; @@ -132,11 +131,17 @@ pub async fn upload_program( commit: &Option, args: Vec, program_address: Pubkey, + connection_url: Option, ) -> anyhow::Result<()> { if prompt_user_input("Do you want to update it to On-Chain Program ?. (Y/n) ") { println!("Uploading the program verification params to the Solana blockchain..."); - let cli_config = get_user_config()?; + let mut cli_config = get_user_config()?; + + if connection_url.is_some() { + cli_config.1 = RpcClient::new(connection_url.unwrap()); + } + let signer_pubkey = cli_config.0.pubkey(); let connection = cli_config.1; let rpc_url = connection.url(); From d6a1510bbed7bf5eb71904d19c2c01004e2bacfb Mon Sep 17 00:00:00 2001 From: ASCorreia <36857753+ASCorreia@users.noreply.github.com> Date: Fri, 4 Oct 2024 21:37:14 +0100 Subject: [PATCH 134/314] minor changes --- src/solana_program.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/solana_program.rs b/src/solana_program.rs index 23f089d..e61b524 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -139,7 +139,8 @@ pub async fn upload_program( let mut cli_config = get_user_config()?; if connection_url.is_some() { - cli_config.1 = RpcClient::new(connection_url.unwrap()); + println!("Using custom connection URL: {}", connection_url.as_ref().unwrap()); + cli_config.1 = RpcClient::new(connection_url.as_ref().unwrap()); } let signer_pubkey = cli_config.0.pubkey(); From fb2f3a73496c8da130238c89d01bdbd6b4138460 Mon Sep 17 00:00:00 2001 From: ASCorreia <36857753+ASCorreia@users.noreply.github.com> Date: Fri, 4 Oct 2024 21:50:35 +0100 Subject: [PATCH 135/314] minor changes --- src/solana_program.rs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/solana_program.rs b/src/solana_program.rs index e61b524..5c23f7c 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -136,19 +136,21 @@ pub async fn upload_program( if prompt_user_input("Do you want to update it to On-Chain Program ?. (Y/n) ") { println!("Uploading the program verification params to the Solana blockchain..."); - let mut cli_config = get_user_config()?; - - if connection_url.is_some() { - println!("Using custom connection URL: {}", connection_url.as_ref().unwrap()); - cli_config.1 = RpcClient::new(connection_url.as_ref().unwrap()); - } + let cli_config = get_user_config()?; let signer_pubkey = cli_config.0.pubkey(); - let connection = cli_config.1; + let connection = match connection_url.is_some() { + true => { + println!("Using custom connection url: {}", connection_url.as_ref().unwrap()); + RpcClient::new(connection_url.unwrap()) + }, + false => cli_config.1 + }; let rpc_url = connection.url(); let last_deployed_slot = get_last_deployed_slot(&rpc_url, &program_address.to_string()).await .map_err(|err| anyhow!("Unable to get last deployed slot: {}", err))?; + println!("Last deployed slot: {}", last_deployed_slot); let input_params = InputParams { version: env!("CARGO_PKG_VERSION").to_string(), From 675f3c29c3735d4ad5cbf228b56325e43d15ee76 Mon Sep 17 00:00:00 2001 From: ASCorreia <36857753+ASCorreia@users.noreply.github.com> Date: Fri, 4 Oct 2024 22:04:53 +0100 Subject: [PATCH 136/314] set custom rpc_client --- src/solana_program.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/solana_program.rs b/src/solana_program.rs index 5c23f7c..52b29f0 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -82,11 +82,12 @@ fn process_otter_verify_ixs( pda_account: Pubkey, program_address: Pubkey, instruction: OtterVerifyInstructions, + rpc_client: RpcClient, ) -> anyhow::Result<()> { let user_config = get_user_config()?; let signer = user_config.0; let signer_pubkey = signer.pubkey(); - let connection = user_config.1; + let connection = rpc_client; let ix_data = if instruction != OtterVerifyInstructions::Close { create_ix_data(params, &instruction) @@ -150,7 +151,6 @@ pub async fn upload_program( let last_deployed_slot = get_last_deployed_slot(&rpc_url, &program_address.to_string()).await .map_err(|err| anyhow!("Unable to get last deployed slot: {}", err))?; - println!("Last deployed slot: {}", last_deployed_slot); let input_params = InputParams { version: env!("CARGO_PKG_VERSION").to_string(), @@ -187,6 +187,7 @@ pub async fn upload_program( pda_account_1, program_address, OtterVerifyInstructions::Update, + connection, )?; } else if connection.get_account(&pda_account_2).is_ok() { let wanna_create_new_pda = prompt_user_input( @@ -198,6 +199,7 @@ pub async fn upload_program( pda_account_1, program_address, OtterVerifyInstructions::Initialize, + connection, )?; } return Ok(()); @@ -208,6 +210,7 @@ pub async fn upload_program( pda_account_1, program_address, OtterVerifyInstructions::Initialize, + connection, )?; } } else { @@ -249,6 +252,7 @@ pub async fn process_close(program_address: Pubkey) -> anyhow::Result<()> { pda_account, program_address, OtterVerifyInstructions::Close, + connection, )?; } else { return Err(anyhow!( From 74a68f501e5671b54a827bd2cf7fc27ffc403655 Mon Sep 17 00:00:00 2001 From: ASCorreia <36857753+ASCorreia@users.noreply.github.com> Date: Sat, 5 Oct 2024 02:49:26 +0100 Subject: [PATCH 137/314] improved rpc client connection --- src/solana_program.rs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/solana_program.rs b/src/solana_program.rs index 52b29f0..6e1f6b0 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -140,14 +140,23 @@ pub async fn upload_program( let cli_config = get_user_config()?; let signer_pubkey = cli_config.0.pubkey(); - let connection = match connection_url.is_some() { - true => { - println!("Using custom connection url: {}", connection_url.as_ref().unwrap()); - RpcClient::new(connection_url.unwrap()) + let connection = match connection_url.as_deref() { + Some("m") => { + RpcClient::new("https://api.mainnet-beta.solana.com") }, - false => cli_config.1 + Some("d") => { + RpcClient::new("https://api.devnet.solana.com") + }, + Some("l") => { + RpcClient::new("http://localhost:8899") + }, + Some(url) => { + RpcClient::new(url) + }, + None => cli_config.1, }; let rpc_url = connection.url(); + println!("Using connection url: {}", rpc_url); let last_deployed_slot = get_last_deployed_slot(&rpc_url, &program_address.to_string()).await .map_err(|err| anyhow!("Unable to get last deployed slot: {}", err))?; From 9a527e31165798ff46abe5e4ca21c2d2ccf5fe25 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Tue, 15 Oct 2024 13:44:43 +0530 Subject: [PATCH 138/314] Added logs url message for user clarity --- src/api/client.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/api/client.rs b/src/api/client.rs index 59a7859..8af0bc9 100644 --- a/src/api/client.rs +++ b/src/api/client.rs @@ -110,6 +110,7 @@ pub async fn send_job_to_remote( if response.status().is_success() { let status_response: VerifyResponse = response.json().await?; + let request_id = status_response.request_id; println!("Verification request sent. ✅"); println!("Verification in progress... ⏳"); // Span new thread for polling the server for status @@ -119,7 +120,7 @@ pub async fn send_job_to_remote( let handle = thread::spawn(move || loading_animation(receiver)); // Poll the server for status loop { - let status = check_job_status(&client, &status_response.request_id).await?; + let status = check_job_status(&client, &request_id).await?; match status.status { JobStatus::InProgress => { thread::sleep(Duration::from_secs(10)); @@ -151,6 +152,7 @@ pub async fn send_job_to_remote( let status_response: JobVerificationResponse = status.respose.unwrap(); println!("Program {} has not been verified. ❌", program_id); eprintln!("Error message: {}", status_response.message.as_str()); + println!("You can check the logs for more details here: {}/logs/{}", REMOTE_SERVER_URL, request_id); break; } JobStatus::Unknown => { From 6b992f5d2aebbd8f8418e55a1c0651a0409dfaf9 Mon Sep 17 00:00:00 2001 From: ASCorreia <36857753+ASCorreia@users.noreply.github.com> Date: Wed, 16 Oct 2024 20:50:19 +0400 Subject: [PATCH 139/314] Minor changes to error messages --- .gitignore | 1 + src/main.rs | 8 ++++---- src/solana_program.rs | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index b60de5b..c77f2e7 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ **/target +.DS_Store diff --git a/src/main.rs b/src/main.rs index 31ac7c1..f6601f3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -252,7 +252,7 @@ async fn main() -> anyhow::Result<()> { ).await } // Handle other subcommands in a similar manner, for now let's panic - _ => panic!("Unknown subcommand"), + _ => panic!("Unknown subcommand: {:?}\nUse '--help' to see available commands", matches.subcommand().0) }; if caught_signal.load(Ordering::Relaxed) || res.is_err() { @@ -269,15 +269,15 @@ async fn main() -> anyhow::Result<()> { } } if let Some(temp_dir) = temp_dir.clone().take() { - println!("Removing temp dir {}", temp_dir); + println!("Removing temporary directory {}", temp_dir); if std::process::Command::new("rm") .args(["-rf", &temp_dir]) .output() .is_err() { - println!("Failed to remove temp dir"); + println!("Failed to remove temporary directory"); } else { - println!("Removed temp dir {}", temp_dir); + println!("Removed temporary directory {}", temp_dir); } } } diff --git a/src/solana_program.rs b/src/solana_program.rs index 6e1f6b0..6b4c7d2 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -62,7 +62,7 @@ fn create_ix_data(params: &InputParams, ix: &OtterVerifyInstructions) -> Vec fn get_user_config() -> anyhow::Result<(Keypair, RpcClient)> { let config_file = solana_cli_config::CONFIG_FILE .as_ref() - .ok_or_else(|| anyhow!("unable to get config file path"))?; + .ok_or_else(|| anyhow!("Unable to get config file path"))?; let cli_config: Config = Config::load(config_file)?; let signer = solana_clap_utils::keypair::keypair_from_path( @@ -134,7 +134,7 @@ pub async fn upload_program( program_address: Pubkey, connection_url: Option, ) -> anyhow::Result<()> { - if prompt_user_input("Do you want to update it to On-Chain Program ?. (Y/n) ") { + if prompt_user_input("Do you want to upload the program verification to the Solana Blockchain? (y/n) ") { println!("Uploading the program verification params to the Solana blockchain..."); let cli_config = get_user_config()?; From 7c6face5346c0109d0e5500b916075549c4e72b6 Mon Sep 17 00:00:00 2001 From: ASCorreia <36857753+ASCorreia@users.noreply.github.com> Date: Sat, 19 Oct 2024 22:11:56 +0400 Subject: [PATCH 140/314] Logging osec status --- src/api/client.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/api/client.rs b/src/api/client.rs index 59a7859..fc0ccee 100644 --- a/src/api/client.rs +++ b/src/api/client.rs @@ -161,15 +161,22 @@ pub async fn send_job_to_remote( } } } + let url = format!("https://verify.osec.io/status/{}", program_id); + println!("Check the status at: {}", url); Ok(()) } else if response.status() == 409 { let response = response.json::().await?; eprintln!("Error: {}", response.error.as_str()); + let url = format!("https://verify.osec.io/status/{}", program_id); + println!("Check the status at: {}", url); Ok(()) } else { eprintln!("Encountered an error while attempting to send the job to remote"); - Err(anyhow!("{:?}", response.text().await?))? + Err(anyhow!("{:?}", response.text().await?))?; + let url = format!("https://verify.osec.io/status/{}", program_id); + println!("Check the status at: {}", url); + Ok(()) } } From 309721e5e0236cb1c6da7edcf921be19337613ea Mon Sep 17 00:00:00 2001 From: ASCorreia <36857753+ASCorreia@users.noreply.github.com> Date: Sat, 19 Oct 2024 23:14:03 +0400 Subject: [PATCH 141/314] Logging job status --- src/api/client.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/api/client.rs b/src/api/client.rs index fc0ccee..ed17c23 100644 --- a/src/api/client.rs +++ b/src/api/client.rs @@ -162,20 +162,21 @@ pub async fn send_job_to_remote( } } let url = format!("https://verify.osec.io/status/{}", program_id); - println!("Check the status at: {}", url); + println!("Check the verification status at: {}", url); + println!("Job url: {}", &format!("{}/job/{}", REMOTE_SERVER_URL, status_response.request_id)); Ok(()) } else if response.status() == 409 { let response = response.json::().await?; eprintln!("Error: {}", response.error.as_str()); - let url = format!("https://verify.osec.io/status/{}", program_id); + let url = format!("{}/status/{}", REMOTE_SERVER_URL, program_id); println!("Check the status at: {}", url); Ok(()) } else { eprintln!("Encountered an error while attempting to send the job to remote"); Err(anyhow!("{:?}", response.text().await?))?; - let url = format!("https://verify.osec.io/status/{}", program_id); - println!("Check the status at: {}", url); + let url = format!("{}/status/{}", REMOTE_SERVER_URL, program_id); + println!("Check the verification status at: {}", url); Ok(()) } } From 964229fdc7fdf5645cbca465333a848210e78c59 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 21 Oct 2024 10:01:07 -0400 Subject: [PATCH 142/314] handle case where dirty set includes new images --- generate_dockerfiles.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/generate_dockerfiles.py b/generate_dockerfiles.py index 691c052..febcb61 100644 --- a/generate_dockerfiles.py +++ b/generate_dockerfiles.py @@ -115,15 +115,24 @@ def get_toolchain(version_tag): ) path = f"docker/{release}.Dockerfile" - with open(path, "r") as f: - prev = f.read() - - if prev != dockerfile: + + # Check if the file exists before trying to read it + if os.path.exists(path): + with open(path, "r") as f: + prev = f.read() + + if prev != dockerfile: + dirty_set.add(release.strip("v")) + print(f"{release} needs to be updated") + else: + # If the file doesn't exist, consider it as dirty dirty_set.add(release.strip("v")) - print(release) + print(f"{release} is new and needs to be created") + # Write the new or updated Dockerfile with open(path, "w") as f: f.write(dockerfile) + dockerfiles[release] = path print(RUST_DOCKER_IMAGESHA_MAP) From eb2d281977f02a77c0c5c8c1e8e5cc8f6162b790 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 21 Oct 2024 10:25:24 -0400 Subject: [PATCH 143/314] add workflow --- .github/workflows/generate_dockerfiles.yml | 46 +++++++++++ pyproject.toml | 9 +++ uv.lock | 94 ++++++++++++++++++++++ 3 files changed, 149 insertions(+) create mode 100644 .github/workflows/generate_dockerfiles.yml create mode 100644 pyproject.toml create mode 100644 uv.lock diff --git a/.github/workflows/generate_dockerfiles.yml b/.github/workflows/generate_dockerfiles.yml new file mode 100644 index 0000000..d539e5f --- /dev/null +++ b/.github/workflows/generate_dockerfiles.yml @@ -0,0 +1,46 @@ +name: Generate Dockerfiles + +on: + workflow_dispatch: + +jobs: + generate-dockerfiles: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Install uv + uses: astral-sh/setup-uv@v3 + with: + enable-cache: true + cache-dependency-glob: "uv.lock" + + - name: "Set up Python" + uses: actions/setup-python@v5 + with: + python-version-file: "pyproject.toml" + + - name: Install dependencies with uv + run: | + uv sync --all-extras --dev + + - name: Run generate_dockerfiles.py + run: uv python generate_dockerfiles.py + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v5 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: Update Dockerfiles + title: 'Update Dockerfiles' + body: | + This PR updates the Dockerfiles in the `docker/` directory. + + Generated automatically by the Generate Dockerfiles workflow. + branch: update-dockerfiles + delete-branch: true + base: main + labels: | + automated pr + dockerfiles diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..c207ada --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,9 @@ +[project] +name = "solana-verifiable-build" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.12" +dependencies = [ + "requests>=2.32.3", +] diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..2717733 --- /dev/null +++ b/uv.lock @@ -0,0 +1,94 @@ +version = 1 +requires-python = ">=3.12" + +[[package]] +name = "certifi" +version = "2024.8.30" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9", size = 168507 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", size = 167321 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", size = 106620 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/0b/4b7a70987abf9b8196845806198975b6aab4ce016632f817ad758a5aa056/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", size = 194445 }, + { url = "https://files.pythonhosted.org/packages/50/89/354cc56cf4dd2449715bc9a0f54f3aef3dc700d2d62d1fa5bbea53b13426/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", size = 125275 }, + { url = "https://files.pythonhosted.org/packages/fa/44/b730e2a2580110ced837ac083d8ad222343c96bb6b66e9e4e706e4d0b6df/charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", size = 119020 }, + { url = "https://files.pythonhosted.org/packages/9d/e4/9263b8240ed9472a2ae7ddc3e516e71ef46617fe40eaa51221ccd4ad9a27/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", size = 139128 }, + { url = "https://files.pythonhosted.org/packages/6b/e3/9f73e779315a54334240353eaea75854a9a690f3f580e4bd85d977cb2204/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", size = 149277 }, + { url = "https://files.pythonhosted.org/packages/1a/cf/f1f50c2f295312edb8a548d3fa56a5c923b146cd3f24114d5adb7e7be558/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", size = 142174 }, + { url = "https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", size = 143838 }, + { url = "https://files.pythonhosted.org/packages/a4/01/2117ff2b1dfc61695daf2babe4a874bca328489afa85952440b59819e9d7/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", size = 146149 }, + { url = "https://files.pythonhosted.org/packages/f6/9b/93a332b8d25b347f6839ca0a61b7f0287b0930216994e8bf67a75d050255/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", size = 140043 }, + { url = "https://files.pythonhosted.org/packages/ab/f6/7ac4a01adcdecbc7a7587767c776d53d369b8b971382b91211489535acf0/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", size = 148229 }, + { url = "https://files.pythonhosted.org/packages/9d/be/5708ad18161dee7dc6a0f7e6cf3a88ea6279c3e8484844c0590e50e803ef/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", size = 151556 }, + { url = "https://files.pythonhosted.org/packages/5a/bb/3d8bc22bacb9eb89785e83e6723f9888265f3a0de3b9ce724d66bd49884e/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", size = 149772 }, + { url = "https://files.pythonhosted.org/packages/f7/fa/d3fc622de05a86f30beea5fc4e9ac46aead4731e73fd9055496732bcc0a4/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", size = 144800 }, + { url = "https://files.pythonhosted.org/packages/9a/65/bdb9bc496d7d190d725e96816e20e2ae3a6fa42a5cac99c3c3d6ff884118/charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", size = 94836 }, + { url = "https://files.pythonhosted.org/packages/3e/67/7b72b69d25b89c0b3cea583ee372c43aa24df15f0e0f8d3982c57804984b/charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", size = 102187 }, + { url = "https://files.pythonhosted.org/packages/f3/89/68a4c86f1a0002810a27f12e9a7b22feb198c59b2f05231349fbce5c06f4/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", size = 194617 }, + { url = "https://files.pythonhosted.org/packages/4f/cd/8947fe425e2ab0aa57aceb7807af13a0e4162cd21eee42ef5b053447edf5/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", size = 125310 }, + { url = "https://files.pythonhosted.org/packages/5b/f0/b5263e8668a4ee9becc2b451ed909e9c27058337fda5b8c49588183c267a/charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", size = 119126 }, + { url = "https://files.pythonhosted.org/packages/ff/6e/e445afe4f7fda27a533f3234b627b3e515a1b9429bc981c9a5e2aa5d97b6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", size = 139342 }, + { url = "https://files.pythonhosted.org/packages/a1/b2/4af9993b532d93270538ad4926c8e37dc29f2111c36f9c629840c57cd9b3/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", size = 149383 }, + { url = "https://files.pythonhosted.org/packages/fb/6f/4e78c3b97686b871db9be6f31d64e9264e889f8c9d7ab33c771f847f79b7/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", size = 142214 }, + { url = "https://files.pythonhosted.org/packages/2b/c9/1c8fe3ce05d30c87eff498592c89015b19fade13df42850aafae09e94f35/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", size = 144104 }, + { url = "https://files.pythonhosted.org/packages/ee/68/efad5dcb306bf37db7db338338e7bb8ebd8cf38ee5bbd5ceaaaa46f257e6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", size = 146255 }, + { url = "https://files.pythonhosted.org/packages/0c/75/1ed813c3ffd200b1f3e71121c95da3f79e6d2a96120163443b3ad1057505/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", size = 140251 }, + { url = "https://files.pythonhosted.org/packages/7d/0d/6f32255c1979653b448d3c709583557a4d24ff97ac4f3a5be156b2e6a210/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", size = 148474 }, + { url = "https://files.pythonhosted.org/packages/ac/a0/c1b5298de4670d997101fef95b97ac440e8c8d8b4efa5a4d1ef44af82f0d/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", size = 151849 }, + { url = "https://files.pythonhosted.org/packages/04/4f/b3961ba0c664989ba63e30595a3ed0875d6790ff26671e2aae2fdc28a399/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", size = 149781 }, + { url = "https://files.pythonhosted.org/packages/d8/90/6af4cd042066a4adad58ae25648a12c09c879efa4849c705719ba1b23d8c/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482", size = 144970 }, + { url = "https://files.pythonhosted.org/packages/cc/67/e5e7e0cbfefc4ca79025238b43cdf8a2037854195b37d6417f3d0895c4c2/charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", size = 94973 }, + { url = "https://files.pythonhosted.org/packages/65/97/fc9bbc54ee13d33dc54a7fcf17b26368b18505500fc01e228c27b5222d80/charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", size = 102308 }, + { url = "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", size = 49446 }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, +] + +[[package]] +name = "solana-verifiable-build" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "requests" }, +] + +[package.metadata] +requires-dist = [{ name = "requests", specifier = ">=2.32.3" }] + +[[package]] +name = "urllib3" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", size = 300677 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338 }, +] From d3b016abd5078da96fff7a1540cd46e685775fca Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 21 Oct 2024 10:29:59 -0400 Subject: [PATCH 144/314] uv run not uv python --- .github/workflows/generate_dockerfiles.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/generate_dockerfiles.yml b/.github/workflows/generate_dockerfiles.yml index d539e5f..2cc8a96 100644 --- a/.github/workflows/generate_dockerfiles.yml +++ b/.github/workflows/generate_dockerfiles.yml @@ -26,7 +26,7 @@ jobs: uv sync --all-extras --dev - name: Run generate_dockerfiles.py - run: uv python generate_dockerfiles.py + run: uv run generate_dockerfiles.py - name: Create Pull Request uses: peter-evans/create-pull-request@v5 From 959ead784e56f4ac8b8144493193679d9744e992 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 21 Oct 2024 10:33:04 -0400 Subject: [PATCH 145/314] fix pr target branch --- .github/workflows/generate_dockerfiles.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/generate_dockerfiles.yml b/.github/workflows/generate_dockerfiles.yml index 2cc8a96..9c92a15 100644 --- a/.github/workflows/generate_dockerfiles.yml +++ b/.github/workflows/generate_dockerfiles.yml @@ -40,7 +40,7 @@ jobs: Generated automatically by the Generate Dockerfiles workflow. branch: update-dockerfiles delete-branch: true - base: main + base: master labels: | automated pr dockerfiles From eb11f39bf90d5bea948dc88c5027e76f24540527 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 21 Oct 2024 10:42:21 -0400 Subject: [PATCH 146/314] use PAT for PRs --- .github/workflows/generate_dockerfiles.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/generate_dockerfiles.yml b/.github/workflows/generate_dockerfiles.yml index 9c92a15..806f924 100644 --- a/.github/workflows/generate_dockerfiles.yml +++ b/.github/workflows/generate_dockerfiles.yml @@ -3,6 +3,10 @@ name: Generate Dockerfiles on: workflow_dispatch: +permissions: + contents: write + pull-requests: write + jobs: generate-dockerfiles: runs-on: ubuntu-latest @@ -31,7 +35,7 @@ jobs: - name: Create Pull Request uses: peter-evans/create-pull-request@v5 with: - token: ${{ secrets.GITHUB_TOKEN }} + token: ${{ secrets.PAT_FOR_ACTIONS }} commit-message: Update Dockerfiles title: 'Update Dockerfiles' body: | From 8f482ecdcb71d4170404595228493a3e1f7cd610 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 21 Oct 2024 10:49:34 -0400 Subject: [PATCH 147/314] use github ci bot to commit gen'd PR --- .github/workflows/generate_dockerfiles.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/generate_dockerfiles.yml b/.github/workflows/generate_dockerfiles.yml index 806f924..5813265 100644 --- a/.github/workflows/generate_dockerfiles.yml +++ b/.github/workflows/generate_dockerfiles.yml @@ -35,7 +35,7 @@ jobs: - name: Create Pull Request uses: peter-evans/create-pull-request@v5 with: - token: ${{ secrets.PAT_FOR_ACTIONS }} + token: ${{ secrets.GITHUB_TOKEN }} commit-message: Update Dockerfiles title: 'Update Dockerfiles' body: | @@ -48,3 +48,5 @@ jobs: labels: | automated pr dockerfiles + author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> + committer: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> From 73ce843244a28bcf1463ce42d2c279058e459c40 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 21 Oct 2024 10:58:37 -0400 Subject: [PATCH 148/314] author by bot --- .github/workflows/generate_dockerfiles.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/generate_dockerfiles.yml b/.github/workflows/generate_dockerfiles.yml index 5813265..df781c3 100644 --- a/.github/workflows/generate_dockerfiles.yml +++ b/.github/workflows/generate_dockerfiles.yml @@ -35,8 +35,10 @@ jobs: - name: Create Pull Request uses: peter-evans/create-pull-request@v5 with: - token: ${{ secrets.GITHUB_TOKEN }} + token: ${{ secrets.PAT_FOR_ACTIONS }} commit-message: Update Dockerfiles + committer: GitHub + author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com> title: 'Update Dockerfiles' body: | This PR updates the Dockerfiles in the `docker/` directory. @@ -48,5 +50,3 @@ jobs: labels: | automated pr dockerfiles - author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> - committer: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> From ed18725852a172eb09eead647dd1cc1a5ee558b2 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 21 Oct 2024 11:09:44 -0400 Subject: [PATCH 149/314] remove unused bot committer info --- .github/workflows/generate_dockerfiles.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/generate_dockerfiles.yml b/.github/workflows/generate_dockerfiles.yml index df781c3..806f924 100644 --- a/.github/workflows/generate_dockerfiles.yml +++ b/.github/workflows/generate_dockerfiles.yml @@ -37,8 +37,6 @@ jobs: with: token: ${{ secrets.PAT_FOR_ACTIONS }} commit-message: Update Dockerfiles - committer: GitHub - author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com> title: 'Update Dockerfiles' body: | This PR updates the Dockerfiles in the `docker/` directory. From 329db6ffcd859f5c781ecb8e485ff1b9991c3aaa Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 21 Oct 2024 13:04:01 -0400 Subject: [PATCH 150/314] author as github bot --- .github/workflows/generate_dockerfiles.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/generate_dockerfiles.yml b/.github/workflows/generate_dockerfiles.yml index 806f924..c8c89d1 100644 --- a/.github/workflows/generate_dockerfiles.yml +++ b/.github/workflows/generate_dockerfiles.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install uv uses: astral-sh/setup-uv@v3 @@ -32,6 +32,10 @@ jobs: - name: Run generate_dockerfiles.py run: uv run generate_dockerfiles.py + - run: | + git config user.name github-actions + git config user.email github-actions@github.com + - name: Create Pull Request uses: peter-evans/create-pull-request@v5 with: From 39af2192dc1b355ff7827c55db6e4a9a54819a5e Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 21 Oct 2024 13:08:35 -0400 Subject: [PATCH 151/314] use app token --- .github/workflows/generate_dockerfiles.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/generate_dockerfiles.yml b/.github/workflows/generate_dockerfiles.yml index c8c89d1..1df4c11 100644 --- a/.github/workflows/generate_dockerfiles.yml +++ b/.github/workflows/generate_dockerfiles.yml @@ -11,6 +11,12 @@ jobs: generate-dockerfiles: runs-on: ubuntu-latest steps: + - uses: actions/create-github-app-token@v1 + id: generate-token + with: + app-id: ${{ vars.ROBO_PR_APP_ID }} + private-key: ${{ secrets.ROBO_PR_CLIENT_SECRET }} + - name: Checkout repository uses: actions/checkout@v4 @@ -32,14 +38,10 @@ jobs: - name: Run generate_dockerfiles.py run: uv run generate_dockerfiles.py - - run: | - git config user.name github-actions - git config user.email github-actions@github.com - - name: Create Pull Request uses: peter-evans/create-pull-request@v5 with: - token: ${{ secrets.PAT_FOR_ACTIONS }} + token: ${{ steps.generate-token.outputs.token }} commit-message: Update Dockerfiles title: 'Update Dockerfiles' body: | From 7ef74efb7c57e400f9fb08f88bf469694ee6334d Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 21 Oct 2024 15:15:31 -0400 Subject: [PATCH 152/314] add v1.18.16 --- Cargo.lock | 2 +- Cargo.toml | 2 +- docker/v1.18.16.Dockerfile | 8 +++++ src/image_config.rs | 60 +++++++++++++++++++------------------- 4 files changed, 40 insertions(+), 32 deletions(-) create mode 100644 docker/v1.18.16.Dockerfile diff --git a/Cargo.lock b/Cargo.lock index 86f6487..ee7b2f4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3619,7 +3619,7 @@ dependencies = [ [[package]] name = "solana-verify" -version = "0.2.12" +version = "0.2.13" dependencies = [ "anyhow", "borsh 1.5.0", diff --git a/Cargo.toml b/Cargo.toml index 33bd56a..427db00 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "solana-verify" -version = "0.2.12" +version = "0.2.13" edition = "2021" description = "A CLI tool for building verifiable Solana programs" license = "MIT" diff --git a/docker/v1.18.16.Dockerfile b/docker/v1.18.16.Dockerfile new file mode 100644 index 0000000..f4e658c --- /dev/null +++ b/docker/v1.18.16.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.16/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/src/image_config.rs b/src/image_config.rs index 309ae6b..0ec4005 100644 --- a/src/image_config.rs +++ b/src/image_config.rs @@ -13,7 +13,6 @@ lazy_static! { m.insert((1, 14, 7), "sha256:b73ccf1e636e278e20c5789b3d3be3e4a72e7813350a93e2ef39a66933175272"); m.insert((1, 14, 8), "sha256:a1f76a938980f4bd05ac92829660a781cab167a9a8dd2179787cf23a17526502"); m.insert((1, 14, 9), "sha256:073eb70e7fa3be8c7d7809e03bdedcf7ddd8744c8004921151c7b1c19fe760fd"); - m.insert((1, 14, 10), "sha256:cbfbe8952496bb22130f6857698491a63a4832f3f8576e469543202ccbfea796"); m.insert((1, 14, 11), "sha256:e82b7df2bb23e6031a04b99e361acb0340b86857e9ad6c76db61fe65757166fd"); m.insert((1, 14, 12), "sha256:15341a61fcee68cd04f0b0b566e8c2a00978899b3d98aa34e4a30bfac7d6deea"); m.insert((1, 14, 13), "sha256:4976bd71a0bfa868c28c456bfb080ac59719c570ca6eb0917b445851c4615af4"); @@ -34,35 +33,35 @@ lazy_static! { m.insert((1, 14, 28), "sha256:4b7a8fcc1d487fe80dfc152d1e49c6067025d5e44bd5d743869fe75b636e4907"); m.insert((1, 14, 29), "sha256:2a38e78a1bcb369a6673b6442f1ee32f99e839445e426c4fdfdc48ee852e346e"); m.insert((1, 16, 0), "sha256:63b59011d4451d461cc1ce3beddc627c648209e151022938a43eafcaa06861b5"); - m.insert((1, 16, 1), "sha256:b923575721bc729e529368af6ddb0a05971c85a69dca9d86517c635a0bf1350e"); + m.insert((1, 16, 1), "sha256:3328149969bfd50dc4ccd0fd61db53f1312cfd8273be3432111ee46a34cf04e4"); m.insert((1, 16, 2), "sha256:3989c28d287659d38a1b3b92d261c7bd7fc92499fe87e1f88cfeb27296dfbfae"); - m.insert((1, 16, 3), "sha256:324aee788745b7b06807d34363e16caa766a9ccb1f68f6b5d6f43581119cfd26"); + m.insert((1, 16, 3), "sha256:e819deea8643d6f4d2f52300148d5de2236df175af7982d400d156f1a69c47d2"); m.insert((1, 16, 4), "sha256:04cb2437921aff3d3b65055742c36efd80f27ba1deeb5740d9758d5d2a7cd143"); m.insert((1, 16, 5), "sha256:bbe60168f1b8cab06020e48e1822d24423794b8acedada88c12c3e99e4d10bf1"); - m.insert((1, 16, 6), "sha256:4982358e725da47f890ff090322aceabbd1619342d9b0173a935a77f0f25dd99"); - m.insert((1, 16, 7), "sha256:bfaf53054066a45def524c3f7aa5699407dc01cf74b1d7060b223753d08e83b4"); - m.insert((1, 16, 8), "sha256:a377f19b7dd3dccc81b4dec69e8dae3b518bb6a058b27075f6078b264e4b4c5c"); + m.insert((1, 16, 6), "sha256:1f6c0032cb1bb12c5ee82b695b2b1ef896cbcae2795514046e5347f371db34bb"); + m.insert((1, 16, 7), "sha256:ee2b096a2c84a8c6e670d5c9973bed744a2b7821521cef8e1ef916276eeb149a"); + m.insert((1, 16, 8), "sha256:5eb24d5a7bae10555a27af158c9e6518005b342bfb0716d45b918c135f7b278c"); m.insert((1, 16, 9), "sha256:c504b12273774f904ba32f51ba1edb369ac3226802b5d0d3e2b03bba486a3143"); m.insert((1, 16, 10), "sha256:ef6901ebabf174eb4a8a4874df6426647663fde723b1092eaa3b7cc464dffd2b"); m.insert((1, 16, 11), "sha256:a2788528b302c4c4144cfcaca35c978a1b420c936201b3b7b80977a289345914"); m.insert((1, 16, 12), "sha256:fa0ddf49a29261a672bce0ab5340d9a4ad45197ba975ad325ed5ecbef9a7a51e"); - m.insert((1, 16, 13), "sha256:255b263d58826d51d00adac9b23f4ea8b7e1e4bc2d13d608c884a260819cfca6"); - m.insert((1, 16, 14), "sha256:0d8df94267a54d944816ccf470cdeed3a7a8a4b430e25e656a30446a1218fe16"); + m.insert((1, 16, 13), "sha256:0ee6802da06f74d999bf32d4816457549549c5d205aba85b0c01ffe982563456"); + m.insert((1, 16, 14), "sha256:1eb74340d1ae38a4c1ae03632ffc63ecfb92d5e3a5971e0c6a27a262999e8b81"); m.insert((1, 16, 15), "sha256:f1077fd6d8bbfbb7bb74d011943840ab477b18a3c4a34def590599ae91dc5ced"); m.insert((1, 16, 16), "sha256:6516d9dd7de0ff660a85b06e7991b61b55980fc48b0301dc2fd464357be6c630"); - m.insert((1, 16, 17), "sha256:c07ac629b03108e4a0d072b52bf1122c93dc922275d1522294726db162bc1d82"); - m.insert((1, 16, 18), "sha256:82254c5155ef6f26de62b16176cd66c41a05aacdf7236ec9038c2248a954a545"); - m.insert((1, 16, 19), "sha256:fa23ec387643045a01b5f879edfbe8f3e01c8047c1e48ba161571f0ec279ca4d"); + m.insert((1, 16, 17), "sha256:a11ca740647ec6bb4c5defdce385e799f0cac94ed4ae43ea54dc97e051530a31"); + m.insert((1, 16, 18), "sha256:5e036ec546573b24771353bcc307df618445b59d7a6cabe7540cc93bb982d0eb"); + m.insert((1, 16, 19), "sha256:767b5e60efd80872b13ff8364e65449dba75e0a681faf2d609863df063954987"); m.insert((1, 16, 20), "sha256:4077c6626a605f9b9d2f050744fc5495cfa5dbf11948e6760a8c5055364bfcdb"); m.insert((1, 16, 21), "sha256:f05e41fb520a6651c31217e7bd77e4bb5e63328dd33e98cb340e624639aca640"); m.insert((1, 16, 22), "sha256:6cd9b344886876f13cb0ea047f58bfcb745d33e0383d420f45f0229e3d7611b8"); - m.insert((1, 16, 23), "sha256:742d8eb1267f09c0cc8ec84676f6d28eaa44a1f3a338b6d91af1b40a22074be3"); - m.insert((1, 16, 24), "sha256:e4734c729e784fba9ad9dc70f274d847074a961f103600c9a504395b6cdc9475"); - m.insert((1, 16, 25), "sha256:8b23dfcc9ea37cb0a275d965cbc729eaf339872759ce63d462401f0485ab9a50"); + m.insert((1, 16, 23), "sha256:fd8fcb3b2ab82a0eb6147b22ed66564788e9be19f759f5af69f713618f2e3c28"); + m.insert((1, 16, 24), "sha256:c39cd5b1ecbd5bb4341d2dc7de9d7bb9631ad48fcc609d94bc9771bba9941746"); + m.insert((1, 16, 25), "sha256:6bfefb55c99a16427a8136dbde438d8ad5710d8200cec7668b1e84609b9fc96a"); m.insert((1, 16, 26), "sha256:b1399b7bff5f37abd52bd1f70a1e14279bddbe68d7a381c30af7a390f2a2b681"); m.insert((1, 16, 27), "sha256:d3f39f5e1d2fbf798149416bbcb050ae8c03ea8ce18c559fc64beb7547f5c96b"); m.insert((1, 17, 0), "sha256:b6a15120904aa5c3d5b2404349478c7577fb25dfd73349829f629b81cd21757d"); - m.insert((1, 17, 1), "sha256:b22eb6d5b64cddf98435a38c0cec4e6702015a63c9cc2d2e8353214a21a13407"); + m.insert((1, 17, 1), "sha256:3ea48411a4a6fdea26f248b4821782d14420dcfda98e63e8b0782b2da42db2c5"); m.insert((1, 17, 2), "sha256:10e43778cfb4a1c57c33c4781b0e51874752ab46ed97e3418d058ba27ee3c813"); m.insert((1, 17, 3), "sha256:c58cf31748b19f03aa21f2d677db0296d98ddc52889953096ab85586b537a770"); m.insert((1, 17, 4), "sha256:cc0e73a825f4688ed897bc4b3e8cd3426e90cba0d53254b19dd93ac49c2eea53"); @@ -71,7 +70,7 @@ lazy_static! { m.insert((1, 17, 7), "sha256:bf95031bb8dc2cd7ac0b9d05b5656a33d5188723859bddfb1dfa5031e04348f2"); m.insert((1, 17, 8), "sha256:007edb91a663b86a5bded18d8db8efb559f89941f51c54fb1f9044c350980c37"); m.insert((1, 17, 9), "sha256:3305eda13a0ed63ddf0a8bb9fb2e8c9a01ba23136f3504da275322efac86d2d7"); - m.insert((1, 17, 10), "sha256:aa33671fa2c90306ce0224bc1676c138a3d867a5cb389a935fad9e48082f0a5c"); + m.insert((1, 17, 10), "sha256:76c4b419c674774d4f6d8f576369b4952145a5336baab243f97a209aa773ecf1"); m.insert((1, 17, 11), "sha256:bbaec57b323f0eaa86ef00fb612a60d6093d27e559f2769b1a6be061a52336e5"); m.insert((1, 17, 12), "sha256:f0f4dfd83424786a64812a53d218264f7900e8cf3286124a071ffa141dfd6051"); m.insert((1, 17, 13), "sha256:21706ce972b8676c37a743cb1fafb471bdaafa42e8c7aed19944966e2dcb63c9"); @@ -80,31 +79,32 @@ lazy_static! { m.insert((1, 17, 16), "sha256:7d6d95378cda2cd6866ae70563bf184e99d3d937632c0033797bcc483ae81597"); m.insert((1, 17, 17), "sha256:b8024cdf9e196490328e4ea0721e403396a6f16a5e825a9af63ced7c703ce9c4"); m.insert((1, 17, 18), "sha256:3c951af1c893a7d509872faed62410de33ff9fc41c2052a8c79f5e44840186d5"); - m.insert((1, 17, 19), "sha256:c0144fd11e72568d8ae4a7311c08871275bff41c6af8984ca7301c84d286e84b"); + m.insert((1, 17, 19), "sha256:a4571591bca47306c7b1aa35747d587fdf8621dc690247f0596cbcaced06ee7f"); m.insert((1, 17, 20), "sha256:7914649a71b10819dbb1f9d5ae440217b83af3f55e8454ff3a1f92e5174148d5"); m.insert((1, 17, 21), "sha256:0a874df16407f8f440d3e647f65047135dd17bfa526eea21d9010e4933214058"); m.insert((1, 17, 22), "sha256:89e8f58ee9fe5c1dbaf5a6852a61423680804ccf0a7b4bad95770e329fb8ef84"); - m.insert((1, 17, 23), "sha256:45b7610a69b8ea0bdc759ac8a273923b84fb6f014a80a3ae1ea741b378324f50"); - m.insert((1, 17, 24), "sha256:096223fcbd814cb1a6270e41a8c5e83931b9e501e38c95ff75e724fc902bd5dc"); + m.insert((1, 17, 23), "sha256:320e37929e0dbb23797e817b089015609acf2e387b0e3c165e43b9db80227105"); + m.insert((1, 17, 24), "sha256:06c5c9011fc7d143ddefc66888dea3e8d91ab6ce95d849ae29e01c507ca5053e"); m.insert((1, 17, 25), "sha256:748d59cfc5465456240c80c8878c5074e46c652b21810579258bcb5ad98d3a65"); - m.insert((1, 17, 26), "sha256:9873c36bd51ca6ba8477acd9ada0a341c148d4dd6473625f41ad69638012863d"); + m.insert((1, 17, 26), "sha256:c968b77df5e307266b4dbfe32ce5cb1f96c1ec0d380005c5ee2372cfb5953629"); m.insert((1, 17, 27), "sha256:31c406d1e64801ed4092790a627c1b36d4407b00d8a90022dacec85ff131c4ae"); - m.insert((1, 17, 28), "sha256:7972c577ff51404e4cead30987df19365425ad722756333dd049684c8c2a189c"); + m.insert((1, 17, 28), "sha256:21511c4de731f494c18b7d51c64cf8ed9bb82deea0028c0d48cbd7fd86c02ffb"); m.insert((1, 17, 29), "sha256:74efa6a72d82ce2b74f2b5642d4293fa5a302d6d82017e6ad67223dbf3102d58"); - m.insert((1, 17, 30), "sha256:f4cf3feeb3ce190608cf00fde565bba4fe4c3e14d7b52e915a89fcf90516f7af"); - m.insert((1, 17, 31), "sha256:318cd840f9e31a11560946af222339556925e149b2d7d25cd6f85b07c247e9e3"); + m.insert((1, 17, 30), "sha256:a3def468a993061fd3ea134692766a97d1f8d24e22a12d0c32addd7cd3da8563"); + m.insert((1, 17, 31), "sha256:4b6a1d5db9edb2f0baf5310e3af243f48264f051464fa6b6441e6c04a52f31f1"); m.insert((1, 18, 0), "sha256:1eda60c966a4da71d5a0d8d1600439aa303561f29068801a8e0e2b34f121f7ab"); m.insert((1, 18, 1), "sha256:0c15cf35e58a43972475bc96de47b5b51805548a16d1e97ec6c1947c98770d22"); m.insert((1, 18, 2), "sha256:5c7bda6b3d0b23ea36fc47363b5d9e534caec7b7f5f3d0e063681a3105e8de88"); - m.insert((1, 18, 3), "sha256:810b023c358e4ead1f8bbc65568fec75875c7e44a44a51ed2cd02b92a8633368"); + m.insert((1, 18, 3), "sha256:7f89d853a5914ba73b5dbc89fd58e51f2dd6586a355ff7308ac2e06d13c733bb"); m.insert((1, 18, 4), "sha256:30a7c92c6249a99d14d742bb08fe5d3d5275aaba39625aca56019e80ea970e63"); - m.insert((1, 18, 5), "sha256:5fafa571776d6eb07916114a150311ed4e4a99f28d82bb51bb0ac34d1c71c31c"); + m.insert((1, 18, 5), "sha256:42b5d459fee57028da69f00791c2c5a6853b745bd2bdbdacb935aa1c57a4679d"); m.insert((1, 18, 6), "sha256:cd66fcd774f1ed500868554836cc025891de2df32e4487067f61b07edf4b4b46"); - m.insert((1, 18, 7), "sha256:8a6dfe988debf999d2f3d5db3ee1c7297d010bb0102a45fc3c0c413978c02f51"); - m.insert((1, 18, 8), "sha256:d3b35657294579f520c270da3fdc6cba5fd6b08e945c16c0b977e86c981f41d9"); - m.insert((1, 18, 9), "sha256:7de18750a50fd49ad71b14a0189ba6d203ee66b01326570d5df483368bfbc296"); - m.insert((1, 18, 10), "sha256:c2c93b0b02086198909e0c0fb8aea3ca110586085f3b4dbd72cf1ff32ad73d84"); - m.insert((1, 18, 11), "sha256:0a41f973bf8207261b39d5e50d5d66f97f203d83de123033624d3e5f7dc41ee5"); + m.insert((1, 18, 7), "sha256:a70e5c66970adb73beaa000df9537e4c41d60dad5e8cc270cdfc53ec6ea13364"); + m.insert((1, 18, 8), "sha256:0a2cfd125ab771f66d5c9d0f60067b78bd5b43ed6edbc63985b48d7f781579d6"); + m.insert((1, 18, 9), "sha256:083ad44f3181d56dea0b628260f3ecf70744add259632234c377d1b6ee5d6a9d"); + m.insert((1, 18, 10), "sha256:0e0b25263f3755a065dcbfcd436844d9ecdaa729cf4395492ea6357a7dcffa50"); + m.insert((1, 18, 11), "sha256:ba596c913a21489633f1d043c05f26dead294a4153dd48a9952d8af4312900a3"); + m.insert((1, 18, 16), "sha256:8f56be84b2c6f2ea8c018e00cff1a9b7e2bbea6bf3d9949c9359b1ef46dba7aa"); m }; } From 12ea2d0546110cf23324aa3552fc1105fcacacc5 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 09:00:19 -0400 Subject: [PATCH 153/314] add build+publish dockerfile --- .github/workflows/publish_dockerfile.yaml | 66 +++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 .github/workflows/publish_dockerfile.yaml diff --git a/.github/workflows/publish_dockerfile.yaml b/.github/workflows/publish_dockerfile.yaml new file mode 100644 index 0000000..da2d775 --- /dev/null +++ b/.github/workflows/publish_dockerfile.yaml @@ -0,0 +1,66 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +# GitHub recommends pinning actions to a commit SHA. +# To get a newer version, you will need to update the SHA. +# You can also reference a tag or branch, but the action may change without warning. + +name: Publish Docker image + +on: + workflow_dispatch: + inputs: + version: + description: 'Solana version to generate Dockerfile for (e.g., 1.16.0)' + required: true + type: string + +jobs: + push_to_registries: + name: Push Docker image to multiple registries + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Check out the repo + uses: actions/checkout@v4 + + - name: Log in to the Container registry + uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 + with: + images: | + ghcr.io/${{ github.repository }} + + - name: Build and push Docker images + id: push + uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 + with: + context: docker/ + file: docker/v${{ github.event.inputs.version }}.Dockerfile + push: true + tags: | + ${{ steps.meta.outputs.tags }} + ghcr.io/solana.${{ github.event.inputs.version }} + labels: | + ${{ steps.meta.outputs.labels }} + org.opencontainers.image.source=https://github.com/${{ github.repository }} + + - name: Generate artifact attestation + uses: actions/attest-build-provenance@v1 + with: + subject-name: ghci.io/solana.${{ github.event.inputs.version }} + subject-digest: ${{ steps.push.outputs.digest }} + push-to-registry: true From a8c5ee1ecd3ae446ac09c8085a5324be1cca7e9a Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 09:06:58 -0400 Subject: [PATCH 154/314] fix namespace --- .github/workflows/publish_dockerfile.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_dockerfile.yaml b/.github/workflows/publish_dockerfile.yaml index da2d775..a75a805 100644 --- a/.github/workflows/publish_dockerfile.yaml +++ b/.github/workflows/publish_dockerfile.yaml @@ -53,7 +53,7 @@ jobs: push: true tags: | ${{ steps.meta.outputs.tags }} - ghcr.io/solana.${{ github.event.inputs.version }} + ghcr.io/{{ github.repository_owner }}/solana:${{ github.event.inputs.version }} labels: | ${{ steps.meta.outputs.labels }} org.opencontainers.image.source=https://github.com/${{ github.repository }} @@ -61,6 +61,6 @@ jobs: - name: Generate artifact attestation uses: actions/attest-build-provenance@v1 with: - subject-name: ghci.io/solana.${{ github.event.inputs.version }} + subject-name: ghcr.io/{{ github.repository_owner }}/solana:${{ github.event.inputs.version }} subject-digest: ${{ steps.push.outputs.digest }} push-to-registry: true From 26c2f975a2e0561aa08318c18e3d80f5d75ce6b3 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 09:10:20 -0400 Subject: [PATCH 155/314] fix namespace variable --- .github/workflows/publish_dockerfile.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_dockerfile.yaml b/.github/workflows/publish_dockerfile.yaml index a75a805..c41554c 100644 --- a/.github/workflows/publish_dockerfile.yaml +++ b/.github/workflows/publish_dockerfile.yaml @@ -53,7 +53,7 @@ jobs: push: true tags: | ${{ steps.meta.outputs.tags }} - ghcr.io/{{ github.repository_owner }}/solana:${{ github.event.inputs.version }} + ghcr.io/${{ github.repository_owner }}/solana:${{ github.event.inputs.version }} labels: | ${{ steps.meta.outputs.labels }} org.opencontainers.image.source=https://github.com/${{ github.repository }} @@ -61,6 +61,6 @@ jobs: - name: Generate artifact attestation uses: actions/attest-build-provenance@v1 with: - subject-name: ghcr.io/{{ github.repository_owner }}/solana:${{ github.event.inputs.version }} + subject-name: ghcr.io/${{ github.repository_owner }}/solana:${{ github.event.inputs.version }} subject-digest: ${{ steps.push.outputs.digest }} push-to-registry: true From 796020a9c36ae49b39b4d5bbfda4383384c7444c Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 09:32:45 -0400 Subject: [PATCH 156/314] fix attestation --- .github/workflows/publish_dockerfile.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_dockerfile.yaml b/.github/workflows/publish_dockerfile.yaml index c41554c..52cef90 100644 --- a/.github/workflows/publish_dockerfile.yaml +++ b/.github/workflows/publish_dockerfile.yaml @@ -7,7 +7,7 @@ # To get a newer version, you will need to update the SHA. # You can also reference a tag or branch, but the action may change without warning. -name: Publish Docker image +name: Publish Docker Image on: workflow_dispatch: @@ -61,6 +61,6 @@ jobs: - name: Generate artifact attestation uses: actions/attest-build-provenance@v1 with: - subject-name: ghcr.io/${{ github.repository_owner }}/solana:${{ github.event.inputs.version }} + subject-name: ghcr.io/${{ github.repository_owner }}/solana subject-digest: ${{ steps.push.outputs.digest }} push-to-registry: true From 38d4de3385996ec4538177e1c4bb05e0e82d1c72 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 12:25:34 -0400 Subject: [PATCH 157/314] Update generate_dockerfiles.yml --- .github/workflows/generate_dockerfiles.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/generate_dockerfiles.yml b/.github/workflows/generate_dockerfiles.yml index 1df4c11..cefaed5 100644 --- a/.github/workflows/generate_dockerfiles.yml +++ b/.github/workflows/generate_dockerfiles.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/create-github-app-token@v1 id: generate-token with: - app-id: ${{ vars.ROBO_PR_APP_ID }} + app-id: ${{ secrets.ROBO_PR_APP_ID }} private-key: ${{ secrets.ROBO_PR_CLIENT_SECRET }} - name: Checkout repository From 5e292577cab9b60f49a5e81ad4e3d44360056f42 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 13:02:05 -0400 Subject: [PATCH 158/314] update whitelist ci job --- .github/workflows/update_whitelist.yaml | 59 +++++++++++++++++++++++++ update_image_whitelist.py | 27 ++++++++--- 2 files changed, 81 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/update_whitelist.yaml diff --git a/.github/workflows/update_whitelist.yaml b/.github/workflows/update_whitelist.yaml new file mode 100644 index 0000000..d48831f --- /dev/null +++ b/.github/workflows/update_whitelist.yaml @@ -0,0 +1,59 @@ +name: Update Docker Image Whitelist + +on: + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + update-docker-image-whitelist: + runs-on: ubuntu-latest + steps: + - uses: actions/create-github-app-token@v1 + id: generate-token + with: + app-id: ${{ vars.ROBO_PR_APP_ID }} + private-key: ${{ secrets.ROBO_PR_CLIENT_SECRET }} + + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install uv + uses: astral-sh/setup-uv@v3 + with: + enable-cache: true + cache-dependency-glob: "uv.lock" + + - name: "Set up Python" + uses: actions/setup-python@v5 + with: + python-version-file: "pyproject.toml" + + - name: Install dependencies with uv + run: | + uv sync --all-extras --dev + + - name: Run generate_dockerfiles.py + env: + USE_GHCR: "true" + GITHUB_TOKEN: ${{ github.token }} + run: uv run update_image_whitelist.py + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v5 + with: + token: ${{ steps.generate-token.outputs.token }} + commit-message: Update Dockerfiles + title: 'Update Dockerfiles' + body: | + This PR updates `image_config.rs` with the latest published Docker image tags. + + Generated automatically by the Update Docker Image Whitelist workflow. + branch: update-dockerfiles + delete-branch: true + base: master + labels: | + automated pr + dockerfiles diff --git a/update_image_whitelist.py b/update_image_whitelist.py index 958a379..ad4d0c6 100644 --- a/update_image_whitelist.py +++ b/update_image_whitelist.py @@ -1,11 +1,28 @@ import requests - -response = requests.get( - "https://hub.docker.com/v2/namespaces/ellipsislabs/repositories/solana/tags?page_size=1000" -) +import os + +github_token = os.environ.get('GITHUB_TOKEN') +use_ghcr = os.environ.get('USE_GHCR', 'false').lower() == 'true' +headers = {'Authorization': f'Bearer {github_token}'} + +if not use_ghcr: + response = requests.get( + "https://hub.docker.com/v2/namespaces/ellipsislabs/repositories/solana/tags?page_size=1000" + ) + if response.status_code != 200: + raise Exception(f"Failed to get Docker images: {response.status_code} {response.text}") + results = response.json()["results"] +else: + response = requests.get( + "https://api.github.com/users/ngundotra/packages/container/solana/versions?per_page=100", + headers=headers + ) + if response.status_code != 200: + raise Exception(f"Failed to get Docker images: {response.status_code} {response.text}") + results = response.json() digest_map = {} -for result in response.json()["results"]: +for result in results: if result["name"] != "latest": try: major, minor, patch = list(map(int, result["name"].split("."))) From c3ec5911cb43ef767e53f72e30983553c26b9f79 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 13:02:48 -0400 Subject: [PATCH 159/314] fix token --- .github/workflows/update_whitelist.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update_whitelist.yaml b/.github/workflows/update_whitelist.yaml index d48831f..8d2ccde 100644 --- a/.github/workflows/update_whitelist.yaml +++ b/.github/workflows/update_whitelist.yaml @@ -38,7 +38,7 @@ jobs: - name: Run generate_dockerfiles.py env: USE_GHCR: "true" - GITHUB_TOKEN: ${{ github.token }} + GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }} run: uv run update_image_whitelist.py - name: Create Pull Request From 5a880125419852ab124ecbdf015c344262496ba0 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 13:04:31 -0400 Subject: [PATCH 160/314] update_whitelist --- .github/workflows/update_whitelist.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update_whitelist.yaml b/.github/workflows/update_whitelist.yaml index 8d2ccde..28eefc0 100644 --- a/.github/workflows/update_whitelist.yaml +++ b/.github/workflows/update_whitelist.yaml @@ -51,7 +51,7 @@ jobs: This PR updates `image_config.rs` with the latest published Docker image tags. Generated automatically by the Update Docker Image Whitelist workflow. - branch: update-dockerfiles + branch: update-image-whitelist delete-branch: true base: master labels: | From 657269e50badb0abb7d83a1c553bd3f2c78c3c8c Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 13:06:47 -0400 Subject: [PATCH 161/314] update whitelist desc --- .github/workflows/update_whitelist.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/update_whitelist.yaml b/.github/workflows/update_whitelist.yaml index 28eefc0..71d7749 100644 --- a/.github/workflows/update_whitelist.yaml +++ b/.github/workflows/update_whitelist.yaml @@ -46,7 +46,7 @@ jobs: with: token: ${{ steps.generate-token.outputs.token }} commit-message: Update Dockerfiles - title: 'Update Dockerfiles' + title: 'Update Image Whitelist' body: | This PR updates `image_config.rs` with the latest published Docker image tags. @@ -56,4 +56,4 @@ jobs: base: master labels: | automated pr - dockerfiles + image whitelist From 03cfd308ad4dd83e52dc5c5deb7c30741ef60ae7 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 13:15:19 -0400 Subject: [PATCH 162/314] fix dockerfile --- .github/workflows/generate_dockerfiles.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/generate_dockerfiles.yml b/.github/workflows/generate_dockerfiles.yml index cefaed5..1df4c11 100644 --- a/.github/workflows/generate_dockerfiles.yml +++ b/.github/workflows/generate_dockerfiles.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/create-github-app-token@v1 id: generate-token with: - app-id: ${{ secrets.ROBO_PR_APP_ID }} + app-id: ${{ vars.ROBO_PR_APP_ID }} private-key: ${{ secrets.ROBO_PR_CLIENT_SECRET }} - name: Checkout repository From f247084217b208800cb2ddcc55ec70b669315aca Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 13:19:29 -0400 Subject: [PATCH 163/314] update image whitelist to kick off on push to master --- .github/workflows/update_whitelist.yaml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/update_whitelist.yaml b/.github/workflows/update_whitelist.yaml index 71d7749..8e31d29 100644 --- a/.github/workflows/update_whitelist.yaml +++ b/.github/workflows/update_whitelist.yaml @@ -1,7 +1,12 @@ name: Update Docker Image Whitelist on: - workflow_dispatch: + workflow_dispatch: + push: + branches: + - master + paths: + - 'docker/**' permissions: contents: write @@ -45,7 +50,7 @@ jobs: uses: peter-evans/create-pull-request@v5 with: token: ${{ steps.generate-token.outputs.token }} - commit-message: Update Dockerfiles + commit-message: Update image whitelist title: 'Update Image Whitelist' body: | This PR updates `image_config.rs` with the latest published Docker image tags. From 22ef44a7681be784cfee60c57bf29ddd3e312f3d Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 13:20:22 -0400 Subject: [PATCH 164/314] prefix branch w autopr --- .github/workflows/update_whitelist.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update_whitelist.yaml b/.github/workflows/update_whitelist.yaml index 8e31d29..e399853 100644 --- a/.github/workflows/update_whitelist.yaml +++ b/.github/workflows/update_whitelist.yaml @@ -56,7 +56,7 @@ jobs: This PR updates `image_config.rs` with the latest published Docker image tags. Generated automatically by the Update Docker Image Whitelist workflow. - branch: update-image-whitelist + branch: autopr-update-image-whitelist delete-branch: true base: master labels: | From 94115420f510e517f97fc2bdf5ac7b5c7cec7362 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 13:22:09 -0400 Subject: [PATCH 165/314] prefix with autopr --- .github/workflows/generate_dockerfiles.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/generate_dockerfiles.yml b/.github/workflows/generate_dockerfiles.yml index 1df4c11..cdb24c8 100644 --- a/.github/workflows/generate_dockerfiles.yml +++ b/.github/workflows/generate_dockerfiles.yml @@ -48,7 +48,7 @@ jobs: This PR updates the Dockerfiles in the `docker/` directory. Generated automatically by the Generate Dockerfiles workflow. - branch: update-dockerfiles + branch: autopr-update-dockerfiles delete-branch: true base: master labels: | From 6103161354225c09b8e40aa70d64e84e973c0b7a Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 13:42:24 -0400 Subject: [PATCH 166/314] straighten out workflows --- .../workflows/publish_all_dockerfiles.yaml | 77 +++++++++++++++++++ .github/workflows/publish_dockerfile.yaml | 11 +-- 2 files changed, 78 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/publish_all_dockerfiles.yaml diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml new file mode 100644 index 0000000..bb7c5bd --- /dev/null +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -0,0 +1,77 @@ +name: Publish All Docker Image + +on: + workflow_dispatch: + push: + branches: + - master + paths: + - 'docker/**' + +jobs: + detect_changes: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + steps: + - uses: actions/checkout@v4 + - id: set-matrix + run: | + CHANGED_FILES=$(git diff --name-only ${{ github.event.before }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) + echo "CHANGED_FILES=$CHANGED_FILES" >> $GITHUB_OUTPUT + if [ -n "$CHANGED_FILES" ]; then + echo "matrix=$(echo $CHANGED_FILES | jq -R -s -c 'split("\n")[:-1] | map({version: .[8:-11]})')" >> $GITHUB_OUTPUT + else + echo "matrix=[]" >> $GITHUB_OUTPUT + fi + + push_to_registries: + needs: detect_changes + if: ${{ needs.detect_changes.outputs.matrix != '[]' }} + strategy: + matrix: ${{fromJson(needs.detect_changes.outputs.matrix)}} + name: Push Docker images to ghcr.io + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Check out the repo + uses: actions/checkout@v4 + + - name: Log in to the Container registry + uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 + with: + images: | + ghcr.io/${{ github.repository }} + + - name: Build and push Docker images + id: push + uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 + with: + context: docker/ + file: docker/v${{ github.event.inputs.version }}.Dockerfile + push: true + tags: | + ${{ steps.meta.outputs.tags }} + ghcr.io/${{ github.repository_owner }}/solana:${{ github.event.inputs.version }} + labels: | + ${{ steps.meta.outputs.labels }} + org.opencontainers.image.source=https://github.com/${{ github.repository }} + + - name: Generate artifact attestation + uses: actions/attest-build-provenance@v1 + with: + subject-name: ghcr.io/${{ github.repository_owner }}/solana + subject-digest: ${{ steps.push.outputs.digest }} + push-to-registry: true diff --git a/.github/workflows/publish_dockerfile.yaml b/.github/workflows/publish_dockerfile.yaml index 52cef90..f2462d0 100644 --- a/.github/workflows/publish_dockerfile.yaml +++ b/.github/workflows/publish_dockerfile.yaml @@ -1,12 +1,3 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. - -# GitHub recommends pinning actions to a commit SHA. -# To get a newer version, you will need to update the SHA. -# You can also reference a tag or branch, but the action may change without warning. - name: Publish Docker Image on: @@ -19,7 +10,7 @@ on: jobs: push_to_registries: - name: Push Docker image to multiple registries + name: Push Docker image to ghcr.io runs-on: ubuntu-latest permissions: packages: write From de3e1d10b8cb5eaa3338a26a6c880cdf26d143ec Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 13:53:04 -0400 Subject: [PATCH 167/314] report matrix version --- .github/workflows/publish_all_dockerfiles.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index bb7c5bd..3d846fb 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -38,6 +38,9 @@ jobs: attestations: write id-token: write steps: + - name: Report version + run: echo "Pushing Docker image for version ${{ matrix.version }}" + - name: Check out the repo uses: actions/checkout@v4 @@ -60,11 +63,11 @@ jobs: uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 with: context: docker/ - file: docker/v${{ github.event.inputs.version }}.Dockerfile + file: docker/v${{ matrix.version }}.Dockerfile push: true tags: | ${{ steps.meta.outputs.tags }} - ghcr.io/${{ github.repository_owner }}/solana:${{ github.event.inputs.version }} + ghcr.io/${{ github.repository_owner }}/solana:${{ matrix.version }} labels: | ${{ steps.meta.outputs.labels }} org.opencontainers.image.source=https://github.com/${{ github.repository }} From 48be5a922f14ebcbfb791179e0d7d34a305fb83c Mon Sep 17 00:00:00 2001 From: ngundotra Date: Tue, 22 Oct 2024 17:57:12 +0000 Subject: [PATCH 168/314] Update Dockerfiles --- docker/v1.17.32.Dockerfile | 8 ++++++++ docker/v1.17.33.Dockerfile | 8 ++++++++ docker/v1.17.34.Dockerfile | 8 ++++++++ docker/v1.18.12.Dockerfile | 8 ++++++++ docker/v1.18.13.Dockerfile | 8 ++++++++ docker/v1.18.14.Dockerfile | 8 ++++++++ docker/v1.18.15.Dockerfile | 8 ++++++++ docker/v1.18.17.Dockerfile | 8 ++++++++ docker/v1.18.18.Dockerfile | 8 ++++++++ docker/v1.18.19.Dockerfile | 8 ++++++++ docker/v1.18.20.Dockerfile | 8 ++++++++ docker/v1.18.21.Dockerfile | 8 ++++++++ docker/v1.18.22.Dockerfile | 8 ++++++++ docker/v1.18.23.Dockerfile | 8 ++++++++ docker/v1.18.25.Dockerfile | 8 ++++++++ docker/v1.18.26.Dockerfile | 8 ++++++++ 16 files changed, 128 insertions(+) create mode 100644 docker/v1.17.32.Dockerfile create mode 100644 docker/v1.17.33.Dockerfile create mode 100644 docker/v1.17.34.Dockerfile create mode 100644 docker/v1.18.12.Dockerfile create mode 100644 docker/v1.18.13.Dockerfile create mode 100644 docker/v1.18.14.Dockerfile create mode 100644 docker/v1.18.15.Dockerfile create mode 100644 docker/v1.18.17.Dockerfile create mode 100644 docker/v1.18.18.Dockerfile create mode 100644 docker/v1.18.19.Dockerfile create mode 100644 docker/v1.18.20.Dockerfile create mode 100644 docker/v1.18.21.Dockerfile create mode 100644 docker/v1.18.22.Dockerfile create mode 100644 docker/v1.18.23.Dockerfile create mode 100644 docker/v1.18.25.Dockerfile create mode 100644 docker/v1.18.26.Dockerfile diff --git a/docker/v1.17.32.Dockerfile b/docker/v1.17.32.Dockerfile new file mode 100644 index 0000000..d11cf9e --- /dev/null +++ b/docker/v1.17.32.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.32/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.33.Dockerfile b/docker/v1.17.33.Dockerfile new file mode 100644 index 0000000..95f72ec --- /dev/null +++ b/docker/v1.17.33.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.33/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.34.Dockerfile b/docker/v1.17.34.Dockerfile new file mode 100644 index 0000000..ae4576b --- /dev/null +++ b/docker/v1.17.34.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.34/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.12.Dockerfile b/docker/v1.18.12.Dockerfile new file mode 100644 index 0000000..3b289d1 --- /dev/null +++ b/docker/v1.18.12.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.12/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.13.Dockerfile b/docker/v1.18.13.Dockerfile new file mode 100644 index 0000000..9e96737 --- /dev/null +++ b/docker/v1.18.13.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.13/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.14.Dockerfile b/docker/v1.18.14.Dockerfile new file mode 100644 index 0000000..8156dc8 --- /dev/null +++ b/docker/v1.18.14.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.14/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.15.Dockerfile b/docker/v1.18.15.Dockerfile new file mode 100644 index 0000000..a0c0e36 --- /dev/null +++ b/docker/v1.18.15.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.15/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.17.Dockerfile b/docker/v1.18.17.Dockerfile new file mode 100644 index 0000000..07a68e9 --- /dev/null +++ b/docker/v1.18.17.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.17/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.18.Dockerfile b/docker/v1.18.18.Dockerfile new file mode 100644 index 0000000..1661182 --- /dev/null +++ b/docker/v1.18.18.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.18/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.19.Dockerfile b/docker/v1.18.19.Dockerfile new file mode 100644 index 0000000..96058e4 --- /dev/null +++ b/docker/v1.18.19.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.19/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.20.Dockerfile b/docker/v1.18.20.Dockerfile new file mode 100644 index 0000000..589a1e1 --- /dev/null +++ b/docker/v1.18.20.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.20/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.21.Dockerfile b/docker/v1.18.21.Dockerfile new file mode 100644 index 0000000..31fdc00 --- /dev/null +++ b/docker/v1.18.21.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.21/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.22.Dockerfile b/docker/v1.18.22.Dockerfile new file mode 100644 index 0000000..8886a00 --- /dev/null +++ b/docker/v1.18.22.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.22/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.23.Dockerfile b/docker/v1.18.23.Dockerfile new file mode 100644 index 0000000..e7896d6 --- /dev/null +++ b/docker/v1.18.23.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.23/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.25.Dockerfile b/docker/v1.18.25.Dockerfile new file mode 100644 index 0000000..85673f3 --- /dev/null +++ b/docker/v1.18.25.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.25/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.26.Dockerfile b/docker/v1.18.26.Dockerfile new file mode 100644 index 0000000..2817c4a --- /dev/null +++ b/docker/v1.18.26.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.26/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash From ded29ce8bef6fb5e2c5e07f0b184e876a4c35b0a Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 14:01:25 -0400 Subject: [PATCH 169/314] Revert "Update Dockerfiles" --- docker/v1.17.32.Dockerfile | 8 -------- docker/v1.17.33.Dockerfile | 8 -------- docker/v1.17.34.Dockerfile | 8 -------- docker/v1.18.12.Dockerfile | 8 -------- docker/v1.18.13.Dockerfile | 8 -------- docker/v1.18.14.Dockerfile | 8 -------- docker/v1.18.15.Dockerfile | 8 -------- docker/v1.18.17.Dockerfile | 8 -------- docker/v1.18.18.Dockerfile | 8 -------- docker/v1.18.19.Dockerfile | 8 -------- docker/v1.18.20.Dockerfile | 8 -------- docker/v1.18.21.Dockerfile | 8 -------- docker/v1.18.22.Dockerfile | 8 -------- docker/v1.18.23.Dockerfile | 8 -------- docker/v1.18.25.Dockerfile | 8 -------- docker/v1.18.26.Dockerfile | 8 -------- 16 files changed, 128 deletions(-) delete mode 100644 docker/v1.17.32.Dockerfile delete mode 100644 docker/v1.17.33.Dockerfile delete mode 100644 docker/v1.17.34.Dockerfile delete mode 100644 docker/v1.18.12.Dockerfile delete mode 100644 docker/v1.18.13.Dockerfile delete mode 100644 docker/v1.18.14.Dockerfile delete mode 100644 docker/v1.18.15.Dockerfile delete mode 100644 docker/v1.18.17.Dockerfile delete mode 100644 docker/v1.18.18.Dockerfile delete mode 100644 docker/v1.18.19.Dockerfile delete mode 100644 docker/v1.18.20.Dockerfile delete mode 100644 docker/v1.18.21.Dockerfile delete mode 100644 docker/v1.18.22.Dockerfile delete mode 100644 docker/v1.18.23.Dockerfile delete mode 100644 docker/v1.18.25.Dockerfile delete mode 100644 docker/v1.18.26.Dockerfile diff --git a/docker/v1.17.32.Dockerfile b/docker/v1.17.32.Dockerfile deleted file mode 100644 index d11cf9e..0000000 --- a/docker/v1.17.32.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.32/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.17.33.Dockerfile b/docker/v1.17.33.Dockerfile deleted file mode 100644 index 95f72ec..0000000 --- a/docker/v1.17.33.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.33/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.17.34.Dockerfile b/docker/v1.17.34.Dockerfile deleted file mode 100644 index ae4576b..0000000 --- a/docker/v1.17.34.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.34/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.12.Dockerfile b/docker/v1.18.12.Dockerfile deleted file mode 100644 index 3b289d1..0000000 --- a/docker/v1.18.12.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.12/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.13.Dockerfile b/docker/v1.18.13.Dockerfile deleted file mode 100644 index 9e96737..0000000 --- a/docker/v1.18.13.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.13/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.14.Dockerfile b/docker/v1.18.14.Dockerfile deleted file mode 100644 index 8156dc8..0000000 --- a/docker/v1.18.14.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.14/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.15.Dockerfile b/docker/v1.18.15.Dockerfile deleted file mode 100644 index a0c0e36..0000000 --- a/docker/v1.18.15.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.15/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.17.Dockerfile b/docker/v1.18.17.Dockerfile deleted file mode 100644 index 07a68e9..0000000 --- a/docker/v1.18.17.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.17/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.18.Dockerfile b/docker/v1.18.18.Dockerfile deleted file mode 100644 index 1661182..0000000 --- a/docker/v1.18.18.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.18/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.19.Dockerfile b/docker/v1.18.19.Dockerfile deleted file mode 100644 index 96058e4..0000000 --- a/docker/v1.18.19.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.19/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.20.Dockerfile b/docker/v1.18.20.Dockerfile deleted file mode 100644 index 589a1e1..0000000 --- a/docker/v1.18.20.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.20/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.21.Dockerfile b/docker/v1.18.21.Dockerfile deleted file mode 100644 index 31fdc00..0000000 --- a/docker/v1.18.21.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.21/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.22.Dockerfile b/docker/v1.18.22.Dockerfile deleted file mode 100644 index 8886a00..0000000 --- a/docker/v1.18.22.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.22/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.23.Dockerfile b/docker/v1.18.23.Dockerfile deleted file mode 100644 index e7896d6..0000000 --- a/docker/v1.18.23.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.23/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.25.Dockerfile b/docker/v1.18.25.Dockerfile deleted file mode 100644 index 85673f3..0000000 --- a/docker/v1.18.25.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.25/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.26.Dockerfile b/docker/v1.18.26.Dockerfile deleted file mode 100644 index 2817c4a..0000000 --- a/docker/v1.18.26.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.26/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash From df59e721d0cd2780c5035563c406e47fa8796964 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 14:04:11 -0400 Subject: [PATCH 170/314] fix parsing, ignore deleted files --- .github/workflows/publish_all_dockerfiles.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index 3d846fb..fa16d40 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -1,4 +1,4 @@ -name: Publish All Docker Image +name: Publish All Changed Images on: workflow_dispatch: @@ -17,8 +17,7 @@ jobs: - uses: actions/checkout@v4 - id: set-matrix run: | - CHANGED_FILES=$(git diff --name-only ${{ github.event.before }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) - echo "CHANGED_FILES=$CHANGED_FILES" >> $GITHUB_OUTPUT + CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.before }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) if [ -n "$CHANGED_FILES" ]; then echo "matrix=$(echo $CHANGED_FILES | jq -R -s -c 'split("\n")[:-1] | map({version: .[8:-11]})')" >> $GITHUB_OUTPUT else From 58fc8a23b718a5ab1d41e0c5b0277d66918325c4 Mon Sep 17 00:00:00 2001 From: ngundotra Date: Tue, 22 Oct 2024 18:06:11 +0000 Subject: [PATCH 171/314] Update Dockerfiles --- docker/v1.17.32.Dockerfile | 8 ++++++++ docker/v1.17.33.Dockerfile | 8 ++++++++ docker/v1.17.34.Dockerfile | 8 ++++++++ docker/v1.18.12.Dockerfile | 8 ++++++++ docker/v1.18.13.Dockerfile | 8 ++++++++ docker/v1.18.14.Dockerfile | 8 ++++++++ docker/v1.18.15.Dockerfile | 8 ++++++++ docker/v1.18.17.Dockerfile | 8 ++++++++ docker/v1.18.18.Dockerfile | 8 ++++++++ docker/v1.18.19.Dockerfile | 8 ++++++++ docker/v1.18.20.Dockerfile | 8 ++++++++ docker/v1.18.21.Dockerfile | 8 ++++++++ docker/v1.18.22.Dockerfile | 8 ++++++++ docker/v1.18.23.Dockerfile | 8 ++++++++ docker/v1.18.25.Dockerfile | 8 ++++++++ docker/v1.18.26.Dockerfile | 8 ++++++++ 16 files changed, 128 insertions(+) create mode 100644 docker/v1.17.32.Dockerfile create mode 100644 docker/v1.17.33.Dockerfile create mode 100644 docker/v1.17.34.Dockerfile create mode 100644 docker/v1.18.12.Dockerfile create mode 100644 docker/v1.18.13.Dockerfile create mode 100644 docker/v1.18.14.Dockerfile create mode 100644 docker/v1.18.15.Dockerfile create mode 100644 docker/v1.18.17.Dockerfile create mode 100644 docker/v1.18.18.Dockerfile create mode 100644 docker/v1.18.19.Dockerfile create mode 100644 docker/v1.18.20.Dockerfile create mode 100644 docker/v1.18.21.Dockerfile create mode 100644 docker/v1.18.22.Dockerfile create mode 100644 docker/v1.18.23.Dockerfile create mode 100644 docker/v1.18.25.Dockerfile create mode 100644 docker/v1.18.26.Dockerfile diff --git a/docker/v1.17.32.Dockerfile b/docker/v1.17.32.Dockerfile new file mode 100644 index 0000000..d11cf9e --- /dev/null +++ b/docker/v1.17.32.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.32/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.33.Dockerfile b/docker/v1.17.33.Dockerfile new file mode 100644 index 0000000..95f72ec --- /dev/null +++ b/docker/v1.17.33.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.33/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.34.Dockerfile b/docker/v1.17.34.Dockerfile new file mode 100644 index 0000000..ae4576b --- /dev/null +++ b/docker/v1.17.34.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.34/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.12.Dockerfile b/docker/v1.18.12.Dockerfile new file mode 100644 index 0000000..3b289d1 --- /dev/null +++ b/docker/v1.18.12.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.12/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.13.Dockerfile b/docker/v1.18.13.Dockerfile new file mode 100644 index 0000000..9e96737 --- /dev/null +++ b/docker/v1.18.13.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.13/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.14.Dockerfile b/docker/v1.18.14.Dockerfile new file mode 100644 index 0000000..8156dc8 --- /dev/null +++ b/docker/v1.18.14.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.14/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.15.Dockerfile b/docker/v1.18.15.Dockerfile new file mode 100644 index 0000000..a0c0e36 --- /dev/null +++ b/docker/v1.18.15.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.15/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.17.Dockerfile b/docker/v1.18.17.Dockerfile new file mode 100644 index 0000000..07a68e9 --- /dev/null +++ b/docker/v1.18.17.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.17/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.18.Dockerfile b/docker/v1.18.18.Dockerfile new file mode 100644 index 0000000..1661182 --- /dev/null +++ b/docker/v1.18.18.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.18/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.19.Dockerfile b/docker/v1.18.19.Dockerfile new file mode 100644 index 0000000..96058e4 --- /dev/null +++ b/docker/v1.18.19.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.19/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.20.Dockerfile b/docker/v1.18.20.Dockerfile new file mode 100644 index 0000000..589a1e1 --- /dev/null +++ b/docker/v1.18.20.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.20/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.21.Dockerfile b/docker/v1.18.21.Dockerfile new file mode 100644 index 0000000..31fdc00 --- /dev/null +++ b/docker/v1.18.21.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.21/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.22.Dockerfile b/docker/v1.18.22.Dockerfile new file mode 100644 index 0000000..8886a00 --- /dev/null +++ b/docker/v1.18.22.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.22/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.23.Dockerfile b/docker/v1.18.23.Dockerfile new file mode 100644 index 0000000..e7896d6 --- /dev/null +++ b/docker/v1.18.23.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.23/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.25.Dockerfile b/docker/v1.18.25.Dockerfile new file mode 100644 index 0000000..85673f3 --- /dev/null +++ b/docker/v1.18.25.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.25/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.26.Dockerfile b/docker/v1.18.26.Dockerfile new file mode 100644 index 0000000..2817c4a --- /dev/null +++ b/docker/v1.18.26.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.26/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash From a413fcf736f76e9f20fb2a3aa3e21c6774041eb8 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 14:09:02 -0400 Subject: [PATCH 172/314] Revert "Update Dockerfiles" --- docker/v1.17.32.Dockerfile | 8 -------- docker/v1.17.33.Dockerfile | 8 -------- docker/v1.17.34.Dockerfile | 8 -------- docker/v1.18.12.Dockerfile | 8 -------- docker/v1.18.13.Dockerfile | 8 -------- docker/v1.18.14.Dockerfile | 8 -------- docker/v1.18.15.Dockerfile | 8 -------- docker/v1.18.17.Dockerfile | 8 -------- docker/v1.18.18.Dockerfile | 8 -------- docker/v1.18.19.Dockerfile | 8 -------- docker/v1.18.20.Dockerfile | 8 -------- docker/v1.18.21.Dockerfile | 8 -------- docker/v1.18.22.Dockerfile | 8 -------- docker/v1.18.23.Dockerfile | 8 -------- docker/v1.18.25.Dockerfile | 8 -------- docker/v1.18.26.Dockerfile | 8 -------- 16 files changed, 128 deletions(-) delete mode 100644 docker/v1.17.32.Dockerfile delete mode 100644 docker/v1.17.33.Dockerfile delete mode 100644 docker/v1.17.34.Dockerfile delete mode 100644 docker/v1.18.12.Dockerfile delete mode 100644 docker/v1.18.13.Dockerfile delete mode 100644 docker/v1.18.14.Dockerfile delete mode 100644 docker/v1.18.15.Dockerfile delete mode 100644 docker/v1.18.17.Dockerfile delete mode 100644 docker/v1.18.18.Dockerfile delete mode 100644 docker/v1.18.19.Dockerfile delete mode 100644 docker/v1.18.20.Dockerfile delete mode 100644 docker/v1.18.21.Dockerfile delete mode 100644 docker/v1.18.22.Dockerfile delete mode 100644 docker/v1.18.23.Dockerfile delete mode 100644 docker/v1.18.25.Dockerfile delete mode 100644 docker/v1.18.26.Dockerfile diff --git a/docker/v1.17.32.Dockerfile b/docker/v1.17.32.Dockerfile deleted file mode 100644 index d11cf9e..0000000 --- a/docker/v1.17.32.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.32/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.17.33.Dockerfile b/docker/v1.17.33.Dockerfile deleted file mode 100644 index 95f72ec..0000000 --- a/docker/v1.17.33.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.33/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.17.34.Dockerfile b/docker/v1.17.34.Dockerfile deleted file mode 100644 index ae4576b..0000000 --- a/docker/v1.17.34.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.34/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.12.Dockerfile b/docker/v1.18.12.Dockerfile deleted file mode 100644 index 3b289d1..0000000 --- a/docker/v1.18.12.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.12/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.13.Dockerfile b/docker/v1.18.13.Dockerfile deleted file mode 100644 index 9e96737..0000000 --- a/docker/v1.18.13.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.13/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.14.Dockerfile b/docker/v1.18.14.Dockerfile deleted file mode 100644 index 8156dc8..0000000 --- a/docker/v1.18.14.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.14/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.15.Dockerfile b/docker/v1.18.15.Dockerfile deleted file mode 100644 index a0c0e36..0000000 --- a/docker/v1.18.15.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.15/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.17.Dockerfile b/docker/v1.18.17.Dockerfile deleted file mode 100644 index 07a68e9..0000000 --- a/docker/v1.18.17.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.17/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.18.Dockerfile b/docker/v1.18.18.Dockerfile deleted file mode 100644 index 1661182..0000000 --- a/docker/v1.18.18.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.18/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.19.Dockerfile b/docker/v1.18.19.Dockerfile deleted file mode 100644 index 96058e4..0000000 --- a/docker/v1.18.19.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.19/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.20.Dockerfile b/docker/v1.18.20.Dockerfile deleted file mode 100644 index 589a1e1..0000000 --- a/docker/v1.18.20.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.20/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.21.Dockerfile b/docker/v1.18.21.Dockerfile deleted file mode 100644 index 31fdc00..0000000 --- a/docker/v1.18.21.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.21/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.22.Dockerfile b/docker/v1.18.22.Dockerfile deleted file mode 100644 index 8886a00..0000000 --- a/docker/v1.18.22.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.22/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.23.Dockerfile b/docker/v1.18.23.Dockerfile deleted file mode 100644 index e7896d6..0000000 --- a/docker/v1.18.23.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.23/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.25.Dockerfile b/docker/v1.18.25.Dockerfile deleted file mode 100644 index 85673f3..0000000 --- a/docker/v1.18.25.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.25/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash diff --git a/docker/v1.18.26.Dockerfile b/docker/v1.18.26.Dockerfile deleted file mode 100644 index 2817c4a..0000000 --- a/docker/v1.18.26.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f - -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.26/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build - -CMD /bin/bash From fc72fc5eb02e50b0c0742b6a06dd5b57dc9b8223 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 14:10:03 -0400 Subject: [PATCH 173/314] show matrix outputs --- .github/workflows/publish_all_dockerfiles.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index fa16d40..9c42f75 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -23,6 +23,8 @@ jobs: else echo "matrix=[]" >> $GITHUB_OUTPUT fi + - name: Display matrix + run: echo "${{ steps.set-matrix.outputs.matrix }}" push_to_registries: needs: detect_changes From 60d9b016fb3f82223d54762a6b5351990151a787 Mon Sep 17 00:00:00 2001 From: ngundotra Date: Tue, 22 Oct 2024 18:11:11 +0000 Subject: [PATCH 174/314] Update Dockerfiles --- docker/v1.17.32.Dockerfile | 8 ++++++++ docker/v1.17.33.Dockerfile | 8 ++++++++ docker/v1.17.34.Dockerfile | 8 ++++++++ docker/v1.18.12.Dockerfile | 8 ++++++++ docker/v1.18.13.Dockerfile | 8 ++++++++ docker/v1.18.14.Dockerfile | 8 ++++++++ docker/v1.18.15.Dockerfile | 8 ++++++++ docker/v1.18.17.Dockerfile | 8 ++++++++ docker/v1.18.18.Dockerfile | 8 ++++++++ docker/v1.18.19.Dockerfile | 8 ++++++++ docker/v1.18.20.Dockerfile | 8 ++++++++ docker/v1.18.21.Dockerfile | 8 ++++++++ docker/v1.18.22.Dockerfile | 8 ++++++++ docker/v1.18.23.Dockerfile | 8 ++++++++ docker/v1.18.25.Dockerfile | 8 ++++++++ docker/v1.18.26.Dockerfile | 8 ++++++++ 16 files changed, 128 insertions(+) create mode 100644 docker/v1.17.32.Dockerfile create mode 100644 docker/v1.17.33.Dockerfile create mode 100644 docker/v1.17.34.Dockerfile create mode 100644 docker/v1.18.12.Dockerfile create mode 100644 docker/v1.18.13.Dockerfile create mode 100644 docker/v1.18.14.Dockerfile create mode 100644 docker/v1.18.15.Dockerfile create mode 100644 docker/v1.18.17.Dockerfile create mode 100644 docker/v1.18.18.Dockerfile create mode 100644 docker/v1.18.19.Dockerfile create mode 100644 docker/v1.18.20.Dockerfile create mode 100644 docker/v1.18.21.Dockerfile create mode 100644 docker/v1.18.22.Dockerfile create mode 100644 docker/v1.18.23.Dockerfile create mode 100644 docker/v1.18.25.Dockerfile create mode 100644 docker/v1.18.26.Dockerfile diff --git a/docker/v1.17.32.Dockerfile b/docker/v1.17.32.Dockerfile new file mode 100644 index 0000000..d11cf9e --- /dev/null +++ b/docker/v1.17.32.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.32/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.33.Dockerfile b/docker/v1.17.33.Dockerfile new file mode 100644 index 0000000..95f72ec --- /dev/null +++ b/docker/v1.17.33.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.33/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.34.Dockerfile b/docker/v1.17.34.Dockerfile new file mode 100644 index 0000000..ae4576b --- /dev/null +++ b/docker/v1.17.34.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.34/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.12.Dockerfile b/docker/v1.18.12.Dockerfile new file mode 100644 index 0000000..3b289d1 --- /dev/null +++ b/docker/v1.18.12.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.12/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.13.Dockerfile b/docker/v1.18.13.Dockerfile new file mode 100644 index 0000000..9e96737 --- /dev/null +++ b/docker/v1.18.13.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.13/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.14.Dockerfile b/docker/v1.18.14.Dockerfile new file mode 100644 index 0000000..8156dc8 --- /dev/null +++ b/docker/v1.18.14.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.14/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.15.Dockerfile b/docker/v1.18.15.Dockerfile new file mode 100644 index 0000000..a0c0e36 --- /dev/null +++ b/docker/v1.18.15.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.15/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.17.Dockerfile b/docker/v1.18.17.Dockerfile new file mode 100644 index 0000000..07a68e9 --- /dev/null +++ b/docker/v1.18.17.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.17/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.18.Dockerfile b/docker/v1.18.18.Dockerfile new file mode 100644 index 0000000..1661182 --- /dev/null +++ b/docker/v1.18.18.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.18/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.19.Dockerfile b/docker/v1.18.19.Dockerfile new file mode 100644 index 0000000..96058e4 --- /dev/null +++ b/docker/v1.18.19.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.19/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.20.Dockerfile b/docker/v1.18.20.Dockerfile new file mode 100644 index 0000000..589a1e1 --- /dev/null +++ b/docker/v1.18.20.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.20/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.21.Dockerfile b/docker/v1.18.21.Dockerfile new file mode 100644 index 0000000..31fdc00 --- /dev/null +++ b/docker/v1.18.21.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.21/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.22.Dockerfile b/docker/v1.18.22.Dockerfile new file mode 100644 index 0000000..8886a00 --- /dev/null +++ b/docker/v1.18.22.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.22/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.23.Dockerfile b/docker/v1.18.23.Dockerfile new file mode 100644 index 0000000..e7896d6 --- /dev/null +++ b/docker/v1.18.23.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.23/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.25.Dockerfile b/docker/v1.18.25.Dockerfile new file mode 100644 index 0000000..85673f3 --- /dev/null +++ b/docker/v1.18.25.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.25/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.26.Dockerfile b/docker/v1.18.26.Dockerfile new file mode 100644 index 0000000..2817c4a --- /dev/null +++ b/docker/v1.18.26.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.26/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash From 7995875287c148247e9234c42f1c56846b346bce Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 14:22:46 -0400 Subject: [PATCH 175/314] choose base version to compare to --- .github/workflows/publish_all_dockerfiles.yaml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index 9c42f75..f108bec 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -2,11 +2,12 @@ name: Publish All Changed Images on: workflow_dispatch: - push: - branches: - - master - paths: - - 'docker/**' + inputs: + commit_hash: + description: 'Commit hash to compare from' + required: true + type: string + jobs: detect_changes: @@ -17,7 +18,7 @@ jobs: - uses: actions/checkout@v4 - id: set-matrix run: | - CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.before }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) + CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.inputs.commit_hash }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) if [ -n "$CHANGED_FILES" ]; then echo "matrix=$(echo $CHANGED_FILES | jq -R -s -c 'split("\n")[:-1] | map({version: .[8:-11]})')" >> $GITHUB_OUTPUT else From 84d3b862e547b27feef792f2f0a75436ea5d07c4 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 14:27:22 -0400 Subject: [PATCH 176/314] add fetch depth --- .github/workflows/publish_all_dockerfiles.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index f108bec..bf065a6 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -16,6 +16,8 @@ jobs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - uses: actions/checkout@v4 + with: + fetch-depth: 0 - id: set-matrix run: | CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.inputs.commit_hash }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) From 5eb05dffd6b5ba3a64cf0e2ea6c0397036937421 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 15:43:48 -0400 Subject: [PATCH 177/314] fix matrix parsing --- .github/workflows/publish_all_dockerfiles.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index bf065a6..7b91e92 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -22,7 +22,7 @@ jobs: run: | CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.inputs.commit_hash }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) if [ -n "$CHANGED_FILES" ]; then - echo "matrix=$(echo $CHANGED_FILES | jq -R -s -c 'split("\n")[:-1] | map({version: .[8:-11]})')" >> $GITHUB_OUTPUT + echo "matrix=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map({version: .[8:-11]})')" >> $GITHUB_OUTPUT else echo "matrix=[]" >> $GITHUB_OUTPUT fi From 365b16c4a1af54580742398c6ee05d81f5836783 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 15:48:21 -0400 Subject: [PATCH 178/314] fix parsing --- .github/workflows/publish_all_dockerfiles.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index 7b91e92..f323de2 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -22,7 +22,7 @@ jobs: run: | CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.inputs.commit_hash }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) if [ -n "$CHANGED_FILES" ]; then - echo "matrix=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map({version: .[8:-11]})')" >> $GITHUB_OUTPUT + echo "matrix=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map({version: .[7:-11]}) | tojson')" >> $GITHUB_OUTPUT else echo "matrix=[]" >> $GITHUB_OUTPUT fi From 5fc13be21bfdcdd9e062ec42fe60644d85878d5f Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 15:55:08 -0400 Subject: [PATCH 179/314] remove mapping w key --- .github/workflows/publish_all_dockerfiles.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index f323de2..02cf59c 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -22,7 +22,7 @@ jobs: run: | CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.inputs.commit_hash }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) if [ -n "$CHANGED_FILES" ]; then - echo "matrix=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map({version: .[7:-11]}) | tojson')" >> $GITHUB_OUTPUT + echo "matrix=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11]) | tojson')" >> $GITHUB_OUTPUT else echo "matrix=[]" >> $GITHUB_OUTPUT fi From 91e5c0397b6fac72205dbfd8ab7af3da259f0543 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Wed, 23 Oct 2024 09:58:22 +0530 Subject: [PATCH 180/314] Fixed close subcommand to call program_close --- src/main.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index f6601f3..469ec9b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -178,7 +178,7 @@ async fn main() -> anyhow::Result<()> { .long("program-id") .required(true) .takes_value(true) - .help(""))) + .help("Close the otter-verify PDA account associated with the given program ID"))) .get_matches(); let res = match matches.subcommand() { @@ -251,6 +251,10 @@ async fn main() -> anyhow::Result<()> { &mut temp_dir, ).await } + ("close", Some(sub_m)) => { + let program_id = sub_m.value_of("program-id").unwrap(); + process_close(Pubkey::try_from(program_id)?).await + } // Handle other subcommands in a similar manner, for now let's panic _ => panic!("Unknown subcommand: {:?}\nUse '--help' to see available commands", matches.subcommand().0) }; @@ -751,7 +755,7 @@ pub async fn verify_from_repo( if let Some(commit_hash) = commit_hash.as_ref() { let result = std::process::Command::new("git") .args(["-C", &verify_tmp_root_path]) - .args(["checkout", &commit_hash]) + .args(["checkout", commit_hash]) .output() .map_err(|e| anyhow!("Failed to checkout commit hash: {:?}", e)); if result.is_ok() { From c54194f0e1eca475ca9e012c292c1987b1036791 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Wed, 23 Oct 2024 10:17:18 +0530 Subject: [PATCH 181/314] Fix send_job_to_remote fn --- src/api/client.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/client.rs b/src/api/client.rs index 9e21757..4f75cde 100644 --- a/src/api/client.rs +++ b/src/api/client.rs @@ -165,7 +165,7 @@ pub async fn send_job_to_remote( } let url = format!("https://verify.osec.io/status/{}", program_id); println!("Check the verification status at: {}", url); - println!("Job url: {}", &format!("{}/job/{}", REMOTE_SERVER_URL, status_response.request_id)); + println!("Job url: {}", &format!("{}/job/{}", REMOTE_SERVER_URL, request_id)); Ok(()) } else if response.status() == 409 { From 4bd73aab2cf372d8d24b73d443b4294786919e5e Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Wed, 23 Oct 2024 10:18:42 +0530 Subject: [PATCH 182/314] suppress clippy warning in main.rs --- src/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.rs b/src/main.rs index 469ec9b..3bc908b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -54,6 +54,7 @@ async fn main() -> anyhow::Result<()> { let caught_signal_clone = caught_signal.clone(); let handle = signals.handle(); std::thread::spawn(move || { + #[allow(clippy::never_loop)] for _ in signals.forever() { caught_signal_clone.store(true, Ordering::Relaxed); break; From 9b28909056d0f23f81c915f6a4185e2bfde04cd6 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Wed, 23 Oct 2024 10:19:55 +0530 Subject: [PATCH 183/314] feat: apply cargo fmt and cargo sort --- Cargo.toml | 31 ++- src/api/client.rs | 10 +- src/api/mod.rs | 4 +- src/api/solana.rs | 25 ++- src/image_config.rs | 500 +++++++++++++++++++++++++++++++++--------- src/main.rs | 49 ++++- src/solana_program.rs | 37 ++-- 7 files changed, 493 insertions(+), 163 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index c0f31b2..dbe3952 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,30 +4,29 @@ version = "0.2.13" edition = "2021" description = "A CLI tool for building verifiable Solana programs" license = "MIT" - # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -clap = "2.33.1" # version of v1.18 does not support derive anyhow = "1.0.79" -tokio = { version = "1.29.1", features = ["full"] } -solana-client = "=1.18.23" -solana-cli-config = "=1.18.23" -solana-clap-utils = "=1.18.23" -solana-sdk = "=1.18.23" -sha256 = "1.1.1" # missing in workspace -hex = "0.4.3" -serde_json = "1.0.111" +borsh = { version = "1.2.1", features = ["derive"] } +cargo-lock = "9.0.0" # missing in workspace cargo_toml = "0.15.3" # missing in workspace +clap = "2.33.1" # version of v1.18 does not support derive +crossbeam-channel = "0.5.11" +hex = "0.4.3" +indicatif = "0.17.7" +lazy_static = "1.4.0" pathdiff = "0.2.0" # missing in workspace -signal-hook = "0.3.17" reqwest = "0.11.23" -cargo-lock = "9.0.0" # missing in workspace -lazy_static = "1.4.0" -indicatif = "0.17.7" -crossbeam-channel = "0.5.11" serde = { version = "1.0.195", features = ["derive"] } -borsh = {version = "1.2.1", features = ["derive"] } +serde_json = "1.0.111" +sha256 = "1.1.1" # missing in workspace +signal-hook = "0.3.17" +solana-clap-utils = "=1.18.23" +solana-cli-config = "=1.18.23" +solana-client = "=1.18.23" +solana-sdk = "=1.18.23" +tokio = { version = "1.29.1", features = ["full"] } [dependencies.uuid] version = "1.2.2" diff --git a/src/api/client.rs b/src/api/client.rs index 4f75cde..47eee55 100644 --- a/src/api/client.rs +++ b/src/api/client.rs @@ -152,7 +152,10 @@ pub async fn send_job_to_remote( let status_response: JobVerificationResponse = status.respose.unwrap(); println!("Program {} has not been verified. ❌", program_id); eprintln!("Error message: {}", status_response.message.as_str()); - println!("You can check the logs for more details here: {}/logs/{}", REMOTE_SERVER_URL, request_id); + println!( + "You can check the logs for more details here: {}/logs/{}", + REMOTE_SERVER_URL, request_id + ); break; } JobStatus::Unknown => { @@ -165,7 +168,10 @@ pub async fn send_job_to_remote( } let url = format!("https://verify.osec.io/status/{}", program_id); println!("Check the verification status at: {}", url); - println!("Job url: {}", &format!("{}/job/{}", REMOTE_SERVER_URL, request_id)); + println!( + "Job url: {}", + &format!("{}/job/{}", REMOTE_SERVER_URL, request_id) + ); Ok(()) } else if response.status() == 409 { diff --git a/src/api/mod.rs b/src/api/mod.rs index f8c489b..3dbf24d 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -1,6 +1,6 @@ mod client; -mod solana; mod models; +mod solana; pub use client::send_job_to_remote; -pub use solana::get_last_deployed_slot; \ No newline at end of file +pub use solana::get_last_deployed_slot; diff --git a/src/api/solana.rs b/src/api/solana.rs index 537a5c4..63e9a2d 100644 --- a/src/api/solana.rs +++ b/src/api/solana.rs @@ -54,7 +54,11 @@ struct ProgramInfo { slot: Option, } -async fn get_account_info(client: &Client, rpc_url: &str, address: &str) -> anyhow::Result { +async fn get_account_info( + client: &Client, + rpc_url: &str, + address: &str, +) -> anyhow::Result { let body = serde_json::json!({ "jsonrpc": "2.0", "id": 1, @@ -67,21 +71,21 @@ async fn get_account_info(client: &Client, rpc_url: &str, address: &str) -> anyh ] }); - - let response = client - .post(rpc_url) - .json(&body) - .send() - .await?; + let response = client.post(rpc_url).json(&body).send().await?; let response: RpcResponse = response.json().await?; if let Some(value) = response.result { - return value.value.ok_or_else(|| anyhow::anyhow!("No value found in account info response")); + return value + .value + .ok_or_else(|| anyhow::anyhow!("No value found in account info response")); } anyhow::bail!("No result found in account info response"); } -pub async fn get_last_deployed_slot(rpc_url: &str, program_address: &str) -> Result> { +pub async fn get_last_deployed_slot( + rpc_url: &str, + program_address: &str, +) -> Result> { let client = Client::new(); // Step 1: Get account info for the program address @@ -105,7 +109,6 @@ pub async fn get_last_deployed_slot(rpc_url: &str, program_address: &str) -> Res Ok(last_deployed_slot) } - #[cfg(test)] mod tests { use super::*; @@ -117,4 +120,4 @@ mod tests { let last_deployed_slot = get_last_deployed_slot(rpc_url, program_address).await; assert!(last_deployed_slot.is_ok()); } -} \ No newline at end of file +} diff --git a/src/image_config.rs b/src/image_config.rs index 0ec4005..04ba4e4 100644 --- a/src/image_config.rs +++ b/src/image_config.rs @@ -5,106 +5,406 @@ use std::collections::BTreeMap; lazy_static! { pub static ref IMAGE_MAP: BTreeMap<(u32, u32, u32), &'static str> = { let mut m = BTreeMap::new(); - m.insert((1, 14, 2), "sha256:d4bcffdb9403b154ceeab3063cc5a846a0b4d59a41a8b708249fcc4239b4129d"); - m.insert((1, 14, 3), "sha256:4adf5dfa0812d3b6835f65fb19687d705d057b7e7cb0cfe14abd240679e12de2"); - m.insert((1, 14, 4), "sha256:67cf2a1be16075ca0b53325212c03f48624ca68cdd86dcaaf5a06ff18e959fae"); - m.insert((1, 14, 5), "sha256:608c50412eb0459b0c894117c1e468a480a6f4ea38c4c074e85fc565ecd29214"); - m.insert((1, 14, 6), "sha256:167ed207752e2ec495851e096bf56c1a276b3330e754b322d401c1087a31f540"); - m.insert((1, 14, 7), "sha256:b73ccf1e636e278e20c5789b3d3be3e4a72e7813350a93e2ef39a66933175272"); - m.insert((1, 14, 8), "sha256:a1f76a938980f4bd05ac92829660a781cab167a9a8dd2179787cf23a17526502"); - m.insert((1, 14, 9), "sha256:073eb70e7fa3be8c7d7809e03bdedcf7ddd8744c8004921151c7b1c19fe760fd"); - m.insert((1, 14, 11), "sha256:e82b7df2bb23e6031a04b99e361acb0340b86857e9ad6c76db61fe65757166fd"); - m.insert((1, 14, 12), "sha256:15341a61fcee68cd04f0b0b566e8c2a00978899b3d98aa34e4a30bfac7d6deea"); - m.insert((1, 14, 13), "sha256:4976bd71a0bfa868c28c456bfb080ac59719c570ca6eb0917b445851c4615af4"); - m.insert((1, 14, 14), "sha256:2700fb6433143e6e8c66ba3dffbad50f001e80c1b4e86815f94b32323f05332d"); - m.insert((1, 14, 15), "sha256:0cf3a1945d24f2525e165ddef8b173d8a4387563477fbbae6696c15f4c51e26e"); - m.insert((1, 14, 16), "sha256:c6d3797b4a7790163049933c361ea2a74b4dff8d6a42434e6a04d0d82c04eda0"); - m.insert((1, 14, 17), "sha256:2aa6adc2a856df8977a332f089ab352211eb28812823121e3b5aedd6bbb89df1"); - m.insert((1, 14, 18), "sha256:fe75071a171f817799cb33821f7d680d594d6f066440c9a4c3fd54b55b681439"); - m.insert((1, 14, 19), "sha256:3e567c978dfc782f60c4ce768738cfacc5c36bd005becd1c14379b120d8f9174"); - m.insert((1, 14, 20), "sha256:e9501544d3d085bbbff7c100898ce29bf085dd8c851fb85a73b00f72b2ce7c4c"); - m.insert((1, 14, 21), "sha256:1531e719c4b2675b59b4be410b4cb8d2ecfaf337b6e111dcaf986cf7c343b7e3"); - m.insert((1, 14, 22), "sha256:e6d6f1f095de3188bfcf9356f91102b85290ffeba6388debe11706e1d9a02826"); - m.insert((1, 14, 23), "sha256:f6193af3b4e86a5a40c77b6d4294fccb914c938ef16d8db1d67c7a571797345e"); - m.insert((1, 14, 24), "sha256:866488d56ec3f1a823cb9ecd7652effdc8746b96827209b5ea4ec78a1fa9d45b"); - m.insert((1, 14, 25), "sha256:a274e5245609baa175d2fcca93a6427c9f295cbbca7a705076d5f977db28d360"); - m.insert((1, 14, 26), "sha256:ee6ca9b4dcdb58413259545f833f3834733bb281790b6778099c1a586d267fa8"); - m.insert((1, 14, 27), "sha256:66beebc3bd73ad7b0c694dd0f7027f39e211932caecc0d908467bb00c8f83812"); - m.insert((1, 14, 28), "sha256:4b7a8fcc1d487fe80dfc152d1e49c6067025d5e44bd5d743869fe75b636e4907"); - m.insert((1, 14, 29), "sha256:2a38e78a1bcb369a6673b6442f1ee32f99e839445e426c4fdfdc48ee852e346e"); - m.insert((1, 16, 0), "sha256:63b59011d4451d461cc1ce3beddc627c648209e151022938a43eafcaa06861b5"); - m.insert((1, 16, 1), "sha256:3328149969bfd50dc4ccd0fd61db53f1312cfd8273be3432111ee46a34cf04e4"); - m.insert((1, 16, 2), "sha256:3989c28d287659d38a1b3b92d261c7bd7fc92499fe87e1f88cfeb27296dfbfae"); - m.insert((1, 16, 3), "sha256:e819deea8643d6f4d2f52300148d5de2236df175af7982d400d156f1a69c47d2"); - m.insert((1, 16, 4), "sha256:04cb2437921aff3d3b65055742c36efd80f27ba1deeb5740d9758d5d2a7cd143"); - m.insert((1, 16, 5), "sha256:bbe60168f1b8cab06020e48e1822d24423794b8acedada88c12c3e99e4d10bf1"); - m.insert((1, 16, 6), "sha256:1f6c0032cb1bb12c5ee82b695b2b1ef896cbcae2795514046e5347f371db34bb"); - m.insert((1, 16, 7), "sha256:ee2b096a2c84a8c6e670d5c9973bed744a2b7821521cef8e1ef916276eeb149a"); - m.insert((1, 16, 8), "sha256:5eb24d5a7bae10555a27af158c9e6518005b342bfb0716d45b918c135f7b278c"); - m.insert((1, 16, 9), "sha256:c504b12273774f904ba32f51ba1edb369ac3226802b5d0d3e2b03bba486a3143"); - m.insert((1, 16, 10), "sha256:ef6901ebabf174eb4a8a4874df6426647663fde723b1092eaa3b7cc464dffd2b"); - m.insert((1, 16, 11), "sha256:a2788528b302c4c4144cfcaca35c978a1b420c936201b3b7b80977a289345914"); - m.insert((1, 16, 12), "sha256:fa0ddf49a29261a672bce0ab5340d9a4ad45197ba975ad325ed5ecbef9a7a51e"); - m.insert((1, 16, 13), "sha256:0ee6802da06f74d999bf32d4816457549549c5d205aba85b0c01ffe982563456"); - m.insert((1, 16, 14), "sha256:1eb74340d1ae38a4c1ae03632ffc63ecfb92d5e3a5971e0c6a27a262999e8b81"); - m.insert((1, 16, 15), "sha256:f1077fd6d8bbfbb7bb74d011943840ab477b18a3c4a34def590599ae91dc5ced"); - m.insert((1, 16, 16), "sha256:6516d9dd7de0ff660a85b06e7991b61b55980fc48b0301dc2fd464357be6c630"); - m.insert((1, 16, 17), "sha256:a11ca740647ec6bb4c5defdce385e799f0cac94ed4ae43ea54dc97e051530a31"); - m.insert((1, 16, 18), "sha256:5e036ec546573b24771353bcc307df618445b59d7a6cabe7540cc93bb982d0eb"); - m.insert((1, 16, 19), "sha256:767b5e60efd80872b13ff8364e65449dba75e0a681faf2d609863df063954987"); - m.insert((1, 16, 20), "sha256:4077c6626a605f9b9d2f050744fc5495cfa5dbf11948e6760a8c5055364bfcdb"); - m.insert((1, 16, 21), "sha256:f05e41fb520a6651c31217e7bd77e4bb5e63328dd33e98cb340e624639aca640"); - m.insert((1, 16, 22), "sha256:6cd9b344886876f13cb0ea047f58bfcb745d33e0383d420f45f0229e3d7611b8"); - m.insert((1, 16, 23), "sha256:fd8fcb3b2ab82a0eb6147b22ed66564788e9be19f759f5af69f713618f2e3c28"); - m.insert((1, 16, 24), "sha256:c39cd5b1ecbd5bb4341d2dc7de9d7bb9631ad48fcc609d94bc9771bba9941746"); - m.insert((1, 16, 25), "sha256:6bfefb55c99a16427a8136dbde438d8ad5710d8200cec7668b1e84609b9fc96a"); - m.insert((1, 16, 26), "sha256:b1399b7bff5f37abd52bd1f70a1e14279bddbe68d7a381c30af7a390f2a2b681"); - m.insert((1, 16, 27), "sha256:d3f39f5e1d2fbf798149416bbcb050ae8c03ea8ce18c559fc64beb7547f5c96b"); - m.insert((1, 17, 0), "sha256:b6a15120904aa5c3d5b2404349478c7577fb25dfd73349829f629b81cd21757d"); - m.insert((1, 17, 1), "sha256:3ea48411a4a6fdea26f248b4821782d14420dcfda98e63e8b0782b2da42db2c5"); - m.insert((1, 17, 2), "sha256:10e43778cfb4a1c57c33c4781b0e51874752ab46ed97e3418d058ba27ee3c813"); - m.insert((1, 17, 3), "sha256:c58cf31748b19f03aa21f2d677db0296d98ddc52889953096ab85586b537a770"); - m.insert((1, 17, 4), "sha256:cc0e73a825f4688ed897bc4b3e8cd3426e90cba0d53254b19dd93ac49c2eea53"); - m.insert((1, 17, 5), "sha256:91e50b5c06b5844a41ac9303e9f54aecfa2386e02bcb229c97e3604fbac012f1"); - m.insert((1, 17, 6), "sha256:6ab8b019f8e3556d5e05ebff7100a533078dd7b37309de5f0c8ee24ffb699a24"); - m.insert((1, 17, 7), "sha256:bf95031bb8dc2cd7ac0b9d05b5656a33d5188723859bddfb1dfa5031e04348f2"); - m.insert((1, 17, 8), "sha256:007edb91a663b86a5bded18d8db8efb559f89941f51c54fb1f9044c350980c37"); - m.insert((1, 17, 9), "sha256:3305eda13a0ed63ddf0a8bb9fb2e8c9a01ba23136f3504da275322efac86d2d7"); - m.insert((1, 17, 10), "sha256:76c4b419c674774d4f6d8f576369b4952145a5336baab243f97a209aa773ecf1"); - m.insert((1, 17, 11), "sha256:bbaec57b323f0eaa86ef00fb612a60d6093d27e559f2769b1a6be061a52336e5"); - m.insert((1, 17, 12), "sha256:f0f4dfd83424786a64812a53d218264f7900e8cf3286124a071ffa141dfd6051"); - m.insert((1, 17, 13), "sha256:21706ce972b8676c37a743cb1fafb471bdaafa42e8c7aed19944966e2dcb63c9"); - m.insert((1, 17, 14), "sha256:e2ffac03523f37a4bb95c41d974bea6f6678d629ff9fb33b84dd65412bc48152"); - m.insert((1, 17, 15), "sha256:27e10d218351b6afa6338a36f045a8334f64c710f58f8753ae15fd3a8e0ad22f"); - m.insert((1, 17, 16), "sha256:7d6d95378cda2cd6866ae70563bf184e99d3d937632c0033797bcc483ae81597"); - m.insert((1, 17, 17), "sha256:b8024cdf9e196490328e4ea0721e403396a6f16a5e825a9af63ced7c703ce9c4"); - m.insert((1, 17, 18), "sha256:3c951af1c893a7d509872faed62410de33ff9fc41c2052a8c79f5e44840186d5"); - m.insert((1, 17, 19), "sha256:a4571591bca47306c7b1aa35747d587fdf8621dc690247f0596cbcaced06ee7f"); - m.insert((1, 17, 20), "sha256:7914649a71b10819dbb1f9d5ae440217b83af3f55e8454ff3a1f92e5174148d5"); - m.insert((1, 17, 21), "sha256:0a874df16407f8f440d3e647f65047135dd17bfa526eea21d9010e4933214058"); - m.insert((1, 17, 22), "sha256:89e8f58ee9fe5c1dbaf5a6852a61423680804ccf0a7b4bad95770e329fb8ef84"); - m.insert((1, 17, 23), "sha256:320e37929e0dbb23797e817b089015609acf2e387b0e3c165e43b9db80227105"); - m.insert((1, 17, 24), "sha256:06c5c9011fc7d143ddefc66888dea3e8d91ab6ce95d849ae29e01c507ca5053e"); - m.insert((1, 17, 25), "sha256:748d59cfc5465456240c80c8878c5074e46c652b21810579258bcb5ad98d3a65"); - m.insert((1, 17, 26), "sha256:c968b77df5e307266b4dbfe32ce5cb1f96c1ec0d380005c5ee2372cfb5953629"); - m.insert((1, 17, 27), "sha256:31c406d1e64801ed4092790a627c1b36d4407b00d8a90022dacec85ff131c4ae"); - m.insert((1, 17, 28), "sha256:21511c4de731f494c18b7d51c64cf8ed9bb82deea0028c0d48cbd7fd86c02ffb"); - m.insert((1, 17, 29), "sha256:74efa6a72d82ce2b74f2b5642d4293fa5a302d6d82017e6ad67223dbf3102d58"); - m.insert((1, 17, 30), "sha256:a3def468a993061fd3ea134692766a97d1f8d24e22a12d0c32addd7cd3da8563"); - m.insert((1, 17, 31), "sha256:4b6a1d5db9edb2f0baf5310e3af243f48264f051464fa6b6441e6c04a52f31f1"); - m.insert((1, 18, 0), "sha256:1eda60c966a4da71d5a0d8d1600439aa303561f29068801a8e0e2b34f121f7ab"); - m.insert((1, 18, 1), "sha256:0c15cf35e58a43972475bc96de47b5b51805548a16d1e97ec6c1947c98770d22"); - m.insert((1, 18, 2), "sha256:5c7bda6b3d0b23ea36fc47363b5d9e534caec7b7f5f3d0e063681a3105e8de88"); - m.insert((1, 18, 3), "sha256:7f89d853a5914ba73b5dbc89fd58e51f2dd6586a355ff7308ac2e06d13c733bb"); - m.insert((1, 18, 4), "sha256:30a7c92c6249a99d14d742bb08fe5d3d5275aaba39625aca56019e80ea970e63"); - m.insert((1, 18, 5), "sha256:42b5d459fee57028da69f00791c2c5a6853b745bd2bdbdacb935aa1c57a4679d"); - m.insert((1, 18, 6), "sha256:cd66fcd774f1ed500868554836cc025891de2df32e4487067f61b07edf4b4b46"); - m.insert((1, 18, 7), "sha256:a70e5c66970adb73beaa000df9537e4c41d60dad5e8cc270cdfc53ec6ea13364"); - m.insert((1, 18, 8), "sha256:0a2cfd125ab771f66d5c9d0f60067b78bd5b43ed6edbc63985b48d7f781579d6"); - m.insert((1, 18, 9), "sha256:083ad44f3181d56dea0b628260f3ecf70744add259632234c377d1b6ee5d6a9d"); - m.insert((1, 18, 10), "sha256:0e0b25263f3755a065dcbfcd436844d9ecdaa729cf4395492ea6357a7dcffa50"); - m.insert((1, 18, 11), "sha256:ba596c913a21489633f1d043c05f26dead294a4153dd48a9952d8af4312900a3"); - m.insert((1, 18, 16), "sha256:8f56be84b2c6f2ea8c018e00cff1a9b7e2bbea6bf3d9949c9359b1ef46dba7aa"); + m.insert( + (1, 14, 2), + "sha256:d4bcffdb9403b154ceeab3063cc5a846a0b4d59a41a8b708249fcc4239b4129d", + ); + m.insert( + (1, 14, 3), + "sha256:4adf5dfa0812d3b6835f65fb19687d705d057b7e7cb0cfe14abd240679e12de2", + ); + m.insert( + (1, 14, 4), + "sha256:67cf2a1be16075ca0b53325212c03f48624ca68cdd86dcaaf5a06ff18e959fae", + ); + m.insert( + (1, 14, 5), + "sha256:608c50412eb0459b0c894117c1e468a480a6f4ea38c4c074e85fc565ecd29214", + ); + m.insert( + (1, 14, 6), + "sha256:167ed207752e2ec495851e096bf56c1a276b3330e754b322d401c1087a31f540", + ); + m.insert( + (1, 14, 7), + "sha256:b73ccf1e636e278e20c5789b3d3be3e4a72e7813350a93e2ef39a66933175272", + ); + m.insert( + (1, 14, 8), + "sha256:a1f76a938980f4bd05ac92829660a781cab167a9a8dd2179787cf23a17526502", + ); + m.insert( + (1, 14, 9), + "sha256:073eb70e7fa3be8c7d7809e03bdedcf7ddd8744c8004921151c7b1c19fe760fd", + ); + m.insert( + (1, 14, 11), + "sha256:e82b7df2bb23e6031a04b99e361acb0340b86857e9ad6c76db61fe65757166fd", + ); + m.insert( + (1, 14, 12), + "sha256:15341a61fcee68cd04f0b0b566e8c2a00978899b3d98aa34e4a30bfac7d6deea", + ); + m.insert( + (1, 14, 13), + "sha256:4976bd71a0bfa868c28c456bfb080ac59719c570ca6eb0917b445851c4615af4", + ); + m.insert( + (1, 14, 14), + "sha256:2700fb6433143e6e8c66ba3dffbad50f001e80c1b4e86815f94b32323f05332d", + ); + m.insert( + (1, 14, 15), + "sha256:0cf3a1945d24f2525e165ddef8b173d8a4387563477fbbae6696c15f4c51e26e", + ); + m.insert( + (1, 14, 16), + "sha256:c6d3797b4a7790163049933c361ea2a74b4dff8d6a42434e6a04d0d82c04eda0", + ); + m.insert( + (1, 14, 17), + "sha256:2aa6adc2a856df8977a332f089ab352211eb28812823121e3b5aedd6bbb89df1", + ); + m.insert( + (1, 14, 18), + "sha256:fe75071a171f817799cb33821f7d680d594d6f066440c9a4c3fd54b55b681439", + ); + m.insert( + (1, 14, 19), + "sha256:3e567c978dfc782f60c4ce768738cfacc5c36bd005becd1c14379b120d8f9174", + ); + m.insert( + (1, 14, 20), + "sha256:e9501544d3d085bbbff7c100898ce29bf085dd8c851fb85a73b00f72b2ce7c4c", + ); + m.insert( + (1, 14, 21), + "sha256:1531e719c4b2675b59b4be410b4cb8d2ecfaf337b6e111dcaf986cf7c343b7e3", + ); + m.insert( + (1, 14, 22), + "sha256:e6d6f1f095de3188bfcf9356f91102b85290ffeba6388debe11706e1d9a02826", + ); + m.insert( + (1, 14, 23), + "sha256:f6193af3b4e86a5a40c77b6d4294fccb914c938ef16d8db1d67c7a571797345e", + ); + m.insert( + (1, 14, 24), + "sha256:866488d56ec3f1a823cb9ecd7652effdc8746b96827209b5ea4ec78a1fa9d45b", + ); + m.insert( + (1, 14, 25), + "sha256:a274e5245609baa175d2fcca93a6427c9f295cbbca7a705076d5f977db28d360", + ); + m.insert( + (1, 14, 26), + "sha256:ee6ca9b4dcdb58413259545f833f3834733bb281790b6778099c1a586d267fa8", + ); + m.insert( + (1, 14, 27), + "sha256:66beebc3bd73ad7b0c694dd0f7027f39e211932caecc0d908467bb00c8f83812", + ); + m.insert( + (1, 14, 28), + "sha256:4b7a8fcc1d487fe80dfc152d1e49c6067025d5e44bd5d743869fe75b636e4907", + ); + m.insert( + (1, 14, 29), + "sha256:2a38e78a1bcb369a6673b6442f1ee32f99e839445e426c4fdfdc48ee852e346e", + ); + m.insert( + (1, 16, 0), + "sha256:63b59011d4451d461cc1ce3beddc627c648209e151022938a43eafcaa06861b5", + ); + m.insert( + (1, 16, 1), + "sha256:3328149969bfd50dc4ccd0fd61db53f1312cfd8273be3432111ee46a34cf04e4", + ); + m.insert( + (1, 16, 2), + "sha256:3989c28d287659d38a1b3b92d261c7bd7fc92499fe87e1f88cfeb27296dfbfae", + ); + m.insert( + (1, 16, 3), + "sha256:e819deea8643d6f4d2f52300148d5de2236df175af7982d400d156f1a69c47d2", + ); + m.insert( + (1, 16, 4), + "sha256:04cb2437921aff3d3b65055742c36efd80f27ba1deeb5740d9758d5d2a7cd143", + ); + m.insert( + (1, 16, 5), + "sha256:bbe60168f1b8cab06020e48e1822d24423794b8acedada88c12c3e99e4d10bf1", + ); + m.insert( + (1, 16, 6), + "sha256:1f6c0032cb1bb12c5ee82b695b2b1ef896cbcae2795514046e5347f371db34bb", + ); + m.insert( + (1, 16, 7), + "sha256:ee2b096a2c84a8c6e670d5c9973bed744a2b7821521cef8e1ef916276eeb149a", + ); + m.insert( + (1, 16, 8), + "sha256:5eb24d5a7bae10555a27af158c9e6518005b342bfb0716d45b918c135f7b278c", + ); + m.insert( + (1, 16, 9), + "sha256:c504b12273774f904ba32f51ba1edb369ac3226802b5d0d3e2b03bba486a3143", + ); + m.insert( + (1, 16, 10), + "sha256:ef6901ebabf174eb4a8a4874df6426647663fde723b1092eaa3b7cc464dffd2b", + ); + m.insert( + (1, 16, 11), + "sha256:a2788528b302c4c4144cfcaca35c978a1b420c936201b3b7b80977a289345914", + ); + m.insert( + (1, 16, 12), + "sha256:fa0ddf49a29261a672bce0ab5340d9a4ad45197ba975ad325ed5ecbef9a7a51e", + ); + m.insert( + (1, 16, 13), + "sha256:0ee6802da06f74d999bf32d4816457549549c5d205aba85b0c01ffe982563456", + ); + m.insert( + (1, 16, 14), + "sha256:1eb74340d1ae38a4c1ae03632ffc63ecfb92d5e3a5971e0c6a27a262999e8b81", + ); + m.insert( + (1, 16, 15), + "sha256:f1077fd6d8bbfbb7bb74d011943840ab477b18a3c4a34def590599ae91dc5ced", + ); + m.insert( + (1, 16, 16), + "sha256:6516d9dd7de0ff660a85b06e7991b61b55980fc48b0301dc2fd464357be6c630", + ); + m.insert( + (1, 16, 17), + "sha256:a11ca740647ec6bb4c5defdce385e799f0cac94ed4ae43ea54dc97e051530a31", + ); + m.insert( + (1, 16, 18), + "sha256:5e036ec546573b24771353bcc307df618445b59d7a6cabe7540cc93bb982d0eb", + ); + m.insert( + (1, 16, 19), + "sha256:767b5e60efd80872b13ff8364e65449dba75e0a681faf2d609863df063954987", + ); + m.insert( + (1, 16, 20), + "sha256:4077c6626a605f9b9d2f050744fc5495cfa5dbf11948e6760a8c5055364bfcdb", + ); + m.insert( + (1, 16, 21), + "sha256:f05e41fb520a6651c31217e7bd77e4bb5e63328dd33e98cb340e624639aca640", + ); + m.insert( + (1, 16, 22), + "sha256:6cd9b344886876f13cb0ea047f58bfcb745d33e0383d420f45f0229e3d7611b8", + ); + m.insert( + (1, 16, 23), + "sha256:fd8fcb3b2ab82a0eb6147b22ed66564788e9be19f759f5af69f713618f2e3c28", + ); + m.insert( + (1, 16, 24), + "sha256:c39cd5b1ecbd5bb4341d2dc7de9d7bb9631ad48fcc609d94bc9771bba9941746", + ); + m.insert( + (1, 16, 25), + "sha256:6bfefb55c99a16427a8136dbde438d8ad5710d8200cec7668b1e84609b9fc96a", + ); + m.insert( + (1, 16, 26), + "sha256:b1399b7bff5f37abd52bd1f70a1e14279bddbe68d7a381c30af7a390f2a2b681", + ); + m.insert( + (1, 16, 27), + "sha256:d3f39f5e1d2fbf798149416bbcb050ae8c03ea8ce18c559fc64beb7547f5c96b", + ); + m.insert( + (1, 17, 0), + "sha256:b6a15120904aa5c3d5b2404349478c7577fb25dfd73349829f629b81cd21757d", + ); + m.insert( + (1, 17, 1), + "sha256:3ea48411a4a6fdea26f248b4821782d14420dcfda98e63e8b0782b2da42db2c5", + ); + m.insert( + (1, 17, 2), + "sha256:10e43778cfb4a1c57c33c4781b0e51874752ab46ed97e3418d058ba27ee3c813", + ); + m.insert( + (1, 17, 3), + "sha256:c58cf31748b19f03aa21f2d677db0296d98ddc52889953096ab85586b537a770", + ); + m.insert( + (1, 17, 4), + "sha256:cc0e73a825f4688ed897bc4b3e8cd3426e90cba0d53254b19dd93ac49c2eea53", + ); + m.insert( + (1, 17, 5), + "sha256:91e50b5c06b5844a41ac9303e9f54aecfa2386e02bcb229c97e3604fbac012f1", + ); + m.insert( + (1, 17, 6), + "sha256:6ab8b019f8e3556d5e05ebff7100a533078dd7b37309de5f0c8ee24ffb699a24", + ); + m.insert( + (1, 17, 7), + "sha256:bf95031bb8dc2cd7ac0b9d05b5656a33d5188723859bddfb1dfa5031e04348f2", + ); + m.insert( + (1, 17, 8), + "sha256:007edb91a663b86a5bded18d8db8efb559f89941f51c54fb1f9044c350980c37", + ); + m.insert( + (1, 17, 9), + "sha256:3305eda13a0ed63ddf0a8bb9fb2e8c9a01ba23136f3504da275322efac86d2d7", + ); + m.insert( + (1, 17, 10), + "sha256:76c4b419c674774d4f6d8f576369b4952145a5336baab243f97a209aa773ecf1", + ); + m.insert( + (1, 17, 11), + "sha256:bbaec57b323f0eaa86ef00fb612a60d6093d27e559f2769b1a6be061a52336e5", + ); + m.insert( + (1, 17, 12), + "sha256:f0f4dfd83424786a64812a53d218264f7900e8cf3286124a071ffa141dfd6051", + ); + m.insert( + (1, 17, 13), + "sha256:21706ce972b8676c37a743cb1fafb471bdaafa42e8c7aed19944966e2dcb63c9", + ); + m.insert( + (1, 17, 14), + "sha256:e2ffac03523f37a4bb95c41d974bea6f6678d629ff9fb33b84dd65412bc48152", + ); + m.insert( + (1, 17, 15), + "sha256:27e10d218351b6afa6338a36f045a8334f64c710f58f8753ae15fd3a8e0ad22f", + ); + m.insert( + (1, 17, 16), + "sha256:7d6d95378cda2cd6866ae70563bf184e99d3d937632c0033797bcc483ae81597", + ); + m.insert( + (1, 17, 17), + "sha256:b8024cdf9e196490328e4ea0721e403396a6f16a5e825a9af63ced7c703ce9c4", + ); + m.insert( + (1, 17, 18), + "sha256:3c951af1c893a7d509872faed62410de33ff9fc41c2052a8c79f5e44840186d5", + ); + m.insert( + (1, 17, 19), + "sha256:a4571591bca47306c7b1aa35747d587fdf8621dc690247f0596cbcaced06ee7f", + ); + m.insert( + (1, 17, 20), + "sha256:7914649a71b10819dbb1f9d5ae440217b83af3f55e8454ff3a1f92e5174148d5", + ); + m.insert( + (1, 17, 21), + "sha256:0a874df16407f8f440d3e647f65047135dd17bfa526eea21d9010e4933214058", + ); + m.insert( + (1, 17, 22), + "sha256:89e8f58ee9fe5c1dbaf5a6852a61423680804ccf0a7b4bad95770e329fb8ef84", + ); + m.insert( + (1, 17, 23), + "sha256:320e37929e0dbb23797e817b089015609acf2e387b0e3c165e43b9db80227105", + ); + m.insert( + (1, 17, 24), + "sha256:06c5c9011fc7d143ddefc66888dea3e8d91ab6ce95d849ae29e01c507ca5053e", + ); + m.insert( + (1, 17, 25), + "sha256:748d59cfc5465456240c80c8878c5074e46c652b21810579258bcb5ad98d3a65", + ); + m.insert( + (1, 17, 26), + "sha256:c968b77df5e307266b4dbfe32ce5cb1f96c1ec0d380005c5ee2372cfb5953629", + ); + m.insert( + (1, 17, 27), + "sha256:31c406d1e64801ed4092790a627c1b36d4407b00d8a90022dacec85ff131c4ae", + ); + m.insert( + (1, 17, 28), + "sha256:21511c4de731f494c18b7d51c64cf8ed9bb82deea0028c0d48cbd7fd86c02ffb", + ); + m.insert( + (1, 17, 29), + "sha256:74efa6a72d82ce2b74f2b5642d4293fa5a302d6d82017e6ad67223dbf3102d58", + ); + m.insert( + (1, 17, 30), + "sha256:a3def468a993061fd3ea134692766a97d1f8d24e22a12d0c32addd7cd3da8563", + ); + m.insert( + (1, 17, 31), + "sha256:4b6a1d5db9edb2f0baf5310e3af243f48264f051464fa6b6441e6c04a52f31f1", + ); + m.insert( + (1, 18, 0), + "sha256:1eda60c966a4da71d5a0d8d1600439aa303561f29068801a8e0e2b34f121f7ab", + ); + m.insert( + (1, 18, 1), + "sha256:0c15cf35e58a43972475bc96de47b5b51805548a16d1e97ec6c1947c98770d22", + ); + m.insert( + (1, 18, 2), + "sha256:5c7bda6b3d0b23ea36fc47363b5d9e534caec7b7f5f3d0e063681a3105e8de88", + ); + m.insert( + (1, 18, 3), + "sha256:7f89d853a5914ba73b5dbc89fd58e51f2dd6586a355ff7308ac2e06d13c733bb", + ); + m.insert( + (1, 18, 4), + "sha256:30a7c92c6249a99d14d742bb08fe5d3d5275aaba39625aca56019e80ea970e63", + ); + m.insert( + (1, 18, 5), + "sha256:42b5d459fee57028da69f00791c2c5a6853b745bd2bdbdacb935aa1c57a4679d", + ); + m.insert( + (1, 18, 6), + "sha256:cd66fcd774f1ed500868554836cc025891de2df32e4487067f61b07edf4b4b46", + ); + m.insert( + (1, 18, 7), + "sha256:a70e5c66970adb73beaa000df9537e4c41d60dad5e8cc270cdfc53ec6ea13364", + ); + m.insert( + (1, 18, 8), + "sha256:0a2cfd125ab771f66d5c9d0f60067b78bd5b43ed6edbc63985b48d7f781579d6", + ); + m.insert( + (1, 18, 9), + "sha256:083ad44f3181d56dea0b628260f3ecf70744add259632234c377d1b6ee5d6a9d", + ); + m.insert( + (1, 18, 10), + "sha256:0e0b25263f3755a065dcbfcd436844d9ecdaa729cf4395492ea6357a7dcffa50", + ); + m.insert( + (1, 18, 11), + "sha256:ba596c913a21489633f1d043c05f26dead294a4153dd48a9952d8af4312900a3", + ); + m.insert( + (1, 18, 16), + "sha256:8f56be84b2c6f2ea8c018e00cff1a9b7e2bbea6bf3d9949c9359b1ef46dba7aa", + ); m }; } diff --git a/src/main.rs b/src/main.rs index 3bc908b..6593a30 100644 --- a/src/main.rs +++ b/src/main.rs @@ -188,9 +188,20 @@ async fn main() -> anyhow::Result<()> { let library_name = sub_m.value_of("library-name").map(|s| s.to_string()); let base_image = sub_m.value_of("base-image").map(|s| s.to_string()); let bpf_flag = sub_m.is_present("bpf"); - let cargo_args = sub_m.values_of("cargo-args").unwrap_or_default().map(|s| s.to_string()).collect(); - build(mount_directory, library_name, base_image, bpf_flag, cargo_args, &mut container_id) - }, + let cargo_args = sub_m + .values_of("cargo-args") + .unwrap_or_default() + .map(|s| s.to_string()) + .collect(); + build( + mount_directory, + library_name, + base_image, + bpf_flag, + cargo_args, + &mut container_id, + ) + } ("verify-from-image", Some(sub_m)) => { let executable_path = sub_m.value_of("executable-path-in-image").unwrap(); let image = sub_m.value_of("image").unwrap(); @@ -205,25 +216,31 @@ async fn main() -> anyhow::Result<()> { &mut temp_dir, &mut container_id, ) - }, + } ("get-executable-hash", Some(sub_m)) => { let filepath = sub_m.value_of("filepath").map(|s| s.to_string()).unwrap(); let program_hash = get_file_hash(&filepath)?; println!("{}", program_hash); Ok(()) - }, + } ("get-buffer-hash", Some(sub_m)) => { let buffer_address = sub_m.value_of("buffer-address").unwrap(); - let buffer_hash = get_buffer_hash(matches.value_of("url").map(|s| s.to_string()), Pubkey::try_from(buffer_address)?)?; + let buffer_hash = get_buffer_hash( + matches.value_of("url").map(|s| s.to_string()), + Pubkey::try_from(buffer_address)?, + )?; println!("{}", buffer_hash); Ok(()) - }, + } ("get-program-hash", Some(sub_m)) => { let program_id = sub_m.value_of("program-id").unwrap(); - let program_hash = get_program_hash(matches.value_of("url").map(|s| s.to_string()), Pubkey::try_from(program_id)?)?; + let program_hash = get_program_hash( + matches.value_of("url").map(|s| s.to_string()), + Pubkey::try_from(program_id)?, + )?; println!("{}", program_hash); Ok(()) - }, + } ("verify-from-repo", Some(sub_m)) => { let remote = sub_m.is_present("remote"); let mount_path = sub_m.value_of("mount-path").map(|s| s.to_string()).unwrap(); @@ -234,7 +251,11 @@ async fn main() -> anyhow::Result<()> { let library_name = sub_m.value_of("library-name").map(|s| s.to_string()); let bpf_flag = sub_m.is_present("bpf"); let current_dir = sub_m.is_present("current-dir"); - let cargo_args: Vec = sub_m.values_of("cargo-args").unwrap_or_default().map(|s| s.to_string()).collect(); + let cargo_args: Vec = sub_m + .values_of("cargo-args") + .unwrap_or_default() + .map(|s| s.to_string()) + .collect(); verify_from_repo( remote, @@ -250,14 +271,18 @@ async fn main() -> anyhow::Result<()> { current_dir, &mut container_id, &mut temp_dir, - ).await + ) + .await } ("close", Some(sub_m)) => { let program_id = sub_m.value_of("program-id").unwrap(); process_close(Pubkey::try_from(program_id)?).await } // Handle other subcommands in a similar manner, for now let's panic - _ => panic!("Unknown subcommand: {:?}\nUse '--help' to see available commands", matches.subcommand().0) + _ => panic!( + "Unknown subcommand: {:?}\nUse '--help' to see available commands", + matches.subcommand().0 + ), }; if caught_signal.load(Ordering::Relaxed) || res.is_err() { diff --git a/src/solana_program.rs b/src/solana_program.rs index 6b4c7d2..e1f0ae7 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -2,7 +2,8 @@ use anyhow::anyhow; use solana_cli_config::Config; use solana_client::rpc_client::RpcClient; use std::{ - io::{self, Read, Write}, str::FromStr + io::{self, Read, Write}, + str::FromStr, }; use borsh::{to_vec, BorshDeserialize, BorshSerialize}; @@ -134,32 +135,27 @@ pub async fn upload_program( program_address: Pubkey, connection_url: Option, ) -> anyhow::Result<()> { - if prompt_user_input("Do you want to upload the program verification to the Solana Blockchain? (y/n) ") { + if prompt_user_input( + "Do you want to upload the program verification to the Solana Blockchain? (y/n) ", + ) { println!("Uploading the program verification params to the Solana blockchain..."); - + let cli_config = get_user_config()?; - + let signer_pubkey = cli_config.0.pubkey(); let connection = match connection_url.as_deref() { - Some("m") => { - RpcClient::new("https://api.mainnet-beta.solana.com") - }, - Some("d") => { - RpcClient::new("https://api.devnet.solana.com") - }, - Some("l") => { - RpcClient::new("http://localhost:8899") - }, - Some(url) => { - RpcClient::new(url) - }, + Some("m") => RpcClient::new("https://api.mainnet-beta.solana.com"), + Some("d") => RpcClient::new("https://api.devnet.solana.com"), + Some("l") => RpcClient::new("http://localhost:8899"), + Some(url) => RpcClient::new(url), None => cli_config.1, }; let rpc_url = connection.url(); println!("Using connection url: {}", rpc_url); - - let last_deployed_slot = get_last_deployed_slot(&rpc_url, &program_address.to_string()).await - .map_err(|err| anyhow!("Unable to get last deployed slot: {}", err))?; + + let last_deployed_slot = get_last_deployed_slot(&rpc_url, &program_address.to_string()) + .await + .map_err(|err| anyhow!("Unable to get last deployed slot: {}", err))?; let input_params = InputParams { version: env!("CARGO_PKG_VERSION").to_string(), @@ -236,7 +232,8 @@ pub async fn process_close(program_address: Pubkey) -> anyhow::Result<()> { let connection = user_config.1; let rpc_url = connection.url(); - let last_deployed_slot = get_last_deployed_slot(&rpc_url, &program_address.to_string()).await + let last_deployed_slot = get_last_deployed_slot(&rpc_url, &program_address.to_string()) + .await .map_err(|err| anyhow!("Unable to get last deployed slot: {}", err))?; let otter_verify_program_id = Pubkey::from_str(OTTER_VERIFY_PROGRAMID)?; From 4a16037eb01131c821fd154fb9c0faf1b0c547ea Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Wed, 23 Oct 2024 10:27:16 +0530 Subject: [PATCH 184/314] enhance the help and about messages for the 'close' subcommand --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6593a30..d8839dc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -174,12 +174,12 @@ async fn main() -> anyhow::Result<()> { .last(true) .help("Arguments to pass to the underlying `cargo build-bpf` command"))) .subcommand(SubCommand::with_name("close") - .about("") + .about("Close the otter-verify PDA account associated with the given program ID") .arg(Arg::with_name("program-id") .long("program-id") .required(true) .takes_value(true) - .help("Close the otter-verify PDA account associated with the given program ID"))) + .help("The address of the program to close the PDA"))) .get_matches(); let res = match matches.subcommand() { From 8cb0a3defb9f1363ab7373c1f61e1a9da805a2aa Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Wed, 23 Oct 2024 10:27:50 +0530 Subject: [PATCH 185/314] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/main.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a698269..0d0af06 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4007,7 +4007,7 @@ dependencies = [ [[package]] name = "solana-verify" -version = "0.2.13" +version = "0.2.14" dependencies = [ "anyhow", "borsh 1.5.0", diff --git a/Cargo.toml b/Cargo.toml index dbe3952..5cab881 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "solana-verify" -version = "0.2.13" +version = "0.2.14" edition = "2021" description = "A CLI tool for building verifiable Solana programs" license = "MIT" diff --git a/src/main.rs b/src/main.rs index d8839dc..01102a9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -63,7 +63,7 @@ async fn main() -> anyhow::Result<()> { let matches = App::new("solana-verifier") .author("Ellipsis") - .version("0.1.0") + .version("0.2.14") .about("Solana Verifiable Build Tool") .arg(Arg::with_name("url") .short("u") From cb255e22705d64847b9c7d64c3a0870496f850c3 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Wed, 23 Oct 2024 11:04:01 +0530 Subject: [PATCH 186/314] update app metadata (name, author, version, about) in CLI tool --- src/main.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 01102a9..00b5e95 100644 --- a/src/main.rs +++ b/src/main.rs @@ -61,10 +61,10 @@ async fn main() -> anyhow::Result<()> { } }); - let matches = App::new("solana-verifier") - .author("Ellipsis") - .version("0.2.14") - .about("Solana Verifiable Build Tool") + let matches = App::new("solana-verify") + .author("Ellipsis Labs ") + .version(env!("CARGO_PKG_VERSION")) + .about("A CLI tool for building verifiable Solana programs") .arg(Arg::with_name("url") .short("u") .long("url") From cce02e68872707dce19a36e8f6a4b9464d0d2411 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Wed, 23 Oct 2024 08:51:19 -0400 Subject: [PATCH 187/314] revamp --- .github/workflows/publish_all_dockerfiles.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index 02cf59c..45d5ef0 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -22,7 +22,7 @@ jobs: run: | CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.inputs.commit_hash }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) if [ -n "$CHANGED_FILES" ]; then - echo "matrix=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11]) | tojson')" >> $GITHUB_OUTPUT + echo "matrix=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11]) | {version: .} | tojson')" >> $GITHUB_OUTPUT else echo "matrix=[]" >> $GITHUB_OUTPUT fi From d5ac5df5720b0a4bb49d5c71f185f9f354250d8c Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Wed, 23 Oct 2024 08:58:32 -0400 Subject: [PATCH 188/314] matrix -> versions name --- .github/workflows/publish_all_dockerfiles.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index 45d5ef0..85469a8 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -22,18 +22,18 @@ jobs: run: | CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.inputs.commit_hash }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) if [ -n "$CHANGED_FILES" ]; then - echo "matrix=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11]) | {version: .} | tojson')" >> $GITHUB_OUTPUT + echo "versions=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11])')" >> $GITHUB_OUTPUT else - echo "matrix=[]" >> $GITHUB_OUTPUT + echo "versions=[]" >> $GITHUB_OUTPUT fi - name: Display matrix run: echo "${{ steps.set-matrix.outputs.matrix }}" push_to_registries: needs: detect_changes - if: ${{ needs.detect_changes.outputs.matrix != '[]' }} + if: ${{ needs.detect_changes.outputs.versions != '[]' }} strategy: - matrix: ${{fromJson(needs.detect_changes.outputs.matrix)}} + matrix: ${{fromJson(needs.detect_changes.outputs.versions )}} name: Push Docker images to ghcr.io runs-on: ubuntu-latest permissions: From 0af870a02e3235e2f67b360a29b566b033f04e4d Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Wed, 23 Oct 2024 09:12:26 -0400 Subject: [PATCH 189/314] truncate whitespace --- .github/workflows/publish_all_dockerfiles.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index 85469a8..c34ce47 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -22,7 +22,7 @@ jobs: run: | CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.inputs.commit_hash }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) if [ -n "$CHANGED_FILES" ]; then - echo "versions=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11])')" >> $GITHUB_OUTPUT + echo "versions=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11])' | tr -d '\n' | sed 's/, /,/g')" >> $GITHUB_OUTPUT else echo "versions=[]" >> $GITHUB_OUTPUT fi @@ -33,7 +33,7 @@ jobs: needs: detect_changes if: ${{ needs.detect_changes.outputs.versions != '[]' }} strategy: - matrix: ${{fromJson(needs.detect_changes.outputs.versions )}} + matrix: ${{ fromJson(needs.detect_changes.outputs.versions )}} name: Push Docker images to ghcr.io runs-on: ubuntu-latest permissions: From 2d11901f5f60850c6a97c824ace574766264c7ae Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Wed, 23 Oct 2024 09:15:00 -0400 Subject: [PATCH 190/314] truncate --- .github/workflows/publish_all_dockerfiles.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index c34ce47..ab40813 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -22,7 +22,7 @@ jobs: run: | CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.inputs.commit_hash }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) if [ -n "$CHANGED_FILES" ]; then - echo "versions=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11])' | tr -d '\n' | sed 's/, /,/g')" >> $GITHUB_OUTPUT + echo "versions=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11])' | tr -d '[:space:]')" >> $GITHUB_OUTPUT else echo "versions=[]" >> $GITHUB_OUTPUT fi From 9b33c3707ebca1f7dcd807106201679ecb9d2efb Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Wed, 23 Oct 2024 17:49:22 -0400 Subject: [PATCH 191/314] debug --- .github/workflows/publish_all_dockerfiles.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index ab40813..d017c57 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -13,7 +13,7 @@ jobs: detect_changes: runs-on: ubuntu-latest outputs: - matrix: ${{ steps.set-matrix.outputs.matrix }} + versions: ${{ steps.set-matrix.outputs.versions }} steps: - uses: actions/checkout@v4 with: @@ -21,13 +21,16 @@ jobs: - id: set-matrix run: | CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.inputs.commit_hash }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) + echo "CHANGED_FILE=$CHANGED_FILES" if [ -n "$CHANGED_FILES" ]; then + echo "$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11])' | tr -d '[:space:]')" echo "versions=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11])' | tr -d '[:space:]')" >> $GITHUB_OUTPUT else echo "versions=[]" >> $GITHUB_OUTPUT fi + echo $GITHUB_OUTPUT - name: Display matrix - run: echo "${{ steps.set-matrix.outputs.matrix }}" + run: echo "${{ steps.set-matrix.outputs.versions }}" push_to_registries: needs: detect_changes From 9a83dc8b66465a8d573bf5ba25015425d46d40dc Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Wed, 23 Oct 2024 17:57:27 -0400 Subject: [PATCH 192/314] fix version matrix strat --- .github/workflows/publish_all_dockerfiles.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index d017c57..a7d9da1 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -36,7 +36,8 @@ jobs: needs: detect_changes if: ${{ needs.detect_changes.outputs.versions != '[]' }} strategy: - matrix: ${{ fromJson(needs.detect_changes.outputs.versions )}} + matrix: + version: ${{ fromJson(needs.detect_changes.outputs.versions )}} name: Push Docker images to ghcr.io runs-on: ubuntu-latest permissions: From e2bea7085cd18bc00db44cd20bc3bb43e02b9ed8 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Wed, 23 Oct 2024 20:59:05 -0400 Subject: [PATCH 193/314] fix ghcr parsing --- update_image_whitelist.py | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/update_image_whitelist.py b/update_image_whitelist.py index ad4d0c6..c9434bc 100644 --- a/update_image_whitelist.py +++ b/update_image_whitelist.py @@ -5,31 +5,44 @@ use_ghcr = os.environ.get('USE_GHCR', 'false').lower() == 'true' headers = {'Authorization': f'Bearer {github_token}'} -if not use_ghcr: +if use_ghcr: response = requests.get( - "https://hub.docker.com/v2/namespaces/ellipsislabs/repositories/solana/tags?page_size=1000" + "https://api.github.com/users/ngundotra/packages/container/solana/versions?per_page=100", + headers=headers ) if response.status_code != 200: raise Exception(f"Failed to get Docker images: {response.status_code} {response.text}") - results = response.json()["results"] + results = response.json() else: response = requests.get( - "https://api.github.com/users/ngundotra/packages/container/solana/versions?per_page=100", - headers=headers + "https://hub.docker.com/v2/namespaces/ellipsislabs/repositories/solana/tags?page_size=1000" ) if response.status_code != 200: raise Exception(f"Failed to get Docker images: {response.status_code} {response.text}") - results = response.json() + results = response.json()["results"] digest_map = {} for result in results: - if result["name"] != "latest": - try: - major, minor, patch = list(map(int, result["name"].split("."))) - digest_map[(major, minor, patch)] = result["digest"] - except Exception as e: - print(e) - continue + if use_ghcr: + # For GHCR, extract version from metadata + metadata = result.get("metadata", {}) + container = metadata.get("container", {}) + tags = container.get("tags", []) + if tags and tags[0] != "latest": + try: + major, minor, patch = map(int, tags[0].split(".")) + digest_map[(major, minor, patch)] = result["name"] # "name" contains the digest/sha for GHCR + except Exception as e: + print(f"Error processing tag {tags[0]}: {e}") + continue + else: + if result["name"] != "latest": + try: + major, minor, patch = list(map(int, result["name"].split("."))) + digest_map[(major, minor, patch)] = result["digest"] + except Exception as e: + print(e) + continue entries = [] From f4d01031c2a51b5b98672d6b5456b54c90e956c7 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Wed, 23 Oct 2024 21:03:04 -0400 Subject: [PATCH 194/314] fix issue where tags don't get parsed correctly --- update_image_whitelist.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/update_image_whitelist.py b/update_image_whitelist.py index c9434bc..309fe5d 100644 --- a/update_image_whitelist.py +++ b/update_image_whitelist.py @@ -1,3 +1,4 @@ +import re import requests import os @@ -28,13 +29,12 @@ metadata = result.get("metadata", {}) container = metadata.get("container", {}) tags = container.get("tags", []) - if tags and tags[0] != "latest": - try: - major, minor, patch = map(int, tags[0].split(".")) - digest_map[(major, minor, patch)] = result["name"] # "name" contains the digest/sha for GHCR - except Exception as e: - print(f"Error processing tag {tags[0]}: {e}") - continue + for tag in tags: + match = re.match(r'(\d+)\.(\d+)\.(\d+)', tag) + if match: + major, minor, patch = map(int, match.groups()) + digest_map[(major, minor, patch)] = result["name"] # "name" contains the digest for GHCR + break else: if result["name"] != "latest": try: From 27dad905768c6e512ef6392f733ff97f35358cb1 Mon Sep 17 00:00:00 2001 From: swaroop-osec Date: Thu, 24 Oct 2024 06:38:23 +0530 Subject: [PATCH 195/314] Regenerate image_config.rs file --- src/image_config.rs | 500 +++++++++----------------------------------- src/main.rs | 1 + 2 files changed, 101 insertions(+), 400 deletions(-) diff --git a/src/image_config.rs b/src/image_config.rs index 04ba4e4..0ec4005 100644 --- a/src/image_config.rs +++ b/src/image_config.rs @@ -5,406 +5,106 @@ use std::collections::BTreeMap; lazy_static! { pub static ref IMAGE_MAP: BTreeMap<(u32, u32, u32), &'static str> = { let mut m = BTreeMap::new(); - m.insert( - (1, 14, 2), - "sha256:d4bcffdb9403b154ceeab3063cc5a846a0b4d59a41a8b708249fcc4239b4129d", - ); - m.insert( - (1, 14, 3), - "sha256:4adf5dfa0812d3b6835f65fb19687d705d057b7e7cb0cfe14abd240679e12de2", - ); - m.insert( - (1, 14, 4), - "sha256:67cf2a1be16075ca0b53325212c03f48624ca68cdd86dcaaf5a06ff18e959fae", - ); - m.insert( - (1, 14, 5), - "sha256:608c50412eb0459b0c894117c1e468a480a6f4ea38c4c074e85fc565ecd29214", - ); - m.insert( - (1, 14, 6), - "sha256:167ed207752e2ec495851e096bf56c1a276b3330e754b322d401c1087a31f540", - ); - m.insert( - (1, 14, 7), - "sha256:b73ccf1e636e278e20c5789b3d3be3e4a72e7813350a93e2ef39a66933175272", - ); - m.insert( - (1, 14, 8), - "sha256:a1f76a938980f4bd05ac92829660a781cab167a9a8dd2179787cf23a17526502", - ); - m.insert( - (1, 14, 9), - "sha256:073eb70e7fa3be8c7d7809e03bdedcf7ddd8744c8004921151c7b1c19fe760fd", - ); - m.insert( - (1, 14, 11), - "sha256:e82b7df2bb23e6031a04b99e361acb0340b86857e9ad6c76db61fe65757166fd", - ); - m.insert( - (1, 14, 12), - "sha256:15341a61fcee68cd04f0b0b566e8c2a00978899b3d98aa34e4a30bfac7d6deea", - ); - m.insert( - (1, 14, 13), - "sha256:4976bd71a0bfa868c28c456bfb080ac59719c570ca6eb0917b445851c4615af4", - ); - m.insert( - (1, 14, 14), - "sha256:2700fb6433143e6e8c66ba3dffbad50f001e80c1b4e86815f94b32323f05332d", - ); - m.insert( - (1, 14, 15), - "sha256:0cf3a1945d24f2525e165ddef8b173d8a4387563477fbbae6696c15f4c51e26e", - ); - m.insert( - (1, 14, 16), - "sha256:c6d3797b4a7790163049933c361ea2a74b4dff8d6a42434e6a04d0d82c04eda0", - ); - m.insert( - (1, 14, 17), - "sha256:2aa6adc2a856df8977a332f089ab352211eb28812823121e3b5aedd6bbb89df1", - ); - m.insert( - (1, 14, 18), - "sha256:fe75071a171f817799cb33821f7d680d594d6f066440c9a4c3fd54b55b681439", - ); - m.insert( - (1, 14, 19), - "sha256:3e567c978dfc782f60c4ce768738cfacc5c36bd005becd1c14379b120d8f9174", - ); - m.insert( - (1, 14, 20), - "sha256:e9501544d3d085bbbff7c100898ce29bf085dd8c851fb85a73b00f72b2ce7c4c", - ); - m.insert( - (1, 14, 21), - "sha256:1531e719c4b2675b59b4be410b4cb8d2ecfaf337b6e111dcaf986cf7c343b7e3", - ); - m.insert( - (1, 14, 22), - "sha256:e6d6f1f095de3188bfcf9356f91102b85290ffeba6388debe11706e1d9a02826", - ); - m.insert( - (1, 14, 23), - "sha256:f6193af3b4e86a5a40c77b6d4294fccb914c938ef16d8db1d67c7a571797345e", - ); - m.insert( - (1, 14, 24), - "sha256:866488d56ec3f1a823cb9ecd7652effdc8746b96827209b5ea4ec78a1fa9d45b", - ); - m.insert( - (1, 14, 25), - "sha256:a274e5245609baa175d2fcca93a6427c9f295cbbca7a705076d5f977db28d360", - ); - m.insert( - (1, 14, 26), - "sha256:ee6ca9b4dcdb58413259545f833f3834733bb281790b6778099c1a586d267fa8", - ); - m.insert( - (1, 14, 27), - "sha256:66beebc3bd73ad7b0c694dd0f7027f39e211932caecc0d908467bb00c8f83812", - ); - m.insert( - (1, 14, 28), - "sha256:4b7a8fcc1d487fe80dfc152d1e49c6067025d5e44bd5d743869fe75b636e4907", - ); - m.insert( - (1, 14, 29), - "sha256:2a38e78a1bcb369a6673b6442f1ee32f99e839445e426c4fdfdc48ee852e346e", - ); - m.insert( - (1, 16, 0), - "sha256:63b59011d4451d461cc1ce3beddc627c648209e151022938a43eafcaa06861b5", - ); - m.insert( - (1, 16, 1), - "sha256:3328149969bfd50dc4ccd0fd61db53f1312cfd8273be3432111ee46a34cf04e4", - ); - m.insert( - (1, 16, 2), - "sha256:3989c28d287659d38a1b3b92d261c7bd7fc92499fe87e1f88cfeb27296dfbfae", - ); - m.insert( - (1, 16, 3), - "sha256:e819deea8643d6f4d2f52300148d5de2236df175af7982d400d156f1a69c47d2", - ); - m.insert( - (1, 16, 4), - "sha256:04cb2437921aff3d3b65055742c36efd80f27ba1deeb5740d9758d5d2a7cd143", - ); - m.insert( - (1, 16, 5), - "sha256:bbe60168f1b8cab06020e48e1822d24423794b8acedada88c12c3e99e4d10bf1", - ); - m.insert( - (1, 16, 6), - "sha256:1f6c0032cb1bb12c5ee82b695b2b1ef896cbcae2795514046e5347f371db34bb", - ); - m.insert( - (1, 16, 7), - "sha256:ee2b096a2c84a8c6e670d5c9973bed744a2b7821521cef8e1ef916276eeb149a", - ); - m.insert( - (1, 16, 8), - "sha256:5eb24d5a7bae10555a27af158c9e6518005b342bfb0716d45b918c135f7b278c", - ); - m.insert( - (1, 16, 9), - "sha256:c504b12273774f904ba32f51ba1edb369ac3226802b5d0d3e2b03bba486a3143", - ); - m.insert( - (1, 16, 10), - "sha256:ef6901ebabf174eb4a8a4874df6426647663fde723b1092eaa3b7cc464dffd2b", - ); - m.insert( - (1, 16, 11), - "sha256:a2788528b302c4c4144cfcaca35c978a1b420c936201b3b7b80977a289345914", - ); - m.insert( - (1, 16, 12), - "sha256:fa0ddf49a29261a672bce0ab5340d9a4ad45197ba975ad325ed5ecbef9a7a51e", - ); - m.insert( - (1, 16, 13), - "sha256:0ee6802da06f74d999bf32d4816457549549c5d205aba85b0c01ffe982563456", - ); - m.insert( - (1, 16, 14), - "sha256:1eb74340d1ae38a4c1ae03632ffc63ecfb92d5e3a5971e0c6a27a262999e8b81", - ); - m.insert( - (1, 16, 15), - "sha256:f1077fd6d8bbfbb7bb74d011943840ab477b18a3c4a34def590599ae91dc5ced", - ); - m.insert( - (1, 16, 16), - "sha256:6516d9dd7de0ff660a85b06e7991b61b55980fc48b0301dc2fd464357be6c630", - ); - m.insert( - (1, 16, 17), - "sha256:a11ca740647ec6bb4c5defdce385e799f0cac94ed4ae43ea54dc97e051530a31", - ); - m.insert( - (1, 16, 18), - "sha256:5e036ec546573b24771353bcc307df618445b59d7a6cabe7540cc93bb982d0eb", - ); - m.insert( - (1, 16, 19), - "sha256:767b5e60efd80872b13ff8364e65449dba75e0a681faf2d609863df063954987", - ); - m.insert( - (1, 16, 20), - "sha256:4077c6626a605f9b9d2f050744fc5495cfa5dbf11948e6760a8c5055364bfcdb", - ); - m.insert( - (1, 16, 21), - "sha256:f05e41fb520a6651c31217e7bd77e4bb5e63328dd33e98cb340e624639aca640", - ); - m.insert( - (1, 16, 22), - "sha256:6cd9b344886876f13cb0ea047f58bfcb745d33e0383d420f45f0229e3d7611b8", - ); - m.insert( - (1, 16, 23), - "sha256:fd8fcb3b2ab82a0eb6147b22ed66564788e9be19f759f5af69f713618f2e3c28", - ); - m.insert( - (1, 16, 24), - "sha256:c39cd5b1ecbd5bb4341d2dc7de9d7bb9631ad48fcc609d94bc9771bba9941746", - ); - m.insert( - (1, 16, 25), - "sha256:6bfefb55c99a16427a8136dbde438d8ad5710d8200cec7668b1e84609b9fc96a", - ); - m.insert( - (1, 16, 26), - "sha256:b1399b7bff5f37abd52bd1f70a1e14279bddbe68d7a381c30af7a390f2a2b681", - ); - m.insert( - (1, 16, 27), - "sha256:d3f39f5e1d2fbf798149416bbcb050ae8c03ea8ce18c559fc64beb7547f5c96b", - ); - m.insert( - (1, 17, 0), - "sha256:b6a15120904aa5c3d5b2404349478c7577fb25dfd73349829f629b81cd21757d", - ); - m.insert( - (1, 17, 1), - "sha256:3ea48411a4a6fdea26f248b4821782d14420dcfda98e63e8b0782b2da42db2c5", - ); - m.insert( - (1, 17, 2), - "sha256:10e43778cfb4a1c57c33c4781b0e51874752ab46ed97e3418d058ba27ee3c813", - ); - m.insert( - (1, 17, 3), - "sha256:c58cf31748b19f03aa21f2d677db0296d98ddc52889953096ab85586b537a770", - ); - m.insert( - (1, 17, 4), - "sha256:cc0e73a825f4688ed897bc4b3e8cd3426e90cba0d53254b19dd93ac49c2eea53", - ); - m.insert( - (1, 17, 5), - "sha256:91e50b5c06b5844a41ac9303e9f54aecfa2386e02bcb229c97e3604fbac012f1", - ); - m.insert( - (1, 17, 6), - "sha256:6ab8b019f8e3556d5e05ebff7100a533078dd7b37309de5f0c8ee24ffb699a24", - ); - m.insert( - (1, 17, 7), - "sha256:bf95031bb8dc2cd7ac0b9d05b5656a33d5188723859bddfb1dfa5031e04348f2", - ); - m.insert( - (1, 17, 8), - "sha256:007edb91a663b86a5bded18d8db8efb559f89941f51c54fb1f9044c350980c37", - ); - m.insert( - (1, 17, 9), - "sha256:3305eda13a0ed63ddf0a8bb9fb2e8c9a01ba23136f3504da275322efac86d2d7", - ); - m.insert( - (1, 17, 10), - "sha256:76c4b419c674774d4f6d8f576369b4952145a5336baab243f97a209aa773ecf1", - ); - m.insert( - (1, 17, 11), - "sha256:bbaec57b323f0eaa86ef00fb612a60d6093d27e559f2769b1a6be061a52336e5", - ); - m.insert( - (1, 17, 12), - "sha256:f0f4dfd83424786a64812a53d218264f7900e8cf3286124a071ffa141dfd6051", - ); - m.insert( - (1, 17, 13), - "sha256:21706ce972b8676c37a743cb1fafb471bdaafa42e8c7aed19944966e2dcb63c9", - ); - m.insert( - (1, 17, 14), - "sha256:e2ffac03523f37a4bb95c41d974bea6f6678d629ff9fb33b84dd65412bc48152", - ); - m.insert( - (1, 17, 15), - "sha256:27e10d218351b6afa6338a36f045a8334f64c710f58f8753ae15fd3a8e0ad22f", - ); - m.insert( - (1, 17, 16), - "sha256:7d6d95378cda2cd6866ae70563bf184e99d3d937632c0033797bcc483ae81597", - ); - m.insert( - (1, 17, 17), - "sha256:b8024cdf9e196490328e4ea0721e403396a6f16a5e825a9af63ced7c703ce9c4", - ); - m.insert( - (1, 17, 18), - "sha256:3c951af1c893a7d509872faed62410de33ff9fc41c2052a8c79f5e44840186d5", - ); - m.insert( - (1, 17, 19), - "sha256:a4571591bca47306c7b1aa35747d587fdf8621dc690247f0596cbcaced06ee7f", - ); - m.insert( - (1, 17, 20), - "sha256:7914649a71b10819dbb1f9d5ae440217b83af3f55e8454ff3a1f92e5174148d5", - ); - m.insert( - (1, 17, 21), - "sha256:0a874df16407f8f440d3e647f65047135dd17bfa526eea21d9010e4933214058", - ); - m.insert( - (1, 17, 22), - "sha256:89e8f58ee9fe5c1dbaf5a6852a61423680804ccf0a7b4bad95770e329fb8ef84", - ); - m.insert( - (1, 17, 23), - "sha256:320e37929e0dbb23797e817b089015609acf2e387b0e3c165e43b9db80227105", - ); - m.insert( - (1, 17, 24), - "sha256:06c5c9011fc7d143ddefc66888dea3e8d91ab6ce95d849ae29e01c507ca5053e", - ); - m.insert( - (1, 17, 25), - "sha256:748d59cfc5465456240c80c8878c5074e46c652b21810579258bcb5ad98d3a65", - ); - m.insert( - (1, 17, 26), - "sha256:c968b77df5e307266b4dbfe32ce5cb1f96c1ec0d380005c5ee2372cfb5953629", - ); - m.insert( - (1, 17, 27), - "sha256:31c406d1e64801ed4092790a627c1b36d4407b00d8a90022dacec85ff131c4ae", - ); - m.insert( - (1, 17, 28), - "sha256:21511c4de731f494c18b7d51c64cf8ed9bb82deea0028c0d48cbd7fd86c02ffb", - ); - m.insert( - (1, 17, 29), - "sha256:74efa6a72d82ce2b74f2b5642d4293fa5a302d6d82017e6ad67223dbf3102d58", - ); - m.insert( - (1, 17, 30), - "sha256:a3def468a993061fd3ea134692766a97d1f8d24e22a12d0c32addd7cd3da8563", - ); - m.insert( - (1, 17, 31), - "sha256:4b6a1d5db9edb2f0baf5310e3af243f48264f051464fa6b6441e6c04a52f31f1", - ); - m.insert( - (1, 18, 0), - "sha256:1eda60c966a4da71d5a0d8d1600439aa303561f29068801a8e0e2b34f121f7ab", - ); - m.insert( - (1, 18, 1), - "sha256:0c15cf35e58a43972475bc96de47b5b51805548a16d1e97ec6c1947c98770d22", - ); - m.insert( - (1, 18, 2), - "sha256:5c7bda6b3d0b23ea36fc47363b5d9e534caec7b7f5f3d0e063681a3105e8de88", - ); - m.insert( - (1, 18, 3), - "sha256:7f89d853a5914ba73b5dbc89fd58e51f2dd6586a355ff7308ac2e06d13c733bb", - ); - m.insert( - (1, 18, 4), - "sha256:30a7c92c6249a99d14d742bb08fe5d3d5275aaba39625aca56019e80ea970e63", - ); - m.insert( - (1, 18, 5), - "sha256:42b5d459fee57028da69f00791c2c5a6853b745bd2bdbdacb935aa1c57a4679d", - ); - m.insert( - (1, 18, 6), - "sha256:cd66fcd774f1ed500868554836cc025891de2df32e4487067f61b07edf4b4b46", - ); - m.insert( - (1, 18, 7), - "sha256:a70e5c66970adb73beaa000df9537e4c41d60dad5e8cc270cdfc53ec6ea13364", - ); - m.insert( - (1, 18, 8), - "sha256:0a2cfd125ab771f66d5c9d0f60067b78bd5b43ed6edbc63985b48d7f781579d6", - ); - m.insert( - (1, 18, 9), - "sha256:083ad44f3181d56dea0b628260f3ecf70744add259632234c377d1b6ee5d6a9d", - ); - m.insert( - (1, 18, 10), - "sha256:0e0b25263f3755a065dcbfcd436844d9ecdaa729cf4395492ea6357a7dcffa50", - ); - m.insert( - (1, 18, 11), - "sha256:ba596c913a21489633f1d043c05f26dead294a4153dd48a9952d8af4312900a3", - ); - m.insert( - (1, 18, 16), - "sha256:8f56be84b2c6f2ea8c018e00cff1a9b7e2bbea6bf3d9949c9359b1ef46dba7aa", - ); + m.insert((1, 14, 2), "sha256:d4bcffdb9403b154ceeab3063cc5a846a0b4d59a41a8b708249fcc4239b4129d"); + m.insert((1, 14, 3), "sha256:4adf5dfa0812d3b6835f65fb19687d705d057b7e7cb0cfe14abd240679e12de2"); + m.insert((1, 14, 4), "sha256:67cf2a1be16075ca0b53325212c03f48624ca68cdd86dcaaf5a06ff18e959fae"); + m.insert((1, 14, 5), "sha256:608c50412eb0459b0c894117c1e468a480a6f4ea38c4c074e85fc565ecd29214"); + m.insert((1, 14, 6), "sha256:167ed207752e2ec495851e096bf56c1a276b3330e754b322d401c1087a31f540"); + m.insert((1, 14, 7), "sha256:b73ccf1e636e278e20c5789b3d3be3e4a72e7813350a93e2ef39a66933175272"); + m.insert((1, 14, 8), "sha256:a1f76a938980f4bd05ac92829660a781cab167a9a8dd2179787cf23a17526502"); + m.insert((1, 14, 9), "sha256:073eb70e7fa3be8c7d7809e03bdedcf7ddd8744c8004921151c7b1c19fe760fd"); + m.insert((1, 14, 11), "sha256:e82b7df2bb23e6031a04b99e361acb0340b86857e9ad6c76db61fe65757166fd"); + m.insert((1, 14, 12), "sha256:15341a61fcee68cd04f0b0b566e8c2a00978899b3d98aa34e4a30bfac7d6deea"); + m.insert((1, 14, 13), "sha256:4976bd71a0bfa868c28c456bfb080ac59719c570ca6eb0917b445851c4615af4"); + m.insert((1, 14, 14), "sha256:2700fb6433143e6e8c66ba3dffbad50f001e80c1b4e86815f94b32323f05332d"); + m.insert((1, 14, 15), "sha256:0cf3a1945d24f2525e165ddef8b173d8a4387563477fbbae6696c15f4c51e26e"); + m.insert((1, 14, 16), "sha256:c6d3797b4a7790163049933c361ea2a74b4dff8d6a42434e6a04d0d82c04eda0"); + m.insert((1, 14, 17), "sha256:2aa6adc2a856df8977a332f089ab352211eb28812823121e3b5aedd6bbb89df1"); + m.insert((1, 14, 18), "sha256:fe75071a171f817799cb33821f7d680d594d6f066440c9a4c3fd54b55b681439"); + m.insert((1, 14, 19), "sha256:3e567c978dfc782f60c4ce768738cfacc5c36bd005becd1c14379b120d8f9174"); + m.insert((1, 14, 20), "sha256:e9501544d3d085bbbff7c100898ce29bf085dd8c851fb85a73b00f72b2ce7c4c"); + m.insert((1, 14, 21), "sha256:1531e719c4b2675b59b4be410b4cb8d2ecfaf337b6e111dcaf986cf7c343b7e3"); + m.insert((1, 14, 22), "sha256:e6d6f1f095de3188bfcf9356f91102b85290ffeba6388debe11706e1d9a02826"); + m.insert((1, 14, 23), "sha256:f6193af3b4e86a5a40c77b6d4294fccb914c938ef16d8db1d67c7a571797345e"); + m.insert((1, 14, 24), "sha256:866488d56ec3f1a823cb9ecd7652effdc8746b96827209b5ea4ec78a1fa9d45b"); + m.insert((1, 14, 25), "sha256:a274e5245609baa175d2fcca93a6427c9f295cbbca7a705076d5f977db28d360"); + m.insert((1, 14, 26), "sha256:ee6ca9b4dcdb58413259545f833f3834733bb281790b6778099c1a586d267fa8"); + m.insert((1, 14, 27), "sha256:66beebc3bd73ad7b0c694dd0f7027f39e211932caecc0d908467bb00c8f83812"); + m.insert((1, 14, 28), "sha256:4b7a8fcc1d487fe80dfc152d1e49c6067025d5e44bd5d743869fe75b636e4907"); + m.insert((1, 14, 29), "sha256:2a38e78a1bcb369a6673b6442f1ee32f99e839445e426c4fdfdc48ee852e346e"); + m.insert((1, 16, 0), "sha256:63b59011d4451d461cc1ce3beddc627c648209e151022938a43eafcaa06861b5"); + m.insert((1, 16, 1), "sha256:3328149969bfd50dc4ccd0fd61db53f1312cfd8273be3432111ee46a34cf04e4"); + m.insert((1, 16, 2), "sha256:3989c28d287659d38a1b3b92d261c7bd7fc92499fe87e1f88cfeb27296dfbfae"); + m.insert((1, 16, 3), "sha256:e819deea8643d6f4d2f52300148d5de2236df175af7982d400d156f1a69c47d2"); + m.insert((1, 16, 4), "sha256:04cb2437921aff3d3b65055742c36efd80f27ba1deeb5740d9758d5d2a7cd143"); + m.insert((1, 16, 5), "sha256:bbe60168f1b8cab06020e48e1822d24423794b8acedada88c12c3e99e4d10bf1"); + m.insert((1, 16, 6), "sha256:1f6c0032cb1bb12c5ee82b695b2b1ef896cbcae2795514046e5347f371db34bb"); + m.insert((1, 16, 7), "sha256:ee2b096a2c84a8c6e670d5c9973bed744a2b7821521cef8e1ef916276eeb149a"); + m.insert((1, 16, 8), "sha256:5eb24d5a7bae10555a27af158c9e6518005b342bfb0716d45b918c135f7b278c"); + m.insert((1, 16, 9), "sha256:c504b12273774f904ba32f51ba1edb369ac3226802b5d0d3e2b03bba486a3143"); + m.insert((1, 16, 10), "sha256:ef6901ebabf174eb4a8a4874df6426647663fde723b1092eaa3b7cc464dffd2b"); + m.insert((1, 16, 11), "sha256:a2788528b302c4c4144cfcaca35c978a1b420c936201b3b7b80977a289345914"); + m.insert((1, 16, 12), "sha256:fa0ddf49a29261a672bce0ab5340d9a4ad45197ba975ad325ed5ecbef9a7a51e"); + m.insert((1, 16, 13), "sha256:0ee6802da06f74d999bf32d4816457549549c5d205aba85b0c01ffe982563456"); + m.insert((1, 16, 14), "sha256:1eb74340d1ae38a4c1ae03632ffc63ecfb92d5e3a5971e0c6a27a262999e8b81"); + m.insert((1, 16, 15), "sha256:f1077fd6d8bbfbb7bb74d011943840ab477b18a3c4a34def590599ae91dc5ced"); + m.insert((1, 16, 16), "sha256:6516d9dd7de0ff660a85b06e7991b61b55980fc48b0301dc2fd464357be6c630"); + m.insert((1, 16, 17), "sha256:a11ca740647ec6bb4c5defdce385e799f0cac94ed4ae43ea54dc97e051530a31"); + m.insert((1, 16, 18), "sha256:5e036ec546573b24771353bcc307df618445b59d7a6cabe7540cc93bb982d0eb"); + m.insert((1, 16, 19), "sha256:767b5e60efd80872b13ff8364e65449dba75e0a681faf2d609863df063954987"); + m.insert((1, 16, 20), "sha256:4077c6626a605f9b9d2f050744fc5495cfa5dbf11948e6760a8c5055364bfcdb"); + m.insert((1, 16, 21), "sha256:f05e41fb520a6651c31217e7bd77e4bb5e63328dd33e98cb340e624639aca640"); + m.insert((1, 16, 22), "sha256:6cd9b344886876f13cb0ea047f58bfcb745d33e0383d420f45f0229e3d7611b8"); + m.insert((1, 16, 23), "sha256:fd8fcb3b2ab82a0eb6147b22ed66564788e9be19f759f5af69f713618f2e3c28"); + m.insert((1, 16, 24), "sha256:c39cd5b1ecbd5bb4341d2dc7de9d7bb9631ad48fcc609d94bc9771bba9941746"); + m.insert((1, 16, 25), "sha256:6bfefb55c99a16427a8136dbde438d8ad5710d8200cec7668b1e84609b9fc96a"); + m.insert((1, 16, 26), "sha256:b1399b7bff5f37abd52bd1f70a1e14279bddbe68d7a381c30af7a390f2a2b681"); + m.insert((1, 16, 27), "sha256:d3f39f5e1d2fbf798149416bbcb050ae8c03ea8ce18c559fc64beb7547f5c96b"); + m.insert((1, 17, 0), "sha256:b6a15120904aa5c3d5b2404349478c7577fb25dfd73349829f629b81cd21757d"); + m.insert((1, 17, 1), "sha256:3ea48411a4a6fdea26f248b4821782d14420dcfda98e63e8b0782b2da42db2c5"); + m.insert((1, 17, 2), "sha256:10e43778cfb4a1c57c33c4781b0e51874752ab46ed97e3418d058ba27ee3c813"); + m.insert((1, 17, 3), "sha256:c58cf31748b19f03aa21f2d677db0296d98ddc52889953096ab85586b537a770"); + m.insert((1, 17, 4), "sha256:cc0e73a825f4688ed897bc4b3e8cd3426e90cba0d53254b19dd93ac49c2eea53"); + m.insert((1, 17, 5), "sha256:91e50b5c06b5844a41ac9303e9f54aecfa2386e02bcb229c97e3604fbac012f1"); + m.insert((1, 17, 6), "sha256:6ab8b019f8e3556d5e05ebff7100a533078dd7b37309de5f0c8ee24ffb699a24"); + m.insert((1, 17, 7), "sha256:bf95031bb8dc2cd7ac0b9d05b5656a33d5188723859bddfb1dfa5031e04348f2"); + m.insert((1, 17, 8), "sha256:007edb91a663b86a5bded18d8db8efb559f89941f51c54fb1f9044c350980c37"); + m.insert((1, 17, 9), "sha256:3305eda13a0ed63ddf0a8bb9fb2e8c9a01ba23136f3504da275322efac86d2d7"); + m.insert((1, 17, 10), "sha256:76c4b419c674774d4f6d8f576369b4952145a5336baab243f97a209aa773ecf1"); + m.insert((1, 17, 11), "sha256:bbaec57b323f0eaa86ef00fb612a60d6093d27e559f2769b1a6be061a52336e5"); + m.insert((1, 17, 12), "sha256:f0f4dfd83424786a64812a53d218264f7900e8cf3286124a071ffa141dfd6051"); + m.insert((1, 17, 13), "sha256:21706ce972b8676c37a743cb1fafb471bdaafa42e8c7aed19944966e2dcb63c9"); + m.insert((1, 17, 14), "sha256:e2ffac03523f37a4bb95c41d974bea6f6678d629ff9fb33b84dd65412bc48152"); + m.insert((1, 17, 15), "sha256:27e10d218351b6afa6338a36f045a8334f64c710f58f8753ae15fd3a8e0ad22f"); + m.insert((1, 17, 16), "sha256:7d6d95378cda2cd6866ae70563bf184e99d3d937632c0033797bcc483ae81597"); + m.insert((1, 17, 17), "sha256:b8024cdf9e196490328e4ea0721e403396a6f16a5e825a9af63ced7c703ce9c4"); + m.insert((1, 17, 18), "sha256:3c951af1c893a7d509872faed62410de33ff9fc41c2052a8c79f5e44840186d5"); + m.insert((1, 17, 19), "sha256:a4571591bca47306c7b1aa35747d587fdf8621dc690247f0596cbcaced06ee7f"); + m.insert((1, 17, 20), "sha256:7914649a71b10819dbb1f9d5ae440217b83af3f55e8454ff3a1f92e5174148d5"); + m.insert((1, 17, 21), "sha256:0a874df16407f8f440d3e647f65047135dd17bfa526eea21d9010e4933214058"); + m.insert((1, 17, 22), "sha256:89e8f58ee9fe5c1dbaf5a6852a61423680804ccf0a7b4bad95770e329fb8ef84"); + m.insert((1, 17, 23), "sha256:320e37929e0dbb23797e817b089015609acf2e387b0e3c165e43b9db80227105"); + m.insert((1, 17, 24), "sha256:06c5c9011fc7d143ddefc66888dea3e8d91ab6ce95d849ae29e01c507ca5053e"); + m.insert((1, 17, 25), "sha256:748d59cfc5465456240c80c8878c5074e46c652b21810579258bcb5ad98d3a65"); + m.insert((1, 17, 26), "sha256:c968b77df5e307266b4dbfe32ce5cb1f96c1ec0d380005c5ee2372cfb5953629"); + m.insert((1, 17, 27), "sha256:31c406d1e64801ed4092790a627c1b36d4407b00d8a90022dacec85ff131c4ae"); + m.insert((1, 17, 28), "sha256:21511c4de731f494c18b7d51c64cf8ed9bb82deea0028c0d48cbd7fd86c02ffb"); + m.insert((1, 17, 29), "sha256:74efa6a72d82ce2b74f2b5642d4293fa5a302d6d82017e6ad67223dbf3102d58"); + m.insert((1, 17, 30), "sha256:a3def468a993061fd3ea134692766a97d1f8d24e22a12d0c32addd7cd3da8563"); + m.insert((1, 17, 31), "sha256:4b6a1d5db9edb2f0baf5310e3af243f48264f051464fa6b6441e6c04a52f31f1"); + m.insert((1, 18, 0), "sha256:1eda60c966a4da71d5a0d8d1600439aa303561f29068801a8e0e2b34f121f7ab"); + m.insert((1, 18, 1), "sha256:0c15cf35e58a43972475bc96de47b5b51805548a16d1e97ec6c1947c98770d22"); + m.insert((1, 18, 2), "sha256:5c7bda6b3d0b23ea36fc47363b5d9e534caec7b7f5f3d0e063681a3105e8de88"); + m.insert((1, 18, 3), "sha256:7f89d853a5914ba73b5dbc89fd58e51f2dd6586a355ff7308ac2e06d13c733bb"); + m.insert((1, 18, 4), "sha256:30a7c92c6249a99d14d742bb08fe5d3d5275aaba39625aca56019e80ea970e63"); + m.insert((1, 18, 5), "sha256:42b5d459fee57028da69f00791c2c5a6853b745bd2bdbdacb935aa1c57a4679d"); + m.insert((1, 18, 6), "sha256:cd66fcd774f1ed500868554836cc025891de2df32e4487067f61b07edf4b4b46"); + m.insert((1, 18, 7), "sha256:a70e5c66970adb73beaa000df9537e4c41d60dad5e8cc270cdfc53ec6ea13364"); + m.insert((1, 18, 8), "sha256:0a2cfd125ab771f66d5c9d0f60067b78bd5b43ed6edbc63985b48d7f781579d6"); + m.insert((1, 18, 9), "sha256:083ad44f3181d56dea0b628260f3ecf70744add259632234c377d1b6ee5d6a9d"); + m.insert((1, 18, 10), "sha256:0e0b25263f3755a065dcbfcd436844d9ecdaa729cf4395492ea6357a7dcffa50"); + m.insert((1, 18, 11), "sha256:ba596c913a21489633f1d043c05f26dead294a4153dd48a9952d8af4312900a3"); + m.insert((1, 18, 16), "sha256:8f56be84b2c6f2ea8c018e00cff1a9b7e2bbea6bf3d9949c9359b1ef46dba7aa"); m }; } diff --git a/src/main.rs b/src/main.rs index 00b5e95..136448c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,6 +23,7 @@ use std::{ }; use uuid::Uuid; pub mod api; +#[rustfmt::skip] pub mod image_config; pub mod solana_program; use image_config::IMAGE_MAP; From b7fee3ea596585276a7040e09e2395b034108731 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 09:00:19 -0400 Subject: [PATCH 196/314] add build+publish dockerfile --- .github/workflows/publish_dockerfile.yaml | 66 +++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 .github/workflows/publish_dockerfile.yaml diff --git a/.github/workflows/publish_dockerfile.yaml b/.github/workflows/publish_dockerfile.yaml new file mode 100644 index 0000000..da2d775 --- /dev/null +++ b/.github/workflows/publish_dockerfile.yaml @@ -0,0 +1,66 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +# GitHub recommends pinning actions to a commit SHA. +# To get a newer version, you will need to update the SHA. +# You can also reference a tag or branch, but the action may change without warning. + +name: Publish Docker image + +on: + workflow_dispatch: + inputs: + version: + description: 'Solana version to generate Dockerfile for (e.g., 1.16.0)' + required: true + type: string + +jobs: + push_to_registries: + name: Push Docker image to multiple registries + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Check out the repo + uses: actions/checkout@v4 + + - name: Log in to the Container registry + uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 + with: + images: | + ghcr.io/${{ github.repository }} + + - name: Build and push Docker images + id: push + uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 + with: + context: docker/ + file: docker/v${{ github.event.inputs.version }}.Dockerfile + push: true + tags: | + ${{ steps.meta.outputs.tags }} + ghcr.io/solana.${{ github.event.inputs.version }} + labels: | + ${{ steps.meta.outputs.labels }} + org.opencontainers.image.source=https://github.com/${{ github.repository }} + + - name: Generate artifact attestation + uses: actions/attest-build-provenance@v1 + with: + subject-name: ghci.io/solana.${{ github.event.inputs.version }} + subject-digest: ${{ steps.push.outputs.digest }} + push-to-registry: true From 246aba4a6359c436ff36ef4abba1a7c95e3bc77a Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 09:06:58 -0400 Subject: [PATCH 197/314] fix namespace --- .github/workflows/publish_dockerfile.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_dockerfile.yaml b/.github/workflows/publish_dockerfile.yaml index da2d775..a75a805 100644 --- a/.github/workflows/publish_dockerfile.yaml +++ b/.github/workflows/publish_dockerfile.yaml @@ -53,7 +53,7 @@ jobs: push: true tags: | ${{ steps.meta.outputs.tags }} - ghcr.io/solana.${{ github.event.inputs.version }} + ghcr.io/{{ github.repository_owner }}/solana:${{ github.event.inputs.version }} labels: | ${{ steps.meta.outputs.labels }} org.opencontainers.image.source=https://github.com/${{ github.repository }} @@ -61,6 +61,6 @@ jobs: - name: Generate artifact attestation uses: actions/attest-build-provenance@v1 with: - subject-name: ghci.io/solana.${{ github.event.inputs.version }} + subject-name: ghcr.io/{{ github.repository_owner }}/solana:${{ github.event.inputs.version }} subject-digest: ${{ steps.push.outputs.digest }} push-to-registry: true From c3f7217592c80d2105967159fba21b972377b831 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 09:10:20 -0400 Subject: [PATCH 198/314] fix namespace variable --- .github/workflows/publish_dockerfile.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_dockerfile.yaml b/.github/workflows/publish_dockerfile.yaml index a75a805..c41554c 100644 --- a/.github/workflows/publish_dockerfile.yaml +++ b/.github/workflows/publish_dockerfile.yaml @@ -53,7 +53,7 @@ jobs: push: true tags: | ${{ steps.meta.outputs.tags }} - ghcr.io/{{ github.repository_owner }}/solana:${{ github.event.inputs.version }} + ghcr.io/${{ github.repository_owner }}/solana:${{ github.event.inputs.version }} labels: | ${{ steps.meta.outputs.labels }} org.opencontainers.image.source=https://github.com/${{ github.repository }} @@ -61,6 +61,6 @@ jobs: - name: Generate artifact attestation uses: actions/attest-build-provenance@v1 with: - subject-name: ghcr.io/{{ github.repository_owner }}/solana:${{ github.event.inputs.version }} + subject-name: ghcr.io/${{ github.repository_owner }}/solana:${{ github.event.inputs.version }} subject-digest: ${{ steps.push.outputs.digest }} push-to-registry: true From 0c0357bc7057ac0c6e2200a92546408f64e86e8f Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 09:32:45 -0400 Subject: [PATCH 199/314] fix attestation --- .github/workflows/publish_dockerfile.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_dockerfile.yaml b/.github/workflows/publish_dockerfile.yaml index c41554c..52cef90 100644 --- a/.github/workflows/publish_dockerfile.yaml +++ b/.github/workflows/publish_dockerfile.yaml @@ -7,7 +7,7 @@ # To get a newer version, you will need to update the SHA. # You can also reference a tag or branch, but the action may change without warning. -name: Publish Docker image +name: Publish Docker Image on: workflow_dispatch: @@ -61,6 +61,6 @@ jobs: - name: Generate artifact attestation uses: actions/attest-build-provenance@v1 with: - subject-name: ghcr.io/${{ github.repository_owner }}/solana:${{ github.event.inputs.version }} + subject-name: ghcr.io/${{ github.repository_owner }}/solana subject-digest: ${{ steps.push.outputs.digest }} push-to-registry: true From 91c6b14cd07d51b06e4c2c94339d05853b7e34fa Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Thu, 24 Oct 2024 06:43:59 -0400 Subject: [PATCH 200/314] update name to Publish Single Docker Image --- .github/workflows/publish_dockerfile.yaml | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/.github/workflows/publish_dockerfile.yaml b/.github/workflows/publish_dockerfile.yaml index 52cef90..9c1f321 100644 --- a/.github/workflows/publish_dockerfile.yaml +++ b/.github/workflows/publish_dockerfile.yaml @@ -1,13 +1,4 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. - -# GitHub recommends pinning actions to a commit SHA. -# To get a newer version, you will need to update the SHA. -# You can also reference a tag or branch, but the action may change without warning. - -name: Publish Docker Image +name: Publish Single Docker Image on: workflow_dispatch: From 28f06de14b077c94a983371a8dd0575b482fa9a7 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 09:00:19 -0400 Subject: [PATCH 201/314] add build+publish dockerfile --- .github/workflows/publish_dockerfile.yaml | 66 +++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 .github/workflows/publish_dockerfile.yaml diff --git a/.github/workflows/publish_dockerfile.yaml b/.github/workflows/publish_dockerfile.yaml new file mode 100644 index 0000000..da2d775 --- /dev/null +++ b/.github/workflows/publish_dockerfile.yaml @@ -0,0 +1,66 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +# GitHub recommends pinning actions to a commit SHA. +# To get a newer version, you will need to update the SHA. +# You can also reference a tag or branch, but the action may change without warning. + +name: Publish Docker image + +on: + workflow_dispatch: + inputs: + version: + description: 'Solana version to generate Dockerfile for (e.g., 1.16.0)' + required: true + type: string + +jobs: + push_to_registries: + name: Push Docker image to multiple registries + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Check out the repo + uses: actions/checkout@v4 + + - name: Log in to the Container registry + uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 + with: + images: | + ghcr.io/${{ github.repository }} + + - name: Build and push Docker images + id: push + uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 + with: + context: docker/ + file: docker/v${{ github.event.inputs.version }}.Dockerfile + push: true + tags: | + ${{ steps.meta.outputs.tags }} + ghcr.io/solana.${{ github.event.inputs.version }} + labels: | + ${{ steps.meta.outputs.labels }} + org.opencontainers.image.source=https://github.com/${{ github.repository }} + + - name: Generate artifact attestation + uses: actions/attest-build-provenance@v1 + with: + subject-name: ghci.io/solana.${{ github.event.inputs.version }} + subject-digest: ${{ steps.push.outputs.digest }} + push-to-registry: true From 468d61b97fc88b960361e8e89332f17b61663727 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 09:06:58 -0400 Subject: [PATCH 202/314] fix namespace --- .github/workflows/publish_dockerfile.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_dockerfile.yaml b/.github/workflows/publish_dockerfile.yaml index da2d775..a75a805 100644 --- a/.github/workflows/publish_dockerfile.yaml +++ b/.github/workflows/publish_dockerfile.yaml @@ -53,7 +53,7 @@ jobs: push: true tags: | ${{ steps.meta.outputs.tags }} - ghcr.io/solana.${{ github.event.inputs.version }} + ghcr.io/{{ github.repository_owner }}/solana:${{ github.event.inputs.version }} labels: | ${{ steps.meta.outputs.labels }} org.opencontainers.image.source=https://github.com/${{ github.repository }} @@ -61,6 +61,6 @@ jobs: - name: Generate artifact attestation uses: actions/attest-build-provenance@v1 with: - subject-name: ghci.io/solana.${{ github.event.inputs.version }} + subject-name: ghcr.io/{{ github.repository_owner }}/solana:${{ github.event.inputs.version }} subject-digest: ${{ steps.push.outputs.digest }} push-to-registry: true From 0ef6b0f1045a3ce69e845f010729e4e00930696c Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 09:10:20 -0400 Subject: [PATCH 203/314] fix namespace variable --- .github/workflows/publish_dockerfile.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_dockerfile.yaml b/.github/workflows/publish_dockerfile.yaml index a75a805..c41554c 100644 --- a/.github/workflows/publish_dockerfile.yaml +++ b/.github/workflows/publish_dockerfile.yaml @@ -53,7 +53,7 @@ jobs: push: true tags: | ${{ steps.meta.outputs.tags }} - ghcr.io/{{ github.repository_owner }}/solana:${{ github.event.inputs.version }} + ghcr.io/${{ github.repository_owner }}/solana:${{ github.event.inputs.version }} labels: | ${{ steps.meta.outputs.labels }} org.opencontainers.image.source=https://github.com/${{ github.repository }} @@ -61,6 +61,6 @@ jobs: - name: Generate artifact attestation uses: actions/attest-build-provenance@v1 with: - subject-name: ghcr.io/{{ github.repository_owner }}/solana:${{ github.event.inputs.version }} + subject-name: ghcr.io/${{ github.repository_owner }}/solana:${{ github.event.inputs.version }} subject-digest: ${{ steps.push.outputs.digest }} push-to-registry: true From 5f1e39ab28ec6b0ba42c90d97798f17c5f21691e Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 09:32:45 -0400 Subject: [PATCH 204/314] fix attestation --- .github/workflows/publish_dockerfile.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_dockerfile.yaml b/.github/workflows/publish_dockerfile.yaml index c41554c..52cef90 100644 --- a/.github/workflows/publish_dockerfile.yaml +++ b/.github/workflows/publish_dockerfile.yaml @@ -7,7 +7,7 @@ # To get a newer version, you will need to update the SHA. # You can also reference a tag or branch, but the action may change without warning. -name: Publish Docker image +name: Publish Docker Image on: workflow_dispatch: @@ -61,6 +61,6 @@ jobs: - name: Generate artifact attestation uses: actions/attest-build-provenance@v1 with: - subject-name: ghcr.io/${{ github.repository_owner }}/solana:${{ github.event.inputs.version }} + subject-name: ghcr.io/${{ github.repository_owner }}/solana subject-digest: ${{ steps.push.outputs.digest }} push-to-registry: true From 676cb3339599d7eaa8f147688a1389c1117302ea Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 13:02:05 -0400 Subject: [PATCH 205/314] update whitelist ci job --- .github/workflows/update_whitelist.yaml | 59 +++++++++++++++++++++++++ update_image_whitelist.py | 27 ++++++++--- 2 files changed, 81 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/update_whitelist.yaml diff --git a/.github/workflows/update_whitelist.yaml b/.github/workflows/update_whitelist.yaml new file mode 100644 index 0000000..d48831f --- /dev/null +++ b/.github/workflows/update_whitelist.yaml @@ -0,0 +1,59 @@ +name: Update Docker Image Whitelist + +on: + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + update-docker-image-whitelist: + runs-on: ubuntu-latest + steps: + - uses: actions/create-github-app-token@v1 + id: generate-token + with: + app-id: ${{ vars.ROBO_PR_APP_ID }} + private-key: ${{ secrets.ROBO_PR_CLIENT_SECRET }} + + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install uv + uses: astral-sh/setup-uv@v3 + with: + enable-cache: true + cache-dependency-glob: "uv.lock" + + - name: "Set up Python" + uses: actions/setup-python@v5 + with: + python-version-file: "pyproject.toml" + + - name: Install dependencies with uv + run: | + uv sync --all-extras --dev + + - name: Run generate_dockerfiles.py + env: + USE_GHCR: "true" + GITHUB_TOKEN: ${{ github.token }} + run: uv run update_image_whitelist.py + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v5 + with: + token: ${{ steps.generate-token.outputs.token }} + commit-message: Update Dockerfiles + title: 'Update Dockerfiles' + body: | + This PR updates `image_config.rs` with the latest published Docker image tags. + + Generated automatically by the Update Docker Image Whitelist workflow. + branch: update-dockerfiles + delete-branch: true + base: master + labels: | + automated pr + dockerfiles diff --git a/update_image_whitelist.py b/update_image_whitelist.py index 958a379..ad4d0c6 100644 --- a/update_image_whitelist.py +++ b/update_image_whitelist.py @@ -1,11 +1,28 @@ import requests - -response = requests.get( - "https://hub.docker.com/v2/namespaces/ellipsislabs/repositories/solana/tags?page_size=1000" -) +import os + +github_token = os.environ.get('GITHUB_TOKEN') +use_ghcr = os.environ.get('USE_GHCR', 'false').lower() == 'true' +headers = {'Authorization': f'Bearer {github_token}'} + +if not use_ghcr: + response = requests.get( + "https://hub.docker.com/v2/namespaces/ellipsislabs/repositories/solana/tags?page_size=1000" + ) + if response.status_code != 200: + raise Exception(f"Failed to get Docker images: {response.status_code} {response.text}") + results = response.json()["results"] +else: + response = requests.get( + "https://api.github.com/users/ngundotra/packages/container/solana/versions?per_page=100", + headers=headers + ) + if response.status_code != 200: + raise Exception(f"Failed to get Docker images: {response.status_code} {response.text}") + results = response.json() digest_map = {} -for result in response.json()["results"]: +for result in results: if result["name"] != "latest": try: major, minor, patch = list(map(int, result["name"].split("."))) From c0e6aef26e643aa14572d90110bc987fa1a76c6f Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 13:02:48 -0400 Subject: [PATCH 206/314] fix token --- .github/workflows/update_whitelist.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update_whitelist.yaml b/.github/workflows/update_whitelist.yaml index d48831f..8d2ccde 100644 --- a/.github/workflows/update_whitelist.yaml +++ b/.github/workflows/update_whitelist.yaml @@ -38,7 +38,7 @@ jobs: - name: Run generate_dockerfiles.py env: USE_GHCR: "true" - GITHUB_TOKEN: ${{ github.token }} + GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }} run: uv run update_image_whitelist.py - name: Create Pull Request From 5ffb34058d446a8a41d1d15f2b6425f1d8ff1337 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 13:04:31 -0400 Subject: [PATCH 207/314] update_whitelist --- .github/workflows/update_whitelist.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update_whitelist.yaml b/.github/workflows/update_whitelist.yaml index 8d2ccde..28eefc0 100644 --- a/.github/workflows/update_whitelist.yaml +++ b/.github/workflows/update_whitelist.yaml @@ -51,7 +51,7 @@ jobs: This PR updates `image_config.rs` with the latest published Docker image tags. Generated automatically by the Update Docker Image Whitelist workflow. - branch: update-dockerfiles + branch: update-image-whitelist delete-branch: true base: master labels: | From 3f1aa6ae0ac823933afcdedfc9bd35c0d728698d Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 13:06:47 -0400 Subject: [PATCH 208/314] update whitelist desc --- .github/workflows/update_whitelist.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/update_whitelist.yaml b/.github/workflows/update_whitelist.yaml index 28eefc0..71d7749 100644 --- a/.github/workflows/update_whitelist.yaml +++ b/.github/workflows/update_whitelist.yaml @@ -46,7 +46,7 @@ jobs: with: token: ${{ steps.generate-token.outputs.token }} commit-message: Update Dockerfiles - title: 'Update Dockerfiles' + title: 'Update Image Whitelist' body: | This PR updates `image_config.rs` with the latest published Docker image tags. @@ -56,4 +56,4 @@ jobs: base: master labels: | automated pr - dockerfiles + image whitelist From 4dd77364cd64113262c3c196e9e192da649422c1 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 13:15:19 -0400 Subject: [PATCH 209/314] fix dockerfile --- .github/workflows/generate_dockerfiles.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/generate_dockerfiles.yml b/.github/workflows/generate_dockerfiles.yml index 897bf1f..cdb24c8 100644 --- a/.github/workflows/generate_dockerfiles.yml +++ b/.github/workflows/generate_dockerfiles.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/create-github-app-token@v1 id: generate-token with: - app-id: ${{ secrets.ROBO_PR_APP_ID }} + app-id: ${{ vars.ROBO_PR_APP_ID }} private-key: ${{ secrets.ROBO_PR_CLIENT_SECRET }} - name: Checkout repository From 83d7476f180a76f57a544e4a456464c320a99ef0 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 13:19:29 -0400 Subject: [PATCH 210/314] update image whitelist to kick off on push to master --- .github/workflows/update_whitelist.yaml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/update_whitelist.yaml b/.github/workflows/update_whitelist.yaml index 71d7749..8e31d29 100644 --- a/.github/workflows/update_whitelist.yaml +++ b/.github/workflows/update_whitelist.yaml @@ -1,7 +1,12 @@ name: Update Docker Image Whitelist on: - workflow_dispatch: + workflow_dispatch: + push: + branches: + - master + paths: + - 'docker/**' permissions: contents: write @@ -45,7 +50,7 @@ jobs: uses: peter-evans/create-pull-request@v5 with: token: ${{ steps.generate-token.outputs.token }} - commit-message: Update Dockerfiles + commit-message: Update image whitelist title: 'Update Image Whitelist' body: | This PR updates `image_config.rs` with the latest published Docker image tags. From 69df1203833b4549f5985eacd286240d5e35d188 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 13:20:22 -0400 Subject: [PATCH 211/314] prefix branch w autopr --- .github/workflows/update_whitelist.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update_whitelist.yaml b/.github/workflows/update_whitelist.yaml index 8e31d29..e399853 100644 --- a/.github/workflows/update_whitelist.yaml +++ b/.github/workflows/update_whitelist.yaml @@ -56,7 +56,7 @@ jobs: This PR updates `image_config.rs` with the latest published Docker image tags. Generated automatically by the Update Docker Image Whitelist workflow. - branch: update-image-whitelist + branch: autopr-update-image-whitelist delete-branch: true base: master labels: | From a1d89cecbb9d8ffa344081aff9d4c694d39a8ccc Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 13:42:24 -0400 Subject: [PATCH 212/314] straighten out workflows --- .../workflows/publish_all_dockerfiles.yaml | 77 +++++++++++++++++++ .github/workflows/publish_dockerfile.yaml | 11 +-- 2 files changed, 78 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/publish_all_dockerfiles.yaml diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml new file mode 100644 index 0000000..bb7c5bd --- /dev/null +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -0,0 +1,77 @@ +name: Publish All Docker Image + +on: + workflow_dispatch: + push: + branches: + - master + paths: + - 'docker/**' + +jobs: + detect_changes: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + steps: + - uses: actions/checkout@v4 + - id: set-matrix + run: | + CHANGED_FILES=$(git diff --name-only ${{ github.event.before }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) + echo "CHANGED_FILES=$CHANGED_FILES" >> $GITHUB_OUTPUT + if [ -n "$CHANGED_FILES" ]; then + echo "matrix=$(echo $CHANGED_FILES | jq -R -s -c 'split("\n")[:-1] | map({version: .[8:-11]})')" >> $GITHUB_OUTPUT + else + echo "matrix=[]" >> $GITHUB_OUTPUT + fi + + push_to_registries: + needs: detect_changes + if: ${{ needs.detect_changes.outputs.matrix != '[]' }} + strategy: + matrix: ${{fromJson(needs.detect_changes.outputs.matrix)}} + name: Push Docker images to ghcr.io + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Check out the repo + uses: actions/checkout@v4 + + - name: Log in to the Container registry + uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 + with: + images: | + ghcr.io/${{ github.repository }} + + - name: Build and push Docker images + id: push + uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 + with: + context: docker/ + file: docker/v${{ github.event.inputs.version }}.Dockerfile + push: true + tags: | + ${{ steps.meta.outputs.tags }} + ghcr.io/${{ github.repository_owner }}/solana:${{ github.event.inputs.version }} + labels: | + ${{ steps.meta.outputs.labels }} + org.opencontainers.image.source=https://github.com/${{ github.repository }} + + - name: Generate artifact attestation + uses: actions/attest-build-provenance@v1 + with: + subject-name: ghcr.io/${{ github.repository_owner }}/solana + subject-digest: ${{ steps.push.outputs.digest }} + push-to-registry: true diff --git a/.github/workflows/publish_dockerfile.yaml b/.github/workflows/publish_dockerfile.yaml index 52cef90..f2462d0 100644 --- a/.github/workflows/publish_dockerfile.yaml +++ b/.github/workflows/publish_dockerfile.yaml @@ -1,12 +1,3 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. - -# GitHub recommends pinning actions to a commit SHA. -# To get a newer version, you will need to update the SHA. -# You can also reference a tag or branch, but the action may change without warning. - name: Publish Docker Image on: @@ -19,7 +10,7 @@ on: jobs: push_to_registries: - name: Push Docker image to multiple registries + name: Push Docker image to ghcr.io runs-on: ubuntu-latest permissions: packages: write From 852b7b759066183a9b2d1cff31ec8e9cf3eeba00 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 13:53:04 -0400 Subject: [PATCH 213/314] report matrix version --- .github/workflows/publish_all_dockerfiles.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index bb7c5bd..3d846fb 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -38,6 +38,9 @@ jobs: attestations: write id-token: write steps: + - name: Report version + run: echo "Pushing Docker image for version ${{ matrix.version }}" + - name: Check out the repo uses: actions/checkout@v4 @@ -60,11 +63,11 @@ jobs: uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 with: context: docker/ - file: docker/v${{ github.event.inputs.version }}.Dockerfile + file: docker/v${{ matrix.version }}.Dockerfile push: true tags: | ${{ steps.meta.outputs.tags }} - ghcr.io/${{ github.repository_owner }}/solana:${{ github.event.inputs.version }} + ghcr.io/${{ github.repository_owner }}/solana:${{ matrix.version }} labels: | ${{ steps.meta.outputs.labels }} org.opencontainers.image.source=https://github.com/${{ github.repository }} From ad3188d18a28546c096559e0abe1cfeac2c43779 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 14:04:11 -0400 Subject: [PATCH 214/314] fix parsing, ignore deleted files --- .github/workflows/publish_all_dockerfiles.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index 3d846fb..fa16d40 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -1,4 +1,4 @@ -name: Publish All Docker Image +name: Publish All Changed Images on: workflow_dispatch: @@ -17,8 +17,7 @@ jobs: - uses: actions/checkout@v4 - id: set-matrix run: | - CHANGED_FILES=$(git diff --name-only ${{ github.event.before }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) - echo "CHANGED_FILES=$CHANGED_FILES" >> $GITHUB_OUTPUT + CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.before }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) if [ -n "$CHANGED_FILES" ]; then echo "matrix=$(echo $CHANGED_FILES | jq -R -s -c 'split("\n")[:-1] | map({version: .[8:-11]})')" >> $GITHUB_OUTPUT else From a7b0ded2a862544067e2ed237144a2a48ad0dcbc Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 14:10:03 -0400 Subject: [PATCH 215/314] show matrix outputs --- .github/workflows/publish_all_dockerfiles.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index fa16d40..9c42f75 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -23,6 +23,8 @@ jobs: else echo "matrix=[]" >> $GITHUB_OUTPUT fi + - name: Display matrix + run: echo "${{ steps.set-matrix.outputs.matrix }}" push_to_registries: needs: detect_changes From 14843044fe96a54ea690e063923a7e25717a0d36 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 14:22:46 -0400 Subject: [PATCH 216/314] choose base version to compare to --- .github/workflows/publish_all_dockerfiles.yaml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index 9c42f75..f108bec 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -2,11 +2,12 @@ name: Publish All Changed Images on: workflow_dispatch: - push: - branches: - - master - paths: - - 'docker/**' + inputs: + commit_hash: + description: 'Commit hash to compare from' + required: true + type: string + jobs: detect_changes: @@ -17,7 +18,7 @@ jobs: - uses: actions/checkout@v4 - id: set-matrix run: | - CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.before }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) + CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.inputs.commit_hash }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) if [ -n "$CHANGED_FILES" ]; then echo "matrix=$(echo $CHANGED_FILES | jq -R -s -c 'split("\n")[:-1] | map({version: .[8:-11]})')" >> $GITHUB_OUTPUT else From 90866d39ce78f67e41fceb6a3824f020828a25c2 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 14:27:22 -0400 Subject: [PATCH 217/314] add fetch depth --- .github/workflows/publish_all_dockerfiles.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index f108bec..bf065a6 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -16,6 +16,8 @@ jobs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - uses: actions/checkout@v4 + with: + fetch-depth: 0 - id: set-matrix run: | CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.inputs.commit_hash }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) From 0192a3126290bf230372f9dd4517b99cda0895cd Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 15:43:48 -0400 Subject: [PATCH 218/314] fix matrix parsing --- .github/workflows/publish_all_dockerfiles.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index bf065a6..7b91e92 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -22,7 +22,7 @@ jobs: run: | CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.inputs.commit_hash }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) if [ -n "$CHANGED_FILES" ]; then - echo "matrix=$(echo $CHANGED_FILES | jq -R -s -c 'split("\n")[:-1] | map({version: .[8:-11]})')" >> $GITHUB_OUTPUT + echo "matrix=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map({version: .[8:-11]})')" >> $GITHUB_OUTPUT else echo "matrix=[]" >> $GITHUB_OUTPUT fi From 2f258ab58c7df488772547fef9d9e6650b68f15c Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 15:48:21 -0400 Subject: [PATCH 219/314] fix parsing --- .github/workflows/publish_all_dockerfiles.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index 7b91e92..f323de2 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -22,7 +22,7 @@ jobs: run: | CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.inputs.commit_hash }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) if [ -n "$CHANGED_FILES" ]; then - echo "matrix=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map({version: .[8:-11]})')" >> $GITHUB_OUTPUT + echo "matrix=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map({version: .[7:-11]}) | tojson')" >> $GITHUB_OUTPUT else echo "matrix=[]" >> $GITHUB_OUTPUT fi From f6cb32698c00f4f97a9d4dd6a94427708aea5b06 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 22 Oct 2024 15:55:08 -0400 Subject: [PATCH 220/314] remove mapping w key --- .github/workflows/publish_all_dockerfiles.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index f323de2..02cf59c 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -22,7 +22,7 @@ jobs: run: | CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.inputs.commit_hash }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) if [ -n "$CHANGED_FILES" ]; then - echo "matrix=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map({version: .[7:-11]}) | tojson')" >> $GITHUB_OUTPUT + echo "matrix=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11]) | tojson')" >> $GITHUB_OUTPUT else echo "matrix=[]" >> $GITHUB_OUTPUT fi From 65c3bae50894e46be4df736bd19fe404f7afcb9d Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Wed, 23 Oct 2024 08:51:19 -0400 Subject: [PATCH 221/314] revamp --- .github/workflows/publish_all_dockerfiles.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index 02cf59c..45d5ef0 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -22,7 +22,7 @@ jobs: run: | CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.inputs.commit_hash }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) if [ -n "$CHANGED_FILES" ]; then - echo "matrix=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11]) | tojson')" >> $GITHUB_OUTPUT + echo "matrix=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11]) | {version: .} | tojson')" >> $GITHUB_OUTPUT else echo "matrix=[]" >> $GITHUB_OUTPUT fi From 5f6b4d43a00ccf1370bbf0ee22bc36156403a8d5 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Wed, 23 Oct 2024 08:58:32 -0400 Subject: [PATCH 222/314] matrix -> versions name --- .github/workflows/publish_all_dockerfiles.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index 45d5ef0..85469a8 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -22,18 +22,18 @@ jobs: run: | CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.inputs.commit_hash }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) if [ -n "$CHANGED_FILES" ]; then - echo "matrix=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11]) | {version: .} | tojson')" >> $GITHUB_OUTPUT + echo "versions=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11])')" >> $GITHUB_OUTPUT else - echo "matrix=[]" >> $GITHUB_OUTPUT + echo "versions=[]" >> $GITHUB_OUTPUT fi - name: Display matrix run: echo "${{ steps.set-matrix.outputs.matrix }}" push_to_registries: needs: detect_changes - if: ${{ needs.detect_changes.outputs.matrix != '[]' }} + if: ${{ needs.detect_changes.outputs.versions != '[]' }} strategy: - matrix: ${{fromJson(needs.detect_changes.outputs.matrix)}} + matrix: ${{fromJson(needs.detect_changes.outputs.versions )}} name: Push Docker images to ghcr.io runs-on: ubuntu-latest permissions: From 3575cc8cfb171fc95485000ded3b41573fbdd028 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Wed, 23 Oct 2024 09:12:26 -0400 Subject: [PATCH 223/314] truncate whitespace --- .github/workflows/publish_all_dockerfiles.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index 85469a8..c34ce47 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -22,7 +22,7 @@ jobs: run: | CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.inputs.commit_hash }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) if [ -n "$CHANGED_FILES" ]; then - echo "versions=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11])')" >> $GITHUB_OUTPUT + echo "versions=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11])' | tr -d '\n' | sed 's/, /,/g')" >> $GITHUB_OUTPUT else echo "versions=[]" >> $GITHUB_OUTPUT fi @@ -33,7 +33,7 @@ jobs: needs: detect_changes if: ${{ needs.detect_changes.outputs.versions != '[]' }} strategy: - matrix: ${{fromJson(needs.detect_changes.outputs.versions )}} + matrix: ${{ fromJson(needs.detect_changes.outputs.versions )}} name: Push Docker images to ghcr.io runs-on: ubuntu-latest permissions: From d863732c9cf217382e985ce25a8a13bc4789b22c Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Wed, 23 Oct 2024 09:15:00 -0400 Subject: [PATCH 224/314] truncate --- .github/workflows/publish_all_dockerfiles.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index c34ce47..ab40813 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -22,7 +22,7 @@ jobs: run: | CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.inputs.commit_hash }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) if [ -n "$CHANGED_FILES" ]; then - echo "versions=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11])' | tr -d '\n' | sed 's/, /,/g')" >> $GITHUB_OUTPUT + echo "versions=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11])' | tr -d '[:space:]')" >> $GITHUB_OUTPUT else echo "versions=[]" >> $GITHUB_OUTPUT fi From 4422a8d1705643db2b7775ff986eb7eda3ee0745 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Wed, 23 Oct 2024 17:49:22 -0400 Subject: [PATCH 225/314] debug --- .github/workflows/publish_all_dockerfiles.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index ab40813..d017c57 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -13,7 +13,7 @@ jobs: detect_changes: runs-on: ubuntu-latest outputs: - matrix: ${{ steps.set-matrix.outputs.matrix }} + versions: ${{ steps.set-matrix.outputs.versions }} steps: - uses: actions/checkout@v4 with: @@ -21,13 +21,16 @@ jobs: - id: set-matrix run: | CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.inputs.commit_hash }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) + echo "CHANGED_FILE=$CHANGED_FILES" if [ -n "$CHANGED_FILES" ]; then + echo "$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11])' | tr -d '[:space:]')" echo "versions=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11])' | tr -d '[:space:]')" >> $GITHUB_OUTPUT else echo "versions=[]" >> $GITHUB_OUTPUT fi + echo $GITHUB_OUTPUT - name: Display matrix - run: echo "${{ steps.set-matrix.outputs.matrix }}" + run: echo "${{ steps.set-matrix.outputs.versions }}" push_to_registries: needs: detect_changes From cab8cce5f910f26182677881cef2d116815c3781 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Wed, 23 Oct 2024 17:57:27 -0400 Subject: [PATCH 226/314] fix version matrix strat --- .github/workflows/publish_all_dockerfiles.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index d017c57..a7d9da1 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -36,7 +36,8 @@ jobs: needs: detect_changes if: ${{ needs.detect_changes.outputs.versions != '[]' }} strategy: - matrix: ${{ fromJson(needs.detect_changes.outputs.versions )}} + matrix: + version: ${{ fromJson(needs.detect_changes.outputs.versions )}} name: Push Docker images to ghcr.io runs-on: ubuntu-latest permissions: From abf1c92c0ee84d9f169a50128e05906345bd5673 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Thu, 24 Oct 2024 06:56:47 -0400 Subject: [PATCH 227/314] lowercase repo owner --- .github/workflows/publish_dockerfile.yaml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_dockerfile.yaml b/.github/workflows/publish_dockerfile.yaml index f2462d0..339df55 100644 --- a/.github/workflows/publish_dockerfile.yaml +++ b/.github/workflows/publish_dockerfile.yaml @@ -35,6 +35,10 @@ jobs: images: | ghcr.io/${{ github.repository }} + - name: lowercase github.repository_owner + run: | + echo "REPO_OWNER=`echo ${{github.repository_owner}} | tr '[:upper:]' '[:lower:]'`" >>${GITHUB_ENV} + - name: Build and push Docker images id: push uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 @@ -44,7 +48,7 @@ jobs: push: true tags: | ${{ steps.meta.outputs.tags }} - ghcr.io/${{ github.repository_owner }}/solana:${{ github.event.inputs.version }} + ghcr.io/${{ env.REPO_OWNER }}/solana:${{ github.event.inputs.version }} labels: | ${{ steps.meta.outputs.labels }} org.opencontainers.image.source=https://github.com/${{ github.repository }} @@ -52,6 +56,6 @@ jobs: - name: Generate artifact attestation uses: actions/attest-build-provenance@v1 with: - subject-name: ghcr.io/${{ github.repository_owner }}/solana + subject-name: ghcr.io/${{ env.REPO_OWNER }}/solana subject-digest: ${{ steps.push.outputs.digest }} push-to-registry: true From c5d04a16f9c328f0676c11db94fcf52f1eaae15b Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Thu, 24 Oct 2024 07:01:27 -0400 Subject: [PATCH 228/314] fix repo owner name in Publish All Dockerfiles --- .github/workflows/publish_all_dockerfiles.yaml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index a7d9da1..cc8fdea 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -66,6 +66,10 @@ jobs: images: | ghcr.io/${{ github.repository }} + - name: lowercase github.repository_owner + run: | + echo "REPO_OWNER=`echo ${{github.repository_owner}} | tr '[:upper:]' '[:lower:]'`" >>${GITHUB_ENV} + - name: Build and push Docker images id: push uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 @@ -75,7 +79,7 @@ jobs: push: true tags: | ${{ steps.meta.outputs.tags }} - ghcr.io/${{ github.repository_owner }}/solana:${{ matrix.version }} + ghcr.io/${{ env.REPO_OWNER }}/solana:${{ matrix.version }} labels: | ${{ steps.meta.outputs.labels }} org.opencontainers.image.source=https://github.com/${{ github.repository }} @@ -83,6 +87,6 @@ jobs: - name: Generate artifact attestation uses: actions/attest-build-provenance@v1 with: - subject-name: ghcr.io/${{ github.repository_owner }}/solana + subject-name: ghcr.io/${{ env.REPO_OWNER }}/solana subject-digest: ${{ steps.push.outputs.digest }} push-to-registry: true From c3b432fc55c49f452c569363785596d7d06d262f Mon Sep 17 00:00:00 2001 From: ngundotra Date: Thu, 24 Oct 2024 11:10:46 +0000 Subject: [PATCH 229/314] Update Dockerfiles --- docker/v1.17.32.Dockerfile | 8 ++++++++ docker/v1.17.33.Dockerfile | 8 ++++++++ docker/v1.17.34.Dockerfile | 8 ++++++++ docker/v1.18.12.Dockerfile | 8 ++++++++ docker/v1.18.13.Dockerfile | 8 ++++++++ docker/v1.18.14.Dockerfile | 8 ++++++++ docker/v1.18.15.Dockerfile | 8 ++++++++ docker/v1.18.17.Dockerfile | 8 ++++++++ docker/v1.18.18.Dockerfile | 8 ++++++++ docker/v1.18.19.Dockerfile | 8 ++++++++ docker/v1.18.20.Dockerfile | 8 ++++++++ docker/v1.18.21.Dockerfile | 8 ++++++++ docker/v1.18.22.Dockerfile | 8 ++++++++ docker/v1.18.23.Dockerfile | 8 ++++++++ docker/v1.18.25.Dockerfile | 8 ++++++++ docker/v1.18.26.Dockerfile | 8 ++++++++ 16 files changed, 128 insertions(+) create mode 100644 docker/v1.17.32.Dockerfile create mode 100644 docker/v1.17.33.Dockerfile create mode 100644 docker/v1.17.34.Dockerfile create mode 100644 docker/v1.18.12.Dockerfile create mode 100644 docker/v1.18.13.Dockerfile create mode 100644 docker/v1.18.14.Dockerfile create mode 100644 docker/v1.18.15.Dockerfile create mode 100644 docker/v1.18.17.Dockerfile create mode 100644 docker/v1.18.18.Dockerfile create mode 100644 docker/v1.18.19.Dockerfile create mode 100644 docker/v1.18.20.Dockerfile create mode 100644 docker/v1.18.21.Dockerfile create mode 100644 docker/v1.18.22.Dockerfile create mode 100644 docker/v1.18.23.Dockerfile create mode 100644 docker/v1.18.25.Dockerfile create mode 100644 docker/v1.18.26.Dockerfile diff --git a/docker/v1.17.32.Dockerfile b/docker/v1.17.32.Dockerfile new file mode 100644 index 0000000..d11cf9e --- /dev/null +++ b/docker/v1.17.32.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.32/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.33.Dockerfile b/docker/v1.17.33.Dockerfile new file mode 100644 index 0000000..95f72ec --- /dev/null +++ b/docker/v1.17.33.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.33/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.34.Dockerfile b/docker/v1.17.34.Dockerfile new file mode 100644 index 0000000..ae4576b --- /dev/null +++ b/docker/v1.17.34.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.34/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.12.Dockerfile b/docker/v1.18.12.Dockerfile new file mode 100644 index 0000000..3b289d1 --- /dev/null +++ b/docker/v1.18.12.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.12/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.13.Dockerfile b/docker/v1.18.13.Dockerfile new file mode 100644 index 0000000..9e96737 --- /dev/null +++ b/docker/v1.18.13.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.13/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.14.Dockerfile b/docker/v1.18.14.Dockerfile new file mode 100644 index 0000000..8156dc8 --- /dev/null +++ b/docker/v1.18.14.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.14/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.15.Dockerfile b/docker/v1.18.15.Dockerfile new file mode 100644 index 0000000..a0c0e36 --- /dev/null +++ b/docker/v1.18.15.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.15/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.17.Dockerfile b/docker/v1.18.17.Dockerfile new file mode 100644 index 0000000..07a68e9 --- /dev/null +++ b/docker/v1.18.17.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.17/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.18.Dockerfile b/docker/v1.18.18.Dockerfile new file mode 100644 index 0000000..1661182 --- /dev/null +++ b/docker/v1.18.18.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.18/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.19.Dockerfile b/docker/v1.18.19.Dockerfile new file mode 100644 index 0000000..96058e4 --- /dev/null +++ b/docker/v1.18.19.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.19/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.20.Dockerfile b/docker/v1.18.20.Dockerfile new file mode 100644 index 0000000..589a1e1 --- /dev/null +++ b/docker/v1.18.20.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.20/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.21.Dockerfile b/docker/v1.18.21.Dockerfile new file mode 100644 index 0000000..31fdc00 --- /dev/null +++ b/docker/v1.18.21.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.21/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.22.Dockerfile b/docker/v1.18.22.Dockerfile new file mode 100644 index 0000000..8886a00 --- /dev/null +++ b/docker/v1.18.22.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.22/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.23.Dockerfile b/docker/v1.18.23.Dockerfile new file mode 100644 index 0000000..e7896d6 --- /dev/null +++ b/docker/v1.18.23.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.23/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.25.Dockerfile b/docker/v1.18.25.Dockerfile new file mode 100644 index 0000000..85673f3 --- /dev/null +++ b/docker/v1.18.25.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.25/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.26.Dockerfile b/docker/v1.18.26.Dockerfile new file mode 100644 index 0000000..2817c4a --- /dev/null +++ b/docker/v1.18.26.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.26/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash From 7eafc43a6c60c5a401bc0ae6d5e688809053cc65 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Thu, 24 Oct 2024 07:20:46 -0400 Subject: [PATCH 230/314] turn off fail-fast for matrix workflow --- .github/workflows/publish_all_dockerfiles.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index cc8fdea..4e26277 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -38,6 +38,7 @@ jobs: strategy: matrix: version: ${{ fromJson(needs.detect_changes.outputs.versions )}} + fail-fast: false name: Push Docker images to ghcr.io runs-on: ubuntu-latest permissions: From 7136b09dd96d45726b968bded16c6855b7b503cf Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Wed, 23 Oct 2024 20:59:05 -0400 Subject: [PATCH 231/314] fix ghcr parsing --- update_image_whitelist.py | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/update_image_whitelist.py b/update_image_whitelist.py index ad4d0c6..c9434bc 100644 --- a/update_image_whitelist.py +++ b/update_image_whitelist.py @@ -5,31 +5,44 @@ use_ghcr = os.environ.get('USE_GHCR', 'false').lower() == 'true' headers = {'Authorization': f'Bearer {github_token}'} -if not use_ghcr: +if use_ghcr: response = requests.get( - "https://hub.docker.com/v2/namespaces/ellipsislabs/repositories/solana/tags?page_size=1000" + "https://api.github.com/users/ngundotra/packages/container/solana/versions?per_page=100", + headers=headers ) if response.status_code != 200: raise Exception(f"Failed to get Docker images: {response.status_code} {response.text}") - results = response.json()["results"] + results = response.json() else: response = requests.get( - "https://api.github.com/users/ngundotra/packages/container/solana/versions?per_page=100", - headers=headers + "https://hub.docker.com/v2/namespaces/ellipsislabs/repositories/solana/tags?page_size=1000" ) if response.status_code != 200: raise Exception(f"Failed to get Docker images: {response.status_code} {response.text}") - results = response.json() + results = response.json()["results"] digest_map = {} for result in results: - if result["name"] != "latest": - try: - major, minor, patch = list(map(int, result["name"].split("."))) - digest_map[(major, minor, patch)] = result["digest"] - except Exception as e: - print(e) - continue + if use_ghcr: + # For GHCR, extract version from metadata + metadata = result.get("metadata", {}) + container = metadata.get("container", {}) + tags = container.get("tags", []) + if tags and tags[0] != "latest": + try: + major, minor, patch = map(int, tags[0].split(".")) + digest_map[(major, minor, patch)] = result["name"] # "name" contains the digest/sha for GHCR + except Exception as e: + print(f"Error processing tag {tags[0]}: {e}") + continue + else: + if result["name"] != "latest": + try: + major, minor, patch = list(map(int, result["name"].split("."))) + digest_map[(major, minor, patch)] = result["digest"] + except Exception as e: + print(e) + continue entries = [] From 00e813a4ed6964d0628401e8fd9dedb57e5a5ea3 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Wed, 23 Oct 2024 21:03:04 -0400 Subject: [PATCH 232/314] fix issue where tags don't get parsed correctly --- update_image_whitelist.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/update_image_whitelist.py b/update_image_whitelist.py index c9434bc..309fe5d 100644 --- a/update_image_whitelist.py +++ b/update_image_whitelist.py @@ -1,3 +1,4 @@ +import re import requests import os @@ -28,13 +29,12 @@ metadata = result.get("metadata", {}) container = metadata.get("container", {}) tags = container.get("tags", []) - if tags and tags[0] != "latest": - try: - major, minor, patch = map(int, tags[0].split(".")) - digest_map[(major, minor, patch)] = result["name"] # "name" contains the digest/sha for GHCR - except Exception as e: - print(f"Error processing tag {tags[0]}: {e}") - continue + for tag in tags: + match = re.match(r'(\d+)\.(\d+)\.(\d+)', tag) + if match: + major, minor, patch = map(int, match.groups()) + digest_map[(major, minor, patch)] = result["name"] # "name" contains the digest for GHCR + break else: if result["name"] != "latest": try: From b272312198ade832ecdacabe36842687026d75a2 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Thu, 24 Oct 2024 08:42:43 -0400 Subject: [PATCH 233/314] change to orgs/ --- update_image_whitelist.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/update_image_whitelist.py b/update_image_whitelist.py index 309fe5d..b8f2d3f 100644 --- a/update_image_whitelist.py +++ b/update_image_whitelist.py @@ -8,7 +8,7 @@ if use_ghcr: response = requests.get( - "https://api.github.com/users/ngundotra/packages/container/solana/versions?per_page=100", + "https://api.github.com/orgs/ellipsis-labs/packages/container/solana/versions?per_page=100", headers=headers ) if response.status_code != 200: From 4483283a6bf9e3c3b2ff34cc9d59b5d4a741cd84 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Thu, 24 Oct 2024 09:00:13 -0400 Subject: [PATCH 234/314] update --- .github/workflows/update_whitelist.yaml | 6 +----- update_image_whitelist.py | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/update_whitelist.yaml b/.github/workflows/update_whitelist.yaml index e399853..0e4fd7a 100644 --- a/.github/workflows/update_whitelist.yaml +++ b/.github/workflows/update_whitelist.yaml @@ -2,15 +2,11 @@ name: Update Docker Image Whitelist on: workflow_dispatch: - push: - branches: - - master - paths: - - 'docker/**' permissions: contents: write pull-requests: write + packages: read jobs: update-docker-image-whitelist: diff --git a/update_image_whitelist.py b/update_image_whitelist.py index b8f2d3f..223906f 100644 --- a/update_image_whitelist.py +++ b/update_image_whitelist.py @@ -8,7 +8,7 @@ if use_ghcr: response = requests.get( - "https://api.github.com/orgs/ellipsis-labs/packages/container/solana/versions?per_page=100", + "https://api.github.com/orgs/Ellipsis-Labs/packages/container/solana/versions?per_page=100", headers=headers ) if response.status_code != 200: From 289d01fe623183a57152ce5eabea077ebc96d8da Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Thu, 24 Oct 2024 09:48:42 -0400 Subject: [PATCH 235/314] use GH token to access pkg registry --- .github/workflows/update_whitelist.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update_whitelist.yaml b/.github/workflows/update_whitelist.yaml index 0e4fd7a..e12cbcb 100644 --- a/.github/workflows/update_whitelist.yaml +++ b/.github/workflows/update_whitelist.yaml @@ -39,7 +39,7 @@ jobs: - name: Run generate_dockerfiles.py env: USE_GHCR: "true" - GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: uv run update_image_whitelist.py - name: Create Pull Request From 6bf4fde8dce9e39e95f9c6d89510840d98762a44 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Thu, 24 Oct 2024 12:25:21 -0400 Subject: [PATCH 236/314] fix image update whitelist script to paginate through all images --- update_image_whitelist.py | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/update_image_whitelist.py b/update_image_whitelist.py index 223906f..2455321 100644 --- a/update_image_whitelist.py +++ b/update_image_whitelist.py @@ -7,13 +7,24 @@ headers = {'Authorization': f'Bearer {github_token}'} if use_ghcr: - response = requests.get( - "https://api.github.com/orgs/Ellipsis-Labs/packages/container/solana/versions?per_page=100", - headers=headers - ) - if response.status_code != 200: - raise Exception(f"Failed to get Docker images: {response.status_code} {response.text}") - results = response.json() + url = "https://api.github.com/orgs/Ellipsis-Labs/packages/container/solana/versions?per_page=100" + results = [] + while url: + response = requests.get(url, headers=headers) + if response.status_code != 200: + raise Exception(f"Failed to get Docker images: {response.status_code} {response.text}") + results.extend(response.json()) + + # Check for pagination + url = None + if 'Link' in response.headers: + links = response.headers['Link'] + for link in links.split(','): + if 'rel="next"' in link: + url = link[link.find('<') + 1:link.find('>')] + break + if response.status_code != 200: + raise Exception(f"Failed to get Docker images: {response.status_code} {response.text}") else: response = requests.get( "https://hub.docker.com/v2/namespaces/ellipsislabs/repositories/solana/tags?page_size=1000" From 81d1685be590b34d588d62ca28492aeeef65122a Mon Sep 17 00:00:00 2001 From: Jacob Creech Date: Fri, 25 Oct 2024 16:52:27 -0500 Subject: [PATCH 237/314] feat: dockerhub push --- .github/workflows/publish_dockerfile.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/publish_dockerfile.yaml b/.github/workflows/publish_dockerfile.yaml index f2462d0..bf7b83c 100644 --- a/.github/workflows/publish_dockerfile.yaml +++ b/.github/workflows/publish_dockerfile.yaml @@ -24,16 +24,16 @@ jobs: - name: Log in to the Container registry uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} + registry: docker.io + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} - name: Extract metadata (tags, labels) for Docker id: meta uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 with: images: | - ghcr.io/${{ github.repository }} + docker.io/${{ github.repository }} - name: Build and push Docker images id: push @@ -44,7 +44,7 @@ jobs: push: true tags: | ${{ steps.meta.outputs.tags }} - ghcr.io/${{ github.repository_owner }}/solana:${{ github.event.inputs.version }} + docker.io/solanafoundation/solana-verifiable-build:${{ github.event.inputs.version }} labels: | ${{ steps.meta.outputs.labels }} org.opencontainers.image.source=https://github.com/${{ github.repository }} @@ -52,6 +52,6 @@ jobs: - name: Generate artifact attestation uses: actions/attest-build-provenance@v1 with: - subject-name: ghcr.io/${{ github.repository_owner }}/solana + subject-name: docker.io/solanafoundation/solana-verifiable-build/ subject-digest: ${{ steps.push.outputs.digest }} push-to-registry: true From 25160c0de5abe9d9b506cf04ca6bebbc464651f2 Mon Sep 17 00:00:00 2001 From: Jacob Creech Date: Fri, 25 Oct 2024 19:36:57 -0500 Subject: [PATCH 238/314] fix: attestation --- .github/workflows/publish_dockerfile.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_dockerfile.yaml b/.github/workflows/publish_dockerfile.yaml index bf7b83c..5dbc0eb 100644 --- a/.github/workflows/publish_dockerfile.yaml +++ b/.github/workflows/publish_dockerfile.yaml @@ -52,6 +52,6 @@ jobs: - name: Generate artifact attestation uses: actions/attest-build-provenance@v1 with: - subject-name: docker.io/solanafoundation/solana-verifiable-build/ + subject-name: index.docker.io/solanafoundation/solana-verifiable-build/ subject-digest: ${{ steps.push.outputs.digest }} push-to-registry: true From 1f23f47e5bfd14e1c0d4d6fc0de17cdb3af339b1 Mon Sep 17 00:00:00 2001 From: Jacob Creech Date: Fri, 25 Oct 2024 19:51:31 -0500 Subject: [PATCH 239/314] fix: remove trailing / --- .github/workflows/publish_dockerfile.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_dockerfile.yaml b/.github/workflows/publish_dockerfile.yaml index 5dbc0eb..6f17abe 100644 --- a/.github/workflows/publish_dockerfile.yaml +++ b/.github/workflows/publish_dockerfile.yaml @@ -52,6 +52,6 @@ jobs: - name: Generate artifact attestation uses: actions/attest-build-provenance@v1 with: - subject-name: index.docker.io/solanafoundation/solana-verifiable-build/ + subject-name: index.docker.io/solanafoundation/solana-verifiable-build subject-digest: ${{ steps.push.outputs.digest }} push-to-registry: true From 258a02a542a687006951801fac541a5c55f163b1 Mon Sep 17 00:00:00 2001 From: Jacob Creech Date: Fri, 25 Oct 2024 20:12:40 -0500 Subject: [PATCH 240/314] feat: update publishing all dockerfiles --- .github/workflows/publish_all_dockerfiles.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index a7d9da1..dba12b2 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -38,7 +38,7 @@ jobs: strategy: matrix: version: ${{ fromJson(needs.detect_changes.outputs.versions )}} - name: Push Docker images to ghcr.io + name: Push Docker images to docker.io runs-on: ubuntu-latest permissions: packages: write @@ -55,9 +55,9 @@ jobs: - name: Log in to the Container registry uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} + registry: docker.io + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} - name: Extract metadata (tags, labels) for Docker id: meta @@ -75,7 +75,7 @@ jobs: push: true tags: | ${{ steps.meta.outputs.tags }} - ghcr.io/${{ github.repository_owner }}/solana:${{ matrix.version }} + docker.io/solanafoundation/solana-verifiable-build:${{ github.event.inputs.version }} labels: | ${{ steps.meta.outputs.labels }} org.opencontainers.image.source=https://github.com/${{ github.repository }} @@ -83,6 +83,6 @@ jobs: - name: Generate artifact attestation uses: actions/attest-build-provenance@v1 with: - subject-name: ghcr.io/${{ github.repository_owner }}/solana + subject-name: index.docker.io/solanafoundation/solana-verifiable-build subject-digest: ${{ steps.push.outputs.digest }} push-to-registry: true From 37c6154f5b975921e5f81ecdffb674e0c247f6d9 Mon Sep 17 00:00:00 2001 From: Jacob Creech Date: Fri, 25 Oct 2024 20:20:39 -0500 Subject: [PATCH 241/314] fix: add sf dockerhub to whitelist --- update_image_whitelist.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/update_image_whitelist.py b/update_image_whitelist.py index 309fe5d..5c1be52 100644 --- a/update_image_whitelist.py +++ b/update_image_whitelist.py @@ -22,6 +22,13 @@ raise Exception(f"Failed to get Docker images: {response.status_code} {response.text}") results = response.json()["results"] + sfResponse = requests.get( + "https://hub.docker.com/v2/namespaces/solanafoundation/repositories/solana-verified-build/tags?page_size=1000" + ) + if sfResponse.status_code != 200: + raise Exception(f"Failed to get Docker images: {sfResponse.status_code} {sfResponse.text}") + results = sfResponse.json()["results"] + results + digest_map = {} for result in results: if use_ghcr: From bcb5251b8849250ef93620075c83aa54ea408522 Mon Sep 17 00:00:00 2001 From: Jacob Creech <82475023+jacobcreech@users.noreply.github.com> Date: Fri, 1 Nov 2024 13:38:06 -0500 Subject: [PATCH 242/314] Update publish_all_dockerfiles.yaml Signed-off-by: Jacob Creech <82475023+jacobcreech@users.noreply.github.com> --- .github/workflows/publish_all_dockerfiles.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index dba12b2..bbebbc0 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -64,7 +64,7 @@ jobs: uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 with: images: | - ghcr.io/${{ github.repository }} + docker.io/${{ github.repository }} - name: Build and push Docker images id: push From 1a234aea28accee45beef2e9a063b05f947a412f Mon Sep 17 00:00:00 2001 From: Jacob Creech <82475023+jacobcreech@users.noreply.github.com> Date: Fri, 1 Nov 2024 13:45:25 -0500 Subject: [PATCH 243/314] Update publish_all_dockerfiles.yaml Signed-off-by: Jacob Creech <82475023+jacobcreech@users.noreply.github.com> --- .github/workflows/publish_all_dockerfiles.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index bbebbc0..f9294ac 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -75,7 +75,7 @@ jobs: push: true tags: | ${{ steps.meta.outputs.tags }} - docker.io/solanafoundation/solana-verifiable-build:${{ github.event.inputs.version }} + docker.io/solanafoundation/solana-verifiable-build:${{ matrix.version }} labels: | ${{ steps.meta.outputs.labels }} org.opencontainers.image.source=https://github.com/${{ github.repository }} From 9c90b327392ee95a41afcc9766a1622f66a2252a Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Sat, 2 Nov 2024 21:35:37 +0100 Subject: [PATCH 244/314] Add and use sf images --- src/image_config.rs | 16 ++++++++++++++++ src/main.rs | 4 ++-- update_image_whitelist.py | 2 +- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/image_config.rs b/src/image_config.rs index 0ec4005..4bb6842 100644 --- a/src/image_config.rs +++ b/src/image_config.rs @@ -92,6 +92,9 @@ lazy_static! { m.insert((1, 17, 29), "sha256:74efa6a72d82ce2b74f2b5642d4293fa5a302d6d82017e6ad67223dbf3102d58"); m.insert((1, 17, 30), "sha256:a3def468a993061fd3ea134692766a97d1f8d24e22a12d0c32addd7cd3da8563"); m.insert((1, 17, 31), "sha256:4b6a1d5db9edb2f0baf5310e3af243f48264f051464fa6b6441e6c04a52f31f1"); + m.insert((1, 17, 32), "sha256:564674f88899cd489381e5cdb212524ab5051f9cbcf126b908dd6c652157e6ec"); + m.insert((1, 17, 33), "sha256:c7abae48a3448147e6c7cbd839b73f59bddaf2d5c21a7f6c0f7ecb582ec9aa30"); + m.insert((1, 17, 34), "sha256:30f7631764c1cb4d9ab5b1c7bc18d932f839d1a3e5a60ee5090c81a429a659c9"); m.insert((1, 18, 0), "sha256:1eda60c966a4da71d5a0d8d1600439aa303561f29068801a8e0e2b34f121f7ab"); m.insert((1, 18, 1), "sha256:0c15cf35e58a43972475bc96de47b5b51805548a16d1e97ec6c1947c98770d22"); m.insert((1, 18, 2), "sha256:5c7bda6b3d0b23ea36fc47363b5d9e534caec7b7f5f3d0e063681a3105e8de88"); @@ -104,7 +107,20 @@ lazy_static! { m.insert((1, 18, 9), "sha256:083ad44f3181d56dea0b628260f3ecf70744add259632234c377d1b6ee5d6a9d"); m.insert((1, 18, 10), "sha256:0e0b25263f3755a065dcbfcd436844d9ecdaa729cf4395492ea6357a7dcffa50"); m.insert((1, 18, 11), "sha256:ba596c913a21489633f1d043c05f26dead294a4153dd48a9952d8af4312900a3"); + m.insert((1, 18, 12), "sha256:62a4f8b82d02dfc657ef4babd29bea7283e7d8c513f2e8f46d6b0d6fbd82f40b"); + m.insert((1, 18, 13), "sha256:52cd626ec8694b66522573aeddd4868831ad9bc2ba8fc06d2ea2d75feed3f39e"); + m.insert((1, 18, 14), "sha256:adb5b1f5e297cd25ca94b46defea73378c5ecba4420ffd5baefb512475578099"); + m.insert((1, 18, 15), "sha256:200ad8cca516544f43da47c4be062f79909a16960d7338ced657d362fca0937c"); m.insert((1, 18, 16), "sha256:8f56be84b2c6f2ea8c018e00cff1a9b7e2bbea6bf3d9949c9359b1ef46dba7aa"); + m.insert((1, 18, 17), "sha256:3c919ec33c446124e562c3f0b80f8f7082b040dcee2fa365bde8f447e4f7601f"); + m.insert((1, 18, 18), "sha256:d0a1f26ac35f5f45cbda491bd8150b2ba3587b9fa5369e15f33bbdb1a72bd216"); + m.insert((1, 18, 19), "sha256:18544955e92d931905cc620cdf097959f9c67bb3972a45e3033df1d5032c79e6"); + m.insert((1, 18, 20), "sha256:e3f8429398f7efd1fb66dcbadcb5f262baa6daed926e37356eb12558a5c5ee44"); + m.insert((1, 18, 21), "sha256:d7ff9073d7a5a4c57d3c506bfd7b5b67f3e3a425bb5693f22bc64f26e7024fbb"); + m.insert((1, 18, 22), "sha256:7ebf040250d608c72530e692a043a5147a7975155853711f1f47b711db63d926"); + m.insert((1, 18, 23), "sha256:3393e5c6bd7bbf96fe811b05e5002e0e361caa179d5dcf38fd91269ecd8d789c"); + m.insert((1, 18, 25), "sha256:cb479693f1b975346aa0d0c6cab73b4d8e3592d3944133474c1f7c9b9f3606d0"); + m.insert((1, 18, 26), "sha256:f038dd8107aa8caef15d492edb55bd4278fd7e791477a250c3157daa6767cea5"); m }; } diff --git a/src/main.rs b/src/main.rs index 136448c..6c99c7b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -426,7 +426,7 @@ pub fn build( } else if let Some(digest) = IMAGE_MAP.get(&(major, minor, patch)) { println!("Found docker image for Solana version {}.{}.{}", major, minor, patch); solana_version = Some(format!("v{}.{}.{}", major, minor, patch)); - format!("ellipsislabs/solana@{}", digest) + format!("solanafoundation/solana-verifiable-build@{}", digest) } else { println!("Unable to find docker image for Solana version {}.{}.{}", major, minor, patch); let prev = IMAGE_MAP.range(..(major, minor, patch)).next_back(); @@ -441,7 +441,7 @@ pub fn build( }; println!("Using backup docker image for Solana version {}.{}.{}", version.0, version.1, version.2); solana_version = Some(format!("v{}.{}.{}", version.0, version.1, version.2)); - format!("ellipsislabs/solana@{}", digest) + format!("solanafoundation/solana-verifiable-build@{}", digest) } }); diff --git a/update_image_whitelist.py b/update_image_whitelist.py index d739709..c07814f 100644 --- a/update_image_whitelist.py +++ b/update_image_whitelist.py @@ -24,7 +24,7 @@ results = response.json()["results"] sfResponse = requests.get( - "https://hub.docker.com/v2/namespaces/solanafoundation/repositories/solana-verified-build/tags?page_size=1000" + "https://hub.docker.com/v2/namespaces/solanafoundation/repositories/solana-verifiable-build/tags?page_size=1000" ) if sfResponse.status_code != 200: raise Exception(f"Failed to get Docker images: {sfResponse.status_code} {sfResponse.text}") From 89a49dfa7cb85f1ec849c659ad4e765ac5f221ef Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Mon, 4 Nov 2024 16:50:00 +0100 Subject: [PATCH 245/314] Add version >1.18.23 and >2.0 from agave --- docker/v1.18.24.Dockerfile | 9 ++ docker/v1.18.25.Dockerfile | 5 +- docker/v1.18.26.Dockerfile | 5 +- docker/v2.0.0.Dockerfile | 9 ++ docker/v2.0.1.Dockerfile | 9 ++ docker/v2.0.10.Dockerfile | 9 ++ docker/v2.0.11.Dockerfile | 9 ++ docker/v2.0.12.Dockerfile | 9 ++ docker/v2.0.13.Dockerfile | 9 ++ docker/v2.0.14.Dockerfile | 9 ++ docker/v2.0.2.Dockerfile | 9 ++ docker/v2.0.3.Dockerfile | 9 ++ docker/v2.0.4.Dockerfile | 9 ++ docker/v2.0.5.Dockerfile | 9 ++ docker/v2.0.6.Dockerfile | 9 ++ docker/v2.0.7.Dockerfile | 9 ++ docker/v2.0.8.Dockerfile | 9 ++ docker/v2.0.9.Dockerfile | 9 ++ docker/v2.1.0.Dockerfile | 9 ++ generate_dockerfiles.py | 224 ++++++++++++++++++++++--------------- 20 files changed, 293 insertions(+), 94 deletions(-) create mode 100644 docker/v1.18.24.Dockerfile create mode 100644 docker/v2.0.0.Dockerfile create mode 100644 docker/v2.0.1.Dockerfile create mode 100644 docker/v2.0.10.Dockerfile create mode 100644 docker/v2.0.11.Dockerfile create mode 100644 docker/v2.0.12.Dockerfile create mode 100644 docker/v2.0.13.Dockerfile create mode 100644 docker/v2.0.14.Dockerfile create mode 100644 docker/v2.0.2.Dockerfile create mode 100644 docker/v2.0.3.Dockerfile create mode 100644 docker/v2.0.4.Dockerfile create mode 100644 docker/v2.0.5.Dockerfile create mode 100644 docker/v2.0.6.Dockerfile create mode 100644 docker/v2.0.7.Dockerfile create mode 100644 docker/v2.0.8.Dockerfile create mode 100644 docker/v2.0.9.Dockerfile create mode 100644 docker/v2.1.0.Dockerfile diff --git a/docker/v1.18.24.Dockerfile b/docker/v1.18.24.Dockerfile new file mode 100644 index 0000000..9cda6bd --- /dev/null +++ b/docker/v1.18.24.Dockerfile @@ -0,0 +1,9 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v1.18.24/install)" + +ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.25.Dockerfile b/docker/v1.18.25.Dockerfile index 85673f3..1520aad 100644 --- a/docker/v1.18.25.Dockerfile +++ b/docker/v1.18.25.Dockerfile @@ -1,8 +1,9 @@ FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.25/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v1.18.25/install)" + +ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash diff --git a/docker/v1.18.26.Dockerfile b/docker/v1.18.26.Dockerfile index 2817c4a..fc0ba35 100644 --- a/docker/v1.18.26.Dockerfile +++ b/docker/v1.18.26.Dockerfile @@ -1,8 +1,9 @@ FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.26/install)" -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v1.18.26/install)" + +ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash diff --git a/docker/v2.0.0.Dockerfile b/docker/v2.0.0.Dockerfile new file mode 100644 index 0000000..c4d38e8 --- /dev/null +++ b/docker/v2.0.0.Dockerfile @@ -0,0 +1,9 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.0/install)" + +ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.1.Dockerfile b/docker/v2.0.1.Dockerfile new file mode 100644 index 0000000..3b37383 --- /dev/null +++ b/docker/v2.0.1.Dockerfile @@ -0,0 +1,9 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.1/install)" + +ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.10.Dockerfile b/docker/v2.0.10.Dockerfile new file mode 100644 index 0000000..dc5010b --- /dev/null +++ b/docker/v2.0.10.Dockerfile @@ -0,0 +1,9 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.10/install)" + +ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.11.Dockerfile b/docker/v2.0.11.Dockerfile new file mode 100644 index 0000000..56c501f --- /dev/null +++ b/docker/v2.0.11.Dockerfile @@ -0,0 +1,9 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.11/install)" + +ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.12.Dockerfile b/docker/v2.0.12.Dockerfile new file mode 100644 index 0000000..eef4c7e --- /dev/null +++ b/docker/v2.0.12.Dockerfile @@ -0,0 +1,9 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.12/install)" + +ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.13.Dockerfile b/docker/v2.0.13.Dockerfile new file mode 100644 index 0000000..8af916e --- /dev/null +++ b/docker/v2.0.13.Dockerfile @@ -0,0 +1,9 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.13/install)" + +ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.14.Dockerfile b/docker/v2.0.14.Dockerfile new file mode 100644 index 0000000..a04152e --- /dev/null +++ b/docker/v2.0.14.Dockerfile @@ -0,0 +1,9 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.14/install)" + +ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.2.Dockerfile b/docker/v2.0.2.Dockerfile new file mode 100644 index 0000000..102b4de --- /dev/null +++ b/docker/v2.0.2.Dockerfile @@ -0,0 +1,9 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.2/install)" + +ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.3.Dockerfile b/docker/v2.0.3.Dockerfile new file mode 100644 index 0000000..f5f3d47 --- /dev/null +++ b/docker/v2.0.3.Dockerfile @@ -0,0 +1,9 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.3/install)" + +ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.4.Dockerfile b/docker/v2.0.4.Dockerfile new file mode 100644 index 0000000..b962d74 --- /dev/null +++ b/docker/v2.0.4.Dockerfile @@ -0,0 +1,9 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.4/install)" + +ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.5.Dockerfile b/docker/v2.0.5.Dockerfile new file mode 100644 index 0000000..1e4202b --- /dev/null +++ b/docker/v2.0.5.Dockerfile @@ -0,0 +1,9 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.5/install)" + +ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.6.Dockerfile b/docker/v2.0.6.Dockerfile new file mode 100644 index 0000000..5fc84b4 --- /dev/null +++ b/docker/v2.0.6.Dockerfile @@ -0,0 +1,9 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.6/install)" + +ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.7.Dockerfile b/docker/v2.0.7.Dockerfile new file mode 100644 index 0000000..93dac92 --- /dev/null +++ b/docker/v2.0.7.Dockerfile @@ -0,0 +1,9 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.7/install)" + +ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.8.Dockerfile b/docker/v2.0.8.Dockerfile new file mode 100644 index 0000000..ee5091d --- /dev/null +++ b/docker/v2.0.8.Dockerfile @@ -0,0 +1,9 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.8/install)" + +ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.9.Dockerfile b/docker/v2.0.9.Dockerfile new file mode 100644 index 0000000..1911d4b --- /dev/null +++ b/docker/v2.0.9.Dockerfile @@ -0,0 +1,9 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.9/install)" + +ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.1.0.Dockerfile b/docker/v2.1.0.Dockerfile new file mode 100644 index 0000000..fe30896 --- /dev/null +++ b/docker/v2.1.0.Dockerfile @@ -0,0 +1,9 @@ +FROM --platform=linux/amd64 rust@sha256:62afc139057dc9d3eda02e490677911b55a208ba22d6f7315f3c5c5851e31a36 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.0/install)" + +ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/generate_dockerfiles.py b/generate_dockerfiles.py index febcb61..4c28f16 100644 --- a/generate_dockerfiles.py +++ b/generate_dockerfiles.py @@ -4,7 +4,6 @@ import requests import tomllib - parser = argparse.ArgumentParser() parser.add_argument("--upload", action="store_true") parser.add_argument("--skip_cache", action="store_true") @@ -16,11 +15,12 @@ "1.68.0": "sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39" } - RUST_VERSION_PLACEHOLDER = "$RUST_VERSION" SOLANA_VERSION_PLACEHOLDER = "$SOLANA_VERSION" +AGAVE_VERSION_PLACEHOLDER = "$AGAVE_VERSION" -base_dockerfile_text = f""" +# Dockerfile template for Solana +base_dockerfile_sol = f""" FROM --platform=linux/amd64 rust@{RUST_VERSION_PLACEHOLDER} RUN apt-get update && apt-get install -qy git gnutls-bin @@ -31,109 +31,153 @@ CMD /bin/bash """ -output = subprocess.check_output( - ["git", "ls-remote", "--tags", "https://github.com/solana-labs/solana"] -) +# Dockerfile template for Agave +base_dockerfile_agave = f""" +FROM --platform=linux/amd64 rust@{RUST_VERSION_PLACEHOLDER} +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/{AGAVE_VERSION_PLACEHOLDER}/install)" +ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +WORKDIR /build -def check_version(version_str): - try: - # Ignore this one - if version_str == "v1.14.0": - return False - [major, minor, _patch] = version_str.strip("v").split(".") - # Ignore 1.15.x - return int(major) >= 1 and int(minor) >= 14 and int(minor) != 15 - except Exception as e: - return False +CMD /bin/bash +""" + +# Determine release information for Solana or Agave +def get_release_info(version_tag): + """ + Determines if a version is a Solana or Agave release and provides relevant info. + Returns a dictionary with base_dockerfile_text, version_placeholder, and the URL for the toolchain. + """ + # Filter out non-numeric tags + version_parts = version_tag.strip("v").split(".") + if not all(part.isdigit() for part in version_parts): + print(f"Skipping non-numeric tag: {version_tag}") + return None + # Convert parts to integers + major, minor, patch = map(int, version_parts) + + if (major == 1 and minor >= 14 and minor != 15) and not (minor == 18 and patch >= 24): + release_info = { + "base_dockerfile_text": base_dockerfile_sol, + "version_placeholder": SOLANA_VERSION_PLACEHOLDER, + "url": f"https://raw.githubusercontent.com/solana-labs/solana/{version_tag}/rust-toolchain.toml" + } + # Check if it's an Agave release + elif (major == 1 and minor == 18 and patch >= 24) or major >= 2: + release_info = { + "base_dockerfile_text": base_dockerfile_agave, + "version_placeholder": AGAVE_VERSION_PLACEHOLDER, + "url": f"https://raw.githubusercontent.com/anza-xyz/agave/{version_tag}/rust-toolchain.toml" + } + else: + print(f"Skipping {version_tag} as it does not meet Solana or Agave criteria.") + return None + return release_info +# Function to get Solana releases +def get_solana_releases(): + output = subprocess.check_output( + ["git", "ls-remote", "--tags", "https://github.com/solana-labs/solana"] + ) + tags = [ + elem.split("\t")[1].split("/")[-1] + for elem in output.decode("utf-8").split("\n") + if elem + ] + return tags + +# Function to get Agave releases +def get_agave_releases(): + output = subprocess.check_output( + ["git", "ls-remote", "--tags", "https://github.com/anza-xyz/agave"] + ) + tags = [ + elem.split("\t")[1].split("/")[-1] + for elem in output.decode("utf-8").split("\n") + if elem + ] + return tags + +# Function to get Rust toolchain for each release def get_toolchain(version_tag): + # Special case for v1.14 if "v1.14" in version_tag: return "1.68.0" - url = f"https://raw.githubusercontent.com/solana-labs/solana/{version_tag}/rust-toolchain.toml" - headers = {"Accept": "application/vnd.github.v3.raw"} # Fetch the raw file content + release_info = get_release_info(version_tag) + if release_info is None: + return None - response = requests.get(url, headers=headers) + url = release_info["url"] + response = requests.get(url, headers={"Accept": "application/vnd.github.v3.raw"}) if response.status_code == 200: parsed_data = tomllib.loads(response.text) - channel_version = parsed_data["toolchain"]["channel"] - - return channel_version - else: - print(f"Failed to fetch rust-toolchain.toml for {version_tag}") - return None + return parsed_data["toolchain"]["channel"] + print(f"Failed to fetch rust-toolchain.toml for {version_tag}") + return None + +# Process releases and generate Dockerfiles +def process_releases(releases): + for release in releases: + release_info = get_release_info(release) + if release_info is None: + continue # Skip non-numeric tags + + base_dockerfile_text = release_info["base_dockerfile_text"] + version_placeholder = release_info["version_placeholder"] + + rust_version = get_toolchain(release) + print(f"Generating Dockerfile for {release} with Rust version {rust_version}") + + # Skip if rust_version is None to avoid KeyError + if rust_version is None: + print(f"Skipping {release} due to missing Rust version.") + continue + # Ensure Rust image hash is available + if rust_version not in RUST_DOCKER_IMAGESHA_MAP and rust_version != "1.68.0": + response = requests.get( + f"https://hub.docker.com/v2/namespaces/library/repositories/rust/tags/{rust_version}" + ) + if response.status_code == 200: + for image in response.json()["images"]: + if image["architecture"] == "amd64": + RUST_DOCKER_IMAGESHA_MAP[rust_version] = image["digest"] + break + if rust_version not in RUST_DOCKER_IMAGESHA_MAP: + print(f"Failed to fetch Rust image for {rust_version}") + continue + + # Replace placeholders in the Dockerfile template + dockerfile = base_dockerfile_text.replace( + version_placeholder, release + ).replace( + RUST_VERSION_PLACEHOLDER, RUST_DOCKER_IMAGESHA_MAP[rust_version] + ).lstrip("\n") + + # Write the Dockerfile to disk + path = f"docker/{release}.Dockerfile" + if os.path.exists(path): + with open(path, "r") as f: + if f.read() != dockerfile: + dirty_set.add(release.strip("v")) + else: + dirty_set.add(release.strip("v")) + with open(path, "w") as f: + f.write(dockerfile) + dockerfiles[release] = path -tags = list( - filter( - check_version, - [ - elem.split("\t")[1].split("/")[-1] - for elem in output.decode("utf-8").split("\n") - if elem - ], - ) -) +# Main execution +solana_releases = get_solana_releases() +agave_releases = get_agave_releases() dockerfiles = {} - dirty_set = set() -for release in tags: - rust_version = get_toolchain(release) - print("Generating Dockerfile for " + release + ", rust version " + rust_version) - - if rust_version is None: - print(f"Failed to fetch rust version for {release}") - continue - - if rust_version not in RUST_DOCKER_IMAGESHA_MAP and rust_version != "1.68.0": - response = requests.get( - f"https://hub.docker.com/v2/namespaces/library/repositories/rust/tags/{rust_version}" - ) - - if response.status_code == 200: - # JSONify response - response_json = response.json() - # find amd64 image - for image in response_json["images"]: - if image["architecture"] == "amd64": - RUST_DOCKER_IMAGESHA_MAP[rust_version] = image["digest"] - break - - if rust_version not in RUST_DOCKER_IMAGESHA_MAP: - print(f"Failed to fetch rust image for {rust_version}") - continue - - dockerfile = base_dockerfile_text.replace( - SOLANA_VERSION_PLACEHOLDER, release - ).lstrip("\n") - dockerfile = dockerfile.replace( - RUST_VERSION_PLACEHOLDER, RUST_DOCKER_IMAGESHA_MAP[rust_version] - ) - - path = f"docker/{release}.Dockerfile" - - # Check if the file exists before trying to read it - if os.path.exists(path): - with open(path, "r") as f: - prev = f.read() - - if prev != dockerfile: - dirty_set.add(release.strip("v")) - print(f"{release} needs to be updated") - else: - # If the file doesn't exist, consider it as dirty - dirty_set.add(release.strip("v")) - print(f"{release} is new and needs to be created") - - # Write the new or updated Dockerfile - with open(path, "w") as f: - f.write(dockerfile) - - dockerfiles[release] = path +process_releases(solana_releases) +process_releases(agave_releases) print(RUST_DOCKER_IMAGESHA_MAP) @@ -197,4 +241,4 @@ def get_toolchain(version_tag): ) subprocess.call(f"docker push ellipsislabs/{version_tag}", shell=True) else: - continue + continue \ No newline at end of file From 856ee4b13740a919b9228b43f8e0f34d25772710 Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Mon, 4 Nov 2024 16:52:31 +0100 Subject: [PATCH 246/314] change PATH back to solana --- docker/v1.18.24.Dockerfile | 3 +-- docker/v1.18.25.Dockerfile | 3 +-- docker/v1.18.26.Dockerfile | 3 +-- docker/v2.0.0.Dockerfile | 3 +-- docker/v2.0.1.Dockerfile | 3 +-- docker/v2.0.10.Dockerfile | 3 +-- docker/v2.0.11.Dockerfile | 3 +-- docker/v2.0.12.Dockerfile | 3 +-- docker/v2.0.13.Dockerfile | 3 +-- docker/v2.0.14.Dockerfile | 3 +-- docker/v2.0.2.Dockerfile | 3 +-- docker/v2.0.3.Dockerfile | 3 +-- docker/v2.0.4.Dockerfile | 3 +-- docker/v2.0.5.Dockerfile | 3 +-- docker/v2.0.6.Dockerfile | 3 +-- docker/v2.0.7.Dockerfile | 3 +-- docker/v2.0.8.Dockerfile | 3 +-- docker/v2.0.9.Dockerfile | 3 +-- docker/v2.1.0.Dockerfile | 3 +-- generate_dockerfiles.py | 2 +- 20 files changed, 20 insertions(+), 39 deletions(-) diff --git a/docker/v1.18.24.Dockerfile b/docker/v1.18.24.Dockerfile index 9cda6bd..3b5a996 100644 --- a/docker/v1.18.24.Dockerfile +++ b/docker/v1.18.24.Dockerfile @@ -2,8 +2,7 @@ FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df9714 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.anza.xyz/v1.18.24/install)" - -ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash diff --git a/docker/v1.18.25.Dockerfile b/docker/v1.18.25.Dockerfile index 1520aad..14e3526 100644 --- a/docker/v1.18.25.Dockerfile +++ b/docker/v1.18.25.Dockerfile @@ -2,8 +2,7 @@ FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df9714 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.anza.xyz/v1.18.25/install)" - -ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash diff --git a/docker/v1.18.26.Dockerfile b/docker/v1.18.26.Dockerfile index fc0ba35..b922024 100644 --- a/docker/v1.18.26.Dockerfile +++ b/docker/v1.18.26.Dockerfile @@ -2,8 +2,7 @@ FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df9714 RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.anza.xyz/v1.18.26/install)" - -ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash diff --git a/docker/v2.0.0.Dockerfile b/docker/v2.0.0.Dockerfile index c4d38e8..409dcb3 100644 --- a/docker/v2.0.0.Dockerfile +++ b/docker/v2.0.0.Dockerfile @@ -2,8 +2,7 @@ FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.0/install)" - -ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash diff --git a/docker/v2.0.1.Dockerfile b/docker/v2.0.1.Dockerfile index 3b37383..2b3ff36 100644 --- a/docker/v2.0.1.Dockerfile +++ b/docker/v2.0.1.Dockerfile @@ -2,8 +2,7 @@ FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.1/install)" - -ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash diff --git a/docker/v2.0.10.Dockerfile b/docker/v2.0.10.Dockerfile index dc5010b..3a5163c 100644 --- a/docker/v2.0.10.Dockerfile +++ b/docker/v2.0.10.Dockerfile @@ -2,8 +2,7 @@ FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.10/install)" - -ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash diff --git a/docker/v2.0.11.Dockerfile b/docker/v2.0.11.Dockerfile index 56c501f..896a1d7 100644 --- a/docker/v2.0.11.Dockerfile +++ b/docker/v2.0.11.Dockerfile @@ -2,8 +2,7 @@ FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.11/install)" - -ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash diff --git a/docker/v2.0.12.Dockerfile b/docker/v2.0.12.Dockerfile index eef4c7e..02ec14a 100644 --- a/docker/v2.0.12.Dockerfile +++ b/docker/v2.0.12.Dockerfile @@ -2,8 +2,7 @@ FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.12/install)" - -ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash diff --git a/docker/v2.0.13.Dockerfile b/docker/v2.0.13.Dockerfile index 8af916e..2881b63 100644 --- a/docker/v2.0.13.Dockerfile +++ b/docker/v2.0.13.Dockerfile @@ -2,8 +2,7 @@ FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.13/install)" - -ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash diff --git a/docker/v2.0.14.Dockerfile b/docker/v2.0.14.Dockerfile index a04152e..591cbde 100644 --- a/docker/v2.0.14.Dockerfile +++ b/docker/v2.0.14.Dockerfile @@ -2,8 +2,7 @@ FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.14/install)" - -ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash diff --git a/docker/v2.0.2.Dockerfile b/docker/v2.0.2.Dockerfile index 102b4de..812b02b 100644 --- a/docker/v2.0.2.Dockerfile +++ b/docker/v2.0.2.Dockerfile @@ -2,8 +2,7 @@ FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.2/install)" - -ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash diff --git a/docker/v2.0.3.Dockerfile b/docker/v2.0.3.Dockerfile index f5f3d47..a1a6d6e 100644 --- a/docker/v2.0.3.Dockerfile +++ b/docker/v2.0.3.Dockerfile @@ -2,8 +2,7 @@ FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.3/install)" - -ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash diff --git a/docker/v2.0.4.Dockerfile b/docker/v2.0.4.Dockerfile index b962d74..f6062b2 100644 --- a/docker/v2.0.4.Dockerfile +++ b/docker/v2.0.4.Dockerfile @@ -2,8 +2,7 @@ FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.4/install)" - -ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash diff --git a/docker/v2.0.5.Dockerfile b/docker/v2.0.5.Dockerfile index 1e4202b..619c02a 100644 --- a/docker/v2.0.5.Dockerfile +++ b/docker/v2.0.5.Dockerfile @@ -2,8 +2,7 @@ FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.5/install)" - -ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash diff --git a/docker/v2.0.6.Dockerfile b/docker/v2.0.6.Dockerfile index 5fc84b4..aed224d 100644 --- a/docker/v2.0.6.Dockerfile +++ b/docker/v2.0.6.Dockerfile @@ -2,8 +2,7 @@ FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.6/install)" - -ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash diff --git a/docker/v2.0.7.Dockerfile b/docker/v2.0.7.Dockerfile index 93dac92..2d48ba6 100644 --- a/docker/v2.0.7.Dockerfile +++ b/docker/v2.0.7.Dockerfile @@ -2,8 +2,7 @@ FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.7/install)" - -ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash diff --git a/docker/v2.0.8.Dockerfile b/docker/v2.0.8.Dockerfile index ee5091d..91ee898 100644 --- a/docker/v2.0.8.Dockerfile +++ b/docker/v2.0.8.Dockerfile @@ -2,8 +2,7 @@ FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.8/install)" - -ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash diff --git a/docker/v2.0.9.Dockerfile b/docker/v2.0.9.Dockerfile index 1911d4b..cc992b7 100644 --- a/docker/v2.0.9.Dockerfile +++ b/docker/v2.0.9.Dockerfile @@ -2,8 +2,7 @@ FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153f RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.9/install)" - -ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash diff --git a/docker/v2.1.0.Dockerfile b/docker/v2.1.0.Dockerfile index fe30896..6458771 100644 --- a/docker/v2.1.0.Dockerfile +++ b/docker/v2.1.0.Dockerfile @@ -2,8 +2,7 @@ FROM --platform=linux/amd64 rust@sha256:62afc139057dc9d3eda02e490677911b55a208ba RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.0/install)" - -ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash diff --git a/generate_dockerfiles.py b/generate_dockerfiles.py index 4c28f16..63aa4d9 100644 --- a/generate_dockerfiles.py +++ b/generate_dockerfiles.py @@ -37,7 +37,7 @@ RUN apt-get update && apt-get install -qy git gnutls-bin RUN sh -c "$(curl -sSfL https://release.anza.xyz/{AGAVE_VERSION_PLACEHOLDER}/install)" -ENV PATH="/root/.local/share/agave/install/active_release/bin:$PATH" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash From bc5072d212c20ed9dd9280d9f96510de5e3111d4 Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Mon, 4 Nov 2024 18:02:26 +0100 Subject: [PATCH 247/314] Change create docker files to use solanafoundation --- generate_dockerfiles.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/generate_dockerfiles.py b/generate_dockerfiles.py index 63aa4d9..2024a12 100644 --- a/generate_dockerfiles.py +++ b/generate_dockerfiles.py @@ -185,7 +185,7 @@ def process_releases(releases): if not args.skip_cache: print("Fetching existing images") response = requests.get( - "https://hub.docker.com/v2/namespaces/ellipsislabs/repositories/solana/tags?page_size=1000" + "https://hub.docker.com/v2/namespaces/solanafoundation/repositories/solana-verifiable-build/tags?page_size=1000" ) for result in response.json()["results"]: print(result) @@ -237,8 +237,8 @@ def process_releases(releases): ) if res == 0: subprocess.call( - f"docker tag {version_tag} ellipsislabs/{version_tag}", shell=True + f"docker tag {version_tag} solanafoundation/solana-verifiable-build/{version_tag}", shell=True ) - subprocess.call(f"docker push ellipsislabs/{version_tag}", shell=True) + subprocess.call(f"docker push solanafoundation/solana-verifiable-build/{version_tag}", shell=True) else: continue \ No newline at end of file From 472ab64917d1a2c5580bdea81be75c84d3503ea6 Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Mon, 4 Nov 2024 18:10:18 +0100 Subject: [PATCH 248/314] Update image_config.rs --- src/image_config.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/image_config.rs b/src/image_config.rs index 4bb6842..c7dfe82 100644 --- a/src/image_config.rs +++ b/src/image_config.rs @@ -119,8 +119,25 @@ lazy_static! { m.insert((1, 18, 21), "sha256:d7ff9073d7a5a4c57d3c506bfd7b5b67f3e3a425bb5693f22bc64f26e7024fbb"); m.insert((1, 18, 22), "sha256:7ebf040250d608c72530e692a043a5147a7975155853711f1f47b711db63d926"); m.insert((1, 18, 23), "sha256:3393e5c6bd7bbf96fe811b05e5002e0e361caa179d5dcf38fd91269ecd8d789c"); - m.insert((1, 18, 25), "sha256:cb479693f1b975346aa0d0c6cab73b4d8e3592d3944133474c1f7c9b9f3606d0"); - m.insert((1, 18, 26), "sha256:f038dd8107aa8caef15d492edb55bd4278fd7e791477a250c3157daa6767cea5"); + m.insert((1, 18, 24), "sha256:1b2c27883f8cd5c3e596526d1b1a776af1acaddf90ac2d93271767306439b532"); + m.insert((1, 18, 25), "sha256:2abc86a752d37f9e51fb25b2de3018a03f8a4cf2833aa34cc974d894d981287a"); + m.insert((1, 18, 26), "sha256:b92ece91a8cec060ff124c56f6625c429f1a9e08bf1a4ae1b739a3e2c5dcb1e5"); + m.insert((2, 0, 0), "sha256:69e1c395a4b9d6513499cb5bb0ea4c6eb1f43591452b4a6608a0dcbaad964ead"); + m.insert((2, 0, 1), "sha256:824c05d5c37de2582139095cc20458f1c6bc30304ea26d37d469a9ced6b2bde2"); + m.insert((2, 0, 2), "sha256:15f47240a7cd476b545bc0facc26cc5538793befb8184ce168b29b1ae4b5f810"); + m.insert((2, 0, 3), "sha256:ad091e93cef5495a9ea18bd54f34cb2577de0d8bafc89570d911da4a829f5d72"); + m.insert((2, 0, 4), "sha256:96ca4a5e2425c2a5e9f9891ebc6d1bf1e4e1ac3c3b2bc503014079525eb69fe9"); + m.insert((2, 0, 5), "sha256:7c86e43374e6272d281bdd3715b9c305a917c92a3e282211b399190415a766ba"); + m.insert((2, 0, 6), "sha256:f3bec73be6602abbc2f677644ec9ffc18791f3ab35a34d0d0e410e024a5d8d17"); + m.insert((2, 0, 7), "sha256:d39f5c1b85a2f8af4db7b110d02e259cefb6c34916c377cabb800cb6a274dec7"); + m.insert((2, 0, 8), "sha256:c2b3e133b1f346b9decdf7dd9d3f37ce94b153f5b16c407891f611acbc3318d3"); + m.insert((2, 0, 9), "sha256:c220177d9a35864aa0537b6911640d4de13bef50bcdce9a711163d3f9972a468"); + m.insert((2, 0, 10), "sha256:db72b936e2385bcffb5ebd2afef2fdbcadfdaebe91d9d936abe1c2787e870933"); + m.insert((2, 0, 11), "sha256:a9fd9debdc119afd231c7bf83519a06800ec9806fc73f4d3895164784448fe24"); + m.insert((2, 0, 12), "sha256:f41ea5fa9234803edfcc3d3611f1cb28c9a1dbf1b9e189f52531327791401ef3"); + m.insert((2, 0, 13), "sha256:1dfcbad7e0ea281288e4c90e2939e6f365294be18ba1d121951d2dcc6ae29db1"); + m.insert((2, 0, 14), "sha256:74ace55d45a6743c32e46de8d86b75a47da443bd335dbfe2590ce85915a91f06"); + m.insert((2, 1, 0), "sha256:da30e737ed0990f82a0782ab6b7b24474a13abcf61ff8d10f783fa6a590ec44e"); m }; } From 3bc687547041458812daa4f3536bb18478917c92 Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Mon, 4 Nov 2024 20:46:06 +0100 Subject: [PATCH 249/314] Update v1.16.27.Dockerfile --- docker/v1.16.27.Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/v1.16.27.Dockerfile b/docker/v1.16.27.Dockerfile index 277a476..5375158 100644 --- a/docker/v1.16.27.Dockerfile +++ b/docker/v1.16.27.Dockerfile @@ -6,3 +6,4 @@ ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash + From 1f242edbe2f35c9b553e45e9b3e9df6b021577dc Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Mon, 4 Nov 2024 20:59:28 +0100 Subject: [PATCH 250/314] Add new sf images --- src/image_config.rs | 129 +++++++++----------------------------- update_image_whitelist.py | 13 ++-- 2 files changed, 36 insertions(+), 106 deletions(-) diff --git a/src/image_config.rs b/src/image_config.rs index c7dfe82..1344528 100644 --- a/src/image_config.rs +++ b/src/image_config.rs @@ -5,113 +5,42 @@ use std::collections::BTreeMap; lazy_static! { pub static ref IMAGE_MAP: BTreeMap<(u32, u32, u32), &'static str> = { let mut m = BTreeMap::new(); - m.insert((1, 14, 2), "sha256:d4bcffdb9403b154ceeab3063cc5a846a0b4d59a41a8b708249fcc4239b4129d"); - m.insert((1, 14, 3), "sha256:4adf5dfa0812d3b6835f65fb19687d705d057b7e7cb0cfe14abd240679e12de2"); - m.insert((1, 14, 4), "sha256:67cf2a1be16075ca0b53325212c03f48624ca68cdd86dcaaf5a06ff18e959fae"); - m.insert((1, 14, 5), "sha256:608c50412eb0459b0c894117c1e468a480a6f4ea38c4c074e85fc565ecd29214"); - m.insert((1, 14, 6), "sha256:167ed207752e2ec495851e096bf56c1a276b3330e754b322d401c1087a31f540"); - m.insert((1, 14, 7), "sha256:b73ccf1e636e278e20c5789b3d3be3e4a72e7813350a93e2ef39a66933175272"); - m.insert((1, 14, 8), "sha256:a1f76a938980f4bd05ac92829660a781cab167a9a8dd2179787cf23a17526502"); - m.insert((1, 14, 9), "sha256:073eb70e7fa3be8c7d7809e03bdedcf7ddd8744c8004921151c7b1c19fe760fd"); - m.insert((1, 14, 11), "sha256:e82b7df2bb23e6031a04b99e361acb0340b86857e9ad6c76db61fe65757166fd"); - m.insert((1, 14, 12), "sha256:15341a61fcee68cd04f0b0b566e8c2a00978899b3d98aa34e4a30bfac7d6deea"); - m.insert((1, 14, 13), "sha256:4976bd71a0bfa868c28c456bfb080ac59719c570ca6eb0917b445851c4615af4"); - m.insert((1, 14, 14), "sha256:2700fb6433143e6e8c66ba3dffbad50f001e80c1b4e86815f94b32323f05332d"); - m.insert((1, 14, 15), "sha256:0cf3a1945d24f2525e165ddef8b173d8a4387563477fbbae6696c15f4c51e26e"); - m.insert((1, 14, 16), "sha256:c6d3797b4a7790163049933c361ea2a74b4dff8d6a42434e6a04d0d82c04eda0"); - m.insert((1, 14, 17), "sha256:2aa6adc2a856df8977a332f089ab352211eb28812823121e3b5aedd6bbb89df1"); - m.insert((1, 14, 18), "sha256:fe75071a171f817799cb33821f7d680d594d6f066440c9a4c3fd54b55b681439"); - m.insert((1, 14, 19), "sha256:3e567c978dfc782f60c4ce768738cfacc5c36bd005becd1c14379b120d8f9174"); - m.insert((1, 14, 20), "sha256:e9501544d3d085bbbff7c100898ce29bf085dd8c851fb85a73b00f72b2ce7c4c"); - m.insert((1, 14, 21), "sha256:1531e719c4b2675b59b4be410b4cb8d2ecfaf337b6e111dcaf986cf7c343b7e3"); - m.insert((1, 14, 22), "sha256:e6d6f1f095de3188bfcf9356f91102b85290ffeba6388debe11706e1d9a02826"); - m.insert((1, 14, 23), "sha256:f6193af3b4e86a5a40c77b6d4294fccb914c938ef16d8db1d67c7a571797345e"); - m.insert((1, 14, 24), "sha256:866488d56ec3f1a823cb9ecd7652effdc8746b96827209b5ea4ec78a1fa9d45b"); - m.insert((1, 14, 25), "sha256:a274e5245609baa175d2fcca93a6427c9f295cbbca7a705076d5f977db28d360"); - m.insert((1, 14, 26), "sha256:ee6ca9b4dcdb58413259545f833f3834733bb281790b6778099c1a586d267fa8"); - m.insert((1, 14, 27), "sha256:66beebc3bd73ad7b0c694dd0f7027f39e211932caecc0d908467bb00c8f83812"); - m.insert((1, 14, 28), "sha256:4b7a8fcc1d487fe80dfc152d1e49c6067025d5e44bd5d743869fe75b636e4907"); - m.insert((1, 14, 29), "sha256:2a38e78a1bcb369a6673b6442f1ee32f99e839445e426c4fdfdc48ee852e346e"); - m.insert((1, 16, 0), "sha256:63b59011d4451d461cc1ce3beddc627c648209e151022938a43eafcaa06861b5"); - m.insert((1, 16, 1), "sha256:3328149969bfd50dc4ccd0fd61db53f1312cfd8273be3432111ee46a34cf04e4"); - m.insert((1, 16, 2), "sha256:3989c28d287659d38a1b3b92d261c7bd7fc92499fe87e1f88cfeb27296dfbfae"); - m.insert((1, 16, 3), "sha256:e819deea8643d6f4d2f52300148d5de2236df175af7982d400d156f1a69c47d2"); - m.insert((1, 16, 4), "sha256:04cb2437921aff3d3b65055742c36efd80f27ba1deeb5740d9758d5d2a7cd143"); - m.insert((1, 16, 5), "sha256:bbe60168f1b8cab06020e48e1822d24423794b8acedada88c12c3e99e4d10bf1"); - m.insert((1, 16, 6), "sha256:1f6c0032cb1bb12c5ee82b695b2b1ef896cbcae2795514046e5347f371db34bb"); - m.insert((1, 16, 7), "sha256:ee2b096a2c84a8c6e670d5c9973bed744a2b7821521cef8e1ef916276eeb149a"); - m.insert((1, 16, 8), "sha256:5eb24d5a7bae10555a27af158c9e6518005b342bfb0716d45b918c135f7b278c"); - m.insert((1, 16, 9), "sha256:c504b12273774f904ba32f51ba1edb369ac3226802b5d0d3e2b03bba486a3143"); - m.insert((1, 16, 10), "sha256:ef6901ebabf174eb4a8a4874df6426647663fde723b1092eaa3b7cc464dffd2b"); - m.insert((1, 16, 11), "sha256:a2788528b302c4c4144cfcaca35c978a1b420c936201b3b7b80977a289345914"); - m.insert((1, 16, 12), "sha256:fa0ddf49a29261a672bce0ab5340d9a4ad45197ba975ad325ed5ecbef9a7a51e"); - m.insert((1, 16, 13), "sha256:0ee6802da06f74d999bf32d4816457549549c5d205aba85b0c01ffe982563456"); - m.insert((1, 16, 14), "sha256:1eb74340d1ae38a4c1ae03632ffc63ecfb92d5e3a5971e0c6a27a262999e8b81"); - m.insert((1, 16, 15), "sha256:f1077fd6d8bbfbb7bb74d011943840ab477b18a3c4a34def590599ae91dc5ced"); - m.insert((1, 16, 16), "sha256:6516d9dd7de0ff660a85b06e7991b61b55980fc48b0301dc2fd464357be6c630"); - m.insert((1, 16, 17), "sha256:a11ca740647ec6bb4c5defdce385e799f0cac94ed4ae43ea54dc97e051530a31"); - m.insert((1, 16, 18), "sha256:5e036ec546573b24771353bcc307df618445b59d7a6cabe7540cc93bb982d0eb"); - m.insert((1, 16, 19), "sha256:767b5e60efd80872b13ff8364e65449dba75e0a681faf2d609863df063954987"); - m.insert((1, 16, 20), "sha256:4077c6626a605f9b9d2f050744fc5495cfa5dbf11948e6760a8c5055364bfcdb"); - m.insert((1, 16, 21), "sha256:f05e41fb520a6651c31217e7bd77e4bb5e63328dd33e98cb340e624639aca640"); - m.insert((1, 16, 22), "sha256:6cd9b344886876f13cb0ea047f58bfcb745d33e0383d420f45f0229e3d7611b8"); - m.insert((1, 16, 23), "sha256:fd8fcb3b2ab82a0eb6147b22ed66564788e9be19f759f5af69f713618f2e3c28"); - m.insert((1, 16, 24), "sha256:c39cd5b1ecbd5bb4341d2dc7de9d7bb9631ad48fcc609d94bc9771bba9941746"); - m.insert((1, 16, 25), "sha256:6bfefb55c99a16427a8136dbde438d8ad5710d8200cec7668b1e84609b9fc96a"); - m.insert((1, 16, 26), "sha256:b1399b7bff5f37abd52bd1f70a1e14279bddbe68d7a381c30af7a390f2a2b681"); - m.insert((1, 16, 27), "sha256:d3f39f5e1d2fbf798149416bbcb050ae8c03ea8ce18c559fc64beb7547f5c96b"); - m.insert((1, 17, 0), "sha256:b6a15120904aa5c3d5b2404349478c7577fb25dfd73349829f629b81cd21757d"); - m.insert((1, 17, 1), "sha256:3ea48411a4a6fdea26f248b4821782d14420dcfda98e63e8b0782b2da42db2c5"); - m.insert((1, 17, 2), "sha256:10e43778cfb4a1c57c33c4781b0e51874752ab46ed97e3418d058ba27ee3c813"); - m.insert((1, 17, 3), "sha256:c58cf31748b19f03aa21f2d677db0296d98ddc52889953096ab85586b537a770"); - m.insert((1, 17, 4), "sha256:cc0e73a825f4688ed897bc4b3e8cd3426e90cba0d53254b19dd93ac49c2eea53"); - m.insert((1, 17, 5), "sha256:91e50b5c06b5844a41ac9303e9f54aecfa2386e02bcb229c97e3604fbac012f1"); - m.insert((1, 17, 6), "sha256:6ab8b019f8e3556d5e05ebff7100a533078dd7b37309de5f0c8ee24ffb699a24"); - m.insert((1, 17, 7), "sha256:bf95031bb8dc2cd7ac0b9d05b5656a33d5188723859bddfb1dfa5031e04348f2"); - m.insert((1, 17, 8), "sha256:007edb91a663b86a5bded18d8db8efb559f89941f51c54fb1f9044c350980c37"); - m.insert((1, 17, 9), "sha256:3305eda13a0ed63ddf0a8bb9fb2e8c9a01ba23136f3504da275322efac86d2d7"); - m.insert((1, 17, 10), "sha256:76c4b419c674774d4f6d8f576369b4952145a5336baab243f97a209aa773ecf1"); - m.insert((1, 17, 11), "sha256:bbaec57b323f0eaa86ef00fb612a60d6093d27e559f2769b1a6be061a52336e5"); - m.insert((1, 17, 12), "sha256:f0f4dfd83424786a64812a53d218264f7900e8cf3286124a071ffa141dfd6051"); - m.insert((1, 17, 13), "sha256:21706ce972b8676c37a743cb1fafb471bdaafa42e8c7aed19944966e2dcb63c9"); - m.insert((1, 17, 14), "sha256:e2ffac03523f37a4bb95c41d974bea6f6678d629ff9fb33b84dd65412bc48152"); - m.insert((1, 17, 15), "sha256:27e10d218351b6afa6338a36f045a8334f64c710f58f8753ae15fd3a8e0ad22f"); - m.insert((1, 17, 16), "sha256:7d6d95378cda2cd6866ae70563bf184e99d3d937632c0033797bcc483ae81597"); - m.insert((1, 17, 17), "sha256:b8024cdf9e196490328e4ea0721e403396a6f16a5e825a9af63ced7c703ce9c4"); - m.insert((1, 17, 18), "sha256:3c951af1c893a7d509872faed62410de33ff9fc41c2052a8c79f5e44840186d5"); - m.insert((1, 17, 19), "sha256:a4571591bca47306c7b1aa35747d587fdf8621dc690247f0596cbcaced06ee7f"); - m.insert((1, 17, 20), "sha256:7914649a71b10819dbb1f9d5ae440217b83af3f55e8454ff3a1f92e5174148d5"); - m.insert((1, 17, 21), "sha256:0a874df16407f8f440d3e647f65047135dd17bfa526eea21d9010e4933214058"); - m.insert((1, 17, 22), "sha256:89e8f58ee9fe5c1dbaf5a6852a61423680804ccf0a7b4bad95770e329fb8ef84"); - m.insert((1, 17, 23), "sha256:320e37929e0dbb23797e817b089015609acf2e387b0e3c165e43b9db80227105"); - m.insert((1, 17, 24), "sha256:06c5c9011fc7d143ddefc66888dea3e8d91ab6ce95d849ae29e01c507ca5053e"); - m.insert((1, 17, 25), "sha256:748d59cfc5465456240c80c8878c5074e46c652b21810579258bcb5ad98d3a65"); - m.insert((1, 17, 26), "sha256:c968b77df5e307266b4dbfe32ce5cb1f96c1ec0d380005c5ee2372cfb5953629"); - m.insert((1, 17, 27), "sha256:31c406d1e64801ed4092790a627c1b36d4407b00d8a90022dacec85ff131c4ae"); - m.insert((1, 17, 28), "sha256:21511c4de731f494c18b7d51c64cf8ed9bb82deea0028c0d48cbd7fd86c02ffb"); - m.insert((1, 17, 29), "sha256:74efa6a72d82ce2b74f2b5642d4293fa5a302d6d82017e6ad67223dbf3102d58"); - m.insert((1, 17, 30), "sha256:a3def468a993061fd3ea134692766a97d1f8d24e22a12d0c32addd7cd3da8563"); - m.insert((1, 17, 31), "sha256:4b6a1d5db9edb2f0baf5310e3af243f48264f051464fa6b6441e6c04a52f31f1"); + m.insert((1, 17, 2), "sha256:fd6432ce7ed2dedc010849812ac5313b5c8ca96cb03997ff172e8ce6e6e6528d"); + m.insert((1, 17, 3), "sha256:21ae71f2456ae8fd318cf8738a309b6c40cac8f5c2b65dd9a78a702d5f0f017a"); + m.insert((1, 17, 4), "sha256:6ae28a12ea924912f171d8817bd6ba1ea3ee668fa53f759789bcdb10b0ae13b5"); + m.insert((1, 17, 5), "sha256:6df790e45a3b1a89ce5f1a69ebf33d50291e18ed31cae1f0f5d159bc6c5f45ff"); + m.insert((1, 17, 6), "sha256:533a4a31198c64670d319aa09c6f00f8a4e6b72881c74e9925c16a9667596017"); + m.insert((1, 17, 7), "sha256:6de36afeaab277dcf2de8b7c04abb2093bbf50cb4ccdb59df4bfd97b16f8bbe7"); + m.insert((1, 17, 8), "sha256:3a129b5e5851b0a25ad7a24a96f4d82fdfd6a616a4f69a94bec1a65cb6dfae93"); + m.insert((1, 17, 9), "sha256:2bacdd91d2aba692fb3c917f6a6ac78bbf034ca2ac2e65be5a3c6689e5997356"); + m.insert((1, 17, 21), "sha256:e1ed7846431d018f4ffe512afd67f247622e9a016927163cfc46c5cd4e49fa97"); + m.insert((1, 17, 23), "sha256:ddafe215050a3a727a72aef87543a914ddb84329e72d1a7e8698fa1db2a8c6e2"); + m.insert((1, 17, 25), "sha256:0ba63bb51937bfcdf64bedf339b04c2ab00011bc67bad9044bc27ef78e95fffb"); + m.insert((1, 17, 26), "sha256:30709e6d35a44a4627a3e67840489174490a0e40560c290440e5500da2acd3f5"); + m.insert((1, 17, 27), "sha256:e32b0cda187d5fcf273781535e991987e232cb2311595f110dc31d07da749134"); + m.insert((1, 17, 29), "sha256:3d66e8747afa3a6e4257cb520c85dd005af34c054fab40b596ab7bfeef02ab9a"); + m.insert((1, 17, 30), "sha256:216d9efd4b0a26b70c1081ee802445c6917e6683be3bc92cbb94e1bca1144418"); + m.insert((1, 17, 31), "sha256:29a9f6ee487c9047687e378fde476cdcd49564736e1128bfcb9d71e9c4720d15"); m.insert((1, 17, 32), "sha256:564674f88899cd489381e5cdb212524ab5051f9cbcf126b908dd6c652157e6ec"); m.insert((1, 17, 33), "sha256:c7abae48a3448147e6c7cbd839b73f59bddaf2d5c21a7f6c0f7ecb582ec9aa30"); m.insert((1, 17, 34), "sha256:30f7631764c1cb4d9ab5b1c7bc18d932f839d1a3e5a60ee5090c81a429a659c9"); - m.insert((1, 18, 0), "sha256:1eda60c966a4da71d5a0d8d1600439aa303561f29068801a8e0e2b34f121f7ab"); - m.insert((1, 18, 1), "sha256:0c15cf35e58a43972475bc96de47b5b51805548a16d1e97ec6c1947c98770d22"); - m.insert((1, 18, 2), "sha256:5c7bda6b3d0b23ea36fc47363b5d9e534caec7b7f5f3d0e063681a3105e8de88"); - m.insert((1, 18, 3), "sha256:7f89d853a5914ba73b5dbc89fd58e51f2dd6586a355ff7308ac2e06d13c733bb"); - m.insert((1, 18, 4), "sha256:30a7c92c6249a99d14d742bb08fe5d3d5275aaba39625aca56019e80ea970e63"); - m.insert((1, 18, 5), "sha256:42b5d459fee57028da69f00791c2c5a6853b745bd2bdbdacb935aa1c57a4679d"); - m.insert((1, 18, 6), "sha256:cd66fcd774f1ed500868554836cc025891de2df32e4487067f61b07edf4b4b46"); - m.insert((1, 18, 7), "sha256:a70e5c66970adb73beaa000df9537e4c41d60dad5e8cc270cdfc53ec6ea13364"); - m.insert((1, 18, 8), "sha256:0a2cfd125ab771f66d5c9d0f60067b78bd5b43ed6edbc63985b48d7f781579d6"); - m.insert((1, 18, 9), "sha256:083ad44f3181d56dea0b628260f3ecf70744add259632234c377d1b6ee5d6a9d"); - m.insert((1, 18, 10), "sha256:0e0b25263f3755a065dcbfcd436844d9ecdaa729cf4395492ea6357a7dcffa50"); - m.insert((1, 18, 11), "sha256:ba596c913a21489633f1d043c05f26dead294a4153dd48a9952d8af4312900a3"); + m.insert((1, 18, 0), "sha256:4ce29cd8849f5686adeb20892fc68da8d4aad10a98cca941d724c256f23c2f8b"); + m.insert((1, 18, 1), "sha256:b96f942f5974dae1b32f1ba682bdc2be5725d51e7004531bc8c51d290e230b05"); + m.insert((1, 18, 2), "sha256:8da146e1e82012935acb39cb717eefe4d3e6256b6f1ad2e4c640be6d79c772bc"); + m.insert((1, 18, 3), "sha256:4ef938720215948e9ec544517ed3759205b62aa41290120c589217f7f904241d"); + m.insert((1, 18, 4), "sha256:12c137fce9676043b7e24bdbc9082d1ab03539d845118dd9b9609ff10c219b73"); + m.insert((1, 18, 5), "sha256:c25e9a37b7f70353dd0e8c16507b7e6841303c9f736f7cc8514c4cf9ea734448"); + m.insert((1, 18, 6), "sha256:fada991c06f739c6f813d65e458e72fd5b7ec51df43f90970466d996561571e6"); + m.insert((1, 18, 7), "sha256:f75aed70c45c40dd16f5a5564044f37e0e1d326c0b48299e0faf31b12c8d89e6"); + m.insert((1, 18, 8), "sha256:44e6d293682570512e1a3c4df21260daa0ffd7ac5c580ad18a27301a5d7a6671"); + m.insert((1, 18, 9), "sha256:e68dac761793f3fe03acd239fa358ffe4b6f0cee3b8ab26e986ba9b074e29842"); + m.insert((1, 18, 10), "sha256:f68a89c9987baf3c4b621a020b90a8f0f003f7ad1f2302234cd0a2fe14eabf98"); + m.insert((1, 18, 11), "sha256:ea97f5e0154df43a2b841e8e94bf08e5afeae0631106aa163c44e2eb3a516a93"); m.insert((1, 18, 12), "sha256:62a4f8b82d02dfc657ef4babd29bea7283e7d8c513f2e8f46d6b0d6fbd82f40b"); m.insert((1, 18, 13), "sha256:52cd626ec8694b66522573aeddd4868831ad9bc2ba8fc06d2ea2d75feed3f39e"); m.insert((1, 18, 14), "sha256:adb5b1f5e297cd25ca94b46defea73378c5ecba4420ffd5baefb512475578099"); m.insert((1, 18, 15), "sha256:200ad8cca516544f43da47c4be062f79909a16960d7338ced657d362fca0937c"); - m.insert((1, 18, 16), "sha256:8f56be84b2c6f2ea8c018e00cff1a9b7e2bbea6bf3d9949c9359b1ef46dba7aa"); + m.insert((1, 18, 16), "sha256:c36cc9ff70e6adb04cef93f9945604948272129ee643c0b4fa741a233e13e7f8"); m.insert((1, 18, 17), "sha256:3c919ec33c446124e562c3f0b80f8f7082b040dcee2fa365bde8f447e4f7601f"); m.insert((1, 18, 18), "sha256:d0a1f26ac35f5f45cbda491bd8150b2ba3587b9fa5369e15f33bbdb1a72bd216"); m.insert((1, 18, 19), "sha256:18544955e92d931905cc620cdf097959f9c67bb3972a45e3033df1d5032c79e6"); diff --git a/update_image_whitelist.py b/update_image_whitelist.py index c07814f..9d9a94e 100644 --- a/update_image_whitelist.py +++ b/update_image_whitelist.py @@ -16,16 +16,17 @@ raise Exception(f"Failed to get Docker images: {response.status_code} {response.text}") results = response.json() else: - response = requests.get( - "https://hub.docker.com/v2/namespaces/ellipsislabs/repositories/solana/tags?page_size=1000" - ) - if response.status_code != 200: - raise Exception(f"Failed to get Docker images: {response.status_code} {response.text}") - results = response.json()["results"] + # response = requests.get( + # "https://hub.docker.com/v2/namespaces/ellipsislabs/repositories/solana/tags?page_size=1000" + # ) + # if response.status_code != 200: + # raise Exception(f"Failed to get Docker images: {response.status_code} {response.text}") + # results = response.json()["results"] sfResponse = requests.get( "https://hub.docker.com/v2/namespaces/solanafoundation/repositories/solana-verifiable-build/tags?page_size=1000" ) + results = sfResponse.json()["results"] if sfResponse.status_code != 200: raise Exception(f"Failed to get Docker images: {sfResponse.status_code} {sfResponse.text}") results = sfResponse.json()["results"] + results From 2bfe1b20e9737e54be82ab018501c9255e440849 Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Mon, 4 Nov 2024 21:30:07 +0100 Subject: [PATCH 251/314] Add pagination to docker request --- src/image_config.rs | 45 ++++++++++++++++++++++++ update_image_whitelist.py | 74 +++++++++++++++++---------------------- 2 files changed, 78 insertions(+), 41 deletions(-) diff --git a/src/image_config.rs b/src/image_config.rs index 1344528..a31a55c 100644 --- a/src/image_config.rs +++ b/src/image_config.rs @@ -5,6 +5,37 @@ use std::collections::BTreeMap; lazy_static! { pub static ref IMAGE_MAP: BTreeMap<(u32, u32, u32), &'static str> = { let mut m = BTreeMap::new(); + m.insert((1, 14, 9), "sha256:073eb70e7fa3be8c7d7809e03bdedcf7ddd8744c8004921151c7b1c19fe760fd"); + m.insert((1, 16, 0), "sha256:9704a8134ab8f71d60393058f54014d68171935778168dae4f177d4b5048eee9"); + m.insert((1, 16, 1), "sha256:f8f9f6ab171cddecf6ca9edfbc2f8832ca40a39d32d1d6d6675480c973e6ddb2"); + m.insert((1, 16, 2), "sha256:3d7bfe90102c93a4e8485ff81f9c8bca7902408195dd469ce39d0d8fb0d83431"); + m.insert((1, 16, 3), "sha256:768aea7ed4a19c33e85f631a69dd9c25fb053c2e33f480dd7cc3a820f6ea7bf4"); + m.insert((1, 16, 4), "sha256:60997907318cec9956f78a8e6931e84c3e8a51c612c0fabd257c0789d3dbf604"); + m.insert((1, 16, 5), "sha256:21e8215f4468a6ec48a07c16585baa1145d2918d5a061466e26f66512c92f290"); + m.insert((1, 16, 6), "sha256:626cfdc69f2daa16b50a75065f5ccf093f4f75f702ba1a77c99c70f6f15266fb"); + m.insert((1, 16, 7), "sha256:c72a7113b49419b75e81b690e87ce29d6e24b5ce3070631850c79c3e965c8946"); + m.insert((1, 16, 8), "sha256:6d69db7b2a7da2e0443508c1bc7fab7789d268b9b6746932bf6bb86da48f1314"); + m.insert((1, 16, 9), "sha256:a7f6bde7a69eed0602e02d86e689010b11105b49f9ccc7f78cad8711ac3a6a3a"); + m.insert((1, 16, 10), "sha256:e8f9558d14448350ab5af424382d19d6814f6f623cf9f13ec9a940dffe59d4f4"); + m.insert((1, 16, 11), "sha256:8b8e7f56736491fe888685f2c2cb607b7ca3e6775bf41811a2eb100ba70ec2be"); + m.insert((1, 16, 12), "sha256:b97a5d04f867faea8bc1efc0dfc48474eac5ff88e1b22160f6a56d7258d26035"); + m.insert((1, 16, 13), "sha256:d02d90d19a84bf75d9e3542b113af9955135f3da376ebcdcc190ca5c4f9ee6d2"); + m.insert((1, 16, 14), "sha256:2fbc2b966c9088478bb2d911c16cc836cbec05cb618e30b17891577452233135"); + m.insert((1, 16, 15), "sha256:bf11d0758709a0bd9c2bf92ce6f00eea32111c8de12506ee51c8ef5c0ef5f73a"); + m.insert((1, 16, 16), "sha256:7d6d002ecb7555d97c72189640129f1d1c51c348636da6f3292ebfcafb31e58d"); + m.insert((1, 16, 17), "sha256:7a2cd1dd224f9ec6a40eaf63958db4fe5702941130080ea2711e340fa94bb6ae"); + m.insert((1, 16, 18), "sha256:f51505ae36d2c76556a87d6f97e048834ea75722bd4be16cc4ec703df4901f5b"); + m.insert((1, 16, 19), "sha256:2cce04e54fb555610d6f4faa5ad2554bbcde089eda9a95d6c098cb22e97092a6"); + m.insert((1, 16, 20), "sha256:ff17d659188c8becc7d4ed3334857de7d085d0c62cef146771b9f02dc5128ced"); + m.insert((1, 16, 21), "sha256:751eb94541383ae941f97c24f1231f1c2d09a1736bb7f3d0ec5b4b8f67d78d1d"); + m.insert((1, 16, 22), "sha256:7579635d65afa2b6f71572f1b7f6a7edecf40462d655c744255b621d46937222"); + m.insert((1, 16, 23), "sha256:f65501333dbbb76214b4b26b767b47d753ed5161b7b5d88c1c0bd550990cf813"); + m.insert((1, 16, 24), "sha256:fca7381626548d1abcf3dede5d16c9cf02e3e9c2f4d75d95ce8c45fea99cd750"); + m.insert((1, 16, 25), "sha256:4c44fadec627d889849823637c0684956897e739dfb4dc8c1ce77f62fcb0c91f"); + m.insert((1, 16, 26), "sha256:3ded13fc6debb6ac2459a5b208483d4bea8915f023d63cbb4c19219654f9838d"); + m.insert((1, 16, 27), "sha256:a3f8836807e84dce3a33f9c791379f6c71729388ac450d88201a03cd7c123702"); + m.insert((1, 17, 0), "sha256:312dabb455aa4408ede17e7b054c9f08a83fbbfa29b5f6cb7c07e500ac76f32a"); + m.insert((1, 17, 1), "sha256:529673d48d37ac5d466d6e0e9c3d7fce227c7de361442526f3439c948252ba48"); m.insert((1, 17, 2), "sha256:fd6432ce7ed2dedc010849812ac5313b5c8ca96cb03997ff172e8ce6e6e6528d"); m.insert((1, 17, 3), "sha256:21ae71f2456ae8fd318cf8738a309b6c40cac8f5c2b65dd9a78a702d5f0f017a"); m.insert((1, 17, 4), "sha256:6ae28a12ea924912f171d8817bd6ba1ea3ee668fa53f759789bcdb10b0ae13b5"); @@ -13,11 +44,25 @@ lazy_static! { m.insert((1, 17, 7), "sha256:6de36afeaab277dcf2de8b7c04abb2093bbf50cb4ccdb59df4bfd97b16f8bbe7"); m.insert((1, 17, 8), "sha256:3a129b5e5851b0a25ad7a24a96f4d82fdfd6a616a4f69a94bec1a65cb6dfae93"); m.insert((1, 17, 9), "sha256:2bacdd91d2aba692fb3c917f6a6ac78bbf034ca2ac2e65be5a3c6689e5997356"); + m.insert((1, 17, 10), "sha256:f6c5e8048c5429259856dcf5708fb90e8e0ca492ea2e7d8286793c61c4d6fa0d"); + m.insert((1, 17, 11), "sha256:49e379af197636e336bfb173d904eb25ebe613a82cd97a60f46233573041f272"); + m.insert((1, 17, 12), "sha256:0889207f369a909278bd51d8286565b8c0757e9753ca71ef1208356ac6c077bf"); + m.insert((1, 17, 13), "sha256:280dc3af1921c4c5536222def0c18e25add520bd786d697aed85072a509c65c7"); + m.insert((1, 17, 14), "sha256:c4abbd449681e4e94814694ca99cb243b1f0d2a2ff69bbc228cf6c7f75408404"); + m.insert((1, 17, 15), "sha256:76fd92555fbefa924151b14da5a64f2ffe054acd0ec0eedf15832a8b6eb02133"); + m.insert((1, 17, 16), "sha256:4372ca4534609b7e9567f7a62845f91630d702262135be86795c9561e1b41fc6"); + m.insert((1, 17, 17), "sha256:646d1fbd5da7d7ca582bacada78a6cd72c8ac956bca7688ecca337f782071914"); + m.insert((1, 17, 18), "sha256:50da0a4c6873e1c5a124cda7efd1c88c18251c69f5be4cc467408e1edada1f1c"); + m.insert((1, 17, 19), "sha256:3d0cff17566b8e1e0fa340d50312f75143946ee972c1cccd098184bd7e3ac58e"); + m.insert((1, 17, 20), "sha256:113a3679aca8ba9fabf0a4a51f05dd9877631ba133750a2f5a328b056091114c"); m.insert((1, 17, 21), "sha256:e1ed7846431d018f4ffe512afd67f247622e9a016927163cfc46c5cd4e49fa97"); + m.insert((1, 17, 22), "sha256:fd66933f9fcb4573f24ccfb3ad9bbdd265e512884afebd02ed1ff5a4e1cf96bb"); m.insert((1, 17, 23), "sha256:ddafe215050a3a727a72aef87543a914ddb84329e72d1a7e8698fa1db2a8c6e2"); + m.insert((1, 17, 24), "sha256:2b312752269b31119bf250f18b947569b8282b5e86c9a33f106299e92f68d0ff"); m.insert((1, 17, 25), "sha256:0ba63bb51937bfcdf64bedf339b04c2ab00011bc67bad9044bc27ef78e95fffb"); m.insert((1, 17, 26), "sha256:30709e6d35a44a4627a3e67840489174490a0e40560c290440e5500da2acd3f5"); m.insert((1, 17, 27), "sha256:e32b0cda187d5fcf273781535e991987e232cb2311595f110dc31d07da749134"); + m.insert((1, 17, 28), "sha256:8a89b26f86eb7fe881e0db3b05b77243ec27efce6de6b37b3f181def9a04c45d"); m.insert((1, 17, 29), "sha256:3d66e8747afa3a6e4257cb520c85dd005af34c054fab40b596ab7bfeef02ab9a"); m.insert((1, 17, 30), "sha256:216d9efd4b0a26b70c1081ee802445c6917e6683be3bc92cbb94e1bca1144418"); m.insert((1, 17, 31), "sha256:29a9f6ee487c9047687e378fde476cdcd49564736e1128bfcb9d71e9c4720d15"); diff --git a/update_image_whitelist.py b/update_image_whitelist.py index 9d9a94e..00cf2a0 100644 --- a/update_image_whitelist.py +++ b/update_image_whitelist.py @@ -7,6 +7,29 @@ use_ghcr = os.environ.get('USE_GHCR', 'false').lower() == 'true' headers = {'Authorization': f'Bearer {github_token}'} +def fetch_all_tags(repository): + """Fetches all tags for a given Docker Hub repository across all pages.""" + url = f"https://hub.docker.com/v2/repositories/{repository}/tags/" + all_tags = [] + page = 1 + page_size = 100 # Maximum page size Docker Hub allows + + while True: + response = requests.get(url, params={"page": page, "page_size": page_size}) + if response.status_code != 200: + raise Exception(f"Failed to get Docker images: {response.status_code} {response.text}") + + response_data = response.json() + + all_tags.extend(response_data.get("results", [])) + print(f"Fetched page {page} with {len(response_data.get('results', []))} tags.") + + if not response_data.get("next"): + break + page += 1 + + return all_tags + if use_ghcr: response = requests.get( "https://api.github.com/users/ngundotra/packages/container/solana/versions?per_page=100", @@ -16,20 +39,8 @@ raise Exception(f"Failed to get Docker images: {response.status_code} {response.text}") results = response.json() else: - # response = requests.get( - # "https://hub.docker.com/v2/namespaces/ellipsislabs/repositories/solana/tags?page_size=1000" - # ) - # if response.status_code != 200: - # raise Exception(f"Failed to get Docker images: {response.status_code} {response.text}") - # results = response.json()["results"] - - sfResponse = requests.get( - "https://hub.docker.com/v2/namespaces/solanafoundation/repositories/solana-verifiable-build/tags?page_size=1000" - ) - results = sfResponse.json()["results"] - if sfResponse.status_code != 200: - raise Exception(f"Failed to get Docker images: {sfResponse.status_code} {sfResponse.text}") - results = sfResponse.json()["results"] + results + repository = "solanafoundation/solana-verifiable-build" + results = fetch_all_tags(repository) digest_map = {} for result in results: @@ -45,34 +56,15 @@ digest_map[(major, minor, patch)] = result["name"] # "name" contains the digest for GHCR break else: - if result["name"] != "latest": - try: - major, minor, patch = list(map(int, result["name"].split("."))) - digest_map[(major, minor, patch)] = result["digest"] - except Exception as e: - print(e) - continue -for result in results: - if use_ghcr: - # For GHCR, extract version from metadata - metadata = result.get("metadata", {}) - container = metadata.get("container", {}) - tags = container.get("tags", []) - for tag in tags: - match = re.match(r'(\d+)\.(\d+)\.(\d+)', tag) + tag_name = result["name"] + if tag_name != "latest": + match = re.match(r'^(\d+)\.(\d+)\.(\d+)$', tag_name) if match: - major, minor, patch = map(int, match.groups()) - digest_map[(major, minor, patch)] = result["name"] # "name" contains the digest for GHCR - break - else: - if result["name"] != "latest": - try: - major, minor, patch = list(map(int, result["name"].split("."))) - digest_map[(major, minor, patch)] = result["digest"] - except Exception as e: - print(e) - continue - + try: + major, minor, patch = map(int, match.groups()) + digest_map[(major, minor, patch)] = result["digest"] + except ValueError as e: + print(f"Skipping invalid version tag '{tag_name}': {e}") entries = [] for k, v in sorted(digest_map.items()): From a0e35270f73ed712df546c41fa38ae2762a48000 Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Mon, 4 Nov 2024 23:07:53 +0100 Subject: [PATCH 252/314] Update v1.14.10.Dockerfile --- docker/v1.14.10.Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/v1.14.10.Dockerfile b/docker/v1.14.10.Dockerfile index 9da5c6f..cd0a8c3 100644 --- a/docker/v1.14.10.Dockerfile +++ b/docker/v1.14.10.Dockerfile @@ -6,3 +6,4 @@ ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash + From bb44148cc29f57c84aca8547bbd25ebb5309b18f Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Tue, 5 Nov 2024 13:16:07 +0100 Subject: [PATCH 253/314] Use 1.18 installer for old 14 version --- docker/v1.14.10.Dockerfile | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/docker/v1.14.10.Dockerfile b/docker/v1.14.10.Dockerfile index cd0a8c3..626737f 100644 --- a/docker/v1.14.10.Dockerfile +++ b/docker/v1.14.10.Dockerfile @@ -1,9 +1,19 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.10/install)" +# Install required packages +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Set desired Solana version +ARG SOLANA_VERSION="v1.14.10" + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=$SOLANA_VERSION/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build +WORKDIR /build CMD /bin/bash - From 54c3d9cdbc742e87d7e37815621ef6464fbd4c75 Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Tue, 5 Nov 2024 14:13:27 +0100 Subject: [PATCH 254/314] Add 1.14 releases --- docker/v1.14.0.Dockerfile | 12 +++++-- docker/v1.14.1.Dockerfile | 12 +++++-- docker/v1.14.10.Dockerfile | 7 +--- docker/v1.14.11.Dockerfile | 12 +++++-- docker/v1.14.12.Dockerfile | 12 +++++-- docker/v1.14.13.Dockerfile | 12 +++++-- docker/v1.14.14.Dockerfile | 12 +++++-- docker/v1.14.15.Dockerfile | 12 +++++-- docker/v1.14.16.Dockerfile | 12 +++++-- docker/v1.14.17.Dockerfile | 12 +++++-- docker/v1.14.18.Dockerfile | 12 +++++-- docker/v1.14.19.Dockerfile | 12 +++++-- docker/v1.14.2.Dockerfile | 12 +++++-- docker/v1.14.20.Dockerfile | 12 +++++-- docker/v1.14.21.Dockerfile | 12 +++++-- docker/v1.14.22.Dockerfile | 12 +++++-- docker/v1.14.23.Dockerfile | 12 +++++-- docker/v1.14.24.Dockerfile | 12 +++++-- docker/v1.14.25.Dockerfile | 12 +++++-- docker/v1.14.26.Dockerfile | 12 +++++-- docker/v1.14.27.Dockerfile | 12 +++++-- docker/v1.14.28.Dockerfile | 12 +++++-- docker/v1.14.29.Dockerfile | 12 +++++-- docker/v1.14.3.Dockerfile | 12 +++++-- docker/v1.14.4.Dockerfile | 12 +++++-- docker/v1.14.5.Dockerfile | 12 +++++-- docker/v1.14.6.Dockerfile | 12 +++++-- docker/v1.14.7.Dockerfile | 12 +++++-- docker/v1.14.8.Dockerfile | 12 +++++-- docker/v1.14.9.Dockerfile | 12 +++++-- docker/v1.16.27.Dockerfile | 1 - generate_dockerfiles.py | 67 +++++++++++++++++++++++++++++++------- src/image_config.rs | 1 + 33 files changed, 319 insertions(+), 105 deletions(-) diff --git a/docker/v1.14.0.Dockerfile b/docker/v1.14.0.Dockerfile index 4747b6a..594c94d 100644 --- a/docker/v1.14.0.Dockerfile +++ b/docker/v1.14.0.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.0/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.0/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.1.Dockerfile b/docker/v1.14.1.Dockerfile index ded722d..1787fc9 100644 --- a/docker/v1.14.1.Dockerfile +++ b/docker/v1.14.1.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.1/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.1/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.10.Dockerfile b/docker/v1.14.10.Dockerfile index 626737f..671fed4 100644 --- a/docker/v1.14.10.Dockerfile +++ b/docker/v1.14.10.Dockerfile @@ -1,19 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -# Install required packages RUN apt-get update && apt-get install -qy git gnutls-bin curl -# Set desired Solana version -ARG SOLANA_VERSION="v1.14.10" - # Download and modify the Solana install script to install the specified version RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ chmod +x solana_install.sh && \ - sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=$SOLANA_VERSION/" solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.10/" solana_install.sh && \ ./solana_install.sh && \ rm solana_install.sh ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" - WORKDIR /build CMD /bin/bash diff --git a/docker/v1.14.11.Dockerfile b/docker/v1.14.11.Dockerfile index 5b16d65..17302b4 100644 --- a/docker/v1.14.11.Dockerfile +++ b/docker/v1.14.11.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.11/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.11/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.12.Dockerfile b/docker/v1.14.12.Dockerfile index 62b6bb1..f248825 100644 --- a/docker/v1.14.12.Dockerfile +++ b/docker/v1.14.12.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.12/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.12/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.13.Dockerfile b/docker/v1.14.13.Dockerfile index 4c5f406..fa5e7f4 100644 --- a/docker/v1.14.13.Dockerfile +++ b/docker/v1.14.13.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.13/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.13/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.14.Dockerfile b/docker/v1.14.14.Dockerfile index 39a8722..1309b7c 100644 --- a/docker/v1.14.14.Dockerfile +++ b/docker/v1.14.14.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.14/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.14/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.15.Dockerfile b/docker/v1.14.15.Dockerfile index bb4da27..77d1d0e 100644 --- a/docker/v1.14.15.Dockerfile +++ b/docker/v1.14.15.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.15/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.15/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.16.Dockerfile b/docker/v1.14.16.Dockerfile index 69610aa..3b469e1 100644 --- a/docker/v1.14.16.Dockerfile +++ b/docker/v1.14.16.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.16/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.16/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.17.Dockerfile b/docker/v1.14.17.Dockerfile index 89c7aa1..6b2c0f8 100644 --- a/docker/v1.14.17.Dockerfile +++ b/docker/v1.14.17.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.17/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.17/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.18.Dockerfile b/docker/v1.14.18.Dockerfile index 90e7221..0babe77 100644 --- a/docker/v1.14.18.Dockerfile +++ b/docker/v1.14.18.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.18/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.18/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.19.Dockerfile b/docker/v1.14.19.Dockerfile index 4bbaf1d..8c53328 100644 --- a/docker/v1.14.19.Dockerfile +++ b/docker/v1.14.19.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.19/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.19/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.2.Dockerfile b/docker/v1.14.2.Dockerfile index ee2ca98..81fe06b 100644 --- a/docker/v1.14.2.Dockerfile +++ b/docker/v1.14.2.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.2/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.2/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.20.Dockerfile b/docker/v1.14.20.Dockerfile index f1a44b0..62042c1 100644 --- a/docker/v1.14.20.Dockerfile +++ b/docker/v1.14.20.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.20/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.20/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.21.Dockerfile b/docker/v1.14.21.Dockerfile index bc576a8..4547de1 100644 --- a/docker/v1.14.21.Dockerfile +++ b/docker/v1.14.21.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.21/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.21/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.22.Dockerfile b/docker/v1.14.22.Dockerfile index 19b4fec..50d9352 100644 --- a/docker/v1.14.22.Dockerfile +++ b/docker/v1.14.22.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.22/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.22/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.23.Dockerfile b/docker/v1.14.23.Dockerfile index d1b8dd2..d247516 100644 --- a/docker/v1.14.23.Dockerfile +++ b/docker/v1.14.23.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.23/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.23/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.24.Dockerfile b/docker/v1.14.24.Dockerfile index 970ee55..0d6c7bf 100644 --- a/docker/v1.14.24.Dockerfile +++ b/docker/v1.14.24.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.24/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.24/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.25.Dockerfile b/docker/v1.14.25.Dockerfile index e1c35eb..3ade3ab 100644 --- a/docker/v1.14.25.Dockerfile +++ b/docker/v1.14.25.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.25/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.25/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.26.Dockerfile b/docker/v1.14.26.Dockerfile index b3d8786..173f25d 100644 --- a/docker/v1.14.26.Dockerfile +++ b/docker/v1.14.26.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.26/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.26/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.27.Dockerfile b/docker/v1.14.27.Dockerfile index 21eb082..6fab2c3 100644 --- a/docker/v1.14.27.Dockerfile +++ b/docker/v1.14.27.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.27/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.27/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.28.Dockerfile b/docker/v1.14.28.Dockerfile index 8b52425..dadef16 100644 --- a/docker/v1.14.28.Dockerfile +++ b/docker/v1.14.28.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.28/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.28/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.29.Dockerfile b/docker/v1.14.29.Dockerfile index e899028..06c0a9b 100644 --- a/docker/v1.14.29.Dockerfile +++ b/docker/v1.14.29.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.29/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.29/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.3.Dockerfile b/docker/v1.14.3.Dockerfile index 4bab5a7..efcdbe7 100644 --- a/docker/v1.14.3.Dockerfile +++ b/docker/v1.14.3.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.3/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.3/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.4.Dockerfile b/docker/v1.14.4.Dockerfile index 66dc294..6c96339 100644 --- a/docker/v1.14.4.Dockerfile +++ b/docker/v1.14.4.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.4/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.4/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.5.Dockerfile b/docker/v1.14.5.Dockerfile index 0b91e9b..e65aa14 100644 --- a/docker/v1.14.5.Dockerfile +++ b/docker/v1.14.5.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.5/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.5/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.6.Dockerfile b/docker/v1.14.6.Dockerfile index 191664d..6c14441 100644 --- a/docker/v1.14.6.Dockerfile +++ b/docker/v1.14.6.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.6/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.6/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.7.Dockerfile b/docker/v1.14.7.Dockerfile index cd1548e..c67eb4d 100644 --- a/docker/v1.14.7.Dockerfile +++ b/docker/v1.14.7.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.7/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.7/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.8.Dockerfile b/docker/v1.14.8.Dockerfile index 315646a..f83b15e 100644 --- a/docker/v1.14.8.Dockerfile +++ b/docker/v1.14.8.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.8/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.8/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.14.9.Dockerfile b/docker/v1.14.9.Dockerfile index 2410937..5aa4c60 100644 --- a/docker/v1.14.9.Dockerfile +++ b/docker/v1.14.9.Dockerfile @@ -1,8 +1,14 @@ FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 -RUN apt-get update && apt-get install -qy git gnutls-bin -RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.9/install)" +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.9/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build - CMD /bin/bash diff --git a/docker/v1.16.27.Dockerfile b/docker/v1.16.27.Dockerfile index 5375158..277a476 100644 --- a/docker/v1.16.27.Dockerfile +++ b/docker/v1.16.27.Dockerfile @@ -6,4 +6,3 @@ ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" WORKDIR /build CMD /bin/bash - diff --git a/generate_dockerfiles.py b/generate_dockerfiles.py index 2024a12..ec83113 100644 --- a/generate_dockerfiles.py +++ b/generate_dockerfiles.py @@ -3,6 +3,7 @@ import argparse import requests import tomllib +import re parser = argparse.ArgumentParser() parser.add_argument("--upload", action="store_true") @@ -19,7 +20,7 @@ SOLANA_VERSION_PLACEHOLDER = "$SOLANA_VERSION" AGAVE_VERSION_PLACEHOLDER = "$AGAVE_VERSION" -# Dockerfile template for Solana +# Dockerfile template for Solana versions >= 1.15 base_dockerfile_sol = f""" FROM --platform=linux/amd64 rust@{RUST_VERSION_PLACEHOLDER} @@ -31,6 +32,24 @@ CMD /bin/bash """ +# Dockerfile template for Solana versions < 1.15 +base_dockerfile_sol_pre15 = f""" +FROM --platform=linux/amd64 rust@{RUST_VERSION_PLACEHOLDER} + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \\ + chmod +x solana_install.sh && \\ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS={SOLANA_VERSION_PLACEHOLDER}/" solana_install.sh && \\ + ./solana_install.sh && \\ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash +""" + # Dockerfile template for Agave base_dockerfile_agave = f""" FROM --platform=linux/amd64 rust@{RUST_VERSION_PLACEHOLDER} @@ -49,22 +68,37 @@ def get_release_info(version_tag): Determines if a version is a Solana or Agave release and provides relevant info. Returns a dictionary with base_dockerfile_text, version_placeholder, and the URL for the toolchain. """ - # Filter out non-numeric tags version_parts = version_tag.strip("v").split(".") if not all(part.isdigit() for part in version_parts): print(f"Skipping non-numeric tag: {version_tag}") return None - # Convert parts to integers major, minor, patch = map(int, version_parts) - if (major == 1 and minor >= 14 and minor != 15) and not (minor == 18 and patch >= 24): + # Filter out v1.15.x releases + if major == 1 and minor == 15: + print(f"Skipping yanked v1.15.x release: {version_tag}") + return None + + if major == 1 and minor < 10: + print(f"Skipping all releases before 10 release: {version_tag}") + return None + + # All releases 14 and below have a broken installer, so we need to use a custom script with a newer installer + if (major == 1 and minor < 15): + release_info = { + "base_dockerfile_text": base_dockerfile_sol_pre15, + "version_placeholder": SOLANA_VERSION_PLACEHOLDER, + "url": f"https://raw.githubusercontent.com/solana-labs/solana/{version_tag}/rust-toolchain.toml" + } + # Everything from 1.15.0 to 1.18.24 we want to get from solana labs + elif (major == 1 and minor >= 15) and not (minor == 18 and patch >= 24): release_info = { "base_dockerfile_text": base_dockerfile_sol, "version_placeholder": SOLANA_VERSION_PLACEHOLDER, "url": f"https://raw.githubusercontent.com/solana-labs/solana/{version_tag}/rust-toolchain.toml" } - # Check if it's an Agave release + #Everything after we need to get from anza elif (major == 1 and minor == 18 and patch >= 24) or major >= 2: release_info = { "base_dockerfile_text": base_dockerfile_agave, @@ -102,7 +136,6 @@ def get_agave_releases(): # Function to get Rust toolchain for each release def get_toolchain(version_tag): - # Special case for v1.14 if "v1.14" in version_tag: return "1.68.0" @@ -116,6 +149,21 @@ def get_toolchain(version_tag): parsed_data = tomllib.loads(response.text) return parsed_data["toolchain"]["channel"] print(f"Failed to fetch rust-toolchain.toml for {version_tag}") + # Fallback to rust-version.ci for older versions + print(f"Attempting to retrieve Rust version from rust-version.ci for {version_tag}") + return get_rust_version_from_ci(version_tag) + +def get_rust_version_from_ci(version_tag): + url = f"https://raw.githubusercontent.com/solana-labs/solana/{version_tag}/ci/rust-version.sh" + response = requests.get(url) + if response.status_code == 200: + match = re.search(r'stable_version=(\d+\.\d+\.\d+)', response.text) + if match: + return match.group(1) + else: + print(f"No stable Rust version found in {version_tag}") + else: + print(f"Failed to fetch rust-version.sh for {version_tag}") return None # Process releases and generate Dockerfiles @@ -123,7 +171,7 @@ def process_releases(releases): for release in releases: release_info = get_release_info(release) if release_info is None: - continue # Skip non-numeric tags + continue base_dockerfile_text = release_info["base_dockerfile_text"] version_placeholder = release_info["version_placeholder"] @@ -131,12 +179,10 @@ def process_releases(releases): rust_version = get_toolchain(release) print(f"Generating Dockerfile for {release} with Rust version {rust_version}") - # Skip if rust_version is None to avoid KeyError if rust_version is None: print(f"Skipping {release} due to missing Rust version.") continue - # Ensure Rust image hash is available if rust_version not in RUST_DOCKER_IMAGESHA_MAP and rust_version != "1.68.0": response = requests.get( f"https://hub.docker.com/v2/namespaces/library/repositories/rust/tags/{rust_version}" @@ -150,14 +196,12 @@ def process_releases(releases): print(f"Failed to fetch Rust image for {rust_version}") continue - # Replace placeholders in the Dockerfile template dockerfile = base_dockerfile_text.replace( version_placeholder, release ).replace( RUST_VERSION_PLACEHOLDER, RUST_DOCKER_IMAGESHA_MAP[rust_version] ).lstrip("\n") - # Write the Dockerfile to disk path = f"docker/{release}.Dockerfile" if os.path.exists(path): with open(path, "r") as f: @@ -181,6 +225,7 @@ def process_releases(releases): print(RUST_DOCKER_IMAGESHA_MAP) + digest_set = set() if not args.skip_cache: print("Fetching existing images") diff --git a/src/image_config.rs b/src/image_config.rs index a31a55c..6ce2719 100644 --- a/src/image_config.rs +++ b/src/image_config.rs @@ -6,6 +6,7 @@ lazy_static! { pub static ref IMAGE_MAP: BTreeMap<(u32, u32, u32), &'static str> = { let mut m = BTreeMap::new(); m.insert((1, 14, 9), "sha256:073eb70e7fa3be8c7d7809e03bdedcf7ddd8744c8004921151c7b1c19fe760fd"); + m.insert((1, 14, 10), "sha256:65d8d4ee9391058ae9079e7d2f4012bf5db92b80c1308160a7dac0d889c27c85"); m.insert((1, 16, 0), "sha256:9704a8134ab8f71d60393058f54014d68171935778168dae4f177d4b5048eee9"); m.insert((1, 16, 1), "sha256:f8f9f6ab171cddecf6ca9edfbc2f8832ca40a39d32d1d6d6675480c973e6ddb2"); m.insert((1, 16, 2), "sha256:3d7bfe90102c93a4e8485ff81f9c8bca7902408195dd469ce39d0d8fb0d83431"); From 944719887797ff8f2f00044093287c8425c6edfb Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Tue, 5 Nov 2024 14:31:41 +0100 Subject: [PATCH 255/314] Skip release 1.14.0 --- docker/v1.14.0.Dockerfile | 14 -------------- generate_dockerfiles.py | 6 +++++- 2 files changed, 5 insertions(+), 15 deletions(-) delete mode 100644 docker/v1.14.0.Dockerfile diff --git a/docker/v1.14.0.Dockerfile b/docker/v1.14.0.Dockerfile deleted file mode 100644 index 594c94d..0000000 --- a/docker/v1.14.0.Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 - -RUN apt-get update && apt-get install -qy git gnutls-bin curl - -# Download and modify the Solana install script to install the specified version -RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ - chmod +x solana_install.sh && \ - sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.0/" solana_install.sh && \ - ./solana_install.sh && \ - rm solana_install.sh - -ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" -WORKDIR /build -CMD /bin/bash diff --git a/generate_dockerfiles.py b/generate_dockerfiles.py index ec83113..c605756 100644 --- a/generate_dockerfiles.py +++ b/generate_dockerfiles.py @@ -79,7 +79,11 @@ def get_release_info(version_tag): if major == 1 and minor == 15: print(f"Skipping yanked v1.15.x release: {version_tag}") return None - + + if major == 1 and minor == 14 and patch == 0: + print(f"Skipping yanked v1.14.0 release: {version_tag}") + return None + if major == 1 and minor < 10: print(f"Skipping all releases before 10 release: {version_tag}") return None From bd46c4b43475eec262896e3fb1f760cbd10c7a41 Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Tue, 5 Nov 2024 16:53:57 +0100 Subject: [PATCH 256/314] Add releases 10-13 --- docker/v1.10.1.Dockerfile | 14 ++++++++++++++ docker/v1.10.10.Dockerfile | 14 ++++++++++++++ docker/v1.10.11.Dockerfile | 14 ++++++++++++++ docker/v1.10.12.Dockerfile | 14 ++++++++++++++ docker/v1.10.13.Dockerfile | 14 ++++++++++++++ docker/v1.10.14.Dockerfile | 14 ++++++++++++++ docker/v1.10.15.Dockerfile | 14 ++++++++++++++ docker/v1.10.17.Dockerfile | 14 ++++++++++++++ docker/v1.10.19.Dockerfile | 14 ++++++++++++++ docker/v1.10.2.Dockerfile | 14 ++++++++++++++ docker/v1.10.20.Dockerfile | 14 ++++++++++++++ docker/v1.10.21.Dockerfile | 14 ++++++++++++++ docker/v1.10.22.Dockerfile | 14 ++++++++++++++ docker/v1.10.23.Dockerfile | 14 ++++++++++++++ docker/v1.10.24.Dockerfile | 14 ++++++++++++++ docker/v1.10.25.Dockerfile | 14 ++++++++++++++ docker/v1.10.26.Dockerfile | 14 ++++++++++++++ docker/v1.10.28.Dockerfile | 14 ++++++++++++++ docker/v1.10.29.Dockerfile | 14 ++++++++++++++ docker/v1.10.3.Dockerfile | 14 ++++++++++++++ docker/v1.10.30.Dockerfile | 14 ++++++++++++++ docker/v1.10.31.Dockerfile | 14 ++++++++++++++ docker/v1.10.32.Dockerfile | 14 ++++++++++++++ docker/v1.10.33.Dockerfile | 14 ++++++++++++++ docker/v1.10.34.Dockerfile | 14 ++++++++++++++ docker/v1.10.35.Dockerfile | 14 ++++++++++++++ docker/v1.10.38.Dockerfile | 14 ++++++++++++++ docker/v1.10.39.Dockerfile | 14 ++++++++++++++ docker/v1.10.4.Dockerfile | 14 ++++++++++++++ docker/v1.10.40.Dockerfile | 14 ++++++++++++++ docker/v1.10.41.Dockerfile | 14 ++++++++++++++ docker/v1.10.5.Dockerfile | 14 ++++++++++++++ docker/v1.10.6.Dockerfile | 14 ++++++++++++++ docker/v1.10.7.Dockerfile | 14 ++++++++++++++ docker/v1.10.8.Dockerfile | 14 ++++++++++++++ docker/v1.10.9.Dockerfile | 14 ++++++++++++++ docker/v1.11.0.Dockerfile | 14 ++++++++++++++ docker/v1.11.1.Dockerfile | 14 ++++++++++++++ docker/v1.11.10.Dockerfile | 14 ++++++++++++++ docker/v1.11.2.Dockerfile | 14 ++++++++++++++ docker/v1.11.3.Dockerfile | 14 ++++++++++++++ docker/v1.11.4.Dockerfile | 14 ++++++++++++++ docker/v1.11.5.Dockerfile | 14 ++++++++++++++ docker/v1.11.6.Dockerfile | 14 ++++++++++++++ docker/v1.13.1.Dockerfile | 14 ++++++++++++++ docker/v1.13.2.Dockerfile | 14 ++++++++++++++ docker/v1.13.3.Dockerfile | 14 ++++++++++++++ docker/v1.13.4.Dockerfile | 14 ++++++++++++++ docker/v1.13.5.Dockerfile | 14 ++++++++++++++ docker/v1.13.6.Dockerfile | 14 ++++++++++++++ docker/v1.13.7.Dockerfile | 14 ++++++++++++++ generate_dockerfiles.py | 13 ++++++++++--- 52 files changed, 724 insertions(+), 3 deletions(-) create mode 100644 docker/v1.10.1.Dockerfile create mode 100644 docker/v1.10.10.Dockerfile create mode 100644 docker/v1.10.11.Dockerfile create mode 100644 docker/v1.10.12.Dockerfile create mode 100644 docker/v1.10.13.Dockerfile create mode 100644 docker/v1.10.14.Dockerfile create mode 100644 docker/v1.10.15.Dockerfile create mode 100644 docker/v1.10.17.Dockerfile create mode 100644 docker/v1.10.19.Dockerfile create mode 100644 docker/v1.10.2.Dockerfile create mode 100644 docker/v1.10.20.Dockerfile create mode 100644 docker/v1.10.21.Dockerfile create mode 100644 docker/v1.10.22.Dockerfile create mode 100644 docker/v1.10.23.Dockerfile create mode 100644 docker/v1.10.24.Dockerfile create mode 100644 docker/v1.10.25.Dockerfile create mode 100644 docker/v1.10.26.Dockerfile create mode 100644 docker/v1.10.28.Dockerfile create mode 100644 docker/v1.10.29.Dockerfile create mode 100644 docker/v1.10.3.Dockerfile create mode 100644 docker/v1.10.30.Dockerfile create mode 100644 docker/v1.10.31.Dockerfile create mode 100644 docker/v1.10.32.Dockerfile create mode 100644 docker/v1.10.33.Dockerfile create mode 100644 docker/v1.10.34.Dockerfile create mode 100644 docker/v1.10.35.Dockerfile create mode 100644 docker/v1.10.38.Dockerfile create mode 100644 docker/v1.10.39.Dockerfile create mode 100644 docker/v1.10.4.Dockerfile create mode 100644 docker/v1.10.40.Dockerfile create mode 100644 docker/v1.10.41.Dockerfile create mode 100644 docker/v1.10.5.Dockerfile create mode 100644 docker/v1.10.6.Dockerfile create mode 100644 docker/v1.10.7.Dockerfile create mode 100644 docker/v1.10.8.Dockerfile create mode 100644 docker/v1.10.9.Dockerfile create mode 100644 docker/v1.11.0.Dockerfile create mode 100644 docker/v1.11.1.Dockerfile create mode 100644 docker/v1.11.10.Dockerfile create mode 100644 docker/v1.11.2.Dockerfile create mode 100644 docker/v1.11.3.Dockerfile create mode 100644 docker/v1.11.4.Dockerfile create mode 100644 docker/v1.11.5.Dockerfile create mode 100644 docker/v1.11.6.Dockerfile create mode 100644 docker/v1.13.1.Dockerfile create mode 100644 docker/v1.13.2.Dockerfile create mode 100644 docker/v1.13.3.Dockerfile create mode 100644 docker/v1.13.4.Dockerfile create mode 100644 docker/v1.13.5.Dockerfile create mode 100644 docker/v1.13.6.Dockerfile create mode 100644 docker/v1.13.7.Dockerfile diff --git a/docker/v1.10.1.Dockerfile b/docker/v1.10.1.Dockerfile new file mode 100644 index 0000000..b14409d --- /dev/null +++ b/docker/v1.10.1.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.1/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.10.Dockerfile b/docker/v1.10.10.Dockerfile new file mode 100644 index 0000000..38c7609 --- /dev/null +++ b/docker/v1.10.10.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.10/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.11.Dockerfile b/docker/v1.10.11.Dockerfile new file mode 100644 index 0000000..5c23c11 --- /dev/null +++ b/docker/v1.10.11.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.11/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.12.Dockerfile b/docker/v1.10.12.Dockerfile new file mode 100644 index 0000000..80b82b0 --- /dev/null +++ b/docker/v1.10.12.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.12/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.13.Dockerfile b/docker/v1.10.13.Dockerfile new file mode 100644 index 0000000..c737897 --- /dev/null +++ b/docker/v1.10.13.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.13/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.14.Dockerfile b/docker/v1.10.14.Dockerfile new file mode 100644 index 0000000..599ce11 --- /dev/null +++ b/docker/v1.10.14.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.14/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.15.Dockerfile b/docker/v1.10.15.Dockerfile new file mode 100644 index 0000000..aa7d78c --- /dev/null +++ b/docker/v1.10.15.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.15/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.17.Dockerfile b/docker/v1.10.17.Dockerfile new file mode 100644 index 0000000..b51a9c8 --- /dev/null +++ b/docker/v1.10.17.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.17/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.19.Dockerfile b/docker/v1.10.19.Dockerfile new file mode 100644 index 0000000..ec0e904 --- /dev/null +++ b/docker/v1.10.19.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.19/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.2.Dockerfile b/docker/v1.10.2.Dockerfile new file mode 100644 index 0000000..098aaf8 --- /dev/null +++ b/docker/v1.10.2.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.2/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.20.Dockerfile b/docker/v1.10.20.Dockerfile new file mode 100644 index 0000000..e3c38f8 --- /dev/null +++ b/docker/v1.10.20.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.20/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.21.Dockerfile b/docker/v1.10.21.Dockerfile new file mode 100644 index 0000000..40ee372 --- /dev/null +++ b/docker/v1.10.21.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.21/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.22.Dockerfile b/docker/v1.10.22.Dockerfile new file mode 100644 index 0000000..ce89658 --- /dev/null +++ b/docker/v1.10.22.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.22/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.23.Dockerfile b/docker/v1.10.23.Dockerfile new file mode 100644 index 0000000..65befc1 --- /dev/null +++ b/docker/v1.10.23.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.23/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.24.Dockerfile b/docker/v1.10.24.Dockerfile new file mode 100644 index 0000000..28269bc --- /dev/null +++ b/docker/v1.10.24.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.24/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.25.Dockerfile b/docker/v1.10.25.Dockerfile new file mode 100644 index 0000000..2f5435d --- /dev/null +++ b/docker/v1.10.25.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.25/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.26.Dockerfile b/docker/v1.10.26.Dockerfile new file mode 100644 index 0000000..2a7edfe --- /dev/null +++ b/docker/v1.10.26.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.26/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.28.Dockerfile b/docker/v1.10.28.Dockerfile new file mode 100644 index 0000000..900da45 --- /dev/null +++ b/docker/v1.10.28.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.28/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.29.Dockerfile b/docker/v1.10.29.Dockerfile new file mode 100644 index 0000000..81fc1cf --- /dev/null +++ b/docker/v1.10.29.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.29/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.3.Dockerfile b/docker/v1.10.3.Dockerfile new file mode 100644 index 0000000..e277ef6 --- /dev/null +++ b/docker/v1.10.3.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.3/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.30.Dockerfile b/docker/v1.10.30.Dockerfile new file mode 100644 index 0000000..8fedace --- /dev/null +++ b/docker/v1.10.30.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.30/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.31.Dockerfile b/docker/v1.10.31.Dockerfile new file mode 100644 index 0000000..2d6ed9b --- /dev/null +++ b/docker/v1.10.31.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.31/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.32.Dockerfile b/docker/v1.10.32.Dockerfile new file mode 100644 index 0000000..2623537 --- /dev/null +++ b/docker/v1.10.32.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.32/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.33.Dockerfile b/docker/v1.10.33.Dockerfile new file mode 100644 index 0000000..a6bd694 --- /dev/null +++ b/docker/v1.10.33.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.33/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.34.Dockerfile b/docker/v1.10.34.Dockerfile new file mode 100644 index 0000000..89ae234 --- /dev/null +++ b/docker/v1.10.34.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.34/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.35.Dockerfile b/docker/v1.10.35.Dockerfile new file mode 100644 index 0000000..5c3c142 --- /dev/null +++ b/docker/v1.10.35.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.35/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.38.Dockerfile b/docker/v1.10.38.Dockerfile new file mode 100644 index 0000000..946171c --- /dev/null +++ b/docker/v1.10.38.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.38/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.39.Dockerfile b/docker/v1.10.39.Dockerfile new file mode 100644 index 0000000..1fb4374 --- /dev/null +++ b/docker/v1.10.39.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.39/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.4.Dockerfile b/docker/v1.10.4.Dockerfile new file mode 100644 index 0000000..b6a5452 --- /dev/null +++ b/docker/v1.10.4.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.4/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.40.Dockerfile b/docker/v1.10.40.Dockerfile new file mode 100644 index 0000000..98415ae --- /dev/null +++ b/docker/v1.10.40.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.40/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.41.Dockerfile b/docker/v1.10.41.Dockerfile new file mode 100644 index 0000000..5da2ed7 --- /dev/null +++ b/docker/v1.10.41.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.41/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.5.Dockerfile b/docker/v1.10.5.Dockerfile new file mode 100644 index 0000000..1f51145 --- /dev/null +++ b/docker/v1.10.5.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.5/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.6.Dockerfile b/docker/v1.10.6.Dockerfile new file mode 100644 index 0000000..4a8eadb --- /dev/null +++ b/docker/v1.10.6.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.6/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.7.Dockerfile b/docker/v1.10.7.Dockerfile new file mode 100644 index 0000000..24ba151 --- /dev/null +++ b/docker/v1.10.7.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.7/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.8.Dockerfile b/docker/v1.10.8.Dockerfile new file mode 100644 index 0000000..e18d0e6 --- /dev/null +++ b/docker/v1.10.8.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.8/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.9.Dockerfile b/docker/v1.10.9.Dockerfile new file mode 100644 index 0000000..e60360d --- /dev/null +++ b/docker/v1.10.9.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.9/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.11.0.Dockerfile b/docker/v1.11.0.Dockerfile new file mode 100644 index 0000000..860a7f7 --- /dev/null +++ b/docker/v1.11.0.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:9fe1f39bec70576e2bd568fafb194b2a532a6f2928bc0b951ac2c0a69a2be9fe + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.11.0/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.11.1.Dockerfile b/docker/v1.11.1.Dockerfile new file mode 100644 index 0000000..a61a44c --- /dev/null +++ b/docker/v1.11.1.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:9fe1f39bec70576e2bd568fafb194b2a532a6f2928bc0b951ac2c0a69a2be9fe + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.11.1/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.11.10.Dockerfile b/docker/v1.11.10.Dockerfile new file mode 100644 index 0000000..ed4d3a6 --- /dev/null +++ b/docker/v1.11.10.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:9fe1f39bec70576e2bd568fafb194b2a532a6f2928bc0b951ac2c0a69a2be9fe + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.11.10/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.11.2.Dockerfile b/docker/v1.11.2.Dockerfile new file mode 100644 index 0000000..cb3e86d --- /dev/null +++ b/docker/v1.11.2.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:9fe1f39bec70576e2bd568fafb194b2a532a6f2928bc0b951ac2c0a69a2be9fe + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.11.2/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.11.3.Dockerfile b/docker/v1.11.3.Dockerfile new file mode 100644 index 0000000..38cbc90 --- /dev/null +++ b/docker/v1.11.3.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:9fe1f39bec70576e2bd568fafb194b2a532a6f2928bc0b951ac2c0a69a2be9fe + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.11.3/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.11.4.Dockerfile b/docker/v1.11.4.Dockerfile new file mode 100644 index 0000000..524e33f --- /dev/null +++ b/docker/v1.11.4.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:9fe1f39bec70576e2bd568fafb194b2a532a6f2928bc0b951ac2c0a69a2be9fe + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.11.4/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.11.5.Dockerfile b/docker/v1.11.5.Dockerfile new file mode 100644 index 0000000..da5072e --- /dev/null +++ b/docker/v1.11.5.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:9fe1f39bec70576e2bd568fafb194b2a532a6f2928bc0b951ac2c0a69a2be9fe + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.11.5/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.11.6.Dockerfile b/docker/v1.11.6.Dockerfile new file mode 100644 index 0000000..ff55f35 --- /dev/null +++ b/docker/v1.11.6.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:9fe1f39bec70576e2bd568fafb194b2a532a6f2928bc0b951ac2c0a69a2be9fe + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.11.6/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.13.1.Dockerfile b/docker/v1.13.1.Dockerfile new file mode 100644 index 0000000..983019b --- /dev/null +++ b/docker/v1.13.1.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.13.1/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.13.2.Dockerfile b/docker/v1.13.2.Dockerfile new file mode 100644 index 0000000..4fe7a9a --- /dev/null +++ b/docker/v1.13.2.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.13.2/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.13.3.Dockerfile b/docker/v1.13.3.Dockerfile new file mode 100644 index 0000000..7aa5d66 --- /dev/null +++ b/docker/v1.13.3.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.13.3/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.13.4.Dockerfile b/docker/v1.13.4.Dockerfile new file mode 100644 index 0000000..333352d --- /dev/null +++ b/docker/v1.13.4.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.13.4/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.13.5.Dockerfile b/docker/v1.13.5.Dockerfile new file mode 100644 index 0000000..6311d34 --- /dev/null +++ b/docker/v1.13.5.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.13.5/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.13.6.Dockerfile b/docker/v1.13.6.Dockerfile new file mode 100644 index 0000000..98115d8 --- /dev/null +++ b/docker/v1.13.6.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.13.6/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.13.7.Dockerfile b/docker/v1.13.7.Dockerfile new file mode 100644 index 0000000..664a64a --- /dev/null +++ b/docker/v1.13.7.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.13.7/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/generate_dockerfiles.py b/generate_dockerfiles.py index c605756..c41bdf8 100644 --- a/generate_dockerfiles.py +++ b/generate_dockerfiles.py @@ -62,6 +62,13 @@ CMD /bin/bash """ +# Skipping these because the are not valid releases or where yanked +SKIPPED_VERSIONS = { + "v1.15", "v1.14.0", "v1.10.0", "v1.10.16", "v1.10.18", + "v1.10.27", "v1.10.36", "v1.10.37", "v1.11.7", "v1.11.8", "v1.11.9", + "v1.13.0", +} + # Determine release information for Solana or Agave def get_release_info(version_tag): """ @@ -75,15 +82,15 @@ def get_release_info(version_tag): major, minor, patch = map(int, version_parts) - # Filter out v1.15.x releases if major == 1 and minor == 15: print(f"Skipping yanked v1.15.x release: {version_tag}") return None - if major == 1 and minor == 14 and patch == 0: - print(f"Skipping yanked v1.14.0 release: {version_tag}") + if version_tag in SKIPPED_VERSIONS: + print(f"Skipping yanked release: {version_tag}") return None + # It would also be possible to generate more images for older versions but is it necessary? if major == 1 and minor < 10: print(f"Skipping all releases before 10 release: {version_tag}") return None From 2adccf981510cd3d3c969ab5444b329f1c66a074 Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Tue, 5 Nov 2024 17:20:50 +0100 Subject: [PATCH 257/314] Update image_config.rs --- src/image_config.rs | 84 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 81 insertions(+), 3 deletions(-) diff --git a/src/image_config.rs b/src/image_config.rs index 6ce2719..20a9ca2 100644 --- a/src/image_config.rs +++ b/src/image_config.rs @@ -5,8 +5,86 @@ use std::collections::BTreeMap; lazy_static! { pub static ref IMAGE_MAP: BTreeMap<(u32, u32, u32), &'static str> = { let mut m = BTreeMap::new(); - m.insert((1, 14, 9), "sha256:073eb70e7fa3be8c7d7809e03bdedcf7ddd8744c8004921151c7b1c19fe760fd"); - m.insert((1, 14, 10), "sha256:65d8d4ee9391058ae9079e7d2f4012bf5db92b80c1308160a7dac0d889c27c85"); + m.insert((1, 10, 1), "sha256:78d58e458d2455fde585d7530bdf46e0921d4473996a546953a8370f7c75fa0a"); + m.insert((1, 10, 2), "sha256:c2a7483771b4b817b9c33c426cd2306378b87c8988bbc8f18b2678888e8bb871"); + m.insert((1, 10, 3), "sha256:0dd11cd4da6e64cd5476214f326c2cf8cd72b701c08a8216143696ab4cc99790"); + m.insert((1, 10, 4), "sha256:919132adbdff0c7aa5d9f69b84d143c757e9a4473001729499be55a878f707ba"); + m.insert((1, 10, 5), "sha256:9d7ffa271af3339c90a0dfb9b6ef9814c7f4ce4207290d8a68f8a44b033948fc"); + m.insert((1, 10, 6), "sha256:7013788942a70864c56373f3284ad0e7f8198e74e5ea6242f9e9ea86349cd9b7"); + m.insert((1, 10, 7), "sha256:661c5585244901cf19efbf1f949332d0035e24b7c20e4543714041528231e7c6"); + m.insert((1, 10, 8), "sha256:0968ed050cb42b8d26efe909be74157bbf7b49641223fc83cc0fe043277d1e43"); + m.insert((1, 10, 9), "sha256:4b9ed938bd91a0351c249a763b1d95b5cec0d1fc5fb6f13d478e926e4f515a89"); + m.insert((1, 10, 10), "sha256:b29a1c669a201ec41dee7a92438e9aa8b8fdfa62f4417019a5f2b3a90f3f284d"); + m.insert((1, 10, 11), "sha256:e1b2bae976d3f450c1986fa78f0c57eb5b6df2038a7216f007c4b848b82e809e"); + m.insert((1, 10, 12), "sha256:e29ba153232cd185ac8a3af10c9adcd23f8545663d69dd577c28e90452e97606"); + m.insert((1, 10, 13), "sha256:6ce7bccefa38b109b21c2564667c21bf76fde7f26b7686cd021847423e1c45d3"); + m.insert((1, 10, 14), "sha256:d9b95469981a9f9a286544ae2d53db8d1288c1c7dce747dd12a78956c57ffe0b"); + m.insert((1, 10, 15), "sha256:1df6e20d8199383f0ec0dff015cb558fe3ef5eaff748a819593afd03355a4c45"); + m.insert((1, 10, 17), "sha256:c149ea5c659c728b97c32f06aacd12a18d910c0d75a179c42b96d497788154b6"); + m.insert((1, 10, 19), "sha256:a5c1429de067c331ad72b2ff7240046c3fa855e1321af506a21d8a2f6bc09cf1"); + m.insert((1, 10, 20), "sha256:67ccf12301a85a4ae86f754bfec29c1bc41d29c2f1f921a4095a5797e412ff2e"); + m.insert((1, 10, 21), "sha256:1c483669fc7a81325d65241585fbbfe5103fd7693a603f97ecdc7fd0ec1a9a55"); + m.insert((1, 10, 22), "sha256:94b9b62ea873fc3df71130fcadf3e33fc87eb02b6e70e82e322b206ba81024a3"); + m.insert((1, 10, 23), "sha256:7e3cd302cffa3a6f28417fa104e0f4a6b9ee3e2affdebba96e96758747e84e24"); + m.insert((1, 10, 24), "sha256:0a57e52107f8e340bb7c7a79b065fcd8d457386f104c8b6ee254df106117795e"); + m.insert((1, 10, 25), "sha256:f6136f17ac34a3332bca69714402335d7687df22ef38c1c6e4b0bd5f8b63c3e5"); + m.insert((1, 10, 26), "sha256:9c7b58d346ba74f18eba3eccea6b5b9778f6d6739ea7e70429aab6bc4f92dd71"); + m.insert((1, 10, 28), "sha256:73f42bbdadb544a5609c3b6a97821abd1b252164273dfebee83b18f077d3d173"); + m.insert((1, 10, 29), "sha256:06768f7230c38f2519d053147ffa9c10e13a07b68affdc3648843208053f92bb"); + m.insert((1, 10, 30), "sha256:f3050d21453c399936e9c974aacc91eebd96131018c556047297ac3f246909c9"); + m.insert((1, 10, 31), "sha256:1baea31b5d90fa8928a50f660865885a697dec741a6f9e9d8bcdae3846d63c43"); + m.insert((1, 10, 32), "sha256:936c1106bb5152fc3952c39b28c27f5b83fe296ed21dbeb4e9486d5d21fd8415"); + m.insert((1, 10, 33), "sha256:fc1a9f29c7eb7af880e7bc84754b39ec2c9cf09ec8e516a379d483cd8e84c8f7"); + m.insert((1, 10, 34), "sha256:b2f47b412693271b6e546ba67d7f0d6bd7284113d5d62f49c7441a8a933ed680"); + m.insert((1, 10, 35), "sha256:4d74e92253746321600a6a918a9eba4617d6da0140222c0e8de6dd3d91eb21fb"); + m.insert((1, 10, 38), "sha256:7ad5ce7410b68feca1dbae56d621ca59e37c72bb32b40b487af9d409ab200475"); + m.insert((1, 10, 39), "sha256:d50af3eda8761f8bf3e66002d9e01b41945f0cdaacf7da4bf4367f673db50dab"); + m.insert((1, 10, 40), "sha256:c6b672ecc201d2e3e3186b7200cd671c2a9ad509730854c797b36bfe295267c9"); + m.insert((1, 10, 41), "sha256:354f31e9c11fa2dafdd3872a730f6267fe9c360cc7c6dbc715ca1f250b5fbcc2"); + m.insert((1, 11, 0), "sha256:a0f1ab4f8c74850594a4f8f9b1ee291c24236aa722bf27a5bd54910284d4117c"); + m.insert((1, 11, 1), "sha256:89125323e21e3b65b08decebd088b6c13ee1191dab1e9441f772917bca1b05ef"); + m.insert((1, 11, 2), "sha256:499e948382785a26d212fe43844e1a0c27493567d6fde44040e59bda78fc7949"); + m.insert((1, 11, 3), "sha256:d7a953f28a674bcd02c6438421a03a843d4a80df77481196d895fe621d738a7e"); + m.insert((1, 11, 4), "sha256:27764f73719ddbbe572d857ea04641d5568ba6d9ac1a152acdae8cc1da1ca964"); + m.insert((1, 11, 5), "sha256:f6c2f54e499a88a1663ac49e927b779714cfdca323798d6ada7d3270db5952d5"); + m.insert((1, 11, 6), "sha256:5846acd614ddbb76a00a5f101f7c95d69019b1c51216eb4dfa7b9fb013bfb3e3"); + m.insert((1, 11, 10), "sha256:cd6a21f940a5029f318b0be930f83689cae028c305ebe033fa93ad86847ea18d"); + m.insert((1, 13, 1), "sha256:0b605e6a5af5a5cae560b392c1a62a65c1f6250b6a766cb15f978b6601f42d99"); + m.insert((1, 13, 2), "sha256:aecf5f578200f424d0ba8eae74bbbaa460cd310e354044f3e55872079dd9d7f2"); + m.insert((1, 13, 3), "sha256:2b1e446b407173afe9ebc56720d5f20ef265d40c88b878957b989080d8bf1604"); + m.insert((1, 13, 4), "sha256:019a0ac2b1cfc73a39087b4bab15d9ab20085e0be701adc069f81cbf5f60d748"); + m.insert((1, 13, 5), "sha256:8391f8cc96730b34e35a9d679d78f194c70bf4cc2d3d737eef68bb18af186820"); + m.insert((1, 13, 6), "sha256:7edf47a523294aa537c8e541ecc684f6247a020a1b41a41dd901e290d4206376"); + m.insert((1, 13, 7), "sha256:ff7be9d6bae396ea61dfa8678e02313aa6a0a6531f6e09f3e58d13cf15db33af"); + m.insert((1, 14, 1), "sha256:5f12fdd369f75a13e71c09599bb391abf9973ba546568a1074275117dcb4421e"); + m.insert((1, 14, 2), "sha256:5130ab2c8a3a891aa78b5859737ff35e27ea438ce7cb4601566043fbacadb706"); + m.insert((1, 14, 3), "sha256:f0fd946937f22ebb484c6650b4309d97645710e1c2f542d30a65a66944b68613"); + m.insert((1, 14, 4), "sha256:27605374d3f4e08aa261fef467a4993c966b80f55756935cc6ca0b82b50cacbb"); + m.insert((1, 14, 5), "sha256:4eca700040945a75612a7958098b7ede5b9f9df522c3568e25af087a71c06e8c"); + m.insert((1, 14, 6), "sha256:15b1713544a93f746788de8c55b2600e14ddb0232d5770541fae20f34d3946cf"); + m.insert((1, 14, 7), "sha256:7c760e94b106c15520d968310620a004a99c080fc0d74b7ce222c96ba35410c6"); + m.insert((1, 14, 8), "sha256:6416557b5826b162b992510300ad407be51ce70dbcd4a8457c6c1dcc9c42890e"); + m.insert((1, 14, 9), "sha256:cfe9f6c72a32ed2198da283cbdc6174e96596d6e89e1437bc7a5c494046f0df0"); + m.insert((1, 14, 10), "sha256:8c6277633c3df6d1f09bcdadb27b08f1946eb9fcd903303b08ee127df2434eb6"); + m.insert((1, 14, 11), "sha256:52bc658d94ba3d09888e54fc9078a51dc2cde5836b4683cf0ad75b530d2811b0"); + m.insert((1, 14, 12), "sha256:6fdf56b1ca5da6d662c66c7cf16f14798e66fb948db4efab7ffb6d2aa3bd840b"); + m.insert((1, 14, 13), "sha256:75e4a434d4fcde57cb7ca86cc4d1dd36d75be9f90104af766b3a033b5a8e0503"); + m.insert((1, 14, 14), "sha256:371b7688d173e1d67ebf868e56538e44e2f784d83c19f79516b241f730dee850"); + m.insert((1, 14, 15), "sha256:1c30eebfa6024cda4e370383077a84d9d9d8bfe7b8c21716624bba2c199c3dc1"); + m.insert((1, 14, 16), "sha256:72ae00776b62501ba82abba5735be4dc68d0cdfc57dc7ceeca3449564066e8c5"); + m.insert((1, 14, 17), "sha256:5f53b29a0bdbf78cf41521ff514c43c25d76b7cef5fb020b29bcbe1bece0f5d5"); + m.insert((1, 14, 18), "sha256:8b38ded7b11d7ec8d9d598c107ac46bd218efa2a0791f75ca4661dda683a9fd2"); + m.insert((1, 14, 19), "sha256:0b3b454930d7049246c8f2e2769696459247ef564a4c40e42f6c22d6465da3ad"); + m.insert((1, 14, 20), "sha256:5737e98cece056195be7b356dba802fa800d0bcad577cb99b4fae7d61937fc0f"); + m.insert((1, 14, 21), "sha256:e05d8b6eb6085f9183837bd26d0917040f9733f95cd9d032d430c03ec30a7d56"); + m.insert((1, 14, 22), "sha256:8557efd830501292b846504f12eb241c06f5cf976d5f700b3b4b74f74bdaaead"); + m.insert((1, 14, 23), "sha256:287f678e5f02ea0da4ee4ff771eaf27b32cd652af0979afa1c828abdab082c0e"); + m.insert((1, 14, 24), "sha256:b089349b1ad098eac053461941b6ca5421a93fb5d637a9f8465ec31c0f1b8a1e"); + m.insert((1, 14, 25), "sha256:fada5e8fcdcebd69f7f76dd3eb48c1349f8417eddf7bf320613e0a71df72b0b2"); + m.insert((1, 14, 26), "sha256:17c257d216cdecb639a47ae548f298a541d58404e83d7909d7846c547a335098"); + m.insert((1, 14, 27), "sha256:c343a8b1935ea7fc8f92ad9e67be5d0cda5b0b2720fb0387c98974116a466b88"); + m.insert((1, 14, 28), "sha256:bc50b7f1606f5ef63077667888860acc65e7fea0c6c60b28406358ea1b0b4b1a"); + m.insert((1, 14, 29), "sha256:9d0e04efd78e1b6744b575d9bb605196f3f91150640bfa142a7733cf37ff19ab"); m.insert((1, 16, 0), "sha256:9704a8134ab8f71d60393058f54014d68171935778168dae4f177d4b5048eee9"); m.insert((1, 16, 1), "sha256:f8f9f6ab171cddecf6ca9edfbc2f8832ca40a39d32d1d6d6675480c973e6ddb2"); m.insert((1, 16, 2), "sha256:3d7bfe90102c93a4e8485ff81f9c8bca7902408195dd469ce39d0d8fb0d83431"); @@ -34,7 +112,7 @@ lazy_static! { m.insert((1, 16, 24), "sha256:fca7381626548d1abcf3dede5d16c9cf02e3e9c2f4d75d95ce8c45fea99cd750"); m.insert((1, 16, 25), "sha256:4c44fadec627d889849823637c0684956897e739dfb4dc8c1ce77f62fcb0c91f"); m.insert((1, 16, 26), "sha256:3ded13fc6debb6ac2459a5b208483d4bea8915f023d63cbb4c19219654f9838d"); - m.insert((1, 16, 27), "sha256:a3f8836807e84dce3a33f9c791379f6c71729388ac450d88201a03cd7c123702"); + m.insert((1, 16, 27), "sha256:0d3837a88344aa69e221810d6f87083baf8c7727055562a6d76e02846b366040"); m.insert((1, 17, 0), "sha256:312dabb455aa4408ede17e7b054c9f08a83fbbfa29b5f6cb7c07e500ac76f32a"); m.insert((1, 17, 1), "sha256:529673d48d37ac5d466d6e0e9c3d7fce227c7de361442526f3439c948252ba48"); m.insert((1, 17, 2), "sha256:fd6432ce7ed2dedc010849812ac5313b5c8ca96cb03997ff172e8ce6e6e6528d"); From 1b5337efa2839846d35abc6c3abf12d2cb6fb3f2 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Fri, 8 Nov 2024 15:11:08 -0500 Subject: [PATCH 258/314] Update update_whitelist.yaml Signed-off-by: Noah Gundotra --- .github/workflows/update_whitelist.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update_whitelist.yaml b/.github/workflows/update_whitelist.yaml index e12cbcb..0108259 100644 --- a/.github/workflows/update_whitelist.yaml +++ b/.github/workflows/update_whitelist.yaml @@ -39,7 +39,7 @@ jobs: - name: Run generate_dockerfiles.py env: USE_GHCR: "true" - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }} run: uv run update_image_whitelist.py - name: Create Pull Request From e37701b943af509e979068f360b0ecfaff1e7642 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Fri, 8 Nov 2024 15:12:32 -0500 Subject: [PATCH 259/314] Update update_whitelist.yaml Signed-off-by: Noah Gundotra --- .github/workflows/update_whitelist.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update_whitelist.yaml b/.github/workflows/update_whitelist.yaml index e399853..c1a7f97 100644 --- a/.github/workflows/update_whitelist.yaml +++ b/.github/workflows/update_whitelist.yaml @@ -43,7 +43,7 @@ jobs: - name: Run generate_dockerfiles.py env: USE_GHCR: "true" - GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: uv run update_image_whitelist.py - name: Create Pull Request From 504d22daceec3033657310bd1614b2027bb19686 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Sat, 9 Nov 2024 07:04:56 -0500 Subject: [PATCH 260/314] Update publish_dockerfile.yaml Signed-off-by: Noah Gundotra --- .github/workflows/publish_dockerfile.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_dockerfile.yaml b/.github/workflows/publish_dockerfile.yaml index 6f17abe..68cca20 100644 --- a/.github/workflows/publish_dockerfile.yaml +++ b/.github/workflows/publish_dockerfile.yaml @@ -33,7 +33,7 @@ jobs: uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 with: images: | - docker.io/${{ github.repository }} + docker.io/solanafoundation/solana-verifiable-build - name: Build and push Docker images id: push From 602c0cbcc7cb51d145118a77d313135e33cffdf1 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Sat, 9 Nov 2024 17:17:02 -0500 Subject: [PATCH 261/314] Update publish_all_dockerfiles.yaml Signed-off-by: Noah Gundotra --- .github/workflows/publish_all_dockerfiles.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml index f9294ac..02885a1 100644 --- a/.github/workflows/publish_all_dockerfiles.yaml +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -64,7 +64,7 @@ jobs: uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 with: images: | - docker.io/${{ github.repository }} + docker.io/solanafoundation/solana-verifiable-build - name: Build and push Docker images id: push From 779a32bc517152367cf0b6fdc1f92e16d1658722 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Sun, 10 Nov 2024 09:54:37 -0500 Subject: [PATCH 262/314] Update update_whitelist.yaml Signed-off-by: Noah Gundotra --- .github/workflows/update_whitelist.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/update_whitelist.yaml b/.github/workflows/update_whitelist.yaml index c1a7f97..7f115c3 100644 --- a/.github/workflows/update_whitelist.yaml +++ b/.github/workflows/update_whitelist.yaml @@ -41,9 +41,6 @@ jobs: uv sync --all-extras --dev - name: Run generate_dockerfiles.py - env: - USE_GHCR: "true" - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: uv run update_image_whitelist.py - name: Create Pull Request From ea6ad56412955026bda18e7e593a6b9db9364a4c Mon Sep 17 00:00:00 2001 From: ngundotra Date: Sun, 10 Nov 2024 14:55:02 +0000 Subject: [PATCH 263/314] Update image whitelist --- src/image_config.rs | 372 ++++++++++++++++++++++---------------------- 1 file changed, 186 insertions(+), 186 deletions(-) diff --git a/src/image_config.rs b/src/image_config.rs index 20a9ca2..d6a035e 100644 --- a/src/image_config.rs +++ b/src/image_config.rs @@ -5,192 +5,192 @@ use std::collections::BTreeMap; lazy_static! { pub static ref IMAGE_MAP: BTreeMap<(u32, u32, u32), &'static str> = { let mut m = BTreeMap::new(); - m.insert((1, 10, 1), "sha256:78d58e458d2455fde585d7530bdf46e0921d4473996a546953a8370f7c75fa0a"); - m.insert((1, 10, 2), "sha256:c2a7483771b4b817b9c33c426cd2306378b87c8988bbc8f18b2678888e8bb871"); - m.insert((1, 10, 3), "sha256:0dd11cd4da6e64cd5476214f326c2cf8cd72b701c08a8216143696ab4cc99790"); - m.insert((1, 10, 4), "sha256:919132adbdff0c7aa5d9f69b84d143c757e9a4473001729499be55a878f707ba"); - m.insert((1, 10, 5), "sha256:9d7ffa271af3339c90a0dfb9b6ef9814c7f4ce4207290d8a68f8a44b033948fc"); - m.insert((1, 10, 6), "sha256:7013788942a70864c56373f3284ad0e7f8198e74e5ea6242f9e9ea86349cd9b7"); - m.insert((1, 10, 7), "sha256:661c5585244901cf19efbf1f949332d0035e24b7c20e4543714041528231e7c6"); - m.insert((1, 10, 8), "sha256:0968ed050cb42b8d26efe909be74157bbf7b49641223fc83cc0fe043277d1e43"); - m.insert((1, 10, 9), "sha256:4b9ed938bd91a0351c249a763b1d95b5cec0d1fc5fb6f13d478e926e4f515a89"); - m.insert((1, 10, 10), "sha256:b29a1c669a201ec41dee7a92438e9aa8b8fdfa62f4417019a5f2b3a90f3f284d"); - m.insert((1, 10, 11), "sha256:e1b2bae976d3f450c1986fa78f0c57eb5b6df2038a7216f007c4b848b82e809e"); - m.insert((1, 10, 12), "sha256:e29ba153232cd185ac8a3af10c9adcd23f8545663d69dd577c28e90452e97606"); - m.insert((1, 10, 13), "sha256:6ce7bccefa38b109b21c2564667c21bf76fde7f26b7686cd021847423e1c45d3"); - m.insert((1, 10, 14), "sha256:d9b95469981a9f9a286544ae2d53db8d1288c1c7dce747dd12a78956c57ffe0b"); - m.insert((1, 10, 15), "sha256:1df6e20d8199383f0ec0dff015cb558fe3ef5eaff748a819593afd03355a4c45"); - m.insert((1, 10, 17), "sha256:c149ea5c659c728b97c32f06aacd12a18d910c0d75a179c42b96d497788154b6"); - m.insert((1, 10, 19), "sha256:a5c1429de067c331ad72b2ff7240046c3fa855e1321af506a21d8a2f6bc09cf1"); - m.insert((1, 10, 20), "sha256:67ccf12301a85a4ae86f754bfec29c1bc41d29c2f1f921a4095a5797e412ff2e"); - m.insert((1, 10, 21), "sha256:1c483669fc7a81325d65241585fbbfe5103fd7693a603f97ecdc7fd0ec1a9a55"); - m.insert((1, 10, 22), "sha256:94b9b62ea873fc3df71130fcadf3e33fc87eb02b6e70e82e322b206ba81024a3"); - m.insert((1, 10, 23), "sha256:7e3cd302cffa3a6f28417fa104e0f4a6b9ee3e2affdebba96e96758747e84e24"); - m.insert((1, 10, 24), "sha256:0a57e52107f8e340bb7c7a79b065fcd8d457386f104c8b6ee254df106117795e"); - m.insert((1, 10, 25), "sha256:f6136f17ac34a3332bca69714402335d7687df22ef38c1c6e4b0bd5f8b63c3e5"); - m.insert((1, 10, 26), "sha256:9c7b58d346ba74f18eba3eccea6b5b9778f6d6739ea7e70429aab6bc4f92dd71"); - m.insert((1, 10, 28), "sha256:73f42bbdadb544a5609c3b6a97821abd1b252164273dfebee83b18f077d3d173"); - m.insert((1, 10, 29), "sha256:06768f7230c38f2519d053147ffa9c10e13a07b68affdc3648843208053f92bb"); - m.insert((1, 10, 30), "sha256:f3050d21453c399936e9c974aacc91eebd96131018c556047297ac3f246909c9"); - m.insert((1, 10, 31), "sha256:1baea31b5d90fa8928a50f660865885a697dec741a6f9e9d8bcdae3846d63c43"); - m.insert((1, 10, 32), "sha256:936c1106bb5152fc3952c39b28c27f5b83fe296ed21dbeb4e9486d5d21fd8415"); - m.insert((1, 10, 33), "sha256:fc1a9f29c7eb7af880e7bc84754b39ec2c9cf09ec8e516a379d483cd8e84c8f7"); - m.insert((1, 10, 34), "sha256:b2f47b412693271b6e546ba67d7f0d6bd7284113d5d62f49c7441a8a933ed680"); - m.insert((1, 10, 35), "sha256:4d74e92253746321600a6a918a9eba4617d6da0140222c0e8de6dd3d91eb21fb"); - m.insert((1, 10, 38), "sha256:7ad5ce7410b68feca1dbae56d621ca59e37c72bb32b40b487af9d409ab200475"); - m.insert((1, 10, 39), "sha256:d50af3eda8761f8bf3e66002d9e01b41945f0cdaacf7da4bf4367f673db50dab"); - m.insert((1, 10, 40), "sha256:c6b672ecc201d2e3e3186b7200cd671c2a9ad509730854c797b36bfe295267c9"); - m.insert((1, 10, 41), "sha256:354f31e9c11fa2dafdd3872a730f6267fe9c360cc7c6dbc715ca1f250b5fbcc2"); - m.insert((1, 11, 0), "sha256:a0f1ab4f8c74850594a4f8f9b1ee291c24236aa722bf27a5bd54910284d4117c"); - m.insert((1, 11, 1), "sha256:89125323e21e3b65b08decebd088b6c13ee1191dab1e9441f772917bca1b05ef"); - m.insert((1, 11, 2), "sha256:499e948382785a26d212fe43844e1a0c27493567d6fde44040e59bda78fc7949"); - m.insert((1, 11, 3), "sha256:d7a953f28a674bcd02c6438421a03a843d4a80df77481196d895fe621d738a7e"); - m.insert((1, 11, 4), "sha256:27764f73719ddbbe572d857ea04641d5568ba6d9ac1a152acdae8cc1da1ca964"); - m.insert((1, 11, 5), "sha256:f6c2f54e499a88a1663ac49e927b779714cfdca323798d6ada7d3270db5952d5"); - m.insert((1, 11, 6), "sha256:5846acd614ddbb76a00a5f101f7c95d69019b1c51216eb4dfa7b9fb013bfb3e3"); - m.insert((1, 11, 10), "sha256:cd6a21f940a5029f318b0be930f83689cae028c305ebe033fa93ad86847ea18d"); - m.insert((1, 13, 1), "sha256:0b605e6a5af5a5cae560b392c1a62a65c1f6250b6a766cb15f978b6601f42d99"); - m.insert((1, 13, 2), "sha256:aecf5f578200f424d0ba8eae74bbbaa460cd310e354044f3e55872079dd9d7f2"); - m.insert((1, 13, 3), "sha256:2b1e446b407173afe9ebc56720d5f20ef265d40c88b878957b989080d8bf1604"); - m.insert((1, 13, 4), "sha256:019a0ac2b1cfc73a39087b4bab15d9ab20085e0be701adc069f81cbf5f60d748"); - m.insert((1, 13, 5), "sha256:8391f8cc96730b34e35a9d679d78f194c70bf4cc2d3d737eef68bb18af186820"); - m.insert((1, 13, 6), "sha256:7edf47a523294aa537c8e541ecc684f6247a020a1b41a41dd901e290d4206376"); - m.insert((1, 13, 7), "sha256:ff7be9d6bae396ea61dfa8678e02313aa6a0a6531f6e09f3e58d13cf15db33af"); - m.insert((1, 14, 1), "sha256:5f12fdd369f75a13e71c09599bb391abf9973ba546568a1074275117dcb4421e"); - m.insert((1, 14, 2), "sha256:5130ab2c8a3a891aa78b5859737ff35e27ea438ce7cb4601566043fbacadb706"); - m.insert((1, 14, 3), "sha256:f0fd946937f22ebb484c6650b4309d97645710e1c2f542d30a65a66944b68613"); - m.insert((1, 14, 4), "sha256:27605374d3f4e08aa261fef467a4993c966b80f55756935cc6ca0b82b50cacbb"); - m.insert((1, 14, 5), "sha256:4eca700040945a75612a7958098b7ede5b9f9df522c3568e25af087a71c06e8c"); - m.insert((1, 14, 6), "sha256:15b1713544a93f746788de8c55b2600e14ddb0232d5770541fae20f34d3946cf"); - m.insert((1, 14, 7), "sha256:7c760e94b106c15520d968310620a004a99c080fc0d74b7ce222c96ba35410c6"); - m.insert((1, 14, 8), "sha256:6416557b5826b162b992510300ad407be51ce70dbcd4a8457c6c1dcc9c42890e"); - m.insert((1, 14, 9), "sha256:cfe9f6c72a32ed2198da283cbdc6174e96596d6e89e1437bc7a5c494046f0df0"); - m.insert((1, 14, 10), "sha256:8c6277633c3df6d1f09bcdadb27b08f1946eb9fcd903303b08ee127df2434eb6"); - m.insert((1, 14, 11), "sha256:52bc658d94ba3d09888e54fc9078a51dc2cde5836b4683cf0ad75b530d2811b0"); - m.insert((1, 14, 12), "sha256:6fdf56b1ca5da6d662c66c7cf16f14798e66fb948db4efab7ffb6d2aa3bd840b"); - m.insert((1, 14, 13), "sha256:75e4a434d4fcde57cb7ca86cc4d1dd36d75be9f90104af766b3a033b5a8e0503"); - m.insert((1, 14, 14), "sha256:371b7688d173e1d67ebf868e56538e44e2f784d83c19f79516b241f730dee850"); - m.insert((1, 14, 15), "sha256:1c30eebfa6024cda4e370383077a84d9d9d8bfe7b8c21716624bba2c199c3dc1"); - m.insert((1, 14, 16), "sha256:72ae00776b62501ba82abba5735be4dc68d0cdfc57dc7ceeca3449564066e8c5"); - m.insert((1, 14, 17), "sha256:5f53b29a0bdbf78cf41521ff514c43c25d76b7cef5fb020b29bcbe1bece0f5d5"); - m.insert((1, 14, 18), "sha256:8b38ded7b11d7ec8d9d598c107ac46bd218efa2a0791f75ca4661dda683a9fd2"); - m.insert((1, 14, 19), "sha256:0b3b454930d7049246c8f2e2769696459247ef564a4c40e42f6c22d6465da3ad"); - m.insert((1, 14, 20), "sha256:5737e98cece056195be7b356dba802fa800d0bcad577cb99b4fae7d61937fc0f"); - m.insert((1, 14, 21), "sha256:e05d8b6eb6085f9183837bd26d0917040f9733f95cd9d032d430c03ec30a7d56"); - m.insert((1, 14, 22), "sha256:8557efd830501292b846504f12eb241c06f5cf976d5f700b3b4b74f74bdaaead"); - m.insert((1, 14, 23), "sha256:287f678e5f02ea0da4ee4ff771eaf27b32cd652af0979afa1c828abdab082c0e"); - m.insert((1, 14, 24), "sha256:b089349b1ad098eac053461941b6ca5421a93fb5d637a9f8465ec31c0f1b8a1e"); - m.insert((1, 14, 25), "sha256:fada5e8fcdcebd69f7f76dd3eb48c1349f8417eddf7bf320613e0a71df72b0b2"); - m.insert((1, 14, 26), "sha256:17c257d216cdecb639a47ae548f298a541d58404e83d7909d7846c547a335098"); - m.insert((1, 14, 27), "sha256:c343a8b1935ea7fc8f92ad9e67be5d0cda5b0b2720fb0387c98974116a466b88"); - m.insert((1, 14, 28), "sha256:bc50b7f1606f5ef63077667888860acc65e7fea0c6c60b28406358ea1b0b4b1a"); - m.insert((1, 14, 29), "sha256:9d0e04efd78e1b6744b575d9bb605196f3f91150640bfa142a7733cf37ff19ab"); - m.insert((1, 16, 0), "sha256:9704a8134ab8f71d60393058f54014d68171935778168dae4f177d4b5048eee9"); - m.insert((1, 16, 1), "sha256:f8f9f6ab171cddecf6ca9edfbc2f8832ca40a39d32d1d6d6675480c973e6ddb2"); - m.insert((1, 16, 2), "sha256:3d7bfe90102c93a4e8485ff81f9c8bca7902408195dd469ce39d0d8fb0d83431"); - m.insert((1, 16, 3), "sha256:768aea7ed4a19c33e85f631a69dd9c25fb053c2e33f480dd7cc3a820f6ea7bf4"); - m.insert((1, 16, 4), "sha256:60997907318cec9956f78a8e6931e84c3e8a51c612c0fabd257c0789d3dbf604"); - m.insert((1, 16, 5), "sha256:21e8215f4468a6ec48a07c16585baa1145d2918d5a061466e26f66512c92f290"); - m.insert((1, 16, 6), "sha256:626cfdc69f2daa16b50a75065f5ccf093f4f75f702ba1a77c99c70f6f15266fb"); - m.insert((1, 16, 7), "sha256:c72a7113b49419b75e81b690e87ce29d6e24b5ce3070631850c79c3e965c8946"); - m.insert((1, 16, 8), "sha256:6d69db7b2a7da2e0443508c1bc7fab7789d268b9b6746932bf6bb86da48f1314"); - m.insert((1, 16, 9), "sha256:a7f6bde7a69eed0602e02d86e689010b11105b49f9ccc7f78cad8711ac3a6a3a"); - m.insert((1, 16, 10), "sha256:e8f9558d14448350ab5af424382d19d6814f6f623cf9f13ec9a940dffe59d4f4"); - m.insert((1, 16, 11), "sha256:8b8e7f56736491fe888685f2c2cb607b7ca3e6775bf41811a2eb100ba70ec2be"); - m.insert((1, 16, 12), "sha256:b97a5d04f867faea8bc1efc0dfc48474eac5ff88e1b22160f6a56d7258d26035"); - m.insert((1, 16, 13), "sha256:d02d90d19a84bf75d9e3542b113af9955135f3da376ebcdcc190ca5c4f9ee6d2"); - m.insert((1, 16, 14), "sha256:2fbc2b966c9088478bb2d911c16cc836cbec05cb618e30b17891577452233135"); - m.insert((1, 16, 15), "sha256:bf11d0758709a0bd9c2bf92ce6f00eea32111c8de12506ee51c8ef5c0ef5f73a"); - m.insert((1, 16, 16), "sha256:7d6d002ecb7555d97c72189640129f1d1c51c348636da6f3292ebfcafb31e58d"); - m.insert((1, 16, 17), "sha256:7a2cd1dd224f9ec6a40eaf63958db4fe5702941130080ea2711e340fa94bb6ae"); - m.insert((1, 16, 18), "sha256:f51505ae36d2c76556a87d6f97e048834ea75722bd4be16cc4ec703df4901f5b"); - m.insert((1, 16, 19), "sha256:2cce04e54fb555610d6f4faa5ad2554bbcde089eda9a95d6c098cb22e97092a6"); - m.insert((1, 16, 20), "sha256:ff17d659188c8becc7d4ed3334857de7d085d0c62cef146771b9f02dc5128ced"); - m.insert((1, 16, 21), "sha256:751eb94541383ae941f97c24f1231f1c2d09a1736bb7f3d0ec5b4b8f67d78d1d"); - m.insert((1, 16, 22), "sha256:7579635d65afa2b6f71572f1b7f6a7edecf40462d655c744255b621d46937222"); - m.insert((1, 16, 23), "sha256:f65501333dbbb76214b4b26b767b47d753ed5161b7b5d88c1c0bd550990cf813"); - m.insert((1, 16, 24), "sha256:fca7381626548d1abcf3dede5d16c9cf02e3e9c2f4d75d95ce8c45fea99cd750"); - m.insert((1, 16, 25), "sha256:4c44fadec627d889849823637c0684956897e739dfb4dc8c1ce77f62fcb0c91f"); - m.insert((1, 16, 26), "sha256:3ded13fc6debb6ac2459a5b208483d4bea8915f023d63cbb4c19219654f9838d"); - m.insert((1, 16, 27), "sha256:0d3837a88344aa69e221810d6f87083baf8c7727055562a6d76e02846b366040"); - m.insert((1, 17, 0), "sha256:312dabb455aa4408ede17e7b054c9f08a83fbbfa29b5f6cb7c07e500ac76f32a"); - m.insert((1, 17, 1), "sha256:529673d48d37ac5d466d6e0e9c3d7fce227c7de361442526f3439c948252ba48"); - m.insert((1, 17, 2), "sha256:fd6432ce7ed2dedc010849812ac5313b5c8ca96cb03997ff172e8ce6e6e6528d"); - m.insert((1, 17, 3), "sha256:21ae71f2456ae8fd318cf8738a309b6c40cac8f5c2b65dd9a78a702d5f0f017a"); - m.insert((1, 17, 4), "sha256:6ae28a12ea924912f171d8817bd6ba1ea3ee668fa53f759789bcdb10b0ae13b5"); - m.insert((1, 17, 5), "sha256:6df790e45a3b1a89ce5f1a69ebf33d50291e18ed31cae1f0f5d159bc6c5f45ff"); - m.insert((1, 17, 6), "sha256:533a4a31198c64670d319aa09c6f00f8a4e6b72881c74e9925c16a9667596017"); - m.insert((1, 17, 7), "sha256:6de36afeaab277dcf2de8b7c04abb2093bbf50cb4ccdb59df4bfd97b16f8bbe7"); - m.insert((1, 17, 8), "sha256:3a129b5e5851b0a25ad7a24a96f4d82fdfd6a616a4f69a94bec1a65cb6dfae93"); - m.insert((1, 17, 9), "sha256:2bacdd91d2aba692fb3c917f6a6ac78bbf034ca2ac2e65be5a3c6689e5997356"); - m.insert((1, 17, 10), "sha256:f6c5e8048c5429259856dcf5708fb90e8e0ca492ea2e7d8286793c61c4d6fa0d"); - m.insert((1, 17, 11), "sha256:49e379af197636e336bfb173d904eb25ebe613a82cd97a60f46233573041f272"); - m.insert((1, 17, 12), "sha256:0889207f369a909278bd51d8286565b8c0757e9753ca71ef1208356ac6c077bf"); - m.insert((1, 17, 13), "sha256:280dc3af1921c4c5536222def0c18e25add520bd786d697aed85072a509c65c7"); - m.insert((1, 17, 14), "sha256:c4abbd449681e4e94814694ca99cb243b1f0d2a2ff69bbc228cf6c7f75408404"); - m.insert((1, 17, 15), "sha256:76fd92555fbefa924151b14da5a64f2ffe054acd0ec0eedf15832a8b6eb02133"); - m.insert((1, 17, 16), "sha256:4372ca4534609b7e9567f7a62845f91630d702262135be86795c9561e1b41fc6"); - m.insert((1, 17, 17), "sha256:646d1fbd5da7d7ca582bacada78a6cd72c8ac956bca7688ecca337f782071914"); - m.insert((1, 17, 18), "sha256:50da0a4c6873e1c5a124cda7efd1c88c18251c69f5be4cc467408e1edada1f1c"); - m.insert((1, 17, 19), "sha256:3d0cff17566b8e1e0fa340d50312f75143946ee972c1cccd098184bd7e3ac58e"); - m.insert((1, 17, 20), "sha256:113a3679aca8ba9fabf0a4a51f05dd9877631ba133750a2f5a328b056091114c"); - m.insert((1, 17, 21), "sha256:e1ed7846431d018f4ffe512afd67f247622e9a016927163cfc46c5cd4e49fa97"); - m.insert((1, 17, 22), "sha256:fd66933f9fcb4573f24ccfb3ad9bbdd265e512884afebd02ed1ff5a4e1cf96bb"); - m.insert((1, 17, 23), "sha256:ddafe215050a3a727a72aef87543a914ddb84329e72d1a7e8698fa1db2a8c6e2"); - m.insert((1, 17, 24), "sha256:2b312752269b31119bf250f18b947569b8282b5e86c9a33f106299e92f68d0ff"); - m.insert((1, 17, 25), "sha256:0ba63bb51937bfcdf64bedf339b04c2ab00011bc67bad9044bc27ef78e95fffb"); - m.insert((1, 17, 26), "sha256:30709e6d35a44a4627a3e67840489174490a0e40560c290440e5500da2acd3f5"); - m.insert((1, 17, 27), "sha256:e32b0cda187d5fcf273781535e991987e232cb2311595f110dc31d07da749134"); - m.insert((1, 17, 28), "sha256:8a89b26f86eb7fe881e0db3b05b77243ec27efce6de6b37b3f181def9a04c45d"); - m.insert((1, 17, 29), "sha256:3d66e8747afa3a6e4257cb520c85dd005af34c054fab40b596ab7bfeef02ab9a"); - m.insert((1, 17, 30), "sha256:216d9efd4b0a26b70c1081ee802445c6917e6683be3bc92cbb94e1bca1144418"); - m.insert((1, 17, 31), "sha256:29a9f6ee487c9047687e378fde476cdcd49564736e1128bfcb9d71e9c4720d15"); - m.insert((1, 17, 32), "sha256:564674f88899cd489381e5cdb212524ab5051f9cbcf126b908dd6c652157e6ec"); - m.insert((1, 17, 33), "sha256:c7abae48a3448147e6c7cbd839b73f59bddaf2d5c21a7f6c0f7ecb582ec9aa30"); - m.insert((1, 17, 34), "sha256:30f7631764c1cb4d9ab5b1c7bc18d932f839d1a3e5a60ee5090c81a429a659c9"); - m.insert((1, 18, 0), "sha256:4ce29cd8849f5686adeb20892fc68da8d4aad10a98cca941d724c256f23c2f8b"); - m.insert((1, 18, 1), "sha256:b96f942f5974dae1b32f1ba682bdc2be5725d51e7004531bc8c51d290e230b05"); - m.insert((1, 18, 2), "sha256:8da146e1e82012935acb39cb717eefe4d3e6256b6f1ad2e4c640be6d79c772bc"); - m.insert((1, 18, 3), "sha256:4ef938720215948e9ec544517ed3759205b62aa41290120c589217f7f904241d"); - m.insert((1, 18, 4), "sha256:12c137fce9676043b7e24bdbc9082d1ab03539d845118dd9b9609ff10c219b73"); - m.insert((1, 18, 5), "sha256:c25e9a37b7f70353dd0e8c16507b7e6841303c9f736f7cc8514c4cf9ea734448"); - m.insert((1, 18, 6), "sha256:fada991c06f739c6f813d65e458e72fd5b7ec51df43f90970466d996561571e6"); - m.insert((1, 18, 7), "sha256:f75aed70c45c40dd16f5a5564044f37e0e1d326c0b48299e0faf31b12c8d89e6"); - m.insert((1, 18, 8), "sha256:44e6d293682570512e1a3c4df21260daa0ffd7ac5c580ad18a27301a5d7a6671"); - m.insert((1, 18, 9), "sha256:e68dac761793f3fe03acd239fa358ffe4b6f0cee3b8ab26e986ba9b074e29842"); - m.insert((1, 18, 10), "sha256:f68a89c9987baf3c4b621a020b90a8f0f003f7ad1f2302234cd0a2fe14eabf98"); - m.insert((1, 18, 11), "sha256:ea97f5e0154df43a2b841e8e94bf08e5afeae0631106aa163c44e2eb3a516a93"); - m.insert((1, 18, 12), "sha256:62a4f8b82d02dfc657ef4babd29bea7283e7d8c513f2e8f46d6b0d6fbd82f40b"); - m.insert((1, 18, 13), "sha256:52cd626ec8694b66522573aeddd4868831ad9bc2ba8fc06d2ea2d75feed3f39e"); - m.insert((1, 18, 14), "sha256:adb5b1f5e297cd25ca94b46defea73378c5ecba4420ffd5baefb512475578099"); - m.insert((1, 18, 15), "sha256:200ad8cca516544f43da47c4be062f79909a16960d7338ced657d362fca0937c"); - m.insert((1, 18, 16), "sha256:c36cc9ff70e6adb04cef93f9945604948272129ee643c0b4fa741a233e13e7f8"); - m.insert((1, 18, 17), "sha256:3c919ec33c446124e562c3f0b80f8f7082b040dcee2fa365bde8f447e4f7601f"); - m.insert((1, 18, 18), "sha256:d0a1f26ac35f5f45cbda491bd8150b2ba3587b9fa5369e15f33bbdb1a72bd216"); - m.insert((1, 18, 19), "sha256:18544955e92d931905cc620cdf097959f9c67bb3972a45e3033df1d5032c79e6"); - m.insert((1, 18, 20), "sha256:e3f8429398f7efd1fb66dcbadcb5f262baa6daed926e37356eb12558a5c5ee44"); - m.insert((1, 18, 21), "sha256:d7ff9073d7a5a4c57d3c506bfd7b5b67f3e3a425bb5693f22bc64f26e7024fbb"); - m.insert((1, 18, 22), "sha256:7ebf040250d608c72530e692a043a5147a7975155853711f1f47b711db63d926"); - m.insert((1, 18, 23), "sha256:3393e5c6bd7bbf96fe811b05e5002e0e361caa179d5dcf38fd91269ecd8d789c"); - m.insert((1, 18, 24), "sha256:1b2c27883f8cd5c3e596526d1b1a776af1acaddf90ac2d93271767306439b532"); - m.insert((1, 18, 25), "sha256:2abc86a752d37f9e51fb25b2de3018a03f8a4cf2833aa34cc974d894d981287a"); - m.insert((1, 18, 26), "sha256:b92ece91a8cec060ff124c56f6625c429f1a9e08bf1a4ae1b739a3e2c5dcb1e5"); - m.insert((2, 0, 0), "sha256:69e1c395a4b9d6513499cb5bb0ea4c6eb1f43591452b4a6608a0dcbaad964ead"); - m.insert((2, 0, 1), "sha256:824c05d5c37de2582139095cc20458f1c6bc30304ea26d37d469a9ced6b2bde2"); - m.insert((2, 0, 2), "sha256:15f47240a7cd476b545bc0facc26cc5538793befb8184ce168b29b1ae4b5f810"); - m.insert((2, 0, 3), "sha256:ad091e93cef5495a9ea18bd54f34cb2577de0d8bafc89570d911da4a829f5d72"); - m.insert((2, 0, 4), "sha256:96ca4a5e2425c2a5e9f9891ebc6d1bf1e4e1ac3c3b2bc503014079525eb69fe9"); - m.insert((2, 0, 5), "sha256:7c86e43374e6272d281bdd3715b9c305a917c92a3e282211b399190415a766ba"); - m.insert((2, 0, 6), "sha256:f3bec73be6602abbc2f677644ec9ffc18791f3ab35a34d0d0e410e024a5d8d17"); - m.insert((2, 0, 7), "sha256:d39f5c1b85a2f8af4db7b110d02e259cefb6c34916c377cabb800cb6a274dec7"); - m.insert((2, 0, 8), "sha256:c2b3e133b1f346b9decdf7dd9d3f37ce94b153f5b16c407891f611acbc3318d3"); - m.insert((2, 0, 9), "sha256:c220177d9a35864aa0537b6911640d4de13bef50bcdce9a711163d3f9972a468"); - m.insert((2, 0, 10), "sha256:db72b936e2385bcffb5ebd2afef2fdbcadfdaebe91d9d936abe1c2787e870933"); - m.insert((2, 0, 11), "sha256:a9fd9debdc119afd231c7bf83519a06800ec9806fc73f4d3895164784448fe24"); - m.insert((2, 0, 12), "sha256:f41ea5fa9234803edfcc3d3611f1cb28c9a1dbf1b9e189f52531327791401ef3"); - m.insert((2, 0, 13), "sha256:1dfcbad7e0ea281288e4c90e2939e6f365294be18ba1d121951d2dcc6ae29db1"); - m.insert((2, 0, 14), "sha256:74ace55d45a6743c32e46de8d86b75a47da443bd335dbfe2590ce85915a91f06"); - m.insert((2, 1, 0), "sha256:da30e737ed0990f82a0782ab6b7b24474a13abcf61ff8d10f783fa6a590ec44e"); + m.insert((1, 10, 1), "sha256:ee0d8b732fe559e52e2c135ed38749593d2d9d9b44aa482635a0b0f3509cebac"); + m.insert((1, 10, 2), "sha256:124c490b219834873ae7c6863f2a99caa46e2955997090945312093245409ad3"); + m.insert((1, 10, 3), "sha256:482be243c4e773d3483f34243e9baaac349580183a6bc7ab5325e36e9baaa19a"); + m.insert((1, 10, 4), "sha256:e061f807705b7fce54c04902d3897130f5778d3aa3215236ce6f7296174b5e15"); + m.insert((1, 10, 5), "sha256:3c683817ac96de5da0f7a71aa87cc047fffc48609ff91c4b998063d35244194e"); + m.insert((1, 10, 6), "sha256:e4813b08a261d7d797d6afc066c05c0d2cf728a06eaa85eb869a4674ef16131b"); + m.insert((1, 10, 7), "sha256:eaac757911fd62ba3ed7d4eda7049cad6fdc38b2f8d866632a9e1258f356e1b2"); + m.insert((1, 10, 8), "sha256:28b544c568bf110b818597683dd0200f06186b1bb128dd0114dd3e6a7834cb87"); + m.insert((1, 10, 9), "sha256:abde8ddd3e330455efb2ab77f7bdf8ceda77680522a683802b89895d4772030e"); + m.insert((1, 10, 10), "sha256:aae15690bee783d31a6b9230f9581ebc237b1e56a10ef4ab00c4b07ebed3cc02"); + m.insert((1, 10, 11), "sha256:40e9c9d3f64654921e71fd485307678ac6cb791ba5f1836d9a0a6c5d38746249"); + m.insert((1, 10, 12), "sha256:d1eb99141bc1391e87dd853a8e9188819edfde4708ab03be93ec81c649c53523"); + m.insert((1, 10, 13), "sha256:1b09317677e2fa47a6fc63ac93948b7bbbc72b2bd8592960c1e11b914808b2ec"); + m.insert((1, 10, 14), "sha256:b53f0c0683c13e67265c0b6440f36d00155d2ce97b2823d355c285b782eca64d"); + m.insert((1, 10, 15), "sha256:c5c635cfd5881087ca14471342d2d8351b40a97bff38b624ecf73da5eafb1aee"); + m.insert((1, 10, 17), "sha256:e0c5eca9f1b65424a6d14861c9b8b8296f9bb1d7f78c2720b0a840b64201cd41"); + m.insert((1, 10, 19), "sha256:ac0c1b579c4a415091de9b125e3c2c8531a5befa59c9ff8082897ba32a41e8a4"); + m.insert((1, 10, 20), "sha256:3a82a9f4e4009df7771711070c3c086bcdf1b944d9659363d3d3dfd8f5523afa"); + m.insert((1, 10, 21), "sha256:49c2789fabecd78f9dbac7998cc4362a77a6ec3ff853f49cb2a1c17e134aa601"); + m.insert((1, 10, 22), "sha256:57b9c75c7e7ac4f9dffb59b4ec19704061dc67b9b095ab792ef99c8ed43b623d"); + m.insert((1, 10, 23), "sha256:51d20066613ed7fa5f8599dc47936ca703a218eaca0489a87a8d2cc1948d7847"); + m.insert((1, 10, 24), "sha256:c2789be1e1c0933950b8219b9179ae3d4cc71963918f871362b4f841a9bcf502"); + m.insert((1, 10, 25), "sha256:d63dc331fb83e3d7a340d4151ace2e844945bcce727653e655fd70bdd0f22d00"); + m.insert((1, 10, 26), "sha256:cdd0322bf46342cbe60e44836c42b8999454ba96fb208fad2b47df6d6de2e577"); + m.insert((1, 10, 28), "sha256:2efe0e466d7131e5ef8ced064d740979f590fbbbb860aeebf74209c1e844290c"); + m.insert((1, 10, 29), "sha256:97c96db195ceceb6ccf9f454e0f0d2892ee0e534377de11331970f96603816e1"); + m.insert((1, 10, 30), "sha256:9ef9f47390cf2d27ab6bc2d1f6f3d037815a8a2203e643bfa5951759ca8826c4"); + m.insert((1, 10, 31), "sha256:6699e61b469348f50f7f120ebc2343f65f894f07a096fc8196e9ba7a5167798d"); + m.insert((1, 10, 32), "sha256:1986e0d983b33bbf3cbd998a701af8f342a332077ccccddf550f41444ce20264"); + m.insert((1, 10, 33), "sha256:ee9ad7809009a99a70f659f7cba959e0c3c124e10f771b524914fd42f2b605a8"); + m.insert((1, 10, 34), "sha256:64f54e0aa08594c489f3586fb1ca6c92d466d143d8d30f7465629bf271e463c3"); + m.insert((1, 10, 35), "sha256:081b6054898bafda97d3f4adf9f281229ec674233d6237bfacd9b519b37f68b2"); + m.insert((1, 10, 38), "sha256:353cd2088d6ba04035a50f38d47faf793a5b66aa4d816b21004fdcb477314bb2"); + m.insert((1, 10, 39), "sha256:d8b2ca56efbded387ce7f7d1627eb3b1498b20a13611efe98d07b259316f543e"); + m.insert((1, 10, 40), "sha256:cdf18019161a01c8e65defc2d26a6a3f6977e15d44b27e9d786bf28fb5d63103"); + m.insert((1, 10, 41), "sha256:e8fc71a777cd5f4d2595be541eadfd2e97a3051d45e9b58a8638936a4fd9798e"); + m.insert((1, 11, 0), "sha256:6a41d00a242588527194b6d8835d04d25f29c6e3198582ec9e9a02c17f37617a"); + m.insert((1, 11, 1), "sha256:6c8a321fed4eca9e4551abff8c6a2c6cd509e9e06b979031a562090d40c95a82"); + m.insert((1, 11, 2), "sha256:819d614a1fbb999a9b3ad2ed8b089a86829a269ef7f5af6785db290835444698"); + m.insert((1, 11, 3), "sha256:c5a3a42c428bb92dc63917e9e4c8702c32ed3fba7835daf163f608028dd07a89"); + m.insert((1, 11, 4), "sha256:e8f3df9a63da3f68ba22292df3132720e9ebbe8364947bb7b02d1ff77e190fe5"); + m.insert((1, 11, 5), "sha256:39a9284493ab77aec1376e859ff67bdd170d3f654b7781465d89ce32897cd80f"); + m.insert((1, 11, 6), "sha256:83d62c54ddca2f3d298c8a262276929edbd3ad97c633b32ec01563c3f4d3e585"); + m.insert((1, 11, 10), "sha256:4daff6e8e10465752b3fe20008748cb5e43e2ad6ab1b40ed4ee5bb760bb7399b"); + m.insert((1, 13, 1), "sha256:f091fca763f10ae73419af9fc02471a74f11f28e945f03daec4207b32dcde7d1"); + m.insert((1, 13, 2), "sha256:400df2fe763ea4ccc080b5f2cb78ff2d658558aaff30df538b80bdb0b888cadb"); + m.insert((1, 13, 3), "sha256:ad80b3873b2e53085e05b143a71040d74886e3fa3919d287ae9d35f1700ec25d"); + m.insert((1, 13, 4), "sha256:7a9494345fbaa40a2cd54ffd6ff3c44c2951afdb1d9ade348278cba801b3ca98"); + m.insert((1, 13, 5), "sha256:8677ed32441c473f342f2625807cd17801c690ddccc2c9692b571e23c2786a9b"); + m.insert((1, 13, 6), "sha256:c418a940178812491b47adac5bbb6aac59d27d61e0ab126c9a103152c49abe6b"); + m.insert((1, 13, 7), "sha256:38fa8ee04b93eee82592abde83dfa2852df60dfe85602ff946d4077bdeb88e91"); + m.insert((1, 14, 1), "sha256:255458e76a872bfe00ecbf3f5dc2b431d5ce7fe04fb663bdacfa796a9055000b"); + m.insert((1, 14, 2), "sha256:a7918b15e721330947d306000c892eb9b69960d1d3b1f354f13b9a018810c507"); + m.insert((1, 14, 3), "sha256:aead8dc4e049d2190d56968f178791b7647b7c8a5822a3a6603169604abf9217"); + m.insert((1, 14, 4), "sha256:36dd459e5e9850876ab8d50897f590c45793c468d297b24f2bb2a6806717e813"); + m.insert((1, 14, 5), "sha256:980f9c0ee379fe76ebfdaacc3e8641d67915246b479d101aeb96d75536ca6d52"); + m.insert((1, 14, 6), "sha256:886210830eb386c189276ac4ee724d2025cdc7ea9cd26399fefb5276fdcfcad3"); + m.insert((1, 14, 7), "sha256:bbe0b6c9a3032b8fe228cf9fa4ef408bce6647ed0e3dcc9f9ee86613bb7a51cf"); + m.insert((1, 14, 8), "sha256:07234d4255365240651de5d846f9df8179a9fbf9e44fbc819a935bafefd055fb"); + m.insert((1, 14, 9), "sha256:9b16f14b5d1a8004a036d1b3ac5abc0431d6f8239937d247ccb5569919d89ade"); + m.insert((1, 14, 10), "sha256:f4a7f98be3aeda2a5cae0d255ac3027e6ee4441c41499e97d970092f55b21d71"); + m.insert((1, 14, 11), "sha256:4e643332b45a34fa66576a403e79ad5de3f5f82f9b921a7ac18018ebc3f5210c"); + m.insert((1, 14, 12), "sha256:1ffe61632a84f1dc504280d1672023ebc920dc2bf2f0bcc959fe285b690664a1"); + m.insert((1, 14, 13), "sha256:c09d75641f8b418d4f0960cdde046582e4779a457627411ddf369afc2c0c75b1"); + m.insert((1, 14, 14), "sha256:7d2c2670cf799eda9eec70b4ac0e388c7336d8907b4aedbc4d6979d75d511cda"); + m.insert((1, 14, 15), "sha256:e40ab6ab90dfe1fb2542be255d3fe1cd5f5385e198488ed3ec70be6894314c67"); + m.insert((1, 14, 16), "sha256:a0a6190dea92b9ed7d7fd1005f93f91a2c95b1caacb2d846c145725ee285dfcb"); + m.insert((1, 14, 17), "sha256:6779c1f4157252a6e78fb6a1236a27b7a0130cc6760b4509a6eeeb78ecc3b684"); + m.insert((1, 14, 18), "sha256:48edaac5c2e16dbe6bf933615591736cbb346f6c2c96f7023e905145895d8c63"); + m.insert((1, 14, 19), "sha256:f58e3b01d63bbbec46b645e9615fe37b6a463074dc55414e1b36a647de6c7981"); + m.insert((1, 14, 20), "sha256:cfcb3e254a2fc373459175916e5000c368c070e09bd806ff37174ebcd0c4f1ea"); + m.insert((1, 14, 21), "sha256:f743b18f19488763f3aa257b15b6a2b60d267f23e9ea2fdd986f54fca069b8c7"); + m.insert((1, 14, 22), "sha256:149d4892484b1437e043c187afbaeeb3633b9f358cbe27ccad63e532c3c81005"); + m.insert((1, 14, 23), "sha256:afe97a24937533e50b2f83dbbded50f62e9859904cfe4cde40c29576c2c9d99d"); + m.insert((1, 14, 24), "sha256:fdcb245764f74c664120a5d1b27fa722d7c94ac309b57c667cbf7683434c83fe"); + m.insert((1, 14, 25), "sha256:a85a366bee24c3e4e20d971628954817c1387c733684a9d8b416eb65639cc5a0"); + m.insert((1, 14, 26), "sha256:ab6b092dabefd21acd666548bc75020f9fd8dad07fece7db493bb85676219e82"); + m.insert((1, 14, 27), "sha256:71138c2b2eb7e6c1a5e0527a9b8c045289d62a2437f7cae593543bb47e446d98"); + m.insert((1, 14, 28), "sha256:24989aca10abc3e5747df2b43732beae6240b3cdc156ceba44bba4051a6eca76"); + m.insert((1, 14, 29), "sha256:80792a6a0f02568f6fa402a872dd34a8fca05701d971427cdc9ccf6317a9f60b"); + m.insert((1, 16, 0), "sha256:7139aa85eaa6aa6e6dd93a342fe4c198fcc4ba835f1349d4bd43e083f1b73d4d"); + m.insert((1, 16, 1), "sha256:2e585871d4a164f0bcd0381cf169afc393f20630c7a835eee136053dd620cb0c"); + m.insert((1, 16, 2), "sha256:5575fb255576206abefae6bc48aabb83bb82044e5e493135f52a1334330af1bd"); + m.insert((1, 16, 3), "sha256:f9c4bcdc55e7aeabbd1e698de0d3e0b9623198bf14dbe5d86c0837a82e09c3e6"); + m.insert((1, 16, 4), "sha256:98119d48d756920ecc139da6117aed11af73ae33eac44331b01e2a0e4e463983"); + m.insert((1, 16, 5), "sha256:80ada1d2ad49b84ca7601a77c16944d41ec2e355906519e7c394baa38bcf600e"); + m.insert((1, 16, 6), "sha256:088aa52b13e1c7117e886d68542474e4dc58709128297b53a00095d678fd1873"); + m.insert((1, 16, 7), "sha256:699c490c03992321eed313cc1f2d9399746313653c6f0fe15ca1b769df278b29"); + m.insert((1, 16, 8), "sha256:03dd4eaca9810a7817cef9a25b0619cf451064594e2670025ffaab2c8588bb94"); + m.insert((1, 16, 9), "sha256:c9c0fe6d2bd67d23848e5f94f22611f3cd819c311b50c2559928321980d8f672"); + m.insert((1, 16, 10), "sha256:5b8ee61bf0d8e7c0390301f91f221aa0029597c671d2de90f57fceacd8ac10e0"); + m.insert((1, 16, 11), "sha256:d371bec494d2e36f4c8ca6c1cf50d46bef9d0cc813de639ee8b089ba8a603131"); + m.insert((1, 16, 12), "sha256:438191d0350d5e0c91d891928151c98e9f312f3849aee38f8cb54b2029ab1f55"); + m.insert((1, 16, 13), "sha256:7d3ec2da00a246adab933082167b99f662e5aa7dd3d098c4601332d7362ba0a9"); + m.insert((1, 16, 14), "sha256:e9cfc73adb9d966d9aed5a10a4943726f42002fe25ac9506e3c32e4580e7d743"); + m.insert((1, 16, 15), "sha256:3197ee7f185a0a16bdda88cc672f8bf8418340f505ccac5a36fee8d2b1996d5f"); + m.insert((1, 16, 16), "sha256:d078bd07af47cfafc293e871950bd8c277bbf64019bf17367da6fe8fb4c240ea"); + m.insert((1, 16, 17), "sha256:f0da7fd1857615be5c7f3a0d83e222b61ad276d6df6b24dfc9773bbf1f4e14fb"); + m.insert((1, 16, 18), "sha256:d0cec0a5ac7b4d37f2b3031cbe644bf476b82b9e2ab0a4f2c658255d08961399"); + m.insert((1, 16, 19), "sha256:77c86c896ed630e19600b811d4eef064da11d6d762f833b9d2eea957e5793a24"); + m.insert((1, 16, 20), "sha256:ee9889e6a42e45bb652db37274be002912e144f08414ea7588a2a57e483a9f54"); + m.insert((1, 16, 21), "sha256:2747a1f2a01c11031aa9c6fb099439e135d12c4dacc7280225c2471b320acad3"); + m.insert((1, 16, 22), "sha256:4d3e5ac2a4301b4472bce726c650a0b438d108a43230dd791ab0a6effa239507"); + m.insert((1, 16, 23), "sha256:b96f582a0afa718bd1bdf8d6446901fab478a40464819a394eb60e13e0774ed4"); + m.insert((1, 16, 24), "sha256:77d61aa8de7a801c12d12e96f09ad358b3e418dbb1f5db794f9b60a1ae2265f8"); + m.insert((1, 16, 25), "sha256:43206149a565ec35da95b1a909f4714f5d5f0d8241c31df24189e517acd18467"); + m.insert((1, 16, 26), "sha256:466e573b4bf3bc596f55fee0f8ab8c27d39bd05bc2c32cec4a862cd41ddc903f"); + m.insert((1, 16, 27), "sha256:1dc8431e3796a0c855d335d2e23bfb41af482d8a1cde0d14aaaf6e4f996cbb15"); + m.insert((1, 17, 0), "sha256:fb5ab0d782524434bffcb17b243697cf8745a6f028bb0be47226e915587ae106"); + m.insert((1, 17, 1), "sha256:76f899df4ee94c8ecf6e2ea01df16c9ab342a04b69ec02676b1c4ab059ab675c"); + m.insert((1, 17, 2), "sha256:88fd751abe4d423bee76462dd7c5d3458ad55a966cad7aba48c5f2f02439c316"); + m.insert((1, 17, 3), "sha256:ed08f6c0ef488239bc9a1ff8e66bd55414ff01d0d5fa4ffec803a99c5eda7d20"); + m.insert((1, 17, 4), "sha256:8b538ab5dcfb206f1e68a4d21bdee74ee38bc9bd4bd061543bbccff8cfb70382"); + m.insert((1, 17, 5), "sha256:222e3d887dcd8a34dafc1d1cae49412e03734810c70ed3e25e9f747f6f303c81"); + m.insert((1, 17, 6), "sha256:b9a7edd6108e7d74cce6c83b85c478fde3af1b658b57946fb08879891115dc84"); + m.insert((1, 17, 7), "sha256:8af92cecf06960a33e9624fa5495c753da17686813c098f8d61bc875cad0ff82"); + m.insert((1, 17, 8), "sha256:d39a047822a802fb6752e4e61cc653b778d5e9ce007055244846911cb25772af"); + m.insert((1, 17, 9), "sha256:e7af10038469c81a968b29af7b162de43bb02cdb7aa1f3b0a7baabda0694a47b"); + m.insert((1, 17, 10), "sha256:58524a0d7d76d0eeda862e687e54f40f1130656ef07112bd75b496dc577769b5"); + m.insert((1, 17, 11), "sha256:746c9d7bfb991924550928dd3843ee0cc8786095381469e0e7a942c9e320296c"); + m.insert((1, 17, 12), "sha256:78d6100202850529cde37148fc5e8c75e70ef4ef473977100748626b2c471920"); + m.insert((1, 17, 13), "sha256:8ac42479a320d0fad24f981dd7e75d5951cf2580dd4710af6d63ab9ea6dfcaa6"); + m.insert((1, 17, 14), "sha256:83f84e8eacbc684f702ef0113bc9177f5415b5aa7a69b47ecd523f3e2c893f28"); + m.insert((1, 17, 15), "sha256:4ae0df0122465ece07059abdd7ae9cc9170f42489d8cc48aee263cc520211d19"); + m.insert((1, 17, 16), "sha256:2e03e7f0b9893ba71dcf3c6b6767dc92ae5daecb0530dd93eca66029f5670838"); + m.insert((1, 17, 17), "sha256:b192f5a364fdc8edaa38cca256be2a2cc4592f297dea50500b7ec7061febcbdc"); + m.insert((1, 17, 18), "sha256:c18ef5aa62adfe17893e673b999a5d15323b93bab08553fd3f63dbac251eca62"); + m.insert((1, 17, 19), "sha256:449941d2a203a52e3d95297adf4a0dd87b995ab59dac0dc8db1296a9a44a9173"); + m.insert((1, 17, 20), "sha256:6f3f380b292bbebfeaa1b035106b70796ec54d3dc9bf8a57a0e2d6523e901339"); + m.insert((1, 17, 21), "sha256:f028c8e248b7aa0b6b1c6d1919c75b7ac12bb592badd896a83c91193a5a422b9"); + m.insert((1, 17, 22), "sha256:adf9063f6553d48236ff18f8985921583e0ff6598b2b5dfbf13b3969c5387d1d"); + m.insert((1, 17, 23), "sha256:1d56de603cbe21ff9d740518e0ae48caff03a5827e7a68ebf474a27bf20def93"); + m.insert((1, 17, 24), "sha256:6847ef73fd583b888071f0e6569ab3ab5e34a621b402b9b430b92dbb4e217d37"); + m.insert((1, 17, 25), "sha256:3b32c8394ee98507289de8a6d63e964a629a4f4f13dbc9c05354e228c415ab92"); + m.insert((1, 17, 26), "sha256:4670d3c55898929f0ca875b2df2d2e35a40f8e3dd1847d6fdab36e9e229a9d23"); + m.insert((1, 17, 27), "sha256:238a089c8077d4bbfbb8bef4516e03da47e1161518d32224b641dfd94986fe96"); + m.insert((1, 17, 28), "sha256:efb9bc4ba4a3d3b682203b3253629cfee534f69f68bbd21cc5401214ae684c2b"); + m.insert((1, 17, 29), "sha256:218c627883518399b53b4590e39b503254c07b2704a58591b074003c98f2969a"); + m.insert((1, 17, 30), "sha256:adc7009cddb0cb6cb9e6e83fd1585941af79c81b6c6240de0cbd847096dda5fb"); + m.insert((1, 17, 31), "sha256:ebdc5d33cf6a817da0de906477dafd1476a17c79e235903b635095f003bd77c1"); + m.insert((1, 17, 32), "sha256:a489ad642c4c0e2ec1b484c9456220084051bcdf1df348541c565de8d67183ec"); + m.insert((1, 17, 33), "sha256:2bf0bc950b6561bc1650ca4c39165f0e57072bf59e6e7749f1ba056945a0ff17"); + m.insert((1, 17, 34), "sha256:775b8a77f67c01203612d82b8e57b60c0ec3dc16c40bc1e9407abd7a54b835a8"); + m.insert((1, 18, 0), "sha256:11c4c1520ad008bf14df1c25e516455514fadddd22d55d56eefad9f5e6a734c1"); + m.insert((1, 18, 1), "sha256:593bf5ca482ab69ac112740799595418096176ff9a912b884e41ebf0c272e59f"); + m.insert((1, 18, 2), "sha256:dc8fd4bdc4546af0a9bb23150ce5034f2f3296c7b56a20ab60cc3d8cf45d9e9c"); + m.insert((1, 18, 3), "sha256:c5cf7ef036915214abc8798b7731ec7a79d8c3dd363feb3018bcf3aab9990a08"); + m.insert((1, 18, 4), "sha256:da103fcb44a23e326e897f30d3b5821a878e566355b0d0a8569f1704d258f213"); + m.insert((1, 18, 5), "sha256:535605c3eb3adfc8df92bf19bf15578dcd93fd4e65784add7e5f7f674779ad39"); + m.insert((1, 18, 6), "sha256:e55c77666145564fbd2913f4949b58da32ce7fc89e52394cac9726a6c3c7694b"); + m.insert((1, 18, 7), "sha256:f276fee74cd617a776241afc7a69f5cadff5a9ee75d2c5ed51be4b0d5e0a3678"); + m.insert((1, 18, 8), "sha256:5d3936df3889481c935c83c908ae7c40d52f800c51a4724d30a7f187a379e21a"); + m.insert((1, 18, 9), "sha256:1491674874420a4763c8b72e65da4035166a2730ba694fdf5225d9dbdc5d742d"); + m.insert((1, 18, 10), "sha256:e11f047643ef67b54d0fd55e12802399919609f8d5f9592ace498c43f850a879"); + m.insert((1, 18, 11), "sha256:1443b6dc7cd8880da6ed31a6de5eb4ab71acbb0f5152650e423a38524aed7efb"); + m.insert((1, 18, 12), "sha256:93f7877b5f6a5c8b38cef65c0c485f78ec8c416f510c0434f893127170535040"); + m.insert((1, 18, 13), "sha256:b71cfa1856f2e51a66a677d3b70b6417caf199bae50992bd966c3840abf1203c"); + m.insert((1, 18, 14), "sha256:7158a643ef938a1ccba55e6e3d314f0f892529093eb9a17091c7393dbdaa34ac"); + m.insert((1, 18, 15), "sha256:f3682ce269baccc41505585cb5b78444e330cbbb2b2d1c79312917c292c30638"); + m.insert((1, 18, 16), "sha256:1388b6e423013b0a4a1b67b3481b1c35f5a13034af97d9059439d923c19f1c87"); + m.insert((1, 18, 17), "sha256:78df045659a84dfb1ba481ef69e6d89b0573a2d43c15cde5f371e320450cf334"); + m.insert((1, 18, 18), "sha256:89cfdc265e1f0cb474dd18b728417830921dc11ba9138ebb26fe02ae6d53c06d"); + m.insert((1, 18, 19), "sha256:25e4973b5ccb7d8eca1cc1e90fe07edb7a799075c78ac5a91cc4ff95fb4f3ec3"); + m.insert((1, 18, 20), "sha256:c0f0d46ad6027a3e834e7d1026a8e2750613d2eac77688910596f15baf250309"); + m.insert((1, 18, 21), "sha256:d72ae60cb3890bcf444ab9f626e6db380235a2c0ef1e8aee1bc530fe3633c4be"); + m.insert((1, 18, 22), "sha256:7804e1076ef24d4840f4fec24c88b5be8008e947cad2705516666a9f24b39de3"); + m.insert((1, 18, 23), "sha256:4e6d3e75b2dc4d37c1278b2b6869265208e775e1397d5dc4b7bd4fc2c8dbd76f"); + m.insert((1, 18, 24), "sha256:f5777341da94aa8f43aa2e18102a4324c5d844aa9d982db5184f537fe56d5597"); + m.insert((1, 18, 25), "sha256:21e754f431b660d884dbacd96da9bbc5d4ad484524a6c9e751b833a8c66e28c0"); + m.insert((1, 18, 26), "sha256:f3d3a4adaa8008644fc4535373c6818275c7e35a0b07660890b4a95ef434221e"); + m.insert((2, 0, 0), "sha256:3be902b4886bbdb78152251df2134a598c862074cdaa8e125e457401f4789f22"); + m.insert((2, 0, 1), "sha256:934f326cad20acb5605bbcd091011bad9e2b8750ec93eb6b9bdfbb584494430d"); + m.insert((2, 0, 2), "sha256:8863bf1687d94dfdbb7627ad561d63b2d6326faec252d9f86a9f65aafd8f9dde"); + m.insert((2, 0, 3), "sha256:e7dd0e6ddb467633bec229ebc76751c42b7f96fd94b756c8e8213acee41baa0f"); + m.insert((2, 0, 4), "sha256:17176f8ee4f6aac1c7d8c5325ef38cf98552e02c9a9f2ce8f01068af30216525"); + m.insert((2, 0, 5), "sha256:110a530982848de9a6fad0e66cd963284a0ab4bae92577291a434467e39641f5"); + m.insert((2, 0, 6), "sha256:e9bb0fe9ba54d87d3a52c5cf76e22dbee7bc8d47a2891d3fdc341177c8dbf0e5"); + m.insert((2, 0, 7), "sha256:9b9958c335fd9ca3c5bd8ef4626cea864278a66bdf62f869265d6d16d1c68840"); + m.insert((2, 0, 8), "sha256:275a3af4f5251cee064f80fa895cacc5bdabdaaa88cc912c51a5705f0c3fff6f"); + m.insert((2, 0, 9), "sha256:9fb669de80f65605b090b2aed2a14072799d754c12d3252cf993332d0868571d"); + m.insert((2, 0, 10), "sha256:bd0dabde1ebc4efbf593a07952df8511aa4a7680f07986409a57c7aad9f27400"); + m.insert((2, 0, 11), "sha256:f737382419ad2fe2fba8ca20f93ee00086ed5694f056be79f676d44f2358f51c"); + m.insert((2, 0, 12), "sha256:7b3ba5526fcf830537447e9e7f62f90a213eed552b89fd08b409b593cf984934"); + m.insert((2, 0, 13), "sha256:b59946326904ffdfc4ec711b74e0ca2132ba69bf56c2fdbb5a795af65695f280"); + m.insert((2, 0, 14), "sha256:50852861690e5cc97976f855dcca9094e127ae7850cc6cf35c0450c839f0b1df"); + m.insert((2, 1, 0), "sha256:d08b07367937bcf7ed6eb9c6ad5741cbb309c96246a554a4f266e386724953f5"); m }; } From 735112216a12ce248403544808f019a58b9db7ee Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 11 Nov 2024 14:59:36 -0500 Subject: [PATCH 264/314] add test to ci --- .github/workflows/test.yaml | 34 ++++++++++++++ Cargo.lock | 29 ++++++++---- Cargo.toml | 1 + README.md | 10 ++-- src/main.rs | 91 ++++++++++++++++++++++++++++++++++++- 5 files changed, 150 insertions(+), 15 deletions(-) create mode 100644 .github/workflows/test.yaml diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 0000000..9143d01 --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,34 @@ +name: Run Tests Matrix + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + test: + name: Run Tests + runs-on: ubuntu-latest + strategy: + fail-fast: false # Continue with other tests even if one fails + matrix: + test_name: + - test_phoenix_v1 + - test_squads_v3 + - test_drift_v2 + - test_marginfi_v2 + steps: + - uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + + - name: Cache dependencies + uses: Swatinem/rust-cache@v2 + + - name: Build + run: cargo build + + - name: Run ${{ matrix.test_name }} + run: cargo test ${{ matrix.test_name }} -- --nocapture diff --git a/Cargo.lock b/Cargo.lock index 0d0af06..3b064e1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -89,9 +89,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -2006,9 +2006,9 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" @@ -2802,9 +2802,21 @@ dependencies = [ [[package]] name = "regex" -version = "1.7.1" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -2813,9 +2825,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.28" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "remove_dir_all" @@ -4019,6 +4031,7 @@ dependencies = [ "indicatif", "lazy_static", "pathdiff", + "regex", "reqwest", "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index 5cab881..5762127 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,7 @@ indicatif = "0.17.7" lazy_static = "1.4.0" pathdiff = "0.2.0" # missing in workspace reqwest = "0.11.23" +regex = "1.11.1" serde = { version = "1.0.195", features = ["derive"] } serde_json = "1.0.111" sha256 = "1.1.1" # missing in workspace diff --git a/README.md b/README.md index c06d47e..484f5eb 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ If you're working in a repository with multiple programs, in order to build a sp solana-verify build --library-name $PROGRAM_LIB_NAME ``` -The string that's passed in must be the *lib* name and NOT the *package* name. These are usually the same, but the distinction is important. +The string that's passed in must be the _lib_ name and NOT the _package_ name. These are usually the same, but the distinction is important. ![image](https://github.com/Ellipsis-Labs/solana-verifiable-build/assets/61092285/0427e88f-cc0f-465f-b2e9-747ea1b8d3af) (NOTE: These commands can take up to 30 minutes if you're running on an M1 Macbook Pro. This has to do with the architecture emulation required to ensure build determinism. For best performance, it is recommended to run builds on a Linux machine running x86) @@ -105,8 +105,8 @@ solana-verify verify-from-repo -um --program-id PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR Final Output: ``` -Executable Program Hash from repo: 7c76ba11f8742d040b1a874d943c2096f1b3a48db14d2a5b411fd5dad5d1bc2d -On-chain Program Hash: 7c76ba11f8742d040b1a874d943c2096f1b3a48db14d2a5b411fd5dad5d1bc2d +Executable Program Hash from repo: 6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9 +On-chain Program Hash: 6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9 Program hash matches ✅ ``` @@ -143,7 +143,7 @@ Program hash matches ✅ ### Marginfi V2 ``` -solana-verify verify-from-repo -um --program-id MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA https://github.com/mrgnlabs/marginfi-v2 --library-name marginfi -- --features mainnet-beta +solana-verify verify-from-repo -um --program-id MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA https://github.com/mrgnlabs/marginfi-v2 --commit-hash d33e649e415c354cc2a1e3c49131725552d69ba0 --library-name marginfi -- --features mainnet-beta ``` Final Output: @@ -213,7 +213,7 @@ Which will return the following hash: By default, this command will strip any trailing zeros away from the program executable and run the sha256 algorithm against it to compute the hash. -To manually verify this program, one could run the following from the root of this repository, which builds a program from source code and computes a hash. *This command takes a long time because it is building the binary in a Docker container* +To manually verify this program, one could run the following from the root of this repository, which builds a program from source code and computes a hash. _This command takes a long time because it is building the binary in a Docker container_ ``` solana-verify build $PWD/examples/hello_world diff --git a/src/main.rs b/src/main.rs index 6c99c7b..e099cbf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use anyhow::anyhow; +use anyhow::{anyhow, Context}; use cargo_lock::Lockfile; use cargo_toml::Manifest; use clap::{App, Arg, SubCommand}; @@ -13,7 +13,7 @@ use solana_sdk::{ pubkey::Pubkey, }; use std::{ - io::Read, + io::{Read, Write}, path::PathBuf, process::{exit, Stdio}, sync::{ @@ -1001,3 +1001,90 @@ pub fn get_pkg_name_from_cargo_toml(cargo_toml_file: &str) -> Option { let pkg = manifest.package?; Some(pkg.name) } + +fn test_verify_program_hash_helper(expected_hash: &str, args: &[&str]) -> anyhow::Result<()> { + let mut child = std::process::Command::new("./target/debug/solana-verify") + .args(args) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .context("Failed to execute solana-verify command")?; + + if let Some(mut stdin) = child.stdin.take() { + stdin.write_all(b"n")?; + } + + let output = child + .wait_with_output() + .context("Failed to wait for solana-verify command")?; + + if !output.status.success() { + let error = String::from_utf8_lossy(&output.stderr); + anyhow::bail!("Command failed: {}", error); + } + + // Print the last 10 lines of the output + let output_str = String::from_utf8_lossy(&output.stdout); + let lines: Vec<&str> = output_str.split('\n').collect(); + let last_10_lines: Vec = lines.iter().rev().take(10).map(|s| s.to_string()).collect(); + println!("Last 10 lines of output:\n{}", last_10_lines.join("\n")); + + let re = regex::Regex::new(r"Executable Program Hash from repo: ([a-f0-9]{64})") + .context("Failed to compile regex")?; + + let program_hash = re + .captures(&output_str) + .context("Could not find program hash in output")? + .get(1) + .context("Invalid capture group")? + .as_str(); + + assert_eq!( + program_hash, expected_hash, + "Program hash {} does not match expected value {}", + program_hash, expected_hash + ); + + Ok(()) +} + +#[test] +fn test_phoenix_v1() -> anyhow::Result<()> { + const EXPECTED_HASH: &str = "6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9"; + + let args = &[ + "verify-from-repo", + "-um", + "--program-id", + "PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY", + "https://github.com/Ellipsis-Labs/phoenix-v1", + ]; + + test_verify_program_hash_helper(EXPECTED_HASH, args)?; + Ok(()) +} + +#[test] +fn test_squads_v3() -> anyhow::Result<()> { + const EXPECTED_HASH: &str = "72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205c"; + let args: Vec<&str> = "verify-from-repo https://github.com/Squads-Protocol/squads-mpl --commit-hash c95b7673d616c377a349ca424261872dfcf8b19d --program-id SMPLecH534NA9acpos4G6x7uf3LWbCAwZQE9e8ZekMu -um --library-name squads_mpl --bpf".split(" ").collect(); + test_verify_program_hash_helper(EXPECTED_HASH, &args)?; + Ok(()) +} + +#[test] +fn test_drift_v2() -> anyhow::Result<()> { + const EXPECTED_HASH: &str = "e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828"; + let args: Vec<&str> = "verify-from-repo -um --program-id dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH https://github.com/drift-labs/protocol-v2 --commit-hash 110d3ff4f8ba07c178d69f9bfc7b30194fac56d6 --library-name drift".split(" ").collect(); + test_verify_program_hash_helper(EXPECTED_HASH, &args)?; + Ok(()) +} + +#[test] +fn test_marginfi_v2() -> anyhow::Result<()> { + const EXPECTED_HASH: &str = "7b37482dd6b2159932b5c2595bc6ce62cf6e587ae67f237c8152b802bf7d7bb8"; + let args: Vec<&str> = "verify-from-repo -um --program-id MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA https://github.com/mrgnlabs/marginfi-v2 --commit-hash d33e649e415c354cc2a1e3c49131725552d69ba0 --library-name marginfi".split(" ").collect(); + test_verify_program_hash_helper(EXPECTED_HASH, &args)?; + Ok(()) +} From 860f9189d952c45023ba106202ea7fc056c6e63c Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 11 Nov 2024 14:59:53 -0500 Subject: [PATCH 265/314] remove solend --- README.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/README.md b/README.md index 484f5eb..9177c98 100644 --- a/README.md +++ b/README.md @@ -154,20 +154,6 @@ On-chain Program Hash: 7b37482dd6b2159932b5c2595bc6ce62cf6e587ae67f237c8152b802b Program hash matches ✅ ``` -### Solend - -``` -solana-verify verify-from-repo -um --program-id So1endDq2YkqhipRh3WViPa8hdiSpxWy6z3Z6tMCpAo https://github.com/solendprotocol/solana-program-library --library-name solend_program -b ellipsislabs/solana:1.14.10 --bpf -``` - -Final Output: - -``` -Executable Program Hash from repo: f89a43677ab106d2e50d3c41b656d067b6142c02a2508caca1c11c0a963d3b17 -On-chain Program Hash: f89a43677ab106d2e50d3c41b656d067b6142c02a2508caca1c11c0a963d3b17 -Program hash matches ✅ -``` - ## Example Walkthrough After installing the CLI, we can test the program verification against the following immutable mainnet program: `2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn` From 161e2cfd78720ec041ae96bbc6e5cf59fc3ac566 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 11 Nov 2024 15:02:16 -0500 Subject: [PATCH 266/314] Update test.yaml Signed-off-by: Noah Gundotra --- .github/workflows/test.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 9143d01..d4f5ca6 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -1,10 +1,11 @@ -name: Run Tests Matrix +name: Run Integration Tests on: push: branches: [main] pull_request: branches: [main] + workflow_dispatch: jobs: test: From 64a6129093d399d1008a11d9cb12e8fd98403ead Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 11 Nov 2024 15:36:18 -0500 Subject: [PATCH 267/314] Update test.yaml Signed-off-by: Noah Gundotra --- .github/workflows/test.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index d4f5ca6..c053eb5 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -2,9 +2,9 @@ name: Run Integration Tests on: push: - branches: [main] + branches: [master] pull_request: - branches: [main] + branches: [master] workflow_dispatch: jobs: From b252474d3161c8c57342aff164241a9bd7862830 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 11 Nov 2024 15:34:50 -0500 Subject: [PATCH 268/314] add local build test --- README.md | 4 ++-- src/main.rs | 62 +++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 9177c98..2ba9684 100644 --- a/README.md +++ b/README.md @@ -149,8 +149,8 @@ solana-verify verify-from-repo -um --program-id MFv2hWf31Z9kbCa1snEPYctwafyhdvnV Final Output: ``` -Executable Program Hash from repo: 7b37482dd6b2159932b5c2595bc6ce62cf6e587ae67f237c8152b802bf7d7bb8 -On-chain Program Hash: 7b37482dd6b2159932b5c2595bc6ce62cf6e587ae67f237c8152b802bf7d7bb8 +Executable Program Hash from repo: 890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5 +On-chain Program Hash: 890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5 Program hash matches ✅ ``` diff --git a/src/main.rs b/src/main.rs index e099cbf..2092017 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1002,6 +1002,7 @@ pub fn get_pkg_name_from_cargo_toml(cargo_toml_file: &str) -> Option { Some(pkg.name) } +#[cfg(test)] fn test_verify_program_hash_helper(expected_hash: &str, args: &[&str]) -> anyhow::Result<()> { let mut child = std::process::Command::new("./target/debug/solana-verify") .args(args) @@ -1052,16 +1053,9 @@ fn test_verify_program_hash_helper(expected_hash: &str, args: &[&str]) -> anyhow #[test] fn test_phoenix_v1() -> anyhow::Result<()> { const EXPECTED_HASH: &str = "6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9"; - - let args = &[ - "verify-from-repo", - "-um", - "--program-id", - "PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY", - "https://github.com/Ellipsis-Labs/phoenix-v1", - ]; - - test_verify_program_hash_helper(EXPECTED_HASH, args)?; + let args: Vec<&str> = + "verify-from-repo -um --program-id PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY https://github.com/Ellipsis-Labs/phoenix-v1".split(" ").collect(); + test_verify_program_hash_helper(EXPECTED_HASH, &args)?; Ok(()) } @@ -1083,8 +1077,54 @@ fn test_drift_v2() -> anyhow::Result<()> { #[test] fn test_marginfi_v2() -> anyhow::Result<()> { - const EXPECTED_HASH: &str = "7b37482dd6b2159932b5c2595bc6ce62cf6e587ae67f237c8152b802bf7d7bb8"; + const EXPECTED_HASH: &str = "890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5"; let args: Vec<&str> = "verify-from-repo -um --program-id MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA https://github.com/mrgnlabs/marginfi-v2 --commit-hash d33e649e415c354cc2a1e3c49131725552d69ba0 --library-name marginfi".split(" ").collect(); test_verify_program_hash_helper(EXPECTED_HASH, &args)?; Ok(()) } + +#[test] +fn test_local_example() -> anyhow::Result<()> { + const EXPECTED_HASH: &str = "08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760"; + + let args: Vec<&str> = "build ./examples/hello_world".split(" ").collect(); + let child = std::process::Command::new("./target/debug/solana-verify") + .args(args) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .context("Failed to execute solana-verify command")?; + + let output = child + .wait_with_output() + .context("Failed to wait for solana-verify command")?; + + if !output.status.success() { + let error = String::from_utf8_lossy(&output.stderr); + anyhow::bail!("Command failed: {}", error); + } + + + let args: Vec<&str> = "get-executable-hash ./examples/hello_world/target/deploy/hello_world.so".split(" ").collect(); + let child = std::process::Command::new("./target/debug/solana-verify") + .args(&args) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .context("Failed to execute solana-verify command")?; + + let output = child + .wait_with_output() + .context("Failed to wait for solana-verify command")?; + + if !output.status.success() { + let error = String::from_utf8_lossy(&output.stderr).trim().to_string(); + anyhow::bail!("Command failed: {}", error); + } + + let hash = String::from_utf8_lossy(&output.stdout).trim().to_string(); + assert_eq!(hash, EXPECTED_HASH, "Program hash {} does not match expected value {}", hash, EXPECTED_HASH); + Ok(()) +} From 28d60bdac687d679a808cf88c76e3d3a2c433061 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 11 Nov 2024 15:49:13 -0500 Subject: [PATCH 269/314] add verify_from_image --- src/main.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/main.rs b/src/main.rs index 2092017..f59d264 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1128,3 +1128,26 @@ fn test_local_example() -> anyhow::Result<()> { assert_eq!(hash, EXPECTED_HASH, "Program hash {} does not match expected value {}", hash, EXPECTED_HASH); Ok(()) } + + +#[test] +fn test_verify_from_image() -> anyhow::Result<()> { + let args: Vec<&str> = "verify-from-image -e examples/hello_world/target/deploy/hello_world.so -i ellipsislabs/hello_world_verifiable_build:latest -p 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn".split(" ").collect(); + let child = std::process::Command::new("./target/debug/solana-verify") + .args(args) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .context("Failed to execute solana-verify command")?; + + let output = child + .wait_with_output() + .context("Failed to wait for solana-verify command")?; + + if !output.status.success() { + let error = String::from_utf8_lossy(&output.stderr); + anyhow::bail!("Command failed: {}", error); + } + Ok(()) +} \ No newline at end of file From 3a75a2a5aa820bdf5940e9aaffb1abb486e2886f Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 11 Nov 2024 15:52:42 -0500 Subject: [PATCH 270/314] separate out tests --- src/main.rs | 157 ++-------------------------------------------------- src/test.rs | 155 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 160 insertions(+), 152 deletions(-) create mode 100644 src/test.rs diff --git a/src/main.rs b/src/main.rs index f59d264..320e7be 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use anyhow::{anyhow, Context}; +use anyhow::anyhow; use cargo_lock::Lockfile; use cargo_toml::Manifest; use clap::{App, Arg, SubCommand}; @@ -13,7 +13,7 @@ use solana_sdk::{ pubkey::Pubkey, }; use std::{ - io::{Read, Write}, + io::Read, path::PathBuf, process::{exit, Stdio}, sync::{ @@ -28,6 +28,9 @@ pub mod image_config; pub mod solana_program; use image_config::IMAGE_MAP; +#[cfg(test)] +mod test; + use crate::{ api::send_job_to_remote, solana_program::{process_close, upload_program}, @@ -1001,153 +1004,3 @@ pub fn get_pkg_name_from_cargo_toml(cargo_toml_file: &str) -> Option { let pkg = manifest.package?; Some(pkg.name) } - -#[cfg(test)] -fn test_verify_program_hash_helper(expected_hash: &str, args: &[&str]) -> anyhow::Result<()> { - let mut child = std::process::Command::new("./target/debug/solana-verify") - .args(args) - .stdin(Stdio::piped()) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .spawn() - .context("Failed to execute solana-verify command")?; - - if let Some(mut stdin) = child.stdin.take() { - stdin.write_all(b"n")?; - } - - let output = child - .wait_with_output() - .context("Failed to wait for solana-verify command")?; - - if !output.status.success() { - let error = String::from_utf8_lossy(&output.stderr); - anyhow::bail!("Command failed: {}", error); - } - - // Print the last 10 lines of the output - let output_str = String::from_utf8_lossy(&output.stdout); - let lines: Vec<&str> = output_str.split('\n').collect(); - let last_10_lines: Vec = lines.iter().rev().take(10).map(|s| s.to_string()).collect(); - println!("Last 10 lines of output:\n{}", last_10_lines.join("\n")); - - let re = regex::Regex::new(r"Executable Program Hash from repo: ([a-f0-9]{64})") - .context("Failed to compile regex")?; - - let program_hash = re - .captures(&output_str) - .context("Could not find program hash in output")? - .get(1) - .context("Invalid capture group")? - .as_str(); - - assert_eq!( - program_hash, expected_hash, - "Program hash {} does not match expected value {}", - program_hash, expected_hash - ); - - Ok(()) -} - -#[test] -fn test_phoenix_v1() -> anyhow::Result<()> { - const EXPECTED_HASH: &str = "6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9"; - let args: Vec<&str> = - "verify-from-repo -um --program-id PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY https://github.com/Ellipsis-Labs/phoenix-v1".split(" ").collect(); - test_verify_program_hash_helper(EXPECTED_HASH, &args)?; - Ok(()) -} - -#[test] -fn test_squads_v3() -> anyhow::Result<()> { - const EXPECTED_HASH: &str = "72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205c"; - let args: Vec<&str> = "verify-from-repo https://github.com/Squads-Protocol/squads-mpl --commit-hash c95b7673d616c377a349ca424261872dfcf8b19d --program-id SMPLecH534NA9acpos4G6x7uf3LWbCAwZQE9e8ZekMu -um --library-name squads_mpl --bpf".split(" ").collect(); - test_verify_program_hash_helper(EXPECTED_HASH, &args)?; - Ok(()) -} - -#[test] -fn test_drift_v2() -> anyhow::Result<()> { - const EXPECTED_HASH: &str = "e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828"; - let args: Vec<&str> = "verify-from-repo -um --program-id dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH https://github.com/drift-labs/protocol-v2 --commit-hash 110d3ff4f8ba07c178d69f9bfc7b30194fac56d6 --library-name drift".split(" ").collect(); - test_verify_program_hash_helper(EXPECTED_HASH, &args)?; - Ok(()) -} - -#[test] -fn test_marginfi_v2() -> anyhow::Result<()> { - const EXPECTED_HASH: &str = "890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5"; - let args: Vec<&str> = "verify-from-repo -um --program-id MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA https://github.com/mrgnlabs/marginfi-v2 --commit-hash d33e649e415c354cc2a1e3c49131725552d69ba0 --library-name marginfi".split(" ").collect(); - test_verify_program_hash_helper(EXPECTED_HASH, &args)?; - Ok(()) -} - -#[test] -fn test_local_example() -> anyhow::Result<()> { - const EXPECTED_HASH: &str = "08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760"; - - let args: Vec<&str> = "build ./examples/hello_world".split(" ").collect(); - let child = std::process::Command::new("./target/debug/solana-verify") - .args(args) - .stdin(Stdio::piped()) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .spawn() - .context("Failed to execute solana-verify command")?; - - let output = child - .wait_with_output() - .context("Failed to wait for solana-verify command")?; - - if !output.status.success() { - let error = String::from_utf8_lossy(&output.stderr); - anyhow::bail!("Command failed: {}", error); - } - - - let args: Vec<&str> = "get-executable-hash ./examples/hello_world/target/deploy/hello_world.so".split(" ").collect(); - let child = std::process::Command::new("./target/debug/solana-verify") - .args(&args) - .stdin(Stdio::piped()) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .spawn() - .context("Failed to execute solana-verify command")?; - - let output = child - .wait_with_output() - .context("Failed to wait for solana-verify command")?; - - if !output.status.success() { - let error = String::from_utf8_lossy(&output.stderr).trim().to_string(); - anyhow::bail!("Command failed: {}", error); - } - - let hash = String::from_utf8_lossy(&output.stdout).trim().to_string(); - assert_eq!(hash, EXPECTED_HASH, "Program hash {} does not match expected value {}", hash, EXPECTED_HASH); - Ok(()) -} - - -#[test] -fn test_verify_from_image() -> anyhow::Result<()> { - let args: Vec<&str> = "verify-from-image -e examples/hello_world/target/deploy/hello_world.so -i ellipsislabs/hello_world_verifiable_build:latest -p 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn".split(" ").collect(); - let child = std::process::Command::new("./target/debug/solana-verify") - .args(args) - .stdin(Stdio::piped()) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .spawn() - .context("Failed to execute solana-verify command")?; - - let output = child - .wait_with_output() - .context("Failed to wait for solana-verify command")?; - - if !output.status.success() { - let error = String::from_utf8_lossy(&output.stderr); - anyhow::bail!("Command failed: {}", error); - } - Ok(()) -} \ No newline at end of file diff --git a/src/test.rs b/src/test.rs new file mode 100644 index 0000000..9e5074e --- /dev/null +++ b/src/test.rs @@ -0,0 +1,155 @@ +mod tests { + use anyhow::Context; + use regex::Regex; + use std::io::Write; + use std::process::Stdio; + + fn test_verify_program_hash_helper(expected_hash: &str, args: &[&str]) -> anyhow::Result<()> { + let mut child = std::process::Command::new("./target/debug/solana-verify") + .args(args) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .context("Failed to execute solana-verify command")?; + + if let Some(mut stdin) = child.stdin.take() { + stdin.write_all(b"n")?; + } + + let output = child + .wait_with_output() + .context("Failed to wait for solana-verify command")?; + + if !output.status.success() { + let error = String::from_utf8_lossy(&output.stderr); + anyhow::bail!("Command failed: {}", error); + } + + // Print the last 10 lines of the output + let output_str = String::from_utf8_lossy(&output.stdout); + let lines: Vec<&str> = output_str.split('\n').collect(); + let last_10_lines: Vec = lines.iter().rev().take(10).map(|s| s.to_string()).collect(); + println!("Last 10 lines of output:\n{}", last_10_lines.join("\n")); + + let re = Regex::new(r"Executable Program Hash from repo: ([a-f0-9]{64})") + .context("Failed to compile regex")?; + + let program_hash = re + .captures(&output_str) + .context("Could not find program hash in output")? + .get(1) + .context("Invalid capture group")? + .as_str(); + + assert_eq!( + program_hash, expected_hash, + "Program hash {} does not match expected value {}", + program_hash, expected_hash + ); + + Ok(()) + } + + #[test] + fn test_phoenix_v1() -> anyhow::Result<()> { + const EXPECTED_HASH: &str = "6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9"; + let args: Vec<&str> = + "verify-from-repo -um --program-id PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY https://github.com/Ellipsis-Labs/phoenix-v1".split(" ").collect(); + test_verify_program_hash_helper(EXPECTED_HASH, &args)?; + Ok(()) + } + + #[test] + fn test_squads_v3() -> anyhow::Result<()> { + const EXPECTED_HASH: &str = "72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205c"; + let args: Vec<&str> = "verify-from-repo https://github.com/Squads-Protocol/squads-mpl --commit-hash c95b7673d616c377a349ca424261872dfcf8b19d --program-id SMPLecH534NA9acpos4G6x7uf3LWbCAwZQE9e8ZekMu -um --library-name squads_mpl --bpf".split(" ").collect(); + test_verify_program_hash_helper(EXPECTED_HASH, &args)?; + Ok(()) + } + + #[test] + fn test_drift_v2() -> anyhow::Result<()> { + const EXPECTED_HASH: &str = "e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828"; + let args: Vec<&str> = "verify-from-repo -um --program-id dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH https://github.com/drift-labs/protocol-v2 --commit-hash 110d3ff4f8ba07c178d69f9bfc7b30194fac56d6 --library-name drift".split(" ").collect(); + test_verify_program_hash_helper(EXPECTED_HASH, &args)?; + Ok(()) + } + + #[test] + fn test_marginfi_v2() -> anyhow::Result<()> { + const EXPECTED_HASH: &str = "890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5"; + let args: Vec<&str> = "verify-from-repo -um --program-id MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA https://github.com/mrgnlabs/marginfi-v2 --commit-hash d33e649e415c354cc2a1e3c49131725552d69ba0 --library-name marginfi".split(" ").collect(); + test_verify_program_hash_helper(EXPECTED_HASH, &args)?; + Ok(()) + } + + #[test] + fn test_local_example() -> anyhow::Result<()> { + const EXPECTED_HASH: &str = "08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760"; + + let args: Vec<&str> = "build ./examples/hello_world".split(" ").collect(); + let child = std::process::Command::new("./target/debug/solana-verify") + .args(args) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .context("Failed to execute solana-verify command")?; + + let output = child + .wait_with_output() + .context("Failed to wait for solana-verify command")?; + + if !output.status.success() { + let error = String::from_utf8_lossy(&output.stderr); + anyhow::bail!("Command failed: {}", error); + } + + + let args: Vec<&str> = "get-executable-hash ./examples/hello_world/target/deploy/hello_world.so".split(" ").collect(); + let child = std::process::Command::new("./target/debug/solana-verify") + .args(&args) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .context("Failed to execute solana-verify command")?; + + let output = child + .wait_with_output() + .context("Failed to wait for solana-verify command")?; + + if !output.status.success() { + let error = String::from_utf8_lossy(&output.stderr).trim().to_string(); + anyhow::bail!("Command failed: {}", error); + } + + let hash = String::from_utf8_lossy(&output.stdout).trim().to_string(); + assert_eq!(hash, EXPECTED_HASH, "Program hash {} does not match expected value {}", hash, EXPECTED_HASH); + Ok(()) + } + + + #[test] + fn test_verify_from_image() -> anyhow::Result<()> { + let args: Vec<&str> = "verify-from-image -e examples/hello_world/target/deploy/hello_world.so -i ellipsislabs/hello_world_verifiable_build:latest -p 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn".split(" ").collect(); + let child = std::process::Command::new("./target/debug/solana-verify") + .args(args) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .context("Failed to execute solana-verify command")?; + + let output = child + .wait_with_output() + .context("Failed to wait for solana-verify command")?; + + if !output.status.success() { + let error = String::from_utf8_lossy(&output.stderr); + anyhow::bail!("Command failed: {}", error); + } + Ok(()) + } +} \ No newline at end of file From 2a7e82f9e47827ba3c12e07c8e740a90f36e18cb Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 11 Nov 2024 15:59:18 -0500 Subject: [PATCH 271/314] Update test.yaml Signed-off-by: Noah Gundotra --- .github/workflows/test.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index c053eb5..010b036 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -19,6 +19,8 @@ jobs: - test_squads_v3 - test_drift_v2 - test_marginfi_v2 + - test_local_example + - test_verify_from_image steps: - uses: actions/checkout@v4 From 363e92f5bfb9ae0b5a45696f4176c20e38884f7a Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Mon, 11 Nov 2024 22:45:14 +0100 Subject: [PATCH 272/314] Add games preset and agave 2.1.0 test --- src/test.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/test.rs b/src/test.rs index 9e5074e..e412b9e 100644 --- a/src/test.rs +++ b/src/test.rs @@ -84,6 +84,22 @@ mod tests { Ok(()) } + #[test] + fn test_games_preset() -> anyhow::Result<()> { + const EXPECTED_HASH: &str = "668ff275819d9276362c6a2636d2a392afe224296e815481b94474785f490025"; + let args: Vec<&str> = "verify-from-repo -um --program-id MkabCfyUD6rBTaYHpgKBBpBo5qzWA2pK2hrGGKMurJt https://github.com/solana-developers/solana-game-preset --commit-hash eaf772fd1f21fe03a9974587f5680635e970be38 --mount-path program".split(" ").collect(); + test_verify_program_hash_helper(EXPECTED_HASH, &args)?; + Ok(()) + } + + #[test] + fn test_agave_2_1() -> anyhow::Result<()> { + const EXPECTED_HASH: &str = "29e7713aa3c48e242e2847bc031fe2a03eb61aae5ecaec8728131e16934de465"; + let args: Vec<&str> = " verify-from-repo https://github.com/Woody4618/verify-2-1 --program-id kGYz2q2WUYCXhKpgUF4AMR3seDA9eg8sbirP5dhbyhy --commit-hash e0f138fb58b669791c823f44f878cb3547a92a26".split(" ").collect(); + test_verify_program_hash_helper(EXPECTED_HASH, &args)?; + Ok(()) + } + #[test] fn test_local_example() -> anyhow::Result<()> { const EXPECTED_HASH: &str = "08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760"; From b055b556bd31abcd5b46613819b534be1d8b0076 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 11 Nov 2024 16:57:03 -0500 Subject: [PATCH 273/314] add tests to ci --- .github/workflows/test.yaml | 2 ++ src/test.rs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 010b036..7ccf57e 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -21,6 +21,8 @@ jobs: - test_marginfi_v2 - test_local_example - test_verify_from_image + - test_games_preset + - test_agave_2_1 steps: - uses: actions/checkout@v4 diff --git a/src/test.rs b/src/test.rs index e412b9e..e0d5c2d 100644 --- a/src/test.rs +++ b/src/test.rs @@ -95,7 +95,7 @@ mod tests { #[test] fn test_agave_2_1() -> anyhow::Result<()> { const EXPECTED_HASH: &str = "29e7713aa3c48e242e2847bc031fe2a03eb61aae5ecaec8728131e16934de465"; - let args: Vec<&str> = " verify-from-repo https://github.com/Woody4618/verify-2-1 --program-id kGYz2q2WUYCXhKpgUF4AMR3seDA9eg8sbirP5dhbyhy --commit-hash e0f138fb58b669791c823f44f878cb3547a92a26".split(" ").collect(); + let args: Vec<&str> = "verify-from-repo https://github.com/Woody4618/verify-2-1 --program-id kGYz2q2WUYCXhKpgUF4AMR3seDA9eg8sbirP5dhbyhy --commit-hash e0f138fb58b669791c823f44f878cb3547a92a26".split(" ").collect(); test_verify_program_hash_helper(EXPECTED_HASH, &args)?; Ok(()) } From b37ba73d87fc6d1f2a4c8ff2e13dba08746ce3f8 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 11 Nov 2024 17:05:54 -0500 Subject: [PATCH 274/314] Update Cargo.toml Signed-off-by: Noah Gundotra --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 5762127..2086177 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "solana-verify" -version = "0.2.14" +version = "0.3.0" edition = "2021" description = "A CLI tool for building verifiable Solana programs" license = "MIT" From 999fd88f89cd5c61ec9526351ebfef1362270c7f Mon Sep 17 00:00:00 2001 From: ngundotra Date: Mon, 11 Nov 2024 22:10:31 +0000 Subject: [PATCH 275/314] Update Dockerfiles --- docker/v2.0.15.Dockerfile | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 docker/v2.0.15.Dockerfile diff --git a/docker/v2.0.15.Dockerfile b/docker/v2.0.15.Dockerfile new file mode 100644 index 0000000..03d9f2e --- /dev/null +++ b/docker/v2.0.15.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.15/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash From 7e0862676259ebf107e700bedab187bf99dae780 Mon Sep 17 00:00:00 2001 From: ngundotra Date: Mon, 11 Nov 2024 22:17:35 +0000 Subject: [PATCH 276/314] Update image whitelist --- src/image_config.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/image_config.rs b/src/image_config.rs index d6a035e..eaf5c96 100644 --- a/src/image_config.rs +++ b/src/image_config.rs @@ -190,6 +190,7 @@ lazy_static! { m.insert((2, 0, 12), "sha256:7b3ba5526fcf830537447e9e7f62f90a213eed552b89fd08b409b593cf984934"); m.insert((2, 0, 13), "sha256:b59946326904ffdfc4ec711b74e0ca2132ba69bf56c2fdbb5a795af65695f280"); m.insert((2, 0, 14), "sha256:50852861690e5cc97976f855dcca9094e127ae7850cc6cf35c0450c839f0b1df"); + m.insert((2, 0, 15), "sha256:37074d98411cbf37d1f0c7078878814cbc88bed0e7ad73cce78fff5326c94fbd"); m.insert((2, 1, 0), "sha256:d08b07367937bcf7ed6eb9c6ad5741cbb309c96246a554a4f266e386724953f5"); m }; From 5ec4ba5b83fe0366ab1fa50a2d294986bdf60c2f Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 11 Nov 2024 22:02:23 -0500 Subject: [PATCH 277/314] update lockfile with v0.3.0 --- Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 3b064e1..6eaf2f3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4019,7 +4019,7 @@ dependencies = [ [[package]] name = "solana-verify" -version = "0.2.14" +version = "0.3.0" dependencies = [ "anyhow", "borsh 1.5.0", From a8ea0ce5e83d5e72c1a09f11ac0c05d5f987008b Mon Sep 17 00:00:00 2001 From: ASCorreia <36857753+ASCorreia@users.noreply.github.com> Date: Wed, 20 Nov 2024 00:59:38 +0000 Subject: [PATCH 278/314] Added PDA upload after remote verification --- src/main.rs | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 87 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index f6601f3..cf9a614 100644 --- a/src/main.rs +++ b/src/main.rs @@ -692,7 +692,7 @@ pub async fn verify_from_repo( temp_dir_opt: &mut Option, ) -> anyhow::Result<()> { if remote { - let genesis_hash = get_genesis_hash(connection_url)?; + let genesis_hash = get_genesis_hash(connection_url.clone())?; if genesis_hash != MAINNET_GENESIS_HASH { return Err(anyhow!("Remote verification only works with mainnet. Please omit the --remote flag to verify locally.")); } @@ -704,11 +704,94 @@ pub async fn verify_from_repo( &program_id, &library_name_opt, bpf_flag, - relative_mount_path, - base_image, - cargo_args, + relative_mount_path.clone(), + base_image.clone(), + cargo_args.clone(), ) .await?; + + let mut args: Vec<&str> = Vec::new(); + if !relative_mount_path.is_empty() { + args.push("--mount-path"); + args.push(&relative_mount_path); + } + // Get the absolute build path to the solana program directory to build inside docker + let mount_path = PathBuf::from(relative_mount_path.clone()); + println!("Build path: {:?}", mount_path); + + args.push("--library-name"); + let library_name = match library_name_opt { + Some(p) => p, + None => { + std::process::Command::new("find") + .args([mount_path.to_str().unwrap(), "-name", "Cargo.toml"]) + .output() + .map_err(|e| { + anyhow::format_err!( + "Failed to find Cargo.toml files in root directory: {}", + e.to_string() + ) + }) + .and_then(|output| { + let mut options = vec![]; + for path in String::from_utf8(output.stdout)?.split("\n") { + match get_lib_name_from_cargo_toml(path) { + Ok(name) => { + options.push(name); + } + Err(_) => { + continue; + } + } + } + if options.len() != 1 { + println!( + "Found multiple possible targets in root directory: {:?}", + options + ); + println!( + "Please explicitly specify the target with the --package-name option", + ); + Err(anyhow::format_err!( + "Failed to find unique Cargo.toml file in root directory" + )) + } else { + Ok(options[0].clone()) + } + })? + } + }; + args.push(&library_name); + println!("Verifying program: {}", library_name); + + if let Some(base_image) = &base_image { + args.push("--base-image"); + args.push(base_image); + } + + if bpf_flag { + args.push("--bpf"); + } + + if !cargo_args.clone().is_empty() { + args.push("--"); + for arg in &cargo_args { + args.push(arg); + } + } + + let x = upload_program( + repo_url, + &commit_hash.clone(), + args.iter().map(|&s| s.into()).collect(), + program_id, + connection_url, + ) + .await; + if x.is_err() { + println!("Error uploading program: {:?}", x); + exit(1); + } return Ok(()); } // Create a Vec to store solana-verify args From acbf4d1e5ade84a2cbdd4d3641cc303a2bdd2a5d Mon Sep 17 00:00:00 2001 From: skrrb Date: Wed, 20 Nov 2024 10:25:42 +0100 Subject: [PATCH 279/314] displays help if no subcommand is provided --- src/main.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 320e7be..9e39c3f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ use anyhow::anyhow; use cargo_lock::Lockfile; use cargo_toml::Manifest; -use clap::{App, Arg, SubCommand}; +use clap::{App, AppSettings, Arg, SubCommand}; use signal_hook::{ consts::{SIGINT, SIGTERM}, iterator::Signals, @@ -69,6 +69,7 @@ async fn main() -> anyhow::Result<()> { .author("Ellipsis Labs ") .version(env!("CARGO_PKG_VERSION")) .about("A CLI tool for building verifiable Solana programs") + .setting(AppSettings::SubcommandRequiredElseHelp) .arg(Arg::with_name("url") .short("u") .long("url") From 122f3ff45c5124aa71ec8037a35528115f3632b9 Mon Sep 17 00:00:00 2001 From: ASCorreia <36857753+ASCorreia@users.noreply.github.com> Date: Thu, 21 Nov 2024 00:28:09 +0000 Subject: [PATCH 280/314] Added flag to skip prompt to upload program --- src/main.rs | 9 +++++++++ src/solana_program.rs | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 636c9e1..8051b3e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -173,6 +173,10 @@ async fn main() -> anyhow::Result<()> { .arg(Arg::with_name("current-dir") .long("current-dir") .help("Verify in current directory")) + .arg(Arg::with_name("skip-prompt") + .short("y") + .long("skip-prompt") + .help("Skip the prompt to upload a new program")) .arg(Arg::with_name("cargo-args") .multiple(true) .last(true) @@ -255,6 +259,7 @@ async fn main() -> anyhow::Result<()> { let library_name = sub_m.value_of("library-name").map(|s| s.to_string()); let bpf_flag = sub_m.is_present("bpf"); let current_dir = sub_m.is_present("current-dir"); + let skip_prompt = sub_m.is_present("skip-prompt"); let cargo_args: Vec = sub_m .values_of("cargo-args") .unwrap_or_default() @@ -273,6 +278,7 @@ async fn main() -> anyhow::Result<()> { bpf_flag, cargo_args, current_dir, + skip_prompt, &mut container_id, &mut temp_dir, ) @@ -722,6 +728,7 @@ pub async fn verify_from_repo( bpf_flag: bool, cargo_args: Vec, current_dir: bool, + skip_prompt: bool, container_id_opt: &mut Option, temp_dir_opt: &mut Option, ) -> anyhow::Result<()> { @@ -820,6 +827,7 @@ pub async fn verify_from_repo( args.iter().map(|&s| s.into()).collect(), program_id, connection_url, + skip_prompt, ) .await; if x.is_err() { @@ -979,6 +987,7 @@ pub async fn verify_from_repo( args.iter().map(|&s| s.into()).collect(), program_id, connection_url, + false, ) .await; if x.is_err() { diff --git a/src/solana_program.rs b/src/solana_program.rs index e1f0ae7..fa46ba3 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -134,8 +134,9 @@ pub async fn upload_program( args: Vec, program_address: Pubkey, connection_url: Option, + skip_prompt: bool, ) -> anyhow::Result<()> { - if prompt_user_input( + if skip_prompt || prompt_user_input( "Do you want to upload the program verification to the Solana Blockchain? (y/n) ", ) { println!("Uploading the program verification params to the Solana blockchain..."); From 58f679e1e318b7bf43a3e1f5186c52dc40f2d224 Mon Sep 17 00:00:00 2001 From: ASCorreia <36857753+ASCorreia@users.noreply.github.com> Date: Thu, 21 Nov 2024 00:29:08 +0000 Subject: [PATCH 281/314] minor changes --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 8051b3e..e9134b8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -987,7 +987,7 @@ pub async fn verify_from_repo( args.iter().map(|&s| s.into()).collect(), program_id, connection_url, - false, + skip_prompt, ) .await; if x.is_err() { From 57de327c2a2090185615b8580f126eada4f97de0 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Thu, 21 Nov 2024 10:24:15 -0500 Subject: [PATCH 282/314] add kp --- src/main.rs | 17 +++++++++++++---- src/solana_program.rs | 40 ++++++++++++++++++++++++++++------------ 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/src/main.rs b/src/main.rs index e9134b8..8b07389 100644 --- a/src/main.rs +++ b/src/main.rs @@ -177,6 +177,10 @@ async fn main() -> anyhow::Result<()> { .short("y") .long("skip-prompt") .help("Skip the prompt to upload a new program")) + .arg(Arg::with_name("keypair") + .short("k") + .long("keypair") + .help("Optionally specify a keypair to use for uploading the program verification args")) .arg(Arg::with_name("cargo-args") .multiple(true) .last(true) @@ -260,6 +264,7 @@ async fn main() -> anyhow::Result<()> { let bpf_flag = sub_m.is_present("bpf"); let current_dir = sub_m.is_present("current-dir"); let skip_prompt = sub_m.is_present("skip-prompt"); + let path_to_keypair = sub_m.value_of("keypair").map(|s| s.to_string()); let cargo_args: Vec = sub_m .values_of("cargo-args") .unwrap_or_default() @@ -279,6 +284,7 @@ async fn main() -> anyhow::Result<()> { cargo_args, current_dir, skip_prompt, + path_to_keypair, &mut container_id, &mut temp_dir, ) @@ -729,6 +735,7 @@ pub async fn verify_from_repo( cargo_args: Vec, current_dir: bool, skip_prompt: bool, + path_to_keypair: Option, container_id_opt: &mut Option, temp_dir_opt: &mut Option, ) -> anyhow::Result<()> { @@ -759,7 +766,7 @@ pub async fn verify_from_repo( // Get the absolute build path to the solana program directory to build inside docker let mount_path = PathBuf::from(relative_mount_path.clone()); println!("Build path: {:?}", mount_path); - + args.push("--library-name"); let library_name = match library_name_opt { Some(p) => p, @@ -804,16 +811,16 @@ pub async fn verify_from_repo( }; args.push(&library_name); println!("Verifying program: {}", library_name); - + if let Some(base_image) = &base_image { args.push("--base-image"); args.push(base_image); } - + if bpf_flag { args.push("--bpf"); } - + if !cargo_args.clone().is_empty() { args.push("--"); for arg in &cargo_args { @@ -828,6 +835,7 @@ pub async fn verify_from_repo( program_id, connection_url, skip_prompt, + path_to_keypair, ) .await; if x.is_err() { @@ -988,6 +996,7 @@ pub async fn verify_from_repo( program_id, connection_url, skip_prompt, + path_to_keypair, ) .await; if x.is_err() { diff --git a/src/solana_program.rs b/src/solana_program.rs index fa46ba3..378e40c 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -60,19 +60,18 @@ fn create_ix_data(params: &InputParams, ix: &OtterVerifyInstructions) -> Vec data } +fn get_keypair_from_path(path: &str) -> anyhow::Result { + solana_clap_utils::keypair::keypair_from_path(&Default::default(), &path, "keypair", false) + .map_err(|err| anyhow!("Unable to get signer from path: {}", err)) +} + fn get_user_config() -> anyhow::Result<(Keypair, RpcClient)> { let config_file = solana_cli_config::CONFIG_FILE .as_ref() .ok_or_else(|| anyhow!("Unable to get config file path"))?; let cli_config: Config = Config::load(config_file)?; - let signer = solana_clap_utils::keypair::keypair_from_path( - &Default::default(), - &cli_config.keypair_path, - "keypair", - false, - ) - .map_err(|err| anyhow!("Unable to get signer from path: {}", err))?; + let signer = get_keypair_from_path(&cli_config.keypair_path)?; let rpc_client = RpcClient::new(cli_config.json_rpc_url.clone()); Ok((signer, rpc_client)) @@ -84,9 +83,14 @@ fn process_otter_verify_ixs( program_address: Pubkey, instruction: OtterVerifyInstructions, rpc_client: RpcClient, + path_to_keypair: Option, ) -> anyhow::Result<()> { let user_config = get_user_config()?; - let signer = user_config.0; + let signer = if let Some(path_to_keypair) = path_to_keypair { + get_keypair_from_path(&path_to_keypair)? + } else { + user_config.0 + }; let signer_pubkey = signer.pubkey(); let connection = rpc_client; @@ -135,15 +139,23 @@ pub async fn upload_program( program_address: Pubkey, connection_url: Option, skip_prompt: bool, + path_to_keypair: Option, ) -> anyhow::Result<()> { - if skip_prompt || prompt_user_input( - "Do you want to upload the program verification to the Solana Blockchain? (y/n) ", - ) { + if skip_prompt + || prompt_user_input( + "Do you want to upload the program verification to the Solana Blockchain? (y/n) ", + ) + { println!("Uploading the program verification params to the Solana blockchain..."); let cli_config = get_user_config()?; - let signer_pubkey = cli_config.0.pubkey(); + let signer_pubkey: Pubkey = if let Some(ref path_to_keypair) = path_to_keypair { + get_keypair_from_path(&path_to_keypair)?.pubkey() + } else { + cli_config.0.pubkey() + }; + let connection = match connection_url.as_deref() { Some("m") => RpcClient::new("https://api.mainnet-beta.solana.com"), Some("d") => RpcClient::new("https://api.devnet.solana.com"), @@ -194,6 +206,7 @@ pub async fn upload_program( program_address, OtterVerifyInstructions::Update, connection, + path_to_keypair, )?; } else if connection.get_account(&pda_account_2).is_ok() { let wanna_create_new_pda = prompt_user_input( @@ -206,6 +219,7 @@ pub async fn upload_program( program_address, OtterVerifyInstructions::Initialize, connection, + path_to_keypair, )?; } return Ok(()); @@ -217,6 +231,7 @@ pub async fn upload_program( program_address, OtterVerifyInstructions::Initialize, connection, + path_to_keypair, )?; } } else { @@ -260,6 +275,7 @@ pub async fn process_close(program_address: Pubkey) -> anyhow::Result<()> { program_address, OtterVerifyInstructions::Close, connection, + None, )?; } else { return Err(anyhow!( From 40d36dc10b2e5fa647338ba57817b08ae93ef5de Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Thu, 21 Nov 2024 11:20:06 -0500 Subject: [PATCH 283/314] add list pdas, fix skip-prompt --- Cargo.lock | 1 + Cargo.toml | 1 + src/main.rs | 26 +++++++++++++++ src/solana_program.rs | 73 +++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 99 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6eaf2f3..aa9923c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4037,6 +4037,7 @@ dependencies = [ "serde_json", "sha256", "signal-hook", + "solana-account-decoder", "solana-clap-utils", "solana-cli-config", "solana-client", diff --git a/Cargo.toml b/Cargo.toml index 2086177..9fa04a0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,6 +28,7 @@ solana-cli-config = "=1.18.23" solana-client = "=1.18.23" solana-sdk = "=1.18.23" tokio = { version = "1.29.1", features = ["full"] } +solana-account-decoder = "1.18.23" [dependencies.uuid] version = "1.2.2" diff --git a/src/main.rs b/src/main.rs index 8b07389..b0f0ef8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,7 @@ use signal_hook::{ }; use solana_cli_config::{Config, CONFIG_FILE}; use solana_client::rpc_client::RpcClient; +use solana_program::get_all_pdas_available; use solana_sdk::{ bpf_loader_upgradeable::{self, UpgradeableLoaderState}, pubkey::Pubkey, @@ -180,6 +181,7 @@ async fn main() -> anyhow::Result<()> { .arg(Arg::with_name("keypair") .short("k") .long("keypair") + .takes_value(true) .help("Optionally specify a keypair to use for uploading the program verification args")) .arg(Arg::with_name("cargo-args") .multiple(true) @@ -192,6 +194,11 @@ async fn main() -> anyhow::Result<()> { .required(true) .takes_value(true) .help("The address of the program to close the PDA"))) + .subcommand(SubCommand::with_name("list-program-pdas") + .about("List all the PDA information associated with a program ID") + .arg(Arg::with_name("program-id") + .required(true) + .help("Program ID of the program to list PDAs for"))) .get_matches(); let res = match matches.subcommand() { @@ -271,6 +278,7 @@ async fn main() -> anyhow::Result<()> { .map(|s| s.to_string()) .collect(); + println!(" Skipping prompt: {}", skip_prompt); verify_from_repo( remote, mount_path, @@ -294,6 +302,11 @@ async fn main() -> anyhow::Result<()> { let program_id = sub_m.value_of("program-id").unwrap(); process_close(Pubkey::try_from(program_id)?).await } + ("list-program-pdas", Some(sub_m)) => { + let program_id = sub_m.value_of("program-id").unwrap(); + let url = matches.value_of("url").map(|s| s.to_string()); + list_program_pdas(Pubkey::try_from(program_id)?, url).await + } // Handle other subcommands in a similar manner, for now let's panic _ => panic!( "Unknown subcommand: {:?}\nUse '--help' to see available commands", @@ -1105,3 +1118,16 @@ pub fn get_pkg_name_from_cargo_toml(cargo_toml_file: &str) -> Option { let pkg = manifest.package?; Some(pkg.name) } + +pub async fn list_program_pdas(program_id: Pubkey, url: Option) -> anyhow::Result<()> { + let client = get_client(url); + let pdas = get_all_pdas_available(&client, &program_id).await?; + for (pda, build_params) in pdas { + println!("----------------------------------------------------------------"); + println!("PDA: {:?}", pda); + println!("----------------------------------------------------------------"); + println!("{}", build_params); + } + // println!("PDAs for program {}: {:?}", program_id, pdas); + Ok(()) +} diff --git a/src/solana_program.rs b/src/solana_program.rs index 378e40c..d5599ee 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -1,6 +1,10 @@ use anyhow::anyhow; use solana_cli_config::Config; -use solana_client::rpc_client::RpcClient; +use solana_client::{ + rpc_client::RpcClient, + rpc_config::RpcProgramAccountsConfig, + rpc_filter::{Memcmp, RpcFilterType}, +}; use std::{ io::{self, Read, Write}, str::FromStr, @@ -12,11 +16,38 @@ use solana_sdk::{ system_program, transaction::Transaction, }; +use solana_account_decoder::UiAccountEncoding; +use solana_sdk::commitment_config::{CommitmentConfig, CommitmentLevel}; + use crate::api::get_last_deployed_slot; const OTTER_VERIFY_PROGRAMID: &str = "verifycLy8mB96wd9wqq3WDXQwM4oU6r42Th37Db9fC"; const OTTER_SIGNER: &str = "9VWiUUhgNoRwTH5NVehYJEDwcotwYX3VgW4MChiHPAqU"; +#[derive(BorshDeserialize, BorshSerialize, Debug)] +pub struct OtterBuildParams { + pub address: Pubkey, + pub signer: Pubkey, + pub version: String, + pub git_url: String, + pub commit: String, + pub args: Vec, + pub deployed_slot: u64, + bump: u8, +} +impl std::fmt::Display for OtterBuildParams { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + writeln!(f, "Program Id: {}", self.address)?; + writeln!(f, "Signer: {}", self.signer)?; + writeln!(f, "Git Url: {}", self.git_url)?; + writeln!(f, "Commit: {}", self.commit)?; + writeln!(f, "Deployed Slot: {}", self.deployed_slot)?; + writeln!(f, "Args: {:?}", self.args)?; + writeln!(f, "Version: {}", self.version)?; + Ok(()) + } +} + pub fn prompt_user_input(message: &str) -> bool { let mut buffer = [0; 1]; print!("{}", message); @@ -209,7 +240,7 @@ pub async fn upload_program( path_to_keypair, )?; } else if connection.get_account(&pda_account_2).is_ok() { - let wanna_create_new_pda = prompt_user_input( + let wanna_create_new_pda = skip_prompt || prompt_user_input( "Program already uploaded by another signer. Do you want to upload a new program? (Y/n)" ); if wanna_create_new_pda { @@ -285,3 +316,41 @@ pub async fn process_close(program_address: Pubkey) -> anyhow::Result<()> { Ok(()) } + +pub async fn get_all_pdas_available( + client: &RpcClient, + program_id_pubkey: &Pubkey, +) -> anyhow::Result> { + let filter = vec![RpcFilterType::Memcmp(Memcmp::new_base58_encoded( + 8, + &program_id_pubkey.to_bytes(), + ))]; + + let config = RpcProgramAccountsConfig { + filters: Some(filter), + account_config: solana_client::rpc_config::RpcAccountInfoConfig { + encoding: Some(UiAccountEncoding::Base64), + data_slice: None, + commitment: Some(CommitmentConfig { + commitment: CommitmentLevel::Confirmed, + }), + min_context_slot: None, + }, + with_context: None, + }; + + let accounts = client.get_program_accounts_with_config( + &Pubkey::from_str(OTTER_VERIFY_PROGRAMID).unwrap(), + config, + )?; + + let mut pdas = vec![]; + for account in accounts { + let otter_build_params = OtterBuildParams::try_from_slice(&account.1.data[8..]); + if let Ok(otter_build_params) = otter_build_params { + pdas.push((account.0, otter_build_params)); + } + } + + Ok(pdas) +} From 6924d099d0252d7c4bcd576c8dd531246aab5b29 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Thu, 21 Nov 2024 11:29:35 -0500 Subject: [PATCH 284/314] improve error message for close --- src/main.rs | 3 ++- src/solana_program.rs | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index b0f0ef8..71ec2de 100644 --- a/src/main.rs +++ b/src/main.rs @@ -197,7 +197,9 @@ async fn main() -> anyhow::Result<()> { .subcommand(SubCommand::with_name("list-program-pdas") .about("List all the PDA information associated with a program ID") .arg(Arg::with_name("program-id") + .long("program-id") .required(true) + .takes_value(true) .help("Program ID of the program to list PDAs for"))) .get_matches(); @@ -1128,6 +1130,5 @@ pub async fn list_program_pdas(program_id: Pubkey, url: Option) -> anyho println!("----------------------------------------------------------------"); println!("{}", build_params); } - // println!("PDAs for program {}: {:?}", program_id, pdas); Ok(()) } diff --git a/src/solana_program.rs b/src/solana_program.rs index d5599ee..5ed5954 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -310,7 +310,10 @@ pub async fn process_close(program_address: Pubkey) -> anyhow::Result<()> { )?; } else { return Err(anyhow!( - "Program account does not exist. Please provide the program address not PDA address." + "No PDA found for signer {:?} and program address {:?}. Make sure you are providing the program address, not the PDA address. Check that a signer exists for the program by running `solana-verify list-program-pdas --program-id {:?}`", + signer_pubkey, + program_address, + program_address )); } From cb90be6763a3cd150ec9739786828fed4f4cc1a6 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Thu, 21 Nov 2024 14:05:03 -0500 Subject: [PATCH 285/314] add command to get pda --- src/api/solana.rs | 11 +++-- src/main.rs | 83 ++++++++++++++++++++----------- src/solana_program.rs | 112 ++++++++++++++++++++++++------------------ 3 files changed, 127 insertions(+), 79 deletions(-) diff --git a/src/api/solana.rs b/src/api/solana.rs index 63e9a2d..1605b2f 100644 --- a/src/api/solana.rs +++ b/src/api/solana.rs @@ -2,6 +2,7 @@ use reqwest::Client; use serde::Deserialize; +use solana_client::rpc_client::RpcClient; use std::error::Error; #[derive(Deserialize)] @@ -83,13 +84,13 @@ async fn get_account_info( } pub async fn get_last_deployed_slot( - rpc_url: &str, + connection: &RpcClient, program_address: &str, ) -> Result> { let client = Client::new(); // Step 1: Get account info for the program address - let account_info = get_account_info(&client, rpc_url, program_address).await?; + let account_info = get_account_info(&client, &connection.url(), program_address).await?; let program_data_address = account_info .data .parsed @@ -98,7 +99,8 @@ pub async fn get_last_deployed_slot( .ok_or("No programData found in program account response")?; // Step 2: Get account info for the program data address - let program_data_info = get_account_info(&client, rpc_url, &program_data_address).await?; + let program_data_info = + get_account_info(&client, &connection.url(), &program_data_address).await?; let last_deployed_slot = program_data_info .data .parsed @@ -117,7 +119,8 @@ mod tests { async fn test_get_last_deployed_slot() { let rpc_url = "https://docs-demo.solana-mainnet.quiknode.pro"; let program_address = "verifycLy8mB96wd9wqq3WDXQwM4oU6r42Th37Db9fC"; - let last_deployed_slot = get_last_deployed_slot(rpc_url, program_address).await; + let last_deployed_slot = + get_last_deployed_slot(&RpcClient::new(rpc_url), program_address).await; assert!(last_deployed_slot.is_ok()); } } diff --git a/src/main.rs b/src/main.rs index ae49d03..a443ed3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,7 +8,7 @@ use signal_hook::{ }; use solana_cli_config::{Config, CONFIG_FILE}; use solana_client::rpc_client::RpcClient; -use solana_program::get_all_pdas_available; +use solana_program::{get_all_pdas_available, get_program_pda, resolve_rpc_url, OtterBuildParams}; use solana_sdk::{ bpf_loader_upgradeable::{self, UpgradeableLoaderState}, pubkey::Pubkey, @@ -196,14 +196,29 @@ async fn main() -> anyhow::Result<()> { .takes_value(true) .help("The address of the program to close the PDA"))) .subcommand(SubCommand::with_name("list-program-pdas") - .about("List all the PDA information associated with a program ID") + .about("List all the PDA information associated with a program ID. Requires custom RPC endpoint") + .arg(Arg::with_name("program-id") + .long("program-id") + .required(true) + .takes_value(true))) + .subcommand(SubCommand::with_name("get-program-pda") + .about("Get uploaded PDA information for a given program ID and signer") .arg(Arg::with_name("program-id") .long("program-id") .required(true) .takes_value(true) - .help("Program ID of the program to list PDAs for"))) + ) + .arg(Arg::with_name("signer") + .short("s") + .long("signer") + .required(false) + .takes_value(true) + .help("Signer to get the PDA for") + ) + ) .get_matches(); + let connection = resolve_rpc_url(matches.value_of("url").map(|s| s.to_string()))?; let res = match matches.subcommand() { ("build", Some(sub_m)) => { let mount_directory = sub_m.value_of("mount-directory").map(|s| s.to_string()); @@ -256,10 +271,7 @@ async fn main() -> anyhow::Result<()> { } ("get-program-hash", Some(sub_m)) => { let program_id = sub_m.value_of("program-id").unwrap(); - let program_hash = get_program_hash( - matches.value_of("url").map(|s| s.to_string()), - Pubkey::try_from(program_id)?, - )?; + let program_hash = get_program_hash(&connection, Pubkey::try_from(program_id)?)?; println!("{}", program_hash); Ok(()) } @@ -285,7 +297,7 @@ async fn main() -> anyhow::Result<()> { verify_from_repo( remote, mount_path, - matches.value_of("url").map(|s| s.to_string()), + &connection, repo_url, commit_hash, Pubkey::try_from(program_id)?, @@ -303,12 +315,16 @@ async fn main() -> anyhow::Result<()> { } ("close", Some(sub_m)) => { let program_id = sub_m.value_of("program-id").unwrap(); - process_close(Pubkey::try_from(program_id)?).await + process_close(Pubkey::try_from(program_id)?, &connection).await } ("list-program-pdas", Some(sub_m)) => { let program_id = sub_m.value_of("program-id").unwrap(); - let url = matches.value_of("url").map(|s| s.to_string()); - list_program_pdas(Pubkey::try_from(program_id)?, url).await + list_program_pdas(Pubkey::try_from(program_id)?, &connection).await + } + ("get-program-pda", Some(sub_m)) => { + let program_id = sub_m.value_of("program-id").unwrap(); + let signer = sub_m.value_of("signer").map(|s| s.to_string()); + print_program_pda(Pubkey::try_from(program_id)?, signer, &connection).await } // Handle other subcommands in a similar manner, for now let's panic _ => panic!( @@ -387,8 +403,7 @@ pub fn get_buffer_hash(url: Option, buffer_address: Pubkey) -> anyhow::R Ok(program_hash) } -pub fn get_program_hash(url: Option, program_id: Pubkey) -> anyhow::Result { - let client = get_client(url); +pub fn get_program_hash(client: &RpcClient, program_id: Pubkey) -> anyhow::Result { let program_buffer = Pubkey::find_program_address(&[program_id.as_ref()], &bpf_loader_upgradeable::id()).0; let offset = UpgradeableLoaderState::size_of_programdata_metadata(); @@ -397,8 +412,7 @@ pub fn get_program_hash(url: Option, program_id: Pubkey) -> anyhow::Resu Ok(program_hash) } -pub fn get_genesis_hash(url: Option) -> anyhow::Result { - let client = get_client(url); +pub fn get_genesis_hash(client: &RpcClient) -> anyhow::Result { let genesis_hash = client.get_genesis_hash()?; Ok(genesis_hash.to_string()) } @@ -741,7 +755,7 @@ pub fn verify_from_image( pub async fn verify_from_repo( remote: bool, relative_mount_path: String, - connection_url: Option, + connection: &RpcClient, repo_url: String, commit_hash: Option, program_id: Pubkey, @@ -756,7 +770,7 @@ pub async fn verify_from_repo( temp_dir_opt: &mut Option, ) -> anyhow::Result<()> { if remote { - let genesis_hash = get_genesis_hash(connection_url.clone())?; + let genesis_hash = get_genesis_hash(connection)?; if genesis_hash != MAINNET_GENESIS_HASH { return Err(anyhow!("Remote verification only works with mainnet. Please omit the --remote flag to verify locally.")); } @@ -849,7 +863,7 @@ pub async fn verify_from_repo( &commit_hash.clone(), args.iter().map(|&s| s.into()).collect(), program_id, - connection_url, + connection, skip_prompt, path_to_keypair, ) @@ -987,7 +1001,7 @@ pub async fn verify_from_repo( base_image.clone(), bpf_flag, library_name.clone(), - connection_url.clone(), + connection, program_id, cargo_args.clone(), container_id_opt, @@ -1010,7 +1024,7 @@ pub async fn verify_from_repo( &commit_hash.clone(), args.iter().map(|&s| s.into()).collect(), program_id, - connection_url, + connection, skip_prompt, path_to_keypair, ) @@ -1035,7 +1049,7 @@ pub fn build_and_verify_repo( base_image: Option, bpf_flag: bool, library_name: String, - connection_url: Option, + connection: &RpcClient, program_id: Pubkey, cargo_args: Vec, container_id_opt: &mut Option, @@ -1069,7 +1083,7 @@ pub fn build_and_verify_repo( "Fetching on-chain program data for program ID: {}", program_id, ); - let program_hash = get_program_hash(connection_url, program_id)?; + let program_hash = get_program_hash(connection, program_id)?; Ok((build_hash, program_hash)) } @@ -1122,14 +1136,27 @@ pub fn get_pkg_name_from_cargo_toml(cargo_toml_file: &str) -> Option { Some(pkg.name) } -pub async fn list_program_pdas(program_id: Pubkey, url: Option) -> anyhow::Result<()> { - let client = get_client(url); +pub fn print_build_params(pubkey: &Pubkey, build_params: &OtterBuildParams) { + println!("----------------------------------------------------------------"); + println!("Address: {:?}", pubkey); + println!("----------------------------------------------------------------"); + println!("{}", build_params); +} + +pub async fn list_program_pdas(program_id: Pubkey, client: &RpcClient) -> anyhow::Result<()> { let pdas = get_all_pdas_available(&client, &program_id).await?; for (pda, build_params) in pdas { - println!("----------------------------------------------------------------"); - println!("PDA: {:?}", pda); - println!("----------------------------------------------------------------"); - println!("{}", build_params); + print_build_params(&pda, &build_params); } Ok(()) } + +pub async fn print_program_pda( + program_id: Pubkey, + signer: Option, + client: &RpcClient, +) -> anyhow::Result<()> { + let (pda, build_params) = get_program_pda(&client, &program_id, signer).await?; + print_build_params(&pda, &build_params); + Ok(()) +} diff --git a/src/solana_program.rs b/src/solana_program.rs index 5ed5954..8d31ab8 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -21,7 +21,8 @@ use solana_sdk::commitment_config::{CommitmentConfig, CommitmentLevel}; use crate::api::get_last_deployed_slot; -const OTTER_VERIFY_PROGRAMID: &str = "verifycLy8mB96wd9wqq3WDXQwM4oU6r42Th37Db9fC"; +const OTTER_VERIFY_PROGRAM_ID: Pubkey = + solana_sdk::pubkey!("verifycLy8mB96wd9wqq3WDXQwM4oU6r42Th37Db9fC"); const OTTER_SIGNER: &str = "9VWiUUhgNoRwTH5NVehYJEDwcotwYX3VgW4MChiHPAqU"; #[derive(BorshDeserialize, BorshSerialize, Debug)] @@ -113,7 +114,7 @@ fn process_otter_verify_ixs( pda_account: Pubkey, program_address: Pubkey, instruction: OtterVerifyInstructions, - rpc_client: RpcClient, + rpc_client: &RpcClient, path_to_keypair: Option, ) -> anyhow::Result<()> { let user_config = get_user_config()?; @@ -130,7 +131,6 @@ fn process_otter_verify_ixs( } else { instruction.get_discriminant() }; - let otter_verify_program_id = Pubkey::from_str(OTTER_VERIFY_PROGRAMID)?; let mut accounts_meta_vec = vec![ AccountMeta::new(pda_account, false), @@ -143,7 +143,7 @@ fn process_otter_verify_ixs( } let ix = solana_sdk::instruction::Instruction::new_with_bytes( - otter_verify_program_id, + OTTER_VERIFY_PROGRAM_ID, &ix_data, accounts_meta_vec, ); @@ -163,12 +163,27 @@ fn process_otter_verify_ixs( Ok(()) } +pub fn resolve_rpc_url(url: Option) -> anyhow::Result { + let cli_config = get_user_config()?; + + let connection = match url.as_deref() { + Some("m") => RpcClient::new("https://api.mainnet-beta.solana.com"), + Some("d") => RpcClient::new("https://api.devnet.solana.com"), + Some("t") => RpcClient::new("https://api.testnet.solana.com"), + Some("l") => RpcClient::new("http://localhost:8899"), + Some(url) => RpcClient::new(url), + None => cli_config.1, + }; + + Ok(connection) +} + pub async fn upload_program( git_url: String, commit: &Option, args: Vec, program_address: Pubkey, - connection_url: Option, + connection: &RpcClient, skip_prompt: bool, path_to_keypair: Option, ) -> anyhow::Result<()> { @@ -187,17 +202,10 @@ pub async fn upload_program( cli_config.0.pubkey() }; - let connection = match connection_url.as_deref() { - Some("m") => RpcClient::new("https://api.mainnet-beta.solana.com"), - Some("d") => RpcClient::new("https://api.devnet.solana.com"), - Some("l") => RpcClient::new("http://localhost:8899"), - Some(url) => RpcClient::new(url), - None => cli_config.1, - }; - let rpc_url = connection.url(); - println!("Using connection url: {}", rpc_url); + // let rpc_url = connection.url(); + println!("Using connection url: {}", connection.url()); - let last_deployed_slot = get_last_deployed_slot(&rpc_url, &program_address.to_string()) + let last_deployed_slot = get_last_deployed_slot(&connection, &program_address.to_string()) .await .map_err(|err| anyhow!("Unable to get last deployed slot: {}", err))?; @@ -209,25 +217,12 @@ pub async fn upload_program( deployed_slot: last_deployed_slot, }; - let otter_verify_program_id = Pubkey::from_str(OTTER_VERIFY_PROGRAMID)?; - // Possible PDA-1: Signer is current signer then we can update the program - let seeds: &[&[u8]; 3] = &[ - b"otter_verify", - &signer_pubkey.to_bytes(), - &program_address.to_bytes(), - ]; - - let (pda_account_1, _) = Pubkey::find_program_address(seeds, &otter_verify_program_id); + let pda_account_1 = find_build_params_pda(&program_address, &signer_pubkey).0; // Possible PDA-2: signer is otter signer let otter_signer = Pubkey::from_str(OTTER_SIGNER)?; - let seeds: &[&[u8]; 3] = &[ - b"otter_verify", - &otter_signer.to_bytes(), - &program_address.to_bytes(), - ]; - let (pda_account_2, _) = Pubkey::find_program_address(seeds, &otter_verify_program_id); + let pda_account_2 = find_build_params_pda(&program_address, &otter_signer).0; if connection.get_account(&pda_account_1).is_ok() { println!("Program already uploaded by the current signer. Updating the program."); @@ -272,26 +267,21 @@ pub async fn upload_program( Ok(()) } -pub async fn process_close(program_address: Pubkey) -> anyhow::Result<()> { +fn find_build_params_pda(program_id: &Pubkey, signer: &Pubkey) -> (Pubkey, u8) { + let seeds: &[&[u8]; 3] = &[b"otter_verify", &signer.to_bytes(), &program_id.to_bytes()]; + Pubkey::find_program_address(seeds, &OTTER_VERIFY_PROGRAM_ID) +} + +pub async fn process_close(program_address: Pubkey, connection: &RpcClient) -> anyhow::Result<()> { let user_config = get_user_config()?; let signer = user_config.0; let signer_pubkey = signer.pubkey(); - let connection = user_config.1; - let rpc_url = connection.url(); - let last_deployed_slot = get_last_deployed_slot(&rpc_url, &program_address.to_string()) + let last_deployed_slot = get_last_deployed_slot(&connection, &program_address.to_string()) .await .map_err(|err| anyhow!("Unable to get last deployed slot: {}", err))?; - let otter_verify_program_id = Pubkey::from_str(OTTER_VERIFY_PROGRAMID)?; - - let seeds: &[&[u8]; 3] = &[ - b"otter_verify", - &signer_pubkey.to_bytes(), - &program_address.to_bytes(), - ]; - - let (pda_account, _) = Pubkey::find_program_address(seeds, &otter_verify_program_id); + let pda_account = find_build_params_pda(&program_address, &signer_pubkey).0; if connection.get_account(&pda_account).is_ok() { process_otter_verify_ixs( @@ -320,6 +310,37 @@ pub async fn process_close(program_address: Pubkey) -> anyhow::Result<()> { Ok(()) } +pub async fn get_program_pda( + client: &RpcClient, + program_id: &Pubkey, + signer_pubkey: Option, +) -> anyhow::Result<(Pubkey, OtterBuildParams)> { + let signer_pubkey = if let Some(signer_pubkey) = signer_pubkey { + Pubkey::from_str(&signer_pubkey)? + } else { + get_user_config()?.0.pubkey() + }; + + let pda = find_build_params_pda(program_id, &signer_pubkey).0; + let account = client + .get_account_with_commitment( + &pda, + CommitmentConfig { + commitment: CommitmentLevel::Confirmed, + }, + ) + .unwrap(); + if let Some(account) = account.value { + Ok(( + pda, + OtterBuildParams::try_from_slice(&account.data[8..]) + .map_err(|err| anyhow!("Unable to parse build params: {}", err))?, + )) + } else { + Err(anyhow!("PDA not found")) + } +} + pub async fn get_all_pdas_available( client: &RpcClient, program_id_pubkey: &Pubkey, @@ -342,10 +363,7 @@ pub async fn get_all_pdas_available( with_context: None, }; - let accounts = client.get_program_accounts_with_config( - &Pubkey::from_str(OTTER_VERIFY_PROGRAMID).unwrap(), - config, - )?; + let accounts = client.get_program_accounts_with_config(&OTTER_VERIFY_PROGRAM_ID, config)?; let mut pdas = vec![]; for account in accounts { From 939333eef77e5aaaebbf67f8071d2890de9b0462 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Thu, 21 Nov 2024 14:17:07 -0500 Subject: [PATCH 286/314] if no CLI config use default mainnet api --- src/solana_program.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/solana_program.rs b/src/solana_program.rs index 8d31ab8..2a60ab4 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -164,15 +164,19 @@ fn process_otter_verify_ixs( } pub fn resolve_rpc_url(url: Option) -> anyhow::Result { - let cli_config = get_user_config()?; - let connection = match url.as_deref() { Some("m") => RpcClient::new("https://api.mainnet-beta.solana.com"), Some("d") => RpcClient::new("https://api.devnet.solana.com"), Some("t") => RpcClient::new("https://api.testnet.solana.com"), Some("l") => RpcClient::new("http://localhost:8899"), Some(url) => RpcClient::new(url), - None => cli_config.1, + None => { + if let Ok(cli_config) = get_user_config() { + cli_config.1 + } else { + RpcClient::new("https://api.mainnet-beta.solana.com") + } + } }; Ok(connection) From 379e88b424ef0fddb4cb71800aec17dc0819eab1 Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Fri, 22 Nov 2024 21:59:40 +0100 Subject: [PATCH 287/314] Get commit hash from remote --- src/main.rs | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 82 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index a443ed3..1a2e3a7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,7 +16,7 @@ use solana_sdk::{ use std::{ io::Read, path::PathBuf, - process::{exit, Stdio}, + process::{exit, Command, Stdio}, sync::{ atomic::{AtomicBool, Ordering}, Arc, @@ -154,7 +154,7 @@ async fn main() -> anyhow::Result<()> { .arg(Arg::with_name("commit-hash") .long("commit-hash") .takes_value(true) - .help("Optional commit hash to checkout")) + .help("Commit hash to checkout. Required to know the correct program snapshot. Will fallback to HEAD if not provided")) .arg(Arg::with_name("program-id") .long("program-id") .required(true) @@ -279,7 +279,6 @@ async fn main() -> anyhow::Result<()> { let remote = sub_m.is_present("remote"); let mount_path = sub_m.value_of("mount-path").map(|s| s.to_string()).unwrap(); let repo_url = sub_m.value_of("repo-url").map(|s| s.to_string()).unwrap(); - let commit_hash = sub_m.value_of("commit-hash").map(|s| s.to_string()); let program_id = sub_m.value_of("program-id").unwrap(); let base_image = sub_m.value_of("base-image").map(|s| s.to_string()); let library_name = sub_m.value_of("library-name").map(|s| s.to_string()); @@ -293,13 +292,27 @@ async fn main() -> anyhow::Result<()> { .map(|s| s.to_string()) .collect(); - println!(" Skipping prompt: {}", skip_prompt); + let commit_hash = sub_m + .value_of("commit-hash") + .map(String::from) + .or_else(|| { + get_commit_hash_from_remote(&repo_url).ok() // Dynamically determine commit hash from remote + }) + .ok_or_else(|| { + anyhow::anyhow!( + "Commit hash must be provided or inferred from the remote repository" + ) + })?; + + println!("Commit hash from remote: {}", commit_hash); + + println!("Skipping prompt: {}", skip_prompt); verify_from_repo( remote, mount_path, &connection, repo_url, - commit_hash, + Some(commit_hash), Pubkey::try_from(program_id)?, base_image, library_name, @@ -375,6 +388,70 @@ pub fn get_client(url: Option) -> RpcClient { RpcClient::new(url) } +fn get_commit_hash_from_remote(repo_url: &str) -> anyhow::Result { + // Fetch the symbolic reference of the default branch + let output = Command::new("git") + .arg("ls-remote") + .arg("--symref") + .arg(repo_url) + .output() + .map_err(|e| anyhow::anyhow!("Failed to run git ls-remote: {}", e))?; + + if !output.status.success() { + return Err(anyhow::anyhow!( + "Failed to fetch default branch information: {}", + String::from_utf8_lossy(&output.stderr) + )); + } + + // Find out if the branch is called master or main + let output_str = String::from_utf8(output.stdout)?; + let default_branch = output_str + .lines() + .find_map(|line| { + if line.starts_with("ref: refs/heads/") { + Some( + line.trim_start_matches("ref: refs/heads/") + .split_whitespace() + .next()? + .to_string(), + ) + } else { + None + } + }) + .ok_or_else(|| { + anyhow::anyhow!( + "Unable to determine default branch from remote repository '{}'", + repo_url + ) + })?; + + println!("Default branch detected: {}", default_branch); + + // Fetch the latest commit hash for the default branch + let hash_output = Command::new("git") + .arg("ls-remote") + .arg(repo_url) + .arg(&default_branch) + .output() + .map_err(|e| anyhow::anyhow!("Failed to fetch commit hash for default branch: {}", e))?; + + if !hash_output.status.success() { + return Err(anyhow::anyhow!( + "Failed to fetch commit hash: {}", + String::from_utf8_lossy(&hash_output.stderr) + )); + } + + // Parse and return the commit hash + String::from_utf8(hash_output.stdout)? + .split_whitespace() + .next() + .map(|s| s.to_string()) + .ok_or_else(|| anyhow::anyhow!("Failed to parse commit hash from git ls-remote output")) +} + pub fn get_binary_hash(program_data: Vec) -> String { let buffer = program_data .into_iter() From 593b058b90d4c0f6f9b059284c5c8537198fd09b Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Fri, 22 Nov 2024 16:20:59 -0500 Subject: [PATCH 288/314] Update Cargo.toml Signed-off-by: Noah Gundotra --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 9fa04a0..c5ab689 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "solana-verify" -version = "0.3.0" +version = "0.3.1" edition = "2021" description = "A CLI tool for building verifiable Solana programs" license = "MIT" From eaf1f696e0e9a77197103298328b43ae2e9e32e8 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Fri, 22 Nov 2024 16:58:48 -0500 Subject: [PATCH 289/314] update lockfile w v0.3.1 --- Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index aa9923c..7f4bc06 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4019,7 +4019,7 @@ dependencies = [ [[package]] name = "solana-verify" -version = "0.3.0" +version = "0.3.1" dependencies = [ "anyhow", "borsh 1.5.0", From 5dc0b387d6df9bcac035553f604c3d4f36a5aa48 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 2 Dec 2024 12:42:16 -0500 Subject: [PATCH 290/314] add remote get-status --- src/api/client.rs | 22 +++++++++++++++++++++- src/api/mod.rs | 1 + src/api/models.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 17 +++++++++++++++++ 4 files changed, 85 insertions(+), 1 deletion(-) diff --git a/src/api/client.rs b/src/api/client.rs index 47eee55..b967ee3 100644 --- a/src/api/client.rs +++ b/src/api/client.rs @@ -8,7 +8,8 @@ use std::thread; use std::time::{Duration, Instant}; use crate::api::models::{ - ErrorResponse, JobResponse, JobStatus, JobVerificationResponse, VerifyResponse, + ErrorResponse, JobResponse, JobStatus, JobVerificationResponse, RemoteStatusResponseWrapper, + VerifyResponse, }; // URL for the remote server @@ -228,3 +229,22 @@ async fn check_job_status(client: &Client, request_id: &str) -> anyhow::Result anyhow::Result<()> { + let client = Client::builder() + .timeout(Duration::from_secs(18000)) + .build()?; + + let response = client + .get(format!( + "{}/status-all/{}", + REMOTE_SERVER_URL, + program_id.to_string() + )) + .send() + .await?; + + let status: RemoteStatusResponseWrapper = response.json().await?; + println!("{}", status); + Ok(()) +} diff --git a/src/api/mod.rs b/src/api/mod.rs index 3dbf24d..dae9698 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -2,5 +2,6 @@ mod client; mod models; mod solana; +pub use client::get_remote_status; pub use client::send_job_to_remote; pub use solana::get_last_deployed_slot; diff --git a/src/api/models.rs b/src/api/models.rs index b8c9114..22f9c9b 100644 --- a/src/api/models.rs +++ b/src/api/models.rs @@ -54,3 +54,49 @@ pub struct JobVerificationResponse { pub executable_hash: String, pub repo_url: String, } + +#[derive(Debug, Serialize, Deserialize)] +pub struct RemoteStatusResponse { + pub signer: String, + pub is_verified: bool, + pub on_chain_hash: String, + pub executable_hash: String, + pub repo_url: String, + pub commit: String, + pub last_verified_at: String, +} + +impl std::fmt::Display for RemoteStatusResponse { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + writeln!(f, "Verification Status for Signer: {}", self.signer)?; + writeln!( + f, + "Verified: {}", + if self.is_verified { "✅" } else { "❌" } + )?; + writeln!(f, "On-chain Hash: {}", self.on_chain_hash)?; + writeln!(f, "Executable Hash: {}", self.executable_hash)?; + writeln!(f, "Repository URL: {}", self.repo_url)?; + writeln!(f, "Commit: {}", self.commit)?; + write!(f, "Last Verified: {}", self.last_verified_at) + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct RemoteStatusResponseWrapper(Vec); + +impl std::fmt::Display for RemoteStatusResponseWrapper { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + for (i, response) in self.0.iter().enumerate() { + if i > 0 { + writeln!(f)?; + writeln!( + f, + "----------------------------------------------------------------" + )?; + } + write!(f, "{}", response)?; + } + Ok(()) + } +} diff --git a/src/main.rs b/src/main.rs index 1a2e3a7..a5f81ef 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ use anyhow::anyhow; +use api::get_remote_status; use cargo_lock::Lockfile; use cargo_toml::Manifest; use clap::{App, AppSettings, Arg, SubCommand}; @@ -216,6 +217,15 @@ async fn main() -> anyhow::Result<()> { .help("Signer to get the PDA for") ) ) + .subcommand(SubCommand::with_name("remote") + .about("Send a command to a remote machine") + .subcommand(SubCommand::with_name("status") + .about("Get the verification status of a program") + .arg(Arg::with_name("program-id") + .long("program-id") + .required(true) + .takes_value(true) + .help("The program address to fetch verification status for")))) .get_matches(); let connection = resolve_rpc_url(matches.value_of("url").map(|s| s.to_string()))?; @@ -339,6 +349,13 @@ async fn main() -> anyhow::Result<()> { let signer = sub_m.value_of("signer").map(|s| s.to_string()); print_program_pda(Pubkey::try_from(program_id)?, signer, &connection).await } + ("remote", Some(sub_m)) => match sub_m.subcommand() { + ("get-status", Some(sub_m)) => { + let program_id = sub_m.value_of("program-id").unwrap(); + get_remote_status(Pubkey::try_from(program_id)?).await + } + _ => unreachable!(), + }, // Handle other subcommands in a similar manner, for now let's panic _ => panic!( "Unknown subcommand: {:?}\nUse '--help' to see available commands", From 9789ce76eb15f9f69d4b556a2c34bfd5c4ef7e8b Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 2 Dec 2024 13:03:16 -0500 Subject: [PATCH 291/314] add get-job --- src/api/client.rs | 10 ++++++++++ src/api/mod.rs | 1 + src/api/models.rs | 21 +++++++++++++++++++++ src/main.rs | 18 +++++++++++++++--- 4 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/api/client.rs b/src/api/client.rs index b967ee3..ce4c9f8 100644 --- a/src/api/client.rs +++ b/src/api/client.rs @@ -248,3 +248,13 @@ pub async fn get_remote_status(program_id: Pubkey) -> anyhow::Result<()> { println!("{}", status); Ok(()) } + +pub async fn get_remote_job(job_id: &str) -> anyhow::Result<()> { + let client = Client::builder() + .timeout(Duration::from_secs(18000)) + .build()?; + + let job = check_job_status(&client, job_id).await?; + println!("{}", job); + Ok(()) +} diff --git a/src/api/mod.rs b/src/api/mod.rs index dae9698..00108f8 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -2,6 +2,7 @@ mod client; mod models; mod solana; +pub use client::get_remote_job; pub use client::get_remote_status; pub use client::send_job_to_remote; pub use solana::get_last_deployed_slot; diff --git a/src/api/models.rs b/src/api/models.rs index 22f9c9b..e3f23cf 100644 --- a/src/api/models.rs +++ b/src/api/models.rs @@ -34,6 +34,17 @@ pub struct JobResponse { pub respose: Option, } +impl std::fmt::Display for JobResponse { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + if let Some(response) = &self.respose { + writeln!(f, "{}", response)?; + } else { + writeln!(f, "Status: {:?}", self.status)?; + } + Ok(()) + } +} + #[derive(Debug, Serialize, Deserialize)] pub enum JobStatus { #[serde(rename = "in_progress")] @@ -55,6 +66,16 @@ pub struct JobVerificationResponse { pub repo_url: String, } +impl std::fmt::Display for JobVerificationResponse { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + writeln!(f, "Status: {:?}", self.status)?; + writeln!(f, "Message: {}", self.message)?; + writeln!(f, "On-chain Hash: {}", self.on_chain_hash)?; + writeln!(f, "Executable Hash: {}", self.executable_hash)?; + write!(f, "Repository URL: {}", self.repo_url) + } +} + #[derive(Debug, Serialize, Deserialize)] pub struct RemoteStatusResponse { pub signer: String, diff --git a/src/main.rs b/src/main.rs index a5f81ef..02e3562 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,5 @@ use anyhow::anyhow; -use api::get_remote_status; +use api::{get_remote_job, get_remote_status}; use cargo_lock::Lockfile; use cargo_toml::Manifest; use clap::{App, AppSettings, Arg, SubCommand}; @@ -219,13 +219,21 @@ async fn main() -> anyhow::Result<()> { ) .subcommand(SubCommand::with_name("remote") .about("Send a command to a remote machine") - .subcommand(SubCommand::with_name("status") + .subcommand(SubCommand::with_name("get-status") .about("Get the verification status of a program") .arg(Arg::with_name("program-id") .long("program-id") .required(true) .takes_value(true) - .help("The program address to fetch verification status for")))) + .help("The program address to fetch verification status for"))) + + .subcommand(SubCommand::with_name("get-job") + .about("Get the status of a verification job") + .arg(Arg::with_name("job-id") + .long("job-id") + .required(true) + .takes_value(true))) + ) .get_matches(); let connection = resolve_rpc_url(matches.value_of("url").map(|s| s.to_string()))?; @@ -354,6 +362,10 @@ async fn main() -> anyhow::Result<()> { let program_id = sub_m.value_of("program-id").unwrap(); get_remote_status(Pubkey::try_from(program_id)?).await } + ("get-job", Some(sub_m)) => { + let job_id = sub_m.value_of("job-id").unwrap(); + get_remote_job(job_id).await + } _ => unreachable!(), }, // Handle other subcommands in a similar manner, for now let's panic From 3a0e2920203b86ddaf3eadfba407b7dc9b46bc5b Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 2 Dec 2024 16:18:02 -0500 Subject: [PATCH 292/314] add submit-job and checks for on-chain PDA before submission --- src/api/client.rs | 50 ++++++++++++++++++++++++++++++++++++++++--- src/api/mod.rs | 1 + src/main.rs | 24 ++++++++++++++++++++- src/solana_program.rs | 6 +++++- 4 files changed, 76 insertions(+), 5 deletions(-) diff --git a/src/api/client.rs b/src/api/client.rs index ce4c9f8..1f53413 100644 --- a/src/api/client.rs +++ b/src/api/client.rs @@ -1,8 +1,9 @@ use anyhow::anyhow; use crossbeam_channel::{unbounded, Receiver}; use indicatif::{HumanDuration, ProgressBar, ProgressStyle}; -use reqwest::Client; +use reqwest::{Client, Response}; use serde_json::json; +use solana_client::rpc_client::RpcClient; use solana_sdk::pubkey::Pubkey; use std::thread; use std::time::{Duration, Instant}; @@ -11,6 +12,7 @@ use crate::api::models::{ ErrorResponse, JobResponse, JobStatus, JobVerificationResponse, RemoteStatusResponseWrapper, VerifyResponse, }; +use crate::solana_program::get_program_pda; // URL for the remote server pub const REMOTE_SERVER_URL: &str = "https://verify.osec.io"; @@ -109,10 +111,52 @@ pub async fn send_job_to_remote( .send() .await?; + handle_submission_response(&client, response, program_id).await +} + +pub async fn send_job_with_uploader_to_remote( + connection: &RpcClient, + program_id: &Pubkey, + uploader: &Pubkey, +) -> anyhow::Result<()> { + // Check that PDA exists before sending job + get_program_pda(connection, program_id, Some(uploader.to_string())).await?; + + let client = Client::builder() + .timeout(Duration::from_secs(18000)) + .build()?; + + // Send the POST request + let response = client + .post(format!("{}/verify-with-signer", REMOTE_SERVER_URL)) + .json(&json!({ + "program_id": program_id.to_string(), + "signer": uploader.to_string(), + "repository": "", + "commit_hash": "", + })) + .send() + .await?; + + handle_submission_response(&client, response, program_id).await +} + +pub async fn handle_submission_response( + client: &Client, + response: Response, + program_id: &Pubkey, +) -> anyhow::Result<()> { if response.status().is_success() { - let status_response: VerifyResponse = response.json().await?; + // First get the raw text to preserve it in case of parsing failure + let response_text = response.text().await?; + let status_response = + serde_json::from_str::(&response_text).map_err(|e| { + eprintln!("Failed to parse response as VerifyResponse: {}", e); + eprintln!("Raw response: {}", response_text); + anyhow!("Failed to parse server response") + })?; let request_id = status_response.request_id; - println!("Verification request sent. ✅"); + println!("Verification request sent with request id: {}", request_id); println!("Verification in progress... ⏳"); // Span new thread for polling the server for status // Create a channel for communication between threads diff --git a/src/api/mod.rs b/src/api/mod.rs index 00108f8..07fb5ff 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -5,4 +5,5 @@ mod solana; pub use client::get_remote_job; pub use client::get_remote_status; pub use client::send_job_to_remote; +pub use client::send_job_with_uploader_to_remote; pub use solana::get_last_deployed_slot; diff --git a/src/main.rs b/src/main.rs index 02e3562..a8393b2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,5 @@ use anyhow::anyhow; -use api::{get_remote_job, get_remote_status}; +use api::{get_remote_job, get_remote_status, send_job_with_uploader_to_remote}; use cargo_lock::Lockfile; use cargo_toml::Manifest; use clap::{App, AppSettings, Arg, SubCommand}; @@ -233,6 +233,17 @@ async fn main() -> anyhow::Result<()> { .long("job-id") .required(true) .takes_value(true))) + .subcommand(SubCommand::with_name("submit-job") + .about("Submit a verification job with with on-chain information") + .arg(Arg::with_name("program-id") + .long("program-id") + .required(true) + .takes_value(true)) + .arg(Arg::with_name("uploader") + .long("uploader") + .required(true) + .takes_value(true) + .help("This is the address that uploaded verified build information for the program-id"))) ) .get_matches(); @@ -366,6 +377,17 @@ async fn main() -> anyhow::Result<()> { let job_id = sub_m.value_of("job-id").unwrap(); get_remote_job(job_id).await } + ("submit-job", Some(sub_m)) => { + let program_id = sub_m.value_of("program-id").unwrap(); + let uploader = sub_m.value_of("uploader").unwrap(); + + send_job_with_uploader_to_remote( + &connection, + &Pubkey::try_from(program_id)?, + &Pubkey::try_from(uploader)?, + ) + .await + } _ => unreachable!(), }, // Handle other subcommands in a similar manner, for now let's panic diff --git a/src/solana_program.rs b/src/solana_program.rs index 2a60ab4..9aae93f 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -341,7 +341,11 @@ pub async fn get_program_pda( .map_err(|err| anyhow!("Unable to parse build params: {}", err))?, )) } else { - Err(anyhow!("PDA not found")) + Err(anyhow!( + "PDA not found for {:?} and uploader {:?}", + program_id, + signer_pubkey + )) } } From c6b040659c06acf69f62295113f9d855d44eb7e0 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Mon, 2 Dec 2024 21:22:30 -0500 Subject: [PATCH 293/314] add better error message for PDA & enforce mainnet check on url --- src/api/client.rs | 5 +++++ src/main.rs | 1 + src/solana_program.rs | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/api/client.rs b/src/api/client.rs index 1f53413..0dd1456 100644 --- a/src/api/client.rs +++ b/src/api/client.rs @@ -13,6 +13,7 @@ use crate::api::models::{ VerifyResponse, }; use crate::solana_program::get_program_pda; +use crate::{get_genesis_hash, MAINNET_GENESIS_HASH}; // URL for the remote server pub const REMOTE_SERVER_URL: &str = "https://verify.osec.io"; @@ -120,6 +121,10 @@ pub async fn send_job_with_uploader_to_remote( uploader: &Pubkey, ) -> anyhow::Result<()> { // Check that PDA exists before sending job + let genesis_hash = get_genesis_hash(connection)?; + if genesis_hash != MAINNET_GENESIS_HASH { + return Err(anyhow!("Remote verification only works with mainnet. Please omit the --remote flag to verify locally.")); + } get_program_pda(connection, program_id, Some(uploader.to_string())).await?; let client = Client::builder() diff --git a/src/main.rs b/src/main.rs index a8393b2..9f871ba 100644 --- a/src/main.rs +++ b/src/main.rs @@ -219,6 +219,7 @@ async fn main() -> anyhow::Result<()> { ) .subcommand(SubCommand::with_name("remote") .about("Send a command to a remote machine") + .setting(AppSettings::SubcommandRequiredElseHelp) .subcommand(SubCommand::with_name("get-status") .about("Get the verification status of a program") .arg(Arg::with_name("program-id") diff --git a/src/solana_program.rs b/src/solana_program.rs index 9aae93f..bfad56f 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -342,7 +342,7 @@ pub async fn get_program_pda( )) } else { Err(anyhow!( - "PDA not found for {:?} and uploader {:?}", + "PDA not found for {:?} and uploader {:?}. Make sure you've uploaded the PDA to mainnet.", program_id, signer_pubkey )) From c53eec2253caa70e5836bf09d6976b498de92e4a Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Mon, 9 Dec 2024 12:19:38 +0100 Subject: [PATCH 294/314] Add priority fee instruction - Handle error when program is not deployed --- src/main.rs | 53 +++++++++++++++++++++++++++++++++++++++---- src/solana_program.rs | 24 ++++++++++++++++---- 2 files changed, 68 insertions(+), 9 deletions(-) diff --git a/src/main.rs b/src/main.rs index 9f871ba..a2d20fd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -78,6 +78,12 @@ async fn main() -> anyhow::Result<()> { .global(true) .takes_value(true) .help("Optionally include your RPC endpoint. Defaults to Solana CLI config file")) + .arg(Arg::with_name("compute-unit-price") + .long("compute-unit-price") + .global(true) + .takes_value(true) + .default_value("100000") + .help("Priority fee in micro-lamports per compute unit")) .subcommand(SubCommand::with_name("build") .about("Deterministically build the program in a Docker container") .arg(Arg::with_name("mount-directory") @@ -316,6 +322,11 @@ async fn main() -> anyhow::Result<()> { let current_dir = sub_m.is_present("current-dir"); let skip_prompt = sub_m.is_present("skip-prompt"); let path_to_keypair = sub_m.value_of("keypair").map(|s| s.to_string()); + let compute_unit_price = matches + .value_of("compute-unit-price") + .unwrap() + .parse::() + .unwrap_or(100000); let cargo_args: Vec = sub_m .values_of("cargo-args") .unwrap_or_default() @@ -351,6 +362,7 @@ async fn main() -> anyhow::Result<()> { current_dir, skip_prompt, path_to_keypair, + compute_unit_price, &mut container_id, &mut temp_dir, ) @@ -358,7 +370,17 @@ async fn main() -> anyhow::Result<()> { } ("close", Some(sub_m)) => { let program_id = sub_m.value_of("program-id").unwrap(); - process_close(Pubkey::try_from(program_id)?, &connection).await + let compute_unit_price = matches + .value_of("compute-unit-price") + .unwrap() + .parse::() + .unwrap_or(100000); + process_close( + Pubkey::try_from(program_id)?, + &connection, + compute_unit_price, + ) + .await } ("list-program-pdas", Some(sub_m)) => { let program_id = sub_m.value_of("program-id").unwrap(); @@ -533,12 +555,30 @@ pub fn get_buffer_hash(url: Option, buffer_address: Pubkey) -> anyhow::R } pub fn get_program_hash(client: &RpcClient, program_id: Pubkey) -> anyhow::Result { + // First check if the program account exists + if client.get_account(&program_id).is_err() { + return Err(anyhow!("Program {} is not deployed", program_id)); + } + let program_buffer = Pubkey::find_program_address(&[program_id.as_ref()], &bpf_loader_upgradeable::id()).0; - let offset = UpgradeableLoaderState::size_of_programdata_metadata(); - let account_data = client.get_account_data(&program_buffer)?[offset..].to_vec(); - let program_hash = get_binary_hash(account_data); - Ok(program_hash) + + // Then check if the program data account exists + match client.get_account_data(&program_buffer) { + Ok(data) => { + let offset = UpgradeableLoaderState::size_of_programdata_metadata(); + let account_data = data[offset..].to_vec(); + let program_hash = get_binary_hash(account_data); + Ok(program_hash) + } + Err(_) => Err(anyhow!( + "Could not find program data for {}. This could mean:\n\ + 1. The program is not deployed\n\ + 2. The program is not upgradeable\n\ + 3. The program was deployed with a different loader", + program_id + )), + } } pub fn get_genesis_hash(client: &RpcClient) -> anyhow::Result { @@ -895,6 +935,7 @@ pub async fn verify_from_repo( current_dir: bool, skip_prompt: bool, path_to_keypair: Option, + compute_unit_price: u64, container_id_opt: &mut Option, temp_dir_opt: &mut Option, ) -> anyhow::Result<()> { @@ -995,6 +1036,7 @@ pub async fn verify_from_repo( connection, skip_prompt, path_to_keypair, + compute_unit_price, ) .await; if x.is_err() { @@ -1156,6 +1198,7 @@ pub async fn verify_from_repo( connection, skip_prompt, path_to_keypair, + compute_unit_price, ) .await; if x.is_err() { diff --git a/src/solana_program.rs b/src/solana_program.rs index bfad56f..76e52f8 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -12,8 +12,7 @@ use std::{ use borsh::{to_vec, BorshDeserialize, BorshSerialize}; use solana_sdk::{ - instruction::AccountMeta, message::Message, pubkey::Pubkey, signature::Keypair, signer::Signer, - system_program, transaction::Transaction, + compute_budget::ComputeBudgetInstruction, instruction::AccountMeta, message::Message, pubkey::Pubkey, signature::Keypair, signer::Signer, system_program, transaction::Transaction }; use solana_account_decoder::UiAccountEncoding; @@ -116,6 +115,7 @@ fn process_otter_verify_ixs( instruction: OtterVerifyInstructions, rpc_client: &RpcClient, path_to_keypair: Option, + compute_unit_price: u64, ) -> anyhow::Result<()> { let user_config = get_user_config()?; let signer = if let Some(path_to_keypair) = path_to_keypair { @@ -147,7 +147,14 @@ fn process_otter_verify_ixs( &ix_data, accounts_meta_vec, ); - let message = Message::new(&[ix], Some(&signer_pubkey)); + + let message = if compute_unit_price > 0 { + // Add compute budget instruction for priority fees only if price > 0 + let compute_budget_ix = ComputeBudgetInstruction::set_compute_unit_price(compute_unit_price); + Message::new(&[compute_budget_ix, ix], Some(&signer_pubkey)) + } else { + Message::new(&[ix], Some(&signer_pubkey)) + }; let mut tx = Transaction::new_unsigned(message); @@ -190,6 +197,7 @@ pub async fn upload_program( connection: &RpcClient, skip_prompt: bool, path_to_keypair: Option, + compute_unit_price: u64, ) -> anyhow::Result<()> { if skip_prompt || prompt_user_input( @@ -237,6 +245,7 @@ pub async fn upload_program( OtterVerifyInstructions::Update, connection, path_to_keypair, + compute_unit_price, )?; } else if connection.get_account(&pda_account_2).is_ok() { let wanna_create_new_pda = skip_prompt || prompt_user_input( @@ -250,6 +259,7 @@ pub async fn upload_program( OtterVerifyInstructions::Initialize, connection, path_to_keypair, + compute_unit_price, )?; } return Ok(()); @@ -262,6 +272,7 @@ pub async fn upload_program( OtterVerifyInstructions::Initialize, connection, path_to_keypair, + compute_unit_price, )?; } } else { @@ -276,7 +287,11 @@ fn find_build_params_pda(program_id: &Pubkey, signer: &Pubkey) -> (Pubkey, u8) { Pubkey::find_program_address(seeds, &OTTER_VERIFY_PROGRAM_ID) } -pub async fn process_close(program_address: Pubkey, connection: &RpcClient) -> anyhow::Result<()> { +pub async fn process_close( + program_address: Pubkey, + connection: &RpcClient, + compute_unit_price: u64, +) -> anyhow::Result<()> { let user_config = get_user_config()?; let signer = user_config.0; let signer_pubkey = signer.pubkey(); @@ -301,6 +316,7 @@ pub async fn process_close(program_address: Pubkey, connection: &RpcClient) -> a OtterVerifyInstructions::Close, connection, None, + compute_unit_price, )?; } else { return Err(anyhow!( From abe450e1576021e5e412499d5bccb0e78627691d Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Mon, 9 Dec 2024 13:00:50 +0100 Subject: [PATCH 295/314] Fix abort signal --- src/api/client.rs | 51 +++++++++++++++++++++--------- src/main.rs | 80 ++++++++++++++++++++++++++++------------------- 2 files changed, 84 insertions(+), 47 deletions(-) diff --git a/src/api/client.rs b/src/api/client.rs index 0dd1456..6166763 100644 --- a/src/api/client.rs +++ b/src/api/client.rs @@ -5,6 +5,7 @@ use reqwest::{Client, Response}; use serde_json::json; use solana_client::rpc_client::RpcClient; use solana_sdk::pubkey::Pubkey; +use std::sync::atomic::{Ordering}; use std::thread; use std::time::{Duration, Instant}; @@ -13,6 +14,7 @@ use crate::api::models::{ VerifyResponse, }; use crate::solana_program::get_program_pda; +use crate::SIGNAL_RECEIVED; use crate::{get_genesis_hash, MAINNET_GENESIS_HASH}; // URL for the remote server @@ -27,8 +29,16 @@ fn loading_animation(receiver: Receiver) { let pb = ProgressBar::new_spinner(); pb.set_style(spinner_style); + pb.enable_steady_tick(Duration::from_millis(100)); pb.set_message("Request sent. Awaiting server response. This may take a moment... ⏳"); + loop { + // Check if interrupt signal was received + if SIGNAL_RECEIVED.load(Ordering::Relaxed) { + pb.finish_with_message("❌ Operation interrupted by user."); + break; + } + match receiver.try_recv() { Ok(result) => { if result { @@ -42,13 +52,16 @@ fn loading_animation(receiver: Receiver) { } break; } - Err(_) => { - pb.inc(1); - thread::sleep(Duration::from_millis(100)); + if SIGNAL_RECEIVED.load(Ordering::Relaxed) { + pb.finish_with_message("❌ Operation interrupted by user."); + break; + } + thread::sleep(Duration::from_millis(10)); } } } + pb.abandon(); // Ensure the progress bar is cleaned up } fn print_verification_status( @@ -84,7 +97,7 @@ pub async fn send_job_to_remote( program_id: &Pubkey, library_name: &Option, bpf_flag: bool, - relative_mount_path: String, + mount_path: String, base_image: Option, cargo_args: Vec, ) -> anyhow::Result<()> { @@ -101,10 +114,10 @@ pub async fn send_job_to_remote( "program_id": program_id.to_string(), "lib_name": library_name, "bpf_flag": bpf_flag, - "mount_path": if relative_mount_path.is_empty() { + "mount_path": if mount_path.is_empty() { None } else { - Some(relative_mount_path) + Some(mount_path) }, "base_image": base_image, "cargo_args": cargo_args, @@ -152,7 +165,6 @@ pub async fn handle_submission_response( program_id: &Pubkey, ) -> anyhow::Result<()> { if response.status().is_success() { - // First get the raw text to preserve it in case of parsing failure let response_text = response.text().await?; let status_response = serde_json::from_str::(&response_text).map_err(|e| { @@ -163,21 +175,31 @@ pub async fn handle_submission_response( let request_id = status_response.request_id; println!("Verification request sent with request id: {}", request_id); println!("Verification in progress... ⏳"); - // Span new thread for polling the server for status - // Create a channel for communication between threads - let (sender, receiver) = unbounded(); + let (sender, receiver) = unbounded(); let handle = thread::spawn(move || loading_animation(receiver)); - // Poll the server for status + loop { + // Check for interrupt signal before polling + if SIGNAL_RECEIVED.load(Ordering::Relaxed) { + let _ = sender.send(false); + let _ = handle.join(); // Use let _ to ignore potential panic results + std::process::exit(130); // Exit with standard Ctrl+C exit code + } + let status = check_job_status(&client, &request_id).await?; match status.status { JobStatus::InProgress => { + if SIGNAL_RECEIVED.load(Ordering::Relaxed) { + let _ = sender.send(false); + let _ = handle.join(); + std::process::exit(130); + } thread::sleep(Duration::from_secs(10)); } JobStatus::Completed => { let _ = sender.send(true); - handle.join().unwrap(); + let _ = handle.join(); let status_response = status.respose.unwrap(); if status_response.executable_hash == status_response.on_chain_hash { @@ -197,8 +219,7 @@ pub async fn handle_submission_response( } JobStatus::Failed => { let _ = sender.send(false); - - handle.join().unwrap(); + let _ = handle.join(); let status_response: JobVerificationResponse = status.respose.unwrap(); println!("Program {} has not been verified. ❌", program_id); eprintln!("Error message: {}", status_response.message.as_str()); @@ -210,7 +231,7 @@ pub async fn handle_submission_response( } JobStatus::Unknown => { let _ = sender.send(false); - handle.join().unwrap(); + let _ = handle.join(); println!("Program {} has not been verified. ❌", program_id); break; } diff --git a/src/main.rs b/src/main.rs index a2d20fd..5cd71de 100644 --- a/src/main.rs +++ b/src/main.rs @@ -49,24 +49,58 @@ pub fn get_network(network_str: &str) -> &str { } } +// At the top level, make the signal handler accessible throughout the program +lazy_static::lazy_static! { + static ref SIGNAL_RECEIVED: Arc = Arc::new(AtomicBool::new(false)); +} + #[tokio::main] async fn main() -> anyhow::Result<()> { // Handle SIGTERM and SIGINT gracefully by stopping the docker container let mut signals = Signals::new([SIGTERM, SIGINT])?; let mut container_id: Option = None; let mut temp_dir: Option = None; - let caught_signal = Arc::new(AtomicBool::new(false)); - let caught_signal_clone = caught_signal.clone(); let handle = signals.handle(); std::thread::spawn(move || { - #[allow(clippy::never_loop)] - for _ in signals.forever() { - caught_signal_clone.store(true, Ordering::Relaxed); - break; + if signals.forever().next().is_some() { + SIGNAL_RECEIVED.store(true, Ordering::Relaxed); } }); + // Add a function to check if we should abort + let check_signal = |container_id: &mut Option, temp_dir: &mut Option| { + if SIGNAL_RECEIVED.load(Ordering::Relaxed) { + println!("\nReceived interrupt signal, cleaning up..."); + + if let Some(container_id) = container_id.take() { + if std::process::Command::new("docker") + .args(["kill", &container_id]) + .output() + .is_err() + { + println!("Failed to close docker container"); + } else { + println!("Stopped container {}", container_id) + } + } + + if let Some(temp_dir) = temp_dir.take() { + if std::process::Command::new("rm") + .args(["-rf", &temp_dir]) + .output() + .is_err() + { + println!("Failed to remove temporary directory"); + } else { + println!("Removed temporary directory {}", temp_dir); + } + } + + std::process::exit(130); + } + }; + let matches = App::new("solana-verify") .author("Ellipsis Labs ") .version(env!("CARGO_PKG_VERSION")) @@ -365,6 +399,7 @@ async fn main() -> anyhow::Result<()> { compute_unit_price, &mut container_id, &mut temp_dir, + &check_signal, ) .await } @@ -420,32 +455,6 @@ async fn main() -> anyhow::Result<()> { ), }; - if caught_signal.load(Ordering::Relaxed) || res.is_err() { - if let Some(container_id) = container_id.clone().take() { - println!("Stopping container {}", container_id); - if std::process::Command::new("docker") - .args(["kill", &container_id]) - .output() - .is_err() - { - println!("Failed to close docker container"); - } else { - println!("Stopped container {}", container_id) - } - } - if let Some(temp_dir) = temp_dir.clone().take() { - println!("Removing temporary directory {}", temp_dir); - if std::process::Command::new("rm") - .args(["-rf", &temp_dir]) - .output() - .is_err() - { - println!("Failed to remove temporary directory"); - } else { - println!("Removed temporary directory {}", temp_dir); - } - } - } handle.close(); res } @@ -938,8 +947,10 @@ pub async fn verify_from_repo( compute_unit_price: u64, container_id_opt: &mut Option, temp_dir_opt: &mut Option, + check_signal: &dyn Fn(&mut Option, &mut Option), ) -> anyhow::Result<()> { if remote { + check_signal(container_id_opt, temp_dir_opt); let genesis_hash = get_genesis_hash(connection)?; if genesis_hash != MAINNET_GENESIS_HASH { return Err(anyhow!("Remote verification only works with mainnet. Please omit the --remote flag to verify locally.")); @@ -1076,11 +1087,14 @@ pub async fn verify_from_repo( let verify_tmp_root_path = format!("{}/{}", verify_dir, base_name); println!("Cloning repo into: {}", verify_tmp_root_path); + check_signal(container_id_opt, temp_dir_opt); std::process::Command::new("git") .args(["clone", &repo_url, &verify_tmp_root_path]) .stdout(Stdio::inherit()) .output()?; + check_signal(container_id_opt, temp_dir_opt); + // Checkout a specific commit hash, if provided if let Some(commit_hash) = commit_hash.as_ref() { let result = std::process::Command::new("git") @@ -1098,6 +1112,8 @@ pub async fn verify_from_repo( } } + check_signal(container_id_opt, temp_dir_opt); + if !relative_mount_path.is_empty() { args.push("--mount-path"); args.push(&relative_mount_path); From 6509642f9929cf9df586477932f247570bd69036 Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Mon, 9 Dec 2024 15:19:13 +0100 Subject: [PATCH 296/314] Add Skip build to verify-from-repo --- src/main.rs | 90 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 53 insertions(+), 37 deletions(-) diff --git a/src/main.rs b/src/main.rs index 5cd71de..dc878de 100644 --- a/src/main.rs +++ b/src/main.rs @@ -228,7 +228,11 @@ async fn main() -> anyhow::Result<()> { .arg(Arg::with_name("cargo-args") .multiple(true) .last(true) - .help("Arguments to pass to the underlying `cargo build-bpf` command"))) + .help("Arguments to pass to the underlying `cargo build-bpf` command")) + .arg(Arg::with_name("skip-build") + .long("skip-build") + .help("Skip building and verification, only upload the PDA") + .takes_value(false))) .subcommand(SubCommand::with_name("close") .about("Close the otter-verify PDA account associated with the given program ID") .arg(Arg::with_name("program-id") @@ -346,6 +350,7 @@ async fn main() -> anyhow::Result<()> { Ok(()) } ("verify-from-repo", Some(sub_m)) => { + let skip_build = sub_m.is_present("skip-build"); let remote = sub_m.is_present("remote"); let mount_path = sub_m.value_of("mount-path").map(|s| s.to_string()).unwrap(); let repo_url = sub_m.value_of("repo-url").map(|s| s.to_string()).unwrap(); @@ -397,6 +402,7 @@ async fn main() -> anyhow::Result<()> { skip_prompt, path_to_keypair, compute_unit_price, + skip_build, &mut container_id, &mut temp_dir, &check_signal, @@ -945,6 +951,7 @@ pub async fn verify_from_repo( skip_prompt: bool, path_to_keypair: Option, compute_unit_price: u64, + skip_build: bool, container_id_opt: &mut Option, temp_dir_opt: &mut Option, check_signal: &dyn Fn(&mut Option, &mut Option), @@ -1183,51 +1190,60 @@ pub async fn verify_from_repo( } } - let result = build_and_verify_repo( - mount_path.to_str().unwrap().to_string(), - base_image.clone(), - bpf_flag, - library_name.clone(), - connection, - program_id, - cargo_args.clone(), - container_id_opt, - ); + // When skip_build is true, we skip the build and verify step but still do the upload + let result = if !skip_build { + build_and_verify_repo( + mount_path.to_str().unwrap().to_string(), + base_image.clone(), + bpf_flag, + library_name.clone(), + connection, + program_id, + cargo_args.clone(), + container_id_opt, + ) + } else { + Ok(("skipped".to_string(), "skipped".to_string())) + }; // Cleanup no matter the result std::process::Command::new("rm") .args(["-rf", &verify_dir]) .output()?; - // Compare hashes or return error - if let Ok((build_hash, program_hash)) = result { - println!("Executable Program Hash from repo: {}", build_hash); - println!("On-chain Program Hash: {}", program_hash); + // Handle the result + match result { + Ok((build_hash, program_hash)) => { + if !skip_build { + println!("Executable Program Hash from repo: {}", build_hash); + println!("On-chain Program Hash: {}", program_hash); + } - if build_hash == program_hash { - println!("Program hash matches ✅"); - let x = upload_program( - repo_url, - &commit_hash.clone(), - args.iter().map(|&s| s.into()).collect(), - program_id, - connection, - skip_prompt, - path_to_keypair, - compute_unit_price, - ) - .await; - if x.is_err() { - println!("Error uploading program: {:?}", x); - exit(1); + if skip_build || build_hash == program_hash { + if skip_build { + println!("Skipping build and uploading program"); + } else { + println!("Program hash matches ✅"); + } + upload_program( + repo_url, + &commit_hash.clone(), + args.iter().map(|&s| s.into()).collect(), + program_id, + connection, + skip_prompt, + path_to_keypair, + compute_unit_price, + ) + .await + } else { + println!("Program hashes do not match ❌"); + println!("Executable Program Hash from repo: {}", build_hash); + println!("On-chain Program Hash: {}", program_hash); + Ok(()) } - } else { - println!("Program hashes do not match ❌"); } - - Ok(()) - } else { - Err(anyhow!("Error verifying program. {:?}", result)) + Err(e) => Err(anyhow!("Error verifying program: {:?}", e)), } } From 2ff2e3b106b7f4cff6bbe461fe4ad96e3654c285 Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Mon, 16 Dec 2024 14:11:51 +0100 Subject: [PATCH 297/314] Upload on chain data before --remote is triggered --- src/main.rs | 223 +++++++++++++++++----------------------------------- 1 file changed, 72 insertions(+), 151 deletions(-) diff --git a/src/main.rs b/src/main.rs index dc878de..0564465 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,7 +17,7 @@ use solana_sdk::{ use std::{ io::Read, path::PathBuf, - process::{exit, Command, Stdio}, + process::{Command, Stdio}, sync::{ atomic::{AtomicBool, Ordering}, Arc, @@ -951,118 +951,14 @@ pub async fn verify_from_repo( skip_prompt: bool, path_to_keypair: Option, compute_unit_price: u64, - skip_build: bool, + mut skip_build: bool, container_id_opt: &mut Option, temp_dir_opt: &mut Option, check_signal: &dyn Fn(&mut Option, &mut Option), ) -> anyhow::Result<()> { - if remote { - check_signal(container_id_opt, temp_dir_opt); - let genesis_hash = get_genesis_hash(connection)?; - if genesis_hash != MAINNET_GENESIS_HASH { - return Err(anyhow!("Remote verification only works with mainnet. Please omit the --remote flag to verify locally.")); - } - - println!("Sending verify command to remote machine..."); - send_job_to_remote( - &repo_url, - &commit_hash, - &program_id, - &library_name_opt, - bpf_flag, - relative_mount_path.clone(), - base_image.clone(), - cargo_args.clone(), - ) - .await?; - - let mut args: Vec<&str> = Vec::new(); - if !relative_mount_path.is_empty() { - args.push("--mount-path"); - args.push(&relative_mount_path); - } - // Get the absolute build path to the solana program directory to build inside docker - let mount_path = PathBuf::from(relative_mount_path.clone()); - println!("Build path: {:?}", mount_path); - - args.push("--library-name"); - let library_name = match library_name_opt { - Some(p) => p, - None => { - std::process::Command::new("find") - .args([mount_path.to_str().unwrap(), "-name", "Cargo.toml"]) - .output() - .map_err(|e| { - anyhow::format_err!( - "Failed to find Cargo.toml files in root directory: {}", - e.to_string() - ) - }) - .and_then(|output| { - let mut options = vec![]; - for path in String::from_utf8(output.stdout)?.split("\n") { - match get_lib_name_from_cargo_toml(path) { - Ok(name) => { - options.push(name); - } - Err(_) => { - continue; - } - } - } - if options.len() != 1 { - println!( - "Found multiple possible targets in root directory: {:?}", - options - ); - println!( - "Please explicitly specify the target with the --package-name option", - ); - Err(anyhow::format_err!( - "Failed to find unique Cargo.toml file in root directory" - )) - } else { - Ok(options[0].clone()) - } - })? - } - }; - args.push(&library_name); - println!("Verifying program: {}", library_name); + // Set skip_build to true if remote is true + skip_build |= remote; - if let Some(base_image) = &base_image { - args.push("--base-image"); - args.push(base_image); - } - - if bpf_flag { - args.push("--bpf"); - } - - if !cargo_args.clone().is_empty() { - args.push("--"); - for arg in &cargo_args { - args.push(arg); - } - } - - let x = upload_program( - repo_url, - &commit_hash.clone(), - args.iter().map(|&s| s.into()).collect(), - program_id, - connection, - skip_prompt, - path_to_keypair, - compute_unit_price, - ) - .await; - if x.is_err() { - println!("Error uploading program: {:?}", x); - exit(1); - } - return Ok(()); - } // Create a Vec to store solana-verify args let mut args: Vec<&str> = Vec::new(); @@ -1130,45 +1026,45 @@ pub async fn verify_from_repo( println!("Build path: {:?}", mount_path); args.push("--library-name"); - let library_name = match library_name_opt { + let library_name = match library_name_opt.clone() { Some(p) => p, None => { - std::process::Command::new("find") - .args([mount_path.to_str().unwrap(), "-name", "Cargo.toml"]) - .output() - .map_err(|e| { - anyhow::format_err!( - "Failed to find Cargo.toml files in root directory: {}", - e.to_string() - ) - }) - .and_then(|output| { - let mut options = vec![]; - for path in String::from_utf8(output.stdout)?.split("\n") { - match get_lib_name_from_cargo_toml(path) { - Ok(name) => { - options.push(name); - } - Err(_) => { - continue; - } + std::process::Command::new("find") + .args([mount_path.to_str().unwrap(), "-name", "Cargo.toml"]) + .output() + .map_err(|e| { + anyhow::format_err!( + "Failed to find Cargo.toml files in root directory: {}", + e.to_string() + ) + }) + .and_then(|output| { + let mut options = vec![]; + for path in String::from_utf8(output.stdout)?.split("\n") { + match get_lib_name_from_cargo_toml(path) { + Ok(name) => { + options.push(name); + } + Err(_) => { + continue; } } - if options.len() != 1 { - println!( - "Found multiple possible targets in root directory: {:?}", - options - ); - println!( - "Please explicitly specify the target with the --package-name option", - ); - Err(anyhow::format_err!( - "Failed to find unique Cargo.toml file in root directory" - )) - } else { - Ok(options[0].clone()) - } - })? + } + if options.len() != 1 { + println!( + "Found multiple possible targets in root directory: {:?}", + options + ); + println!( + "Please explicitly specify the target with the --library-name option", + ); + Err(anyhow::format_err!( + "Failed to find unique Cargo.toml file in root directory" + )) + } else { + Ok(options[0].clone()) + } + })? } }; args.push(&library_name); @@ -1190,8 +1086,7 @@ pub async fn verify_from_repo( } } - // When skip_build is true, we skip the build and verify step but still do the upload - let result = if !skip_build { + let result: Result<(String, String), anyhow::Error> = if !skip_build { build_and_verify_repo( mount_path.to_str().unwrap().to_string(), base_image.clone(), @@ -1207,9 +1102,11 @@ pub async fn verify_from_repo( }; // Cleanup no matter the result - std::process::Command::new("rm") - .args(["-rf", &verify_dir]) - .output()?; + if !skip_build { + std::process::Command::new("rm") + .args(["-rf", &verify_dir]) + .output()?; + } // Handle the result match result { @@ -1221,12 +1118,13 @@ pub async fn verify_from_repo( if skip_build || build_hash == program_hash { if skip_build { - println!("Skipping build and uploading program"); + println!("Skipping local build and uploading program"); } else { println!("Program hash matches ✅"); } + upload_program( - repo_url, + repo_url.clone(), &commit_hash.clone(), args.iter().map(|&s| s.into()).collect(), program_id, @@ -1235,7 +1133,30 @@ pub async fn verify_from_repo( path_to_keypair, compute_unit_price, ) - .await + .await?; + + if remote { + check_signal(container_id_opt, temp_dir_opt); + let genesis_hash = get_genesis_hash(connection)?; + if genesis_hash != MAINNET_GENESIS_HASH { + return Err(anyhow!("Remote verification only works with mainnet. Please omit the --remote flag to verify locally.")); + } + + println!("Sending verify command to remote machine..."); + send_job_to_remote( + &repo_url, + &commit_hash, + &program_id, + &library_name_opt.clone(), + bpf_flag, + relative_mount_path.clone(), + base_image.clone(), + cargo_args.clone(), + ) + .await?; + } + + Ok(()) } else { println!("Program hashes do not match ❌"); println!("Executable Program Hash from repo: {}", build_hash); From 927ecfd401a5796ca906b18ff1c9f667b39c902e Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Tue, 17 Dec 2024 10:49:20 +0100 Subject: [PATCH 298/314] Code review --- src/api/client.rs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/api/client.rs b/src/api/client.rs index 6166763..0ef73c1 100644 --- a/src/api/client.rs +++ b/src/api/client.rs @@ -97,7 +97,7 @@ pub async fn send_job_to_remote( program_id: &Pubkey, library_name: &Option, bpf_flag: bool, - mount_path: String, + relative_mount_path: String, base_image: Option, cargo_args: Vec, ) -> anyhow::Result<()> { @@ -114,10 +114,10 @@ pub async fn send_job_to_remote( "program_id": program_id.to_string(), "lib_name": library_name, "bpf_flag": bpf_flag, - "mount_path": if mount_path.is_empty() { + "mount_path": if relative_mount_path.is_empty() { None } else { - Some(mount_path) + Some(relative_mount_path) }, "base_image": base_image, "cargo_args": cargo_args, @@ -165,6 +165,7 @@ pub async fn handle_submission_response( program_id: &Pubkey, ) -> anyhow::Result<()> { if response.status().is_success() { + // First get the raw text to preserve it in case of parsing failure let response_text = response.text().await?; let status_response = serde_json::from_str::(&response_text).map_err(|e| { @@ -176,6 +177,8 @@ pub async fn handle_submission_response( println!("Verification request sent with request id: {}", request_id); println!("Verification in progress... ⏳"); + // Span new thread for polling the server for status + // Create a channel for communication between threads let (sender, receiver) = unbounded(); let handle = thread::spawn(move || loading_animation(receiver)); @@ -183,8 +186,8 @@ pub async fn handle_submission_response( // Check for interrupt signal before polling if SIGNAL_RECEIVED.load(Ordering::Relaxed) { let _ = sender.send(false); - let _ = handle.join(); // Use let _ to ignore potential panic results - std::process::exit(130); // Exit with standard Ctrl+C exit code + handle.join().unwrap(); + break; // Exit the loop and continue with normal error handling } let status = check_job_status(&client, &request_id).await?; @@ -192,14 +195,14 @@ pub async fn handle_submission_response( JobStatus::InProgress => { if SIGNAL_RECEIVED.load(Ordering::Relaxed) { let _ = sender.send(false); - let _ = handle.join(); - std::process::exit(130); + handle.join().unwrap(); + break; } thread::sleep(Duration::from_secs(10)); } JobStatus::Completed => { let _ = sender.send(true); - let _ = handle.join(); + handle.join().unwrap(); let status_response = status.respose.unwrap(); if status_response.executable_hash == status_response.on_chain_hash { @@ -219,7 +222,7 @@ pub async fn handle_submission_response( } JobStatus::Failed => { let _ = sender.send(false); - let _ = handle.join(); + handle.join().unwrap(); let status_response: JobVerificationResponse = status.respose.unwrap(); println!("Program {} has not been verified. ❌", program_id); eprintln!("Error message: {}", status_response.message.as_str()); @@ -231,7 +234,7 @@ pub async fn handle_submission_response( } JobStatus::Unknown => { let _ = sender.send(false); - let _ = handle.join(); + handle.join().unwrap(); println!("Program {} has not been verified. ❌", program_id); break; } From 83d18301e6b60d9c7de8abc61beb8f233de7c0d4 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 17 Dec 2024 15:07:34 -0500 Subject: [PATCH 299/314] refactor & add export-pda-tx to handle exporting of the pda creation tx --- Cargo.lock | 35 +++- Cargo.toml | 4 + src/main.rs | 419 ++++++++++++++++++++++++++++++------------ src/solana_program.rs | 53 ++++-- 4 files changed, 372 insertions(+), 139 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7f4bc06..01d4ad8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -416,6 +416,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "base64ct" version = "1.5.3" @@ -635,6 +641,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + [[package]] name = "bumpalo" version = "3.12.0" @@ -3364,7 +3379,7 @@ dependencies = [ "Inflector", "base64 0.21.7", "bincode", - "bs58", + "bs58 0.4.0", "bv", "lazy_static", "serde", @@ -3489,7 +3504,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bfcde2fc6946c99c7e3400fadd04d1628d675bfd66cb34d461c0f3224bd27d1" dependencies = [ "block-buffer 0.10.4", - "bs58", + "bs58 0.4.0", "bv", "either", "generic-array", @@ -3623,7 +3638,7 @@ dependencies = [ "borsh 0.10.4", "borsh 0.9.3", "borsh 1.5.0", - "bs58", + "bs58 0.4.0", "bv", "bytemuck", "cc", @@ -3779,7 +3794,7 @@ dependencies = [ "async-trait", "base64 0.21.7", "bincode", - "bs58", + "bs58 0.4.0", "indicatif", "log", "reqwest", @@ -3803,7 +3818,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617df2c53f948c821cefca6824e376aac04ff0d844bb27f4d3ada9e211bcffe7" dependencies = [ "base64 0.21.7", - "bs58", + "bs58 0.4.0", "jsonrpc-core", "reqwest", "semver", @@ -3842,7 +3857,7 @@ dependencies = [ "bincode", "bitflags 2.6.0", "borsh 1.5.0", - "bs58", + "bs58 0.4.0", "bytemuck", "byteorder", "chrono", @@ -3892,7 +3907,7 @@ version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a8613ca80150f7e277e773620ba65d2c5fcc3a08eb8026627d601421ab43aef" dependencies = [ - "bs58", + "bs58 0.4.0", "proc-macro2", "quote", "rustversion", @@ -3987,7 +4002,7 @@ dependencies = [ "base64 0.21.7", "bincode", "borsh 0.10.4", - "bs58", + "bs58 0.4.0", "lazy_static", "log", "serde", @@ -4022,7 +4037,10 @@ name = "solana-verify" version = "0.3.1" dependencies = [ "anyhow", + "base64 0.22.1", + "bincode", "borsh 1.5.0", + "bs58 0.5.1", "cargo-lock", "cargo_toml", "clap 2.34.0", @@ -4042,6 +4060,7 @@ dependencies = [ "solana-cli-config", "solana-client", "solana-sdk", + "solana-transaction-status", "tokio", "uuid", ] diff --git a/Cargo.toml b/Cargo.toml index c5ab689..c2cd603 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,10 @@ solana-client = "=1.18.23" solana-sdk = "=1.18.23" tokio = { version = "1.29.1", features = ["full"] } solana-account-decoder = "1.18.23" +bincode = "1.3.3" +bs58 = "0.5.1" +base64 = "0.22.1" +solana-transaction-status = "=1.18.23" [dependencies.uuid] version = "1.2.2" diff --git a/src/main.rs b/src/main.rs index 0564465..fc229fe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,19 +1,28 @@ use anyhow::anyhow; -use api::{get_remote_job, get_remote_status, send_job_with_uploader_to_remote}; +use api::{ + get_last_deployed_slot, get_remote_job, get_remote_status, send_job_with_uploader_to_remote, +}; +use base64::{prelude::BASE64_STANDARD, Engine}; +use bincode::serialize; use cargo_lock::Lockfile; use cargo_toml::Manifest; -use clap::{App, AppSettings, Arg, SubCommand}; +use clap::{App, AppSettings, Arg, ArgMatches, SubCommand}; +use serde::Serialize; use signal_hook::{ consts::{SIGINT, SIGTERM}, iterator::Signals, }; use solana_cli_config::{Config, CONFIG_FILE}; -use solana_client::rpc_client::RpcClient; -use solana_program::{get_all_pdas_available, get_program_pda, resolve_rpc_url, OtterBuildParams}; +use solana_client::{rpc_client::RpcClient, rpc_config::EncodingConfig}; +use solana_program::{ + compose_transaction, find_build_params_pda, get_all_pdas_available, get_program_pda, + resolve_rpc_url, InputParams, OtterBuildParams, OtterVerifyInstructions, +}; use solana_sdk::{ bpf_loader_upgradeable::{self, UpgradeableLoaderState}, pubkey::Pubkey, }; +use solana_transaction_status::UiTransactionEncoding; use std::{ io::Read, path::PathBuf, @@ -23,6 +32,7 @@ use std::{ Arc, }, }; +use tokio::join; use uuid::Uuid; pub mod api; #[rustfmt::skip] @@ -233,6 +243,51 @@ async fn main() -> anyhow::Result<()> { .long("skip-build") .help("Skip building and verification, only upload the PDA") .takes_value(false))) + .subcommand(SubCommand::with_name("export-pda-tx") + .about("Export the transaction as base58 for use with Squads") + .arg(Arg::with_name("uploader") + .long("uploader") + .takes_value(true) + .required(true) + .help("Specifies an address to use for uploading the program verification args (should be the program authority)")) + .arg(Arg::with_name("encoding") + .long("encoding") + .takes_value(true) + .default_value("base58") + .possible_values(&["base58", "base64"]) + .help("The encoding to use for the transaction")) + .arg(Arg::with_name("mount-path") + .long("mount-path") + .takes_value(true) + .default_value("") + .help("Relative path to the root directory or the source code repository from which to build the program")) + .arg(Arg::with_name("repo-url") + .required(true) + .help("The HTTPS URL of the repo to clone")) + .arg(Arg::with_name("commit-hash") + .long("commit-hash") + .takes_value(true) + .help("Commit hash to checkout. Required to know the correct program snapshot. Will fallback to HEAD if not provided")) + .arg(Arg::with_name("program-id") + .long("program-id") + .required(true) + .takes_value(true) + .help("The Program ID of the program to verify")) + .arg(Arg::with_name("base-image") + .short("b") + .long("base-image") + .takes_value(true) + .help("Optionally specify a custom base docker image to use for building")) + .arg(Arg::with_name("library-name") + .long("library-name") + .takes_value(true) + .help("Specify the name of the library to build and verify")) + .arg(Arg::with_name("bpf") + .long("bpf") + .help("If the program requires cargo build-bpf (instead of cargo build-sbf), set this flag")) + .arg(Arg::with_name("current-dir") + .long("current-dir") + .help("Verify in current directory"))) .subcommand(SubCommand::with_name("close") .about("Close the otter-verify PDA account associated with the given program ID") .arg(Arg::with_name("program-id") @@ -240,6 +295,10 @@ async fn main() -> anyhow::Result<()> { .required(true) .takes_value(true) .help("The address of the program to close the PDA"))) + .arg(Arg::with_name("export") + .long("export") + .required(false) + .help("Print the transaction as base58 for use with Squads")) .subcommand(SubCommand::with_name("list-program-pdas") .about("List all the PDA information associated with a program ID. Requires custom RPC endpoint") .arg(Arg::with_name("program-id") @@ -372,19 +431,7 @@ async fn main() -> anyhow::Result<()> { .map(|s| s.to_string()) .collect(); - let commit_hash = sub_m - .value_of("commit-hash") - .map(String::from) - .or_else(|| { - get_commit_hash_from_remote(&repo_url).ok() // Dynamically determine commit hash from remote - }) - .ok_or_else(|| { - anyhow::anyhow!( - "Commit hash must be provided or inferred from the remote repository" - ) - })?; - - println!("Commit hash from remote: {}", commit_hash); + let commit_hash = get_commit_hash(sub_m, &repo_url)?; println!("Skipping prompt: {}", skip_prompt); verify_from_repo( @@ -423,6 +470,96 @@ async fn main() -> anyhow::Result<()> { ) .await } + ("export-pda-tx", Some(sub_m)) => { + let uploader = sub_m.value_of("uploader").unwrap(); + let mount_path = sub_m.value_of("mount-path").map(|s| s.to_string()).unwrap(); + let repo_url = sub_m.value_of("repo-url").map(|s| s.to_string()).unwrap(); + let program_id = sub_m.value_of("program-id").unwrap(); + let base_image = sub_m.value_of("base-image").map(|s| s.to_string()); + let library_name = sub_m.value_of("library-name").map(|s| s.to_string()); + let bpf_flag = sub_m.is_present("bpf"); + let encoding = sub_m.value_of("encoding").unwrap(); + + let encoding: UiTransactionEncoding = match encoding { + "base58" => UiTransactionEncoding::Base58, + "base64" => UiTransactionEncoding::Base64, + _ => { + return Err(anyhow!("Unsupported encoding: {}", encoding)); + } + }; + + let compute_unit_price = matches + .value_of("compute-unit-price") + .unwrap() + .parse::() + .unwrap_or(100000); + + let commit_hash = get_commit_hash(sub_m, &repo_url)?; + let cargo_args: Vec = sub_m + .values_of("cargo-args") + .unwrap_or_default() + .map(|s| s.to_string()) + .collect(); + + let connection = resolve_rpc_url(matches.value_of("url").map(|s| s.to_string()))?; + println!("Using connection url: {}", connection.url()); + + let last_deployed_slot = get_last_deployed_slot(&connection, &program_id.to_string()) + .await + .map_err(|err| anyhow!("Unable to get last deployed slot: {}", err))?; + + let (temp_root_path, verify_dir) = clone_repo_and_checkout( + &repo_url, + true, + &get_basename(&repo_url)?, + Some(commit_hash.clone()), + &mut temp_dir, + )?; + + let input_params = InputParams { + version: env!("CARGO_PKG_VERSION").to_string(), + git_url: repo_url, + commit: commit_hash.clone(), + args: build_args( + &mount_path, + library_name, + &temp_root_path, + base_image, + bpf_flag, + cargo_args, + )? + .0, + deployed_slot: last_deployed_slot, + }; + + std::process::Command::new("rm") + .args(["-rf", &verify_dir]) + .output()?; + + let (pda, _) = + find_build_params_pda(&Pubkey::try_from(program_id)?, &Pubkey::try_from(uploader)?); + + let tx = compose_transaction( + &input_params, + Pubkey::try_from(uploader)?, + pda, + Pubkey::try_from(program_id)?, + OtterVerifyInstructions::Initialize, + compute_unit_price, + ); + + // serialize the transaction to base58 + match encoding { + UiTransactionEncoding::Base58 => { + println!("{}", bs58::encode(serialize(&tx)?).into_string()); + } + UiTransactionEncoding::Base64 => { + println!("{}", BASE64_STANDARD.encode(serialize(&tx)?)); + } + _ => unreachable!(), + } + Ok(()) + } ("list-program-pdas", Some(sub_m)) => { let program_id = sub_m.value_of("program-id").unwrap(); list_program_pdas(Pubkey::try_from(program_id)?, &connection).await @@ -935,97 +1072,23 @@ pub fn verify_from_image( Ok(()) } -#[allow(clippy::too_many_arguments)] -pub async fn verify_from_repo( - remote: bool, - relative_mount_path: String, - connection: &RpcClient, - repo_url: String, - commit_hash: Option, - program_id: Pubkey, - base_image: Option, +fn build_args( + relative_mount_path: &str, library_name_opt: Option, + verify_tmp_root_path: &str, + base_image: Option, bpf_flag: bool, cargo_args: Vec, - current_dir: bool, - skip_prompt: bool, - path_to_keypair: Option, - compute_unit_price: u64, - mut skip_build: bool, - container_id_opt: &mut Option, - temp_dir_opt: &mut Option, - check_signal: &dyn Fn(&mut Option, &mut Option), -) -> anyhow::Result<()> { - // Set skip_build to true if remote is true - skip_build |= remote; - - // Create a Vec to store solana-verify args - let mut args: Vec<&str> = Vec::new(); - - // Get source code from repo_url - let base_name = std::process::Command::new("basename") - .arg(&repo_url) - .output() - .map_err(|e| anyhow!("Failed to get basename of repo_url: {:?}", e)) - .and_then(|output| parse_output(output.stdout))?; - - let uuid = Uuid::new_v4().to_string(); - - // Create a temporary directory to clone the repo into - let verify_dir = if current_dir { - format!( - "{}/.{}", - std::env::current_dir()? - .as_os_str() - .to_str() - .ok_or_else(|| anyhow::Error::msg("Invalid path string"))?, - uuid.clone() - ) - } else { - format!("/tmp/solana-verify/{}", uuid) - }; - - temp_dir_opt.replace(verify_dir.clone()); - - let verify_tmp_root_path = format!("{}/{}", verify_dir, base_name); - println!("Cloning repo into: {}", verify_tmp_root_path); - - check_signal(container_id_opt, temp_dir_opt); - std::process::Command::new("git") - .args(["clone", &repo_url, &verify_tmp_root_path]) - .stdout(Stdio::inherit()) - .output()?; - - check_signal(container_id_opt, temp_dir_opt); - - // Checkout a specific commit hash, if provided - if let Some(commit_hash) = commit_hash.as_ref() { - let result = std::process::Command::new("git") - .args(["-C", &verify_tmp_root_path]) - .args(["checkout", commit_hash]) - .output() - .map_err(|e| anyhow!("Failed to checkout commit hash: {:?}", e)); - if result.is_ok() { - println!("Checked out commit hash: {}", commit_hash); - } else { - std::process::Command::new("rm") - .args(["-rf", verify_dir.as_str()]) - .output()?; - Err(anyhow!("Encountered error in git setup: {:?}", result))?; - } - } - - check_signal(container_id_opt, temp_dir_opt); - +) -> anyhow::Result<(Vec, String, String)> { + let mut args: Vec = Vec::new(); if !relative_mount_path.is_empty() { - args.push("--mount-path"); - args.push(&relative_mount_path); + args.push("--mount-path".to_string()); + args.push(relative_mount_path.to_string()); } // Get the absolute build path to the solana program directory to build inside docker let mount_path = PathBuf::from(verify_tmp_root_path.clone()).join(&relative_mount_path); - println!("Build path: {:?}", mount_path); - args.push("--library-name"); + args.push("--library-name".to_string()); let library_name = match library_name_opt.clone() { Some(p) => p, None => { @@ -1067,28 +1130,143 @@ pub async fn verify_from_repo( })? } }; - args.push(&library_name); - println!("Verifying program: {}", library_name); + args.push(library_name.clone()); if let Some(base_image) = &base_image { - args.push("--base-image"); - args.push(base_image); + args.push("--base-image".to_string()); + args.push(base_image.clone()); } if bpf_flag { - args.push("--bpf"); + args.push("--bpf".to_string()); } if !cargo_args.is_empty() { - args.push("--"); + args.push("--".to_string()); for arg in &cargo_args { - args.push(arg); + args.push(arg.clone()); } } + Ok((args, mount_path.to_str().unwrap().to_string(), library_name)) +} + +fn clone_repo_and_checkout( + repo_url: &str, + current_dir: bool, + base_name: &str, + commit_hash: Option, + temp_dir_opt: &mut Option, +) -> anyhow::Result<(String, String)> { + let uuid = Uuid::new_v4().to_string(); + + // Create a temporary directory to clone the repo into + let verify_dir = if current_dir { + format!( + "{}/.{}", + std::env::current_dir()? + .as_os_str() + .to_str() + .ok_or_else(|| anyhow::Error::msg("Invalid path string"))?, + uuid.clone() + ) + } else { + format!("/tmp/solana-verify/{}", uuid) + }; + + temp_dir_opt.replace(verify_dir.clone()); + + let verify_tmp_root_path = format!("{}/{}", verify_dir, base_name); + println!("Cloning repo into: {}", verify_tmp_root_path); + + std::process::Command::new("git") + .args(["clone", &repo_url, &verify_tmp_root_path]) + .stdout(Stdio::inherit()) + .output()?; + + if let Some(commit_hash) = commit_hash.as_ref() { + let result = std::process::Command::new("git") + .args(["-C", &verify_tmp_root_path]) + .args(["checkout", commit_hash]) + .output() + .map_err(|e| anyhow!("Failed to checkout commit hash: {:?}", e)); + if result.is_ok() { + println!("Checked out commit hash: {}", commit_hash); + } else { + std::process::Command::new("rm") + .args(["-rf", verify_dir.as_str()]) + .output()?; + Err(anyhow!("Encountered error in git setup: {:?}", result))?; + } + } + + Ok((verify_tmp_root_path, verify_dir)) +} + +fn get_basename(repo_url: &str) -> anyhow::Result { + let base_name = std::process::Command::new("basename") + .arg(&repo_url) + .output() + .map_err(|e| anyhow!("Failed to get basename of repo_url: {:?}", e)) + .and_then(|output| parse_output(output.stdout))?; + Ok(base_name) +} + +#[allow(clippy::too_many_arguments)] +pub async fn verify_from_repo( + remote: bool, + relative_mount_path: String, + connection: &RpcClient, + repo_url: String, + commit_hash: Option, + program_id: Pubkey, + base_image: Option, + library_name_opt: Option, + bpf_flag: bool, + cargo_args: Vec, + current_dir: bool, + skip_prompt: bool, + path_to_keypair: Option, + compute_unit_price: u64, + mut skip_build: bool, + container_id_opt: &mut Option, + temp_dir_opt: &mut Option, + check_signal: &dyn Fn(&mut Option, &mut Option), +) -> anyhow::Result<()> { + // Set skip_build to true if remote is true + skip_build |= remote; + + // Get source code from repo_url + let base_name = get_basename(&repo_url)?; + + check_signal(container_id_opt, temp_dir_opt); + + let (verify_tmp_root_path, verify_dir) = clone_repo_and_checkout( + &repo_url, + current_dir, + &base_name, + commit_hash.clone(), + temp_dir_opt, + )?; + + check_signal(container_id_opt, temp_dir_opt); + + let (args, mount_path, library_name) = build_args( + &relative_mount_path, + library_name_opt.clone(), + &verify_tmp_root_path, + base_image.clone(), + bpf_flag, + cargo_args.clone(), + )?; + println!("Build path: {:?}", mount_path); + println!("Verifying program: {}", library_name); + + check_signal(container_id_opt, temp_dir_opt); + let result: Result<(String, String), anyhow::Error> = if !skip_build { build_and_verify_repo( - mount_path.to_str().unwrap().to_string(), + mount_path, base_image.clone(), bpf_flag, library_name.clone(), @@ -1102,11 +1280,9 @@ pub async fn verify_from_repo( }; // Cleanup no matter the result - if !skip_build { - std::process::Command::new("rm") - .args(["-rf", &verify_dir]) - .output()?; - } + std::process::Command::new("rm") + .args(["-rf", &verify_dir]) + .output()?; // Handle the result match result { @@ -1126,7 +1302,7 @@ pub async fn verify_from_repo( upload_program( repo_url.clone(), &commit_hash.clone(), - args.iter().map(|&s| s.into()).collect(), + args.iter().map(|s| s.to_string()).collect(), program_id, connection, skip_prompt, @@ -1285,3 +1461,18 @@ pub async fn print_program_pda( print_build_params(&pda, &build_params); Ok(()) } + +pub fn get_commit_hash(sub_m: &ArgMatches, repo_url: &str) -> anyhow::Result { + let commit_hash = sub_m + .value_of("commit-hash") + .map(String::from) + .or_else(|| { + get_commit_hash_from_remote(&repo_url).ok() // Dynamically determine commit hash from remote + }) + .ok_or_else(|| { + anyhow::anyhow!("Commit hash must be provided or inferred from the remote repository") + })?; + + println!("Commit hash from remote: {}", commit_hash); + Ok(commit_hash) +} diff --git a/src/solana_program.rs b/src/solana_program.rs index 76e52f8..77ea7a9 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -12,7 +12,8 @@ use std::{ use borsh::{to_vec, BorshDeserialize, BorshSerialize}; use solana_sdk::{ - compute_budget::ComputeBudgetInstruction, instruction::AccountMeta, message::Message, pubkey::Pubkey, signature::Keypair, signer::Signer, system_program, transaction::Transaction + compute_budget::ComputeBudgetInstruction, instruction::AccountMeta, message::Message, + pubkey::Pubkey, signature::Keypair, signer::Signer, system_program, transaction::Transaction, }; use solana_account_decoder::UiAccountEncoding; @@ -108,24 +109,14 @@ fn get_user_config() -> anyhow::Result<(Keypair, RpcClient)> { Ok((signer, rpc_client)) } -fn process_otter_verify_ixs( +pub fn compose_transaction( params: &InputParams, + signer_pubkey: Pubkey, pda_account: Pubkey, program_address: Pubkey, instruction: OtterVerifyInstructions, - rpc_client: &RpcClient, - path_to_keypair: Option, compute_unit_price: u64, -) -> anyhow::Result<()> { - let user_config = get_user_config()?; - let signer = if let Some(path_to_keypair) = path_to_keypair { - get_keypair_from_path(&path_to_keypair)? - } else { - user_config.0 - }; - let signer_pubkey = signer.pubkey(); - let connection = rpc_client; - +) -> Transaction { let ix_data = if instruction != OtterVerifyInstructions::Close { create_ix_data(params, &instruction) } else { @@ -150,13 +141,41 @@ fn process_otter_verify_ixs( let message = if compute_unit_price > 0 { // Add compute budget instruction for priority fees only if price > 0 - let compute_budget_ix = ComputeBudgetInstruction::set_compute_unit_price(compute_unit_price); + let compute_budget_ix = + ComputeBudgetInstruction::set_compute_unit_price(compute_unit_price); Message::new(&[compute_budget_ix, ix], Some(&signer_pubkey)) } else { Message::new(&[ix], Some(&signer_pubkey)) }; - let mut tx = Transaction::new_unsigned(message); + Transaction::new_unsigned(message) +} + +fn process_otter_verify_ixs( + params: &InputParams, + pda_account: Pubkey, + program_address: Pubkey, + instruction: OtterVerifyInstructions, + rpc_client: &RpcClient, + path_to_keypair: Option, + compute_unit_price: u64, +) -> anyhow::Result<()> { + let user_config = get_user_config()?; + let signer = if let Some(path_to_keypair) = path_to_keypair { + get_keypair_from_path(&path_to_keypair)? + } else { + user_config.0 + }; + let connection = rpc_client; + + let mut tx = compose_transaction( + params, + signer.pubkey(), + pda_account, + program_address, + instruction, + compute_unit_price, + ); tx.sign(&[&signer], connection.get_latest_blockhash()?); @@ -282,7 +301,7 @@ pub async fn upload_program( Ok(()) } -fn find_build_params_pda(program_id: &Pubkey, signer: &Pubkey) -> (Pubkey, u8) { +pub fn find_build_params_pda(program_id: &Pubkey, signer: &Pubkey) -> (Pubkey, u8) { let seeds: &[&[u8]; 3] = &[b"otter_verify", &signer.to_bytes(), &program_id.to_bytes()]; Pubkey::find_program_address(seeds, &OTTER_VERIFY_PROGRAM_ID) } From 37373da0d73d4ee3fc299fe18c4ec6de3836a12a Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 17 Dec 2024 16:24:58 -0500 Subject: [PATCH 300/314] refactor into its own function --- src/main.rs | 140 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 87 insertions(+), 53 deletions(-) diff --git a/src/main.rs b/src/main.rs index fc229fe..ec136e4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -504,61 +504,22 @@ async fn main() -> anyhow::Result<()> { let connection = resolve_rpc_url(matches.value_of("url").map(|s| s.to_string()))?; println!("Using connection url: {}", connection.url()); - let last_deployed_slot = get_last_deployed_slot(&connection, &program_id.to_string()) - .await - .map_err(|err| anyhow!("Unable to get last deployed slot: {}", err))?; - - let (temp_root_path, verify_dir) = clone_repo_and_checkout( - &repo_url, - true, - &get_basename(&repo_url)?, - Some(commit_hash.clone()), - &mut temp_dir, - )?; - - let input_params = InputParams { - version: env!("CARGO_PKG_VERSION").to_string(), - git_url: repo_url, - commit: commit_hash.clone(), - args: build_args( - &mount_path, - library_name, - &temp_root_path, - base_image, - bpf_flag, - cargo_args, - )? - .0, - deployed_slot: last_deployed_slot, - }; - - std::process::Command::new("rm") - .args(["-rf", &verify_dir]) - .output()?; - - let (pda, _) = - find_build_params_pda(&Pubkey::try_from(program_id)?, &Pubkey::try_from(uploader)?); - - let tx = compose_transaction( - &input_params, - Pubkey::try_from(uploader)?, - pda, + export_pda_tx( + &connection, Pubkey::try_from(program_id)?, - OtterVerifyInstructions::Initialize, + Pubkey::try_from(uploader)?, + repo_url, + commit_hash, + mount_path, + library_name, + base_image, + bpf_flag, + &mut temp_dir, + encoding, + cargo_args, compute_unit_price, - ); - - // serialize the transaction to base58 - match encoding { - UiTransactionEncoding::Base58 => { - println!("{}", bs58::encode(serialize(&tx)?).into_string()); - } - UiTransactionEncoding::Base64 => { - println!("{}", BASE64_STANDARD.encode(serialize(&tx)?)); - } - _ => unreachable!(), - } - Ok(()) + ) + .await } ("list-program-pdas", Some(sub_m)) => { let program_id = sub_m.value_of("program-id").unwrap(); @@ -1476,3 +1437,76 @@ pub fn get_commit_hash(sub_m: &ArgMatches, repo_url: &str) -> anyhow::Result, + base_image: Option, + bpf_flag: bool, + temp_dir: &mut Option, + encoding: UiTransactionEncoding, + cargo_args: Vec, + compute_unit_price: u64, +) -> anyhow::Result<()> { + let last_deployed_slot = get_last_deployed_slot(&connection, &program_id.to_string()) + .await + .map_err(|err| anyhow!("Unable to get last deployed slot: {}", err))?; + + let (temp_root_path, verify_dir) = clone_repo_and_checkout( + &repo_url, + true, + &get_basename(&repo_url)?, + Some(commit_hash.clone()), + temp_dir, + )?; + + let input_params = InputParams { + version: env!("CARGO_PKG_VERSION").to_string(), + git_url: repo_url, + commit: commit_hash.clone(), + args: build_args( + &mount_path, + library_name.clone(), + &temp_root_path, + base_image.clone(), + bpf_flag.clone(), + cargo_args, + )? + .0, + deployed_slot: last_deployed_slot, + }; + + std::process::Command::new("rm") + .args(["-rf", &verify_dir]) + .output()?; + + let (pda, _) = + find_build_params_pda(&Pubkey::try_from(program_id)?, &Pubkey::try_from(uploader)?); + + let tx = compose_transaction( + &input_params, + Pubkey::try_from(uploader)?, + pda, + Pubkey::try_from(program_id)?, + OtterVerifyInstructions::Initialize, + compute_unit_price, + ); + + // serialize the transaction to base58 + match encoding { + UiTransactionEncoding::Base58 => { + println!("{}", bs58::encode(serialize(&tx)?).into_string()); + } + UiTransactionEncoding::Base64 => { + println!("{}", BASE64_STANDARD.encode(serialize(&tx)?)); + } + _ => unreachable!(), + } + + Ok(()) +} From c74d6dd941f78ef88e7ab7491f88ca8a4f02bd6b Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Tue, 17 Dec 2024 16:29:22 -0500 Subject: [PATCH 301/314] switch update/initialize ix based on whether or not pda exists --- src/main.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index ec136e4..4c7d4b5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1488,12 +1488,26 @@ async fn export_pda_tx( let (pda, _) = find_build_params_pda(&Pubkey::try_from(program_id)?, &Pubkey::try_from(uploader)?); + // check if account already exists + let instruction = match connection.get_account(&pda) { + Ok(account_info) => { + if account_info.data.len() > 0 { + println!("PDA already exists, creating update transaction"); + OtterVerifyInstructions::Update + } else { + println!("PDA does not exist, creating initialize transaction"); + OtterVerifyInstructions::Initialize + } + } + Err(_) => OtterVerifyInstructions::Initialize, + }; + let tx = compose_transaction( &input_params, Pubkey::try_from(uploader)?, pda, Pubkey::try_from(program_id)?, - OtterVerifyInstructions::Initialize, + instruction, compute_unit_price, ); From 80ba682e1653beae396ffe89572b063ee5600466 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Wed, 18 Dec 2024 09:52:00 -0500 Subject: [PATCH 302/314] remove dead code --- src/main.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 4c7d4b5..a209acf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,13 +7,12 @@ use bincode::serialize; use cargo_lock::Lockfile; use cargo_toml::Manifest; use clap::{App, AppSettings, Arg, ArgMatches, SubCommand}; -use serde::Serialize; use signal_hook::{ consts::{SIGINT, SIGTERM}, iterator::Signals, }; use solana_cli_config::{Config, CONFIG_FILE}; -use solana_client::{rpc_client::RpcClient, rpc_config::EncodingConfig}; +use solana_client::rpc_client::RpcClient; use solana_program::{ compose_transaction, find_build_params_pda, get_all_pdas_available, get_program_pda, resolve_rpc_url, InputParams, OtterBuildParams, OtterVerifyInstructions, @@ -32,7 +31,6 @@ use std::{ Arc, }, }; -use tokio::join; use uuid::Uuid; pub mod api; #[rustfmt::skip] @@ -1047,7 +1045,7 @@ fn build_args( args.push(relative_mount_path.to_string()); } // Get the absolute build path to the solana program directory to build inside docker - let mount_path = PathBuf::from(verify_tmp_root_path.clone()).join(&relative_mount_path); + let mount_path = PathBuf::from(verify_tmp_root_path).join(&relative_mount_path); args.push("--library-name".to_string()); let library_name = match library_name_opt.clone() { From 6734e000aec86ac63868dcfe9b5efafc8779279b Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Wed, 18 Dec 2024 11:13:30 -0500 Subject: [PATCH 303/314] update prompt and function name --- src/main.rs | 16 ++++++++-------- src/solana_program.rs | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main.rs b/src/main.rs index a209acf..47e9ef0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,10 +13,6 @@ use signal_hook::{ }; use solana_cli_config::{Config, CONFIG_FILE}; use solana_client::rpc_client::RpcClient; -use solana_program::{ - compose_transaction, find_build_params_pda, get_all_pdas_available, get_program_pda, - resolve_rpc_url, InputParams, OtterBuildParams, OtterVerifyInstructions, -}; use solana_sdk::{ bpf_loader_upgradeable::{self, UpgradeableLoaderState}, pubkey::Pubkey, @@ -43,7 +39,11 @@ mod test; use crate::{ api::send_job_to_remote, - solana_program::{process_close, upload_program}, + solana_program::{ + compose_transaction, find_build_params_pda, get_all_pdas_available, get_program_pda, + process_close, resolve_rpc_url, upload_program_verification_data, InputParams, + OtterBuildParams, OtterVerifyInstructions, + }, }; const MAINNET_GENESIS_HASH: &str = "5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d"; @@ -227,7 +227,7 @@ async fn main() -> anyhow::Result<()> { .arg(Arg::with_name("skip-prompt") .short("y") .long("skip-prompt") - .help("Skip the prompt to upload a new program")) + .help("Skip the prompt to write verify data on chain without user confirmation")) .arg(Arg::with_name("keypair") .short("k") .long("keypair") @@ -1253,12 +1253,12 @@ pub async fn verify_from_repo( if skip_build || build_hash == program_hash { if skip_build { - println!("Skipping local build and uploading program"); + println!("Skipping local build and writing verify data on chain"); } else { println!("Program hash matches ✅"); } - upload_program( + upload_program_verification_data( repo_url.clone(), &commit_hash.clone(), args.iter().map(|s| s.to_string()).collect(), diff --git a/src/solana_program.rs b/src/solana_program.rs index 77ea7a9..6e4f97d 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -208,7 +208,7 @@ pub fn resolve_rpc_url(url: Option) -> anyhow::Result { Ok(connection) } -pub async fn upload_program( +pub async fn upload_program_verification_data( git_url: String, commit: &Option, args: Vec, From 88e22316808e6203a408bc653c02ef8e98c4598c Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Wed, 18 Dec 2024 11:16:55 -0500 Subject: [PATCH 304/314] cargo clippy fix --- src/api/client.rs | 12 ++++-------- src/main.rs | 26 +++++++++++++------------- src/solana_program.rs | 9 +++++---- 3 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/api/client.rs b/src/api/client.rs index 0ef73c1..4207d20 100644 --- a/src/api/client.rs +++ b/src/api/client.rs @@ -5,7 +5,7 @@ use reqwest::{Client, Response}; use serde_json::json; use solana_client::rpc_client::RpcClient; use solana_sdk::pubkey::Pubkey; -use std::sync::atomic::{Ordering}; +use std::sync::atomic::Ordering; use std::thread; use std::time::{Duration, Instant}; @@ -190,7 +190,7 @@ pub async fn handle_submission_response( break; // Exit the loop and continue with normal error handling } - let status = check_job_status(&client, &request_id).await?; + let status = check_job_status(client, &request_id).await?; match status.status { JobStatus::InProgress => { if SIGNAL_RECEIVED.load(Ordering::Relaxed) { @@ -266,7 +266,7 @@ pub async fn handle_submission_response( async fn check_job_status(client: &Client, request_id: &str) -> anyhow::Result { // Get /job/:id let response = client - .get(&format!("{}/job/{}", REMOTE_SERVER_URL, request_id)) + .get(format!("{}/job/{}", REMOTE_SERVER_URL, request_id)) .send() .await .unwrap(); @@ -309,11 +309,7 @@ pub async fn get_remote_status(program_id: Pubkey) -> anyhow::Result<()> { .build()?; let response = client - .get(format!( - "{}/status-all/{}", - REMOTE_SERVER_URL, - program_id.to_string() - )) + .get(format!("{}/status-all/{}", REMOTE_SERVER_URL, program_id,)) .send() .await?; diff --git a/src/main.rs b/src/main.rs index 47e9ef0..3840bcf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1045,7 +1045,7 @@ fn build_args( args.push(relative_mount_path.to_string()); } // Get the absolute build path to the solana program directory to build inside docker - let mount_path = PathBuf::from(verify_tmp_root_path).join(&relative_mount_path); + let mount_path = PathBuf::from(verify_tmp_root_path).join(relative_mount_path); args.push("--library-name".to_string()); let library_name = match library_name_opt.clone() { @@ -1139,7 +1139,7 @@ fn clone_repo_and_checkout( println!("Cloning repo into: {}", verify_tmp_root_path); std::process::Command::new("git") - .args(["clone", &repo_url, &verify_tmp_root_path]) + .args(["clone", repo_url, &verify_tmp_root_path]) .stdout(Stdio::inherit()) .output()?; @@ -1164,7 +1164,7 @@ fn clone_repo_and_checkout( fn get_basename(repo_url: &str) -> anyhow::Result { let base_name = std::process::Command::new("basename") - .arg(&repo_url) + .arg(repo_url) .output() .map_err(|e| anyhow!("Failed to get basename of repo_url: {:?}", e)) .and_then(|output| parse_output(output.stdout))?; @@ -1404,7 +1404,7 @@ pub fn print_build_params(pubkey: &Pubkey, build_params: &OtterBuildParams) { } pub async fn list_program_pdas(program_id: Pubkey, client: &RpcClient) -> anyhow::Result<()> { - let pdas = get_all_pdas_available(&client, &program_id).await?; + let pdas = get_all_pdas_available(client, &program_id).await?; for (pda, build_params) in pdas { print_build_params(&pda, &build_params); } @@ -1416,7 +1416,7 @@ pub async fn print_program_pda( signer: Option, client: &RpcClient, ) -> anyhow::Result<()> { - let (pda, build_params) = get_program_pda(&client, &program_id, signer).await?; + let (pda, build_params) = get_program_pda(client, &program_id, signer).await?; print_build_params(&pda, &build_params); Ok(()) } @@ -1426,7 +1426,7 @@ pub fn get_commit_hash(sub_m: &ArgMatches, repo_url: &str) -> anyhow::Result anyhow::Result, compute_unit_price: u64, ) -> anyhow::Result<()> { - let last_deployed_slot = get_last_deployed_slot(&connection, &program_id.to_string()) + let last_deployed_slot = get_last_deployed_slot(connection, &program_id.to_string()) .await .map_err(|err| anyhow!("Unable to get last deployed slot: {}", err))?; @@ -1472,7 +1473,7 @@ async fn export_pda_tx( library_name.clone(), &temp_root_path, base_image.clone(), - bpf_flag.clone(), + bpf_flag, cargo_args, )? .0, @@ -1483,13 +1484,12 @@ async fn export_pda_tx( .args(["-rf", &verify_dir]) .output()?; - let (pda, _) = - find_build_params_pda(&Pubkey::try_from(program_id)?, &Pubkey::try_from(uploader)?); + let (pda, _) = find_build_params_pda(&program_id, &uploader); // check if account already exists let instruction = match connection.get_account(&pda) { Ok(account_info) => { - if account_info.data.len() > 0 { + if !account_info.data.is_empty() { println!("PDA already exists, creating update transaction"); OtterVerifyInstructions::Update } else { @@ -1502,9 +1502,9 @@ async fn export_pda_tx( let tx = compose_transaction( &input_params, - Pubkey::try_from(uploader)?, + uploader, pda, - Pubkey::try_from(program_id)?, + program_id, instruction, compute_unit_price, ); diff --git a/src/solana_program.rs b/src/solana_program.rs index 6e4f97d..3aa12f9 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -93,7 +93,7 @@ fn create_ix_data(params: &InputParams, ix: &OtterVerifyInstructions) -> Vec } fn get_keypair_from_path(path: &str) -> anyhow::Result { - solana_clap_utils::keypair::keypair_from_path(&Default::default(), &path, "keypair", false) + solana_clap_utils::keypair::keypair_from_path(&Default::default(), path, "keypair", false) .map_err(|err| anyhow!("Unable to get signer from path: {}", err)) } @@ -208,6 +208,7 @@ pub fn resolve_rpc_url(url: Option) -> anyhow::Result { Ok(connection) } +#[allow(clippy::too_many_arguments)] pub async fn upload_program_verification_data( git_url: String, commit: &Option, @@ -228,7 +229,7 @@ pub async fn upload_program_verification_data( let cli_config = get_user_config()?; let signer_pubkey: Pubkey = if let Some(ref path_to_keypair) = path_to_keypair { - get_keypair_from_path(&path_to_keypair)?.pubkey() + get_keypair_from_path(path_to_keypair)?.pubkey() } else { cli_config.0.pubkey() }; @@ -236,7 +237,7 @@ pub async fn upload_program_verification_data( // let rpc_url = connection.url(); println!("Using connection url: {}", connection.url()); - let last_deployed_slot = get_last_deployed_slot(&connection, &program_address.to_string()) + let last_deployed_slot = get_last_deployed_slot(connection, &program_address.to_string()) .await .map_err(|err| anyhow!("Unable to get last deployed slot: {}", err))?; @@ -315,7 +316,7 @@ pub async fn process_close( let signer = user_config.0; let signer_pubkey = signer.pubkey(); - let last_deployed_slot = get_last_deployed_slot(&connection, &program_address.to_string()) + let last_deployed_slot = get_last_deployed_slot(connection, &program_address.to_string()) .await .map_err(|err| anyhow!("Unable to get last deployed slot: {}", err))?; From f2a5a9f516ac7f22d0c9cdda5b6e821d244e12de Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Thu, 19 Dec 2024 09:13:38 -0500 Subject: [PATCH 305/314] use verify-with-signer on --remote, same as remote submit-job, to make API behavior consistent, and improve error messages --- src/main.rs | 40 ++++++++++++++++++++++++++-------------- src/solana_program.rs | 18 +++++++++++------- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/src/main.rs b/src/main.rs index 3840bcf..4843c0c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,6 +13,7 @@ use signal_hook::{ }; use solana_cli_config::{Config, CONFIG_FILE}; use solana_client::rpc_client::RpcClient; +use solana_program::get_address_from_keypair_or_config; use solana_sdk::{ bpf_loader_upgradeable::{self, UpgradeableLoaderState}, pubkey::Pubkey, @@ -1265,7 +1266,7 @@ pub async fn verify_from_repo( program_id, connection, skip_prompt, - path_to_keypair, + path_to_keypair.clone(), compute_unit_price, ) .await?; @@ -1277,18 +1278,23 @@ pub async fn verify_from_repo( return Err(anyhow!("Remote verification only works with mainnet. Please omit the --remote flag to verify locally.")); } - println!("Sending verify command to remote machine..."); - send_job_to_remote( - &repo_url, - &commit_hash, - &program_id, - &library_name_opt.clone(), - bpf_flag, - relative_mount_path.clone(), - base_image.clone(), - cargo_args.clone(), - ) - .await?; + let uploader = get_address_from_keypair_or_config(path_to_keypair.as_ref())?; + println!( + "Sending verify command to remote machine with uploader: {}", + &uploader + ); + send_job_with_uploader_to_remote(&connection, &program_id, &uploader).await?; + // send_job_to_remote( + // &repo_url, + // &commit_hash, + // &program_id, + // &library_name_opt.clone(), + // bpf_flag, + // relative_mount_path.clone(), + // base_image.clone(), + // cargo_args.clone(), + // ) + // .await?; } Ok(()) @@ -1299,7 +1305,13 @@ pub async fn verify_from_repo( Ok(()) } } - Err(e) => Err(anyhow!("Error verifying program: {:?}", e)), + Err(e) => { + eprintln!( + "\nPlease note that if the desired uploader is not the provided keypair, you will need to run `solana-verify remote submit-job --program-id {} --uploader .\n", + &program_id, + ); + Err(anyhow!("Error verifying program: {:?}", e)) + } } } diff --git a/src/solana_program.rs b/src/solana_program.rs index 3aa12f9..19ccd05 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -208,6 +208,16 @@ pub fn resolve_rpc_url(url: Option) -> anyhow::Result { Ok(connection) } +pub fn get_address_from_keypair_or_config( + path_to_keypair: Option<&String>, +) -> anyhow::Result { + if let Some(path_to_keypair) = path_to_keypair { + Ok(get_keypair_from_path(&path_to_keypair)?.pubkey()) + } else { + Ok(get_user_config()?.0.pubkey()) + } +} + #[allow(clippy::too_many_arguments)] pub async fn upload_program_verification_data( git_url: String, @@ -226,13 +236,7 @@ pub async fn upload_program_verification_data( { println!("Uploading the program verification params to the Solana blockchain..."); - let cli_config = get_user_config()?; - - let signer_pubkey: Pubkey = if let Some(ref path_to_keypair) = path_to_keypair { - get_keypair_from_path(path_to_keypair)?.pubkey() - } else { - cli_config.0.pubkey() - }; + let signer_pubkey: Pubkey = get_address_from_keypair_or_config(path_to_keypair.as_ref())?; // let rpc_url = connection.url(); println!("Using connection url: {}", connection.url()); From 3eb59294f8e8376f13cd111e569e4bfb6c32b4c7 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Thu, 19 Dec 2024 09:22:19 -0500 Subject: [PATCH 306/314] clippy --- src/main.rs | 36 ++++++++++-------------------------- src/solana_program.rs | 2 +- 2 files changed, 11 insertions(+), 27 deletions(-) diff --git a/src/main.rs b/src/main.rs index 4843c0c..4f2dea7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -38,13 +38,10 @@ use image_config::IMAGE_MAP; #[cfg(test)] mod test; -use crate::{ - api::send_job_to_remote, - solana_program::{ - compose_transaction, find_build_params_pda, get_all_pdas_available, get_program_pda, - process_close, resolve_rpc_url, upload_program_verification_data, InputParams, - OtterBuildParams, OtterVerifyInstructions, - }, +use crate::solana_program::{ + compose_transaction, find_build_params_pda, get_all_pdas_available, get_program_pda, + process_close, resolve_rpc_url, upload_program_verification_data, InputParams, + OtterBuildParams, OtterVerifyInstructions, }; const MAINNET_GENESIS_HASH: &str = "5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d"; @@ -1283,18 +1280,11 @@ pub async fn verify_from_repo( "Sending verify command to remote machine with uploader: {}", &uploader ); - send_job_with_uploader_to_remote(&connection, &program_id, &uploader).await?; - // send_job_to_remote( - // &repo_url, - // &commit_hash, - // &program_id, - // &library_name_opt.clone(), - // bpf_flag, - // relative_mount_path.clone(), - // base_image.clone(), - // cargo_args.clone(), - // ) - // .await?; + println!( + "\nPlease note that if the desired uploader is not the provided keypair, you will need to run `solana-verify remote submit-job --program-id {} --uploader .\n", + &program_id, + ); + send_job_with_uploader_to_remote(connection, &program_id, &uploader).await?; } Ok(()) @@ -1305,13 +1295,7 @@ pub async fn verify_from_repo( Ok(()) } } - Err(e) => { - eprintln!( - "\nPlease note that if the desired uploader is not the provided keypair, you will need to run `solana-verify remote submit-job --program-id {} --uploader .\n", - &program_id, - ); - Err(anyhow!("Error verifying program: {:?}", e)) - } + Err(e) => Err(anyhow!("Error verifying program: {:?}", e)), } } diff --git a/src/solana_program.rs b/src/solana_program.rs index 19ccd05..2a3aaea 100644 --- a/src/solana_program.rs +++ b/src/solana_program.rs @@ -212,7 +212,7 @@ pub fn get_address_from_keypair_or_config( path_to_keypair: Option<&String>, ) -> anyhow::Result { if let Some(path_to_keypair) = path_to_keypair { - Ok(get_keypair_from_path(&path_to_keypair)?.pubkey()) + Ok(get_keypair_from_path(path_to_keypair)?.pubkey()) } else { Ok(get_user_config()?.0.pubkey()) } From 24735b91c0a27a4117e43f7b3da5b3c6e1d76564 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Thu, 19 Dec 2024 09:41:18 -0500 Subject: [PATCH 307/314] remove unused function --- src/api/client.rs | 39 --------------------------------------- src/api/mod.rs | 1 - 2 files changed, 40 deletions(-) diff --git a/src/api/client.rs b/src/api/client.rs index 4207d20..50224fc 100644 --- a/src/api/client.rs +++ b/src/api/client.rs @@ -89,45 +89,6 @@ fn print_verification_status( println!("Repo URL: {}", status_response.repo_url.as_str()); } -// Send a job to the remote server -#[allow(clippy::too_many_arguments)] -pub async fn send_job_to_remote( - repo_url: &str, - commit_hash: &Option, - program_id: &Pubkey, - library_name: &Option, - bpf_flag: bool, - relative_mount_path: String, - base_image: Option, - cargo_args: Vec, -) -> anyhow::Result<()> { - let client = Client::builder() - .timeout(Duration::from_secs(18000)) - .build()?; - - // Send the POST request - let response = client - .post(format!("{}/verify", REMOTE_SERVER_URL)) - .json(&json!({ - "repository": repo_url, - "commit_hash": commit_hash, - "program_id": program_id.to_string(), - "lib_name": library_name, - "bpf_flag": bpf_flag, - "mount_path": if relative_mount_path.is_empty() { - None - } else { - Some(relative_mount_path) - }, - "base_image": base_image, - "cargo_args": cargo_args, - })) - .send() - .await?; - - handle_submission_response(&client, response, program_id).await -} - pub async fn send_job_with_uploader_to_remote( connection: &RpcClient, program_id: &Pubkey, diff --git a/src/api/mod.rs b/src/api/mod.rs index 07fb5ff..b9e2267 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -4,6 +4,5 @@ mod solana; pub use client::get_remote_job; pub use client::get_remote_status; -pub use client::send_job_to_remote; pub use client::send_job_with_uploader_to_remote; pub use solana::get_last_deployed_slot; From c9bce4c566eba48148a1563dba0ea1125bb03c35 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Wed, 18 Dec 2024 14:50:11 -0500 Subject: [PATCH 308/314] release v0.4.0 --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 01d4ad8..562bd7f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4034,7 +4034,7 @@ dependencies = [ [[package]] name = "solana-verify" -version = "0.3.1" +version = "0.4.0" dependencies = [ "anyhow", "base64 0.22.1", diff --git a/Cargo.toml b/Cargo.toml index c2cd603..9f97343 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "solana-verify" -version = "0.3.1" +version = "0.4.0" edition = "2021" description = "A CLI tool for building verifiable Solana programs" license = "MIT" From 5f803c4cae9f2d2ee7a07ac47f1a6f7b36a04a24 Mon Sep 17 00:00:00 2001 From: Jonas Hahn Date: Tue, 3 Dec 2024 14:02:17 +0100 Subject: [PATCH 309/314] Update README.md --- README.md | 241 ++++++++---------------------------------------------- 1 file changed, 32 insertions(+), 209 deletions(-) diff --git a/README.md b/README.md index 2ba9684..80137ee 100644 --- a/README.md +++ b/README.md @@ -1,232 +1,55 @@ -# Solana Verify CLI +# Solana Verified Builds -A command line tool to build and verify solana programs. Users can ensure that the hash of the on-chain program matches the hash of the program of the given codebase. +This repository demonstrates how to implement verified builds for Solana programs. Verified builds ensure that your deployed program matches exactly with your public source code, promoting transparency and security in the Solana ecosystem. -## Installation +## What are Verified Builds? -In order for this CLI to work properly, you must have `docker` installed on your computer. Follow the steps here: to install Docker (based on your platform) +Verified builds allow developers and users to verify that a deployed Solana program matches its source code. This verification: -Once the installation is complete, make sure that the server has been started: () +- Ensures program authenticity +- Promotes transparency +- Builds user trust +- Makes source code discoverable -You will also need to install Cargo if you don't already have it. +## Quick Start -Run the following command in your shell to install it (or visit ): +1. Install prerequisites: -``` -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -``` - -Finally, to install the Solana Verify cli, run the following in your shell: - -``` -# Pulls the latest version from crates.io -cargo install solana-verify -``` - -If you want to pin the version: - -``` -# Pulls the latest version from crates.io -cargo install solana-verify --version $VERSION -``` - -If you are extra cautious and want to install a version of the binary that maps 1-to-1 with a specific commit, run the following. This example is installing version 0.2.6 from revision `13a1db2`: - -``` -# Pulls the source from git. Change the argument to --rev to the desired commit -cargo install solana-verify --git https://github.com/Ellipsis-Labs/solana-verifiable-build --rev 13a1db2 -``` - -## Building Verifiable Programs + - Docker + - Cargo + - Solana Verify CLI (`cargo install solana-verify`) -To verifiably build your Solana program, go to the directory with the workspace Cargo.toml file and run the following: +2. Build your program: -``` +```bash solana-verify build ``` -If you're working in a repository with multiple programs, in order to build a specific program, `$PROGRAM_LIB_NAME`, run the following: - -``` -solana-verify build --library-name $PROGRAM_LIB_NAME -``` - -The string that's passed in must be the _lib_ name and NOT the _package_ name. These are usually the same, but the distinction is important. -![image](https://github.com/Ellipsis-Labs/solana-verifiable-build/assets/61092285/0427e88f-cc0f-465f-b2e9-747ea1b8d3af) - -(NOTE: These commands can take up to 30 minutes if you're running on an M1 Macbook Pro. This has to do with the architecture emulation required to ensure build determinism. For best performance, it is recommended to run builds on a Linux machine running x86) - -You can now print the executable hash of the program by running the following: - -``` -solana-verify get-executable-hash target/deploy/$PROGRAM_LIB_NAME.so -``` - -## Deploying Verifiable Programs - -When the build completes, the executable file in `target/deploy/$PROGRAM_LIB_NAME.so` will contain the buffer to upload to the network. - -In order to directly upload the program to chain (NOT RECOMMENDED), run the following: - -``` -solana program deploy -u $NETWORK_URL target/deploy/$PROGRAM_LIB_NAME.so --program-id $PROGRAM_ID --upgrade-authority $UPGRADE_AUTHORITY -``` - -The same caveats apply as any normal deployment. See the Solana [docs](https://docs.solana.com/cli/deploy-a-program) for more details. - -Once the upload is completed, you can verify that the program hash matches the executable hash computed in the previous step: - -``` -solana-verify get-program-hash -u $NETWORK_URL $PROGRAM_ID -``` - -The recommended approach for deploying program is to use [Squads V3](https://docs.squads.so/squads-v3-docs/navigating-your-squad/developers/programs). - -To upgrade a verifiable build, run the following to upload the program buffer: - -``` -solana program write-buffer -u $NETWORK_URL target/deploy/$PROGRAM_LIB_NAME.so -``` - -This command will output a `$BUFFER_ADDRESS`. Before voting to upgrade the program, verify that the following command produces an identical hash to executable hash (built from the previous step) - -``` -solana-verify get-buffer-hash -u $NETWORK_URL $BUFFER_ADDRESS -``` - -## Mainnet Verified Programs - -### Phoenix - -``` -solana-verify verify-from-repo -um --program-id PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY https://github.com/Ellipsis-Labs/phoenix-v1 -``` - -Final Output: - -``` -Executable Program Hash from repo: 6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9 -On-chain Program Hash: 6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9 -Program hash matches ✅ -``` - -### Squads V3 - -``` -solana-verify verify-from-repo https://github.com/Squads-Protocol/squads-mpl --commit-hash c95b7673d616c377a349ca424261872dfcf8b19d --program-id SMPLecH534NA9acpos4G6x7uf3LWbCAwZQE9e8ZekMu -um --library-name squads_mpl --bpf -``` +3. Deploy and verify: -(Note: we needed to specify the `library-name` because the Squads repo includes multiple programs. We use the `--bpf` flag because `squads_mpl` was previously verified with Anchor.) - -Final Output: - -``` -Executable Program Hash from repo: 72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205c -On-chain Program Hash: 72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205c -Program hash matches ✅ -``` - -### Drift V2 - -``` -solana-verify verify-from-repo -um --program-id dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH https://github.com/drift-labs/protocol-v2 --commit-hash 110d3ff4f8ba07c178d69f9bfc7b30194fac56d6 --library-name drift -``` - -Final Output: - -``` -Executable Program Hash from repo: e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828 -On-chain Program Hash: e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828 -Program hash matches ✅ -``` - -### Marginfi V2 - -``` -solana-verify verify-from-repo -um --program-id MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA https://github.com/mrgnlabs/marginfi-v2 --commit-hash d33e649e415c354cc2a1e3c49131725552d69ba0 --library-name marginfi -- --features mainnet-beta -``` - -Final Output: - -``` -Executable Program Hash from repo: 890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5 -On-chain Program Hash: 890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5 -Program hash matches ✅ -``` - -## Example Walkthrough - -After installing the CLI, we can test the program verification against the following immutable mainnet program: `2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn` - -Check it out here: - -### Verification with Docker - -Run the following command: - -``` -solana-verify verify-from-image -e examples/hello_world/target/deploy/hello_world.so -i ellipsislabs/hello_world_verifiable_build:latest -p 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn -``` - -This command loads up the image stored at [ellipsislabs/hello_world_verifiable_build:latest](https://hub.docker.com/layers/ellipsislabs/hello_world_verifiable_build/latest/images/sha256-d8b51c04c739999da618df4271d8d088fdcb3a0d8474044ebf434ebb993b5c7d?context=explore), and verifies that the hash of the executable path in the container is the same as the hash of the on-chain program supplied to the command. Because the build was already uploaded to an image, there is no need for a full rebuild of the executable which takes an extremely long time. - -The Dockerfile that creates the image `ellipsislabs/hello_world_verifiable_build:latest` can be found in ./examples/hello_world under this repo. - -Below is the expected output: - -``` -Verifying image: "ellipsislabs/hello_world_verifiable_build:latest", on network "https://api.mainnet-beta.solana.com" against program ID 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn -Executable path in container: "examples/hello_world/target/deploy/hello_world.so" - -Executable hash: 08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 -Program hash: 08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 -Executable matches on-chain program data ✅ -``` - -### Manual Verification - -To get the hash of an on-chain program, we can run the following with a given program ID: - -``` -solana-verify get-program-hash 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn -``` - -Which will return the following hash: - -``` -08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 -``` - -By default, this command will strip any trailing zeros away from the program executable and run the sha256 algorithm against it to compute the hash. - -To manually verify this program, one could run the following from the root of this repository, which builds a program from source code and computes a hash. _This command takes a long time because it is building the binary in a Docker container_ - -``` -solana-verify build $PWD/examples/hello_world - -``` - -Now we can check the resulting hash from the build. +```bash +# Deploy +solana program deploy -u $NETWORK_URL target/deploy/$PROGRAM_LIB_NAME.so --program-id $PROGRAM_ID -``` -solana-verify get-executable-hash ./examples/hello_world/target/deploy/hello_world.so +# Verify against repository -> upload your build data on chain +solana-verify verify-from-repo -u $NETWORK_URL --program-id $PROGRAM_ID https://github.com/$REPO_PATH +# Trigger a remote job +solana-verify remote submit-job --program-id $PROGRAM_ID --uploader $THE_PUBKEY_THAT_UPLOADED_YOUR_BUILD_DATA ``` -This will return the hash of the stripped executable, which should match the hash of the program data retrieved from the blockchain. +## Documentation -``` +For detailed instructions and best practices, please refer to the [official Solana documentation on verified builds](https://solana.com/developers/guides/advanced/verified-builds). -08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760 +## Security Considerations -``` +While verified builds enhance transparency, they should not be considered a complete security solution. Always: -### To send verification to OtterSec API - -```bash -solana-verify verify-from-repo --remote -um --program-id PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY https://github.com/Ellipsis-Labs/phoenix-v1 -``` +- Review the source code +- Use trusted build environments +- Consider using governance solutions for program upgrades -- This verification will be sent to the OtterSec API and will be available at [https://verify.osec.io/status](https://verify.osec.io/status/PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY) +## Contributing +Contributions are welcome! Please feel free to submit a Pull Request. -> Note: The `--remote` flag is required to send the verification to the OtterSec API. The `--remote` flag is not required for local verification. And this will take 5-10 minutes to complete. From 0ada04fe32f7130b0fe6e384b3161567d545552c Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Thu, 5 Dec 2024 14:56:08 -0500 Subject: [PATCH 310/314] add maintainers email with bug disclosure --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 80137ee..b3a9ae8 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,8 @@ While verified builds enhance transparency, they should not be considered a comp - Use trusted build environments - Consider using governance solutions for program upgrades +For responsible disclosure of bugs related to verified builds CLI, please email maintainers@ellipsislabs.xyz with a detailed description of the attack vector. + ## Contributing -Contributions are welcome! Please feel free to submit a Pull Request. +Contributions are welcome! Please feel free to submit a Pull Request. From e99a3f8900ef1be38adac50fa891217a2ce59977 Mon Sep 17 00:00:00 2001 From: Noah Gundotra Date: Fri, 20 Dec 2024 08:52:55 -0500 Subject: [PATCH 311/314] remove unused current dir arg and add cargo args parsing --- src/main.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index 4f2dea7..8516800 100644 --- a/src/main.rs +++ b/src/main.rs @@ -144,7 +144,7 @@ async fn main() -> anyhow::Result<()> { .arg(Arg::with_name("cargo-args") .multiple(true) .last(true) - .help("Arguments to pass to the underlying `cargo build-bpf` command"))) + .help("Arguments to pass to the underlying `cargo build-sbf` command"))) .subcommand(SubCommand::with_name("verify-from-image") .about("Verifies a cached build from a docker image") .arg(Arg::with_name("executable-path-in-image") @@ -234,7 +234,7 @@ async fn main() -> anyhow::Result<()> { .arg(Arg::with_name("cargo-args") .multiple(true) .last(true) - .help("Arguments to pass to the underlying `cargo build-bpf` command")) + .help("Arguments to pass to the underlying `cargo build-sbf` command")) .arg(Arg::with_name("skip-build") .long("skip-build") .help("Skip building and verification, only upload the PDA") @@ -281,9 +281,10 @@ async fn main() -> anyhow::Result<()> { .arg(Arg::with_name("bpf") .long("bpf") .help("If the program requires cargo build-bpf (instead of cargo build-sbf), set this flag")) - .arg(Arg::with_name("current-dir") - .long("current-dir") - .help("Verify in current directory"))) + .arg(Arg::with_name("cargo-args") + .multiple(true) + .last(true) + .help("Arguments to pass to the underlying `cargo build-sbf` command"))) .subcommand(SubCommand::with_name("close") .about("Close the otter-verify PDA account associated with the given program ID") .arg(Arg::with_name("program-id") From a4b84484e38b90eba2a457c4c0481b47b84786f4 Mon Sep 17 00:00:00 2001 From: ngundotra Date: Wed, 15 Jan 2025 22:41:21 +0000 Subject: [PATCH 312/314] Update Dockerfiles --- docker/v2.0.16.Dockerfile | 8 ++++++++ docker/v2.0.17.Dockerfile | 8 ++++++++ docker/v2.0.18.Dockerfile | 8 ++++++++ docker/v2.0.19.Dockerfile | 8 ++++++++ docker/v2.0.20.Dockerfile | 8 ++++++++ docker/v2.0.21.Dockerfile | 8 ++++++++ docker/v2.0.22.Dockerfile | 8 ++++++++ docker/v2.1.1.Dockerfile | 8 ++++++++ docker/v2.1.2.Dockerfile | 8 ++++++++ docker/v2.1.3.Dockerfile | 8 ++++++++ docker/v2.1.4.Dockerfile | 8 ++++++++ docker/v2.1.5.Dockerfile | 8 ++++++++ docker/v2.1.6.Dockerfile | 8 ++++++++ docker/v2.1.7.Dockerfile | 8 ++++++++ docker/v2.1.8.Dockerfile | 8 ++++++++ docker/v2.1.9.Dockerfile | 8 ++++++++ 16 files changed, 128 insertions(+) create mode 100644 docker/v2.0.16.Dockerfile create mode 100644 docker/v2.0.17.Dockerfile create mode 100644 docker/v2.0.18.Dockerfile create mode 100644 docker/v2.0.19.Dockerfile create mode 100644 docker/v2.0.20.Dockerfile create mode 100644 docker/v2.0.21.Dockerfile create mode 100644 docker/v2.0.22.Dockerfile create mode 100644 docker/v2.1.1.Dockerfile create mode 100644 docker/v2.1.2.Dockerfile create mode 100644 docker/v2.1.3.Dockerfile create mode 100644 docker/v2.1.4.Dockerfile create mode 100644 docker/v2.1.5.Dockerfile create mode 100644 docker/v2.1.6.Dockerfile create mode 100644 docker/v2.1.7.Dockerfile create mode 100644 docker/v2.1.8.Dockerfile create mode 100644 docker/v2.1.9.Dockerfile diff --git a/docker/v2.0.16.Dockerfile b/docker/v2.0.16.Dockerfile new file mode 100644 index 0000000..d0a5016 --- /dev/null +++ b/docker/v2.0.16.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.16/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.17.Dockerfile b/docker/v2.0.17.Dockerfile new file mode 100644 index 0000000..e61e8d4 --- /dev/null +++ b/docker/v2.0.17.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.17/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.18.Dockerfile b/docker/v2.0.18.Dockerfile new file mode 100644 index 0000000..2846e3d --- /dev/null +++ b/docker/v2.0.18.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.18/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.19.Dockerfile b/docker/v2.0.19.Dockerfile new file mode 100644 index 0000000..790c871 --- /dev/null +++ b/docker/v2.0.19.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.19/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.20.Dockerfile b/docker/v2.0.20.Dockerfile new file mode 100644 index 0000000..a746e32 --- /dev/null +++ b/docker/v2.0.20.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.20/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.21.Dockerfile b/docker/v2.0.21.Dockerfile new file mode 100644 index 0000000..e9a82c8 --- /dev/null +++ b/docker/v2.0.21.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.21/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.22.Dockerfile b/docker/v2.0.22.Dockerfile new file mode 100644 index 0000000..52bd2a8 --- /dev/null +++ b/docker/v2.0.22.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.22/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.1.1.Dockerfile b/docker/v2.1.1.Dockerfile new file mode 100644 index 0000000..80659e0 --- /dev/null +++ b/docker/v2.1.1.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:62afc139057dc9d3eda02e490677911b55a208ba22d6f7315f3c5c5851e31a36 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.1/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.1.2.Dockerfile b/docker/v2.1.2.Dockerfile new file mode 100644 index 0000000..ff28612 --- /dev/null +++ b/docker/v2.1.2.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:62afc139057dc9d3eda02e490677911b55a208ba22d6f7315f3c5c5851e31a36 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.2/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.1.3.Dockerfile b/docker/v2.1.3.Dockerfile new file mode 100644 index 0000000..bc7c1db --- /dev/null +++ b/docker/v2.1.3.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:62afc139057dc9d3eda02e490677911b55a208ba22d6f7315f3c5c5851e31a36 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.3/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.1.4.Dockerfile b/docker/v2.1.4.Dockerfile new file mode 100644 index 0000000..81c9086 --- /dev/null +++ b/docker/v2.1.4.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:62afc139057dc9d3eda02e490677911b55a208ba22d6f7315f3c5c5851e31a36 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.4/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.1.5.Dockerfile b/docker/v2.1.5.Dockerfile new file mode 100644 index 0000000..d4e304a --- /dev/null +++ b/docker/v2.1.5.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:62afc139057dc9d3eda02e490677911b55a208ba22d6f7315f3c5c5851e31a36 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.5/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.1.6.Dockerfile b/docker/v2.1.6.Dockerfile new file mode 100644 index 0000000..d846d43 --- /dev/null +++ b/docker/v2.1.6.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:62afc139057dc9d3eda02e490677911b55a208ba22d6f7315f3c5c5851e31a36 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.6/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.1.7.Dockerfile b/docker/v2.1.7.Dockerfile new file mode 100644 index 0000000..c782a5e --- /dev/null +++ b/docker/v2.1.7.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:62afc139057dc9d3eda02e490677911b55a208ba22d6f7315f3c5c5851e31a36 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.7/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.1.8.Dockerfile b/docker/v2.1.8.Dockerfile new file mode 100644 index 0000000..5d28005 --- /dev/null +++ b/docker/v2.1.8.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:62afc139057dc9d3eda02e490677911b55a208ba22d6f7315f3c5c5851e31a36 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.8/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.1.9.Dockerfile b/docker/v2.1.9.Dockerfile new file mode 100644 index 0000000..271a898 --- /dev/null +++ b/docker/v2.1.9.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:62afc139057dc9d3eda02e490677911b55a208ba22d6f7315f3c5c5851e31a36 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.9/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash From 83f3c3381cf93dd406c47a4f8be82359a4e9a9b4 Mon Sep 17 00:00:00 2001 From: ngundotra Date: Wed, 15 Jan 2025 22:58:02 +0000 Subject: [PATCH 313/314] Update image whitelist --- src/image_config.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/image_config.rs b/src/image_config.rs index eaf5c96..e778fb3 100644 --- a/src/image_config.rs +++ b/src/image_config.rs @@ -191,7 +191,23 @@ lazy_static! { m.insert((2, 0, 13), "sha256:b59946326904ffdfc4ec711b74e0ca2132ba69bf56c2fdbb5a795af65695f280"); m.insert((2, 0, 14), "sha256:50852861690e5cc97976f855dcca9094e127ae7850cc6cf35c0450c839f0b1df"); m.insert((2, 0, 15), "sha256:37074d98411cbf37d1f0c7078878814cbc88bed0e7ad73cce78fff5326c94fbd"); + m.insert((2, 0, 16), "sha256:efa2a7c93579ab00da292e599b0169d01ffca7fe1a74594d522d3a651ae70eb0"); + m.insert((2, 0, 17), "sha256:e02cfef2deb5376b354af9149310ffeb5ec60d1ca46b3b22e57af439d28c47c6"); + m.insert((2, 0, 18), "sha256:1d11389dd5720d05b308501a81c2decad083440b3ea7511aaca19035379db425"); + m.insert((2, 0, 19), "sha256:690df5cb60f3a00ab64db63c0df78efedbc83b8c9ff0794cea30bec1444ea9db"); + m.insert((2, 0, 20), "sha256:2ab8a9c4a7d208ed97eaa65110ad3002b9731f370bdfa0f11fe67c3bf9ec043d"); + m.insert((2, 0, 21), "sha256:caf0ce6fb8b48aec0e1750246360ddbe53adddab2a9f39c6a248d584ee3c1c89"); + m.insert((2, 0, 22), "sha256:c205fd8d6cf88e2d226a1f2b66b7a03285fde519cd26ad3d2156a5de8cf577b5"); m.insert((2, 1, 0), "sha256:d08b07367937bcf7ed6eb9c6ad5741cbb309c96246a554a4f266e386724953f5"); + m.insert((2, 1, 1), "sha256:fc6edcdf3db4ab6a58fb67698b59ff9ba49023ae5f01c3761c991dc9e0dab8d7"); + m.insert((2, 1, 2), "sha256:49f2269b6dfe51fca6761613dbcedc47d76ce6d1795c7e85e6a4aa8a093801b5"); + m.insert((2, 1, 3), "sha256:87b8ed00dc4480e9233b2ec8cdff4f906eee5198d984ac6453aa14034da782b2"); + m.insert((2, 1, 4), "sha256:6597378c87a9a9e59d5a9b75d68d1097e74afcd11bde4b5079f06f94372aae80"); + m.insert((2, 1, 5), "sha256:f386972c8af6a19d7fd35e7cc90d36cf5c4fdb5ad9989eb6a47297aec1afa110"); + m.insert((2, 1, 6), "sha256:51b00aaf9fcd5eefc2da83b9dd416a4ea69c092424a29051681cbfda209ad78e"); + m.insert((2, 1, 7), "sha256:2d5facb2a697b57ef01b86605a94991ecd2fd81728a40a127176fa6dd3fe1d19"); + m.insert((2, 1, 8), "sha256:84a2f138142d2279ff058dffa3886fcbf6ca811431ad4806065cba56ec5ae9cb"); + m.insert((2, 1, 9), "sha256:a00890657d7f6c84d6511b202bbe38f44f6de358b80a65317410747e1ff79ed6"); m }; } From 08df4825772705a8cb2687c84d33d7a072e1a6ff Mon Sep 17 00:00:00 2001 From: oubiad Date: Wed, 2 Jul 2025 02:32:34 +0300 Subject: [PATCH 314/314] Create build@sha256:75b75eab447ebcca1f471c98583d9b5d82c4be122c470852a022afcf9c98bead Approved Signed-off-by: oubiad --- ...ab447ebcca1f471c98583d9b5d82c4be122c470852a022afcf9c98bead | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .devcontainer/projectserum/build@sha256:75b75eab447ebcca1f471c98583d9b5d82c4be122c470852a022afcf9c98bead diff --git a/.devcontainer/projectserum/build@sha256:75b75eab447ebcca1f471c98583d9b5d82c4be122c470852a022afcf9c98bead b/.devcontainer/projectserum/build@sha256:75b75eab447ebcca1f471c98583d9b5d82c4be122c470852a022afcf9c98bead new file mode 100644 index 0000000..39bbd26 --- /dev/null +++ b/.devcontainer/projectserum/build@sha256:75b75eab447ebcca1f471c98583d9b5d82c4be122c470852a022afcf9c98bead @@ -0,0 +1,4 @@ +{ + "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": {} +}