From c94f5e14afce2fabfa400d256d368cfb963ea911 Mon Sep 17 00:00:00 2001 From: indirection42 Date: Tue, 5 Aug 2025 16:38:28 +0800 Subject: [PATCH] update ci and clean guest-examples --- .github/workflows/build.yml | 37 ++++--- Makefile | 8 +- guest-examples/Cargo.lock | 101 +++++++----------- guest-examples/Cargo.toml | 10 +- .../sum-balance-hand-written/Cargo.toml | 9 -- .../sum-balance-hand-written/src/main.rs | 83 -------------- guest-examples/sum-balance-percent/Cargo.toml | 2 +- guest-examples/sum-balance/Cargo.toml | 2 +- guest-examples/swap-info/Cargo.toml | 2 +- .../total-supply-hand-written/Cargo.toml | 10 -- .../total-supply-hand-written/src/main.rs | 71 ------------ guest-examples/total-supply/Cargo.toml | 2 +- .../transparent-call-hand-written/Cargo.toml | 8 -- .../transparent-call-hand-written/src/main.rs | 20 ---- 14 files changed, 72 insertions(+), 293 deletions(-) delete mode 100644 guest-examples/sum-balance-hand-written/Cargo.toml delete mode 100644 guest-examples/sum-balance-hand-written/src/main.rs delete mode 100644 guest-examples/total-supply-hand-written/Cargo.toml delete mode 100644 guest-examples/total-supply-hand-written/src/main.rs delete mode 100644 guest-examples/transparent-call-hand-written/Cargo.toml delete mode 100644 guest-examples/transparent-call-hand-written/src/main.rs diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d307e25..35bc0cf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -120,8 +120,8 @@ jobs: - name: Run tests run: make test - # Build guest programs in parallel using matrix - build-guest: + # Generate guest program list dynamically + generate-guest-matrix: runs-on: ubuntu-latest # Run on main branches, release branches, or when explicitly requested if: | @@ -129,17 +129,28 @@ jobs: startsWith(github.ref, 'refs/heads/release/') || startsWith(github.ref, 'refs/tags/v') || contains(github.event.pull_request.labels.*.name, 'full-build') + outputs: + guest-matrix: ${{ steps.generate-matrix.outputs.guest-matrix }} + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Generate guest matrix + id: generate-matrix + run: | + # Extract package names from Cargo.toml files + guests=$(find guest-examples -name "Cargo.toml" -not -path "guest-examples/Cargo.toml" | xargs -I{} sh -c 'grep "^name" "{}" | cut -d"=" -f2 | tr -d " \""' | jq -R -s -c 'split("\n")[:-1]') + echo "guest-matrix=$guests" >> $GITHUB_OUTPUT + echo "Found guest programs: $guests" + + # Build guest programs in parallel using dynamic matrix + build-guest: + runs-on: ubuntu-latest + needs: generate-guest-matrix strategy: matrix: - guest: [ - sum-balance, - sum-balance-hand-written, - sum-balance-percent, - swap-info, - total-supply, - total-supply-hand-written, - transparent-call-hand-written - ] + guest: ${{ fromJson(needs.generate-guest-matrix.outputs.guest-matrix) }} steps: - uses: actions/checkout@v4 with: @@ -153,7 +164,7 @@ jobs: - uses: Swatinem/rust-cache@v2 with: cache-bin: "false" - prefix-key: "guest-${{ matrix.guest }}" + prefix-key: "${{ matrix.guest }}" - name: Install polkatool and pvq-program-metadata-gen run: | @@ -177,7 +188,7 @@ jobs: # Collect all guest artifacts (optional - for when you need all guests together) collect-guests: runs-on: ubuntu-latest - needs: build-guest + needs: [generate-guest-matrix, build-guest] if: github.event_name == 'push' || contains(github.event.pull_request.labels.*.name, 'full-build') steps: - name: Download all guest artifacts diff --git a/Makefile b/Makefile index 4ecb4f9..d0b72d0 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ run: chainspec bunx @acala-network/chopsticks@1.0.6 --config poc/runtime/chopsticks.yml --genesis output/chainspec.json -GUEST_EXAMPLES = $(shell find guest-examples -name "Cargo.toml" -not -path "guest-examples/Cargo.toml" | xargs -n1 dirname | xargs -n1 basename) +GUEST_EXAMPLES = $(shell find guest-examples -name "Cargo.toml" -not -path "guest-examples/Cargo.toml" | xargs -I{} sh -c 'grep "^name" "{}" | cut -d"=" -f2 | tr -d " \""') GUEST_TARGETS = $(patsubst %,guest-%,$(GUEST_EXAMPLES)) DUMMY_GUEST_TARGETS = $(patsubst %,dummy-guest-%,$(GUEST_EXAMPLES)) @@ -14,12 +14,12 @@ dummy-guests: $(DUMMY_GUEST_TARGETS) guest-%: mkdir -p output - cd guest-examples; METADATA_OUTPUT_DIR=$(shell pwd)/output cargo build --release --bin guest-$* -p guest-$* - polkatool link --run-only-if-newer -s guest-examples/target/riscv32emac-unknown-none-polkavm/release/guest-$* -o output/guest-$*.polkavm + cd guest-examples; METADATA_OUTPUT_DIR=$(shell pwd)/output cargo build --release --bin $* -p $* + polkatool link --run-only-if-newer -s guest-examples/target/riscv32emac-unknown-none-polkavm/release/$* -o output/$*.polkavm dummy-guest-%: mkdir -p output - touch output/guest-$*.polkavm + touch output/$*.polkavm .PHONY: tools tools: polkatool chain-spec-builder pvq-program-metadata-gen diff --git a/guest-examples/Cargo.lock b/guest-examples/Cargo.lock index 0161550..ce9da82 100644 --- a/guest-examples/Cargo.lock +++ b/guest-examples/Cargo.lock @@ -66,68 +66,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" -[[package]] -name = "guest-sum-balance" -version = "0.1.0" -dependencies = [ - "cfg-if", - "parity-scale-codec", - "polkavm-derive", - "pvq-program", -] - -[[package]] -name = "guest-sum-balance-hand-written" -version = "0.1.0" -dependencies = [ - "parity-scale-codec", - "polkavm-derive", -] - -[[package]] -name = "guest-sum-balance-percent" -version = "0.1.0" -dependencies = [ - "parity-scale-codec", - "polkavm-derive", - "pvq-program", -] - -[[package]] -name = "guest-swap-info" -version = "0.1.0" -dependencies = [ - "cfg-if", - "parity-scale-codec", - "polkavm-derive", - "pvq-program", - "scale-info", -] - -[[package]] -name = "guest-total-supply" -version = "0.1.0" -dependencies = [ - "parity-scale-codec", - "polkavm-derive", - "pvq-program", -] - -[[package]] -name = "guest-total-supply-hand-written" -version = "0.1.0" -dependencies = [ - "parity-scale-codec", - "polkavm-derive", -] - -[[package]] -name = "guest-transparent-call-hand-written" -version = "0.1.0" -dependencies = [ - "polkavm-derive", -] - [[package]] name = "hashbrown" version = "0.15.2" @@ -314,6 +252,36 @@ dependencies = [ "syn", ] +[[package]] +name = "sum-balance" +version = "0.1.0" +dependencies = [ + "cfg-if", + "parity-scale-codec", + "polkavm-derive", + "pvq-program", +] + +[[package]] +name = "sum-balance-percent" +version = "0.1.0" +dependencies = [ + "parity-scale-codec", + "polkavm-derive", + "pvq-program", +] + +[[package]] +name = "swap-info" +version = "0.1.0" +dependencies = [ + "cfg-if", + "parity-scale-codec", + "polkavm-derive", + "pvq-program", + "scale-info", +] + [[package]] name = "syn" version = "2.0.100" @@ -342,6 +310,15 @@ dependencies = [ "winnow", ] +[[package]] +name = "total-supply" +version = "0.1.0" +dependencies = [ + "parity-scale-codec", + "polkavm-derive", + "pvq-program", +] + [[package]] name = "unicode-ident" version = "1.0.18" diff --git a/guest-examples/Cargo.toml b/guest-examples/Cargo.toml index c3c5dfc..efd93ab 100644 --- a/guest-examples/Cargo.toml +++ b/guest-examples/Cargo.toml @@ -1,13 +1,5 @@ [workspace] -members = [ - "sum-balance", - "sum-balance-percent", - "sum-balance-hand-written", - "total-supply", - "total-supply-hand-written", - "transparent-call-hand-written", - "swap-info", -] +members = ["sum-balance", "sum-balance-percent", "total-supply", "swap-info"] resolver = "2" [workspace.dependencies] diff --git a/guest-examples/sum-balance-hand-written/Cargo.toml b/guest-examples/sum-balance-hand-written/Cargo.toml deleted file mode 100644 index ffb241a..0000000 --- a/guest-examples/sum-balance-hand-written/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[package] -name = "guest-sum-balance-hand-written" -version = "0.1.0" -edition = "2021" -publish = false - -[dependencies] -polkavm-derive = { workspace = true } -parity-scale-codec = { workspace = true, features = ["derive"] } diff --git a/guest-examples/sum-balance-hand-written/src/main.rs b/guest-examples/sum-balance-hand-written/src/main.rs deleted file mode 100644 index 8732ff5..0000000 --- a/guest-examples/sum-balance-hand-written/src/main.rs +++ /dev/null @@ -1,83 +0,0 @@ -// Generated by macro -#![no_std] -#![no_main] -extern crate alloc; -use alloc::vec::Vec; - -#[global_allocator] -static GLOBAL: polkavm_derive::LeakingAllocator = polkavm_derive::LeakingAllocator; - -#[panic_handler] -fn panic(_info: &core::panic::PanicInfo) -> ! { - unsafe { - core::arch::asm!("unimp", options(noreturn)); - } -} - -#[polkavm_derive::polkavm_import] -extern "C" { - fn host_call(extension_id: u64, call_ptr: u32, call_len: u32) -> u64; -} - -type AssetId = u32; -type AccountId = [u8; 32]; -type Balance = u64; - -// #[program::extension(extension_id = 4071833530116166512u64, fn_index = 1)] -// fn balance(asset: AssetId, who: AccountId) -> Balance {} -// expands to -#[allow(non_camel_case_types)] -#[derive(parity_scale_codec::Encode, parity_scale_codec::Decode)] -enum BalanceCall { - #[codec(index = 1)] - balance { asset: AssetId, who: AccountId }, -} -fn balance(asset: AssetId, who: AccountId) -> Balance { - let encoded_call = parity_scale_codec::Encode::encode(&BalanceCall::balance { asset, who }); - let res = unsafe { - host_call( - 4071833530116166512u64, - encoded_call.as_ptr() as u32, - encoded_call.len() as u32, - ) - }; - let res_ptr = res as u32 as *const u8; - let res_len = (res >> 32) as usize; - let mut res_bytes = unsafe { core::slice::from_raw_parts(res_ptr, res_len) }; - parity_scale_codec::Decode::decode(&mut res_bytes).expect("Failed to decode result") -} - -// #[program::entrypoint] -// fn sum_balance(asset: AssetId, accounts: Vec) -> Balance { -// let mut sum = 0; -// for account in accounts { -// sum += balance(asset, account); -// } -// sum -// } -// expands to -#[polkavm_derive::polkavm_export] -extern "C" fn main(arg_ptr: u32, size: u32) -> u64 { - // Decode the arguments - let mut arg_bytes = unsafe { core::slice::from_raw_parts(arg_ptr as *const u8, size as usize) }; - let asset: AssetId = parity_scale_codec::Decode::decode(&mut arg_bytes).expect("Failed to decode asset"); - let accounts: Vec = - parity_scale_codec::Decode::decode(&mut arg_bytes).expect("Failed to decode accounts"); - - // Call the function - let res = sum_balance(asset, accounts); - - // Encode the result - let encoded_res = parity_scale_codec::Encode::encode(&res); - - // Return the result - (encoded_res.len() as u64) << 32 | (encoded_res.as_ptr() as u64) -} - -fn sum_balance(asset: AssetId, accounts: Vec) -> Balance { - let mut sum = 0; - for account in accounts { - sum += balance(asset, account); - } - sum -} diff --git a/guest-examples/sum-balance-percent/Cargo.toml b/guest-examples/sum-balance-percent/Cargo.toml index 5196d27..2f64fc1 100644 --- a/guest-examples/sum-balance-percent/Cargo.toml +++ b/guest-examples/sum-balance-percent/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "guest-sum-balance-percent" +name = "sum-balance-percent" version = "0.1.0" edition = "2021" publish = false diff --git a/guest-examples/sum-balance/Cargo.toml b/guest-examples/sum-balance/Cargo.toml index 96997b9..71b759a 100644 --- a/guest-examples/sum-balance/Cargo.toml +++ b/guest-examples/sum-balance/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "guest-sum-balance" +name = "sum-balance" version = "0.1.0" edition = "2021" publish = false diff --git a/guest-examples/swap-info/Cargo.toml b/guest-examples/swap-info/Cargo.toml index 070e6b0..cb6547c 100644 --- a/guest-examples/swap-info/Cargo.toml +++ b/guest-examples/swap-info/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "guest-swap-info" +name = "swap-info" version = "0.1.0" edition = "2021" publish = false diff --git a/guest-examples/total-supply-hand-written/Cargo.toml b/guest-examples/total-supply-hand-written/Cargo.toml deleted file mode 100644 index 2f967c2..0000000 --- a/guest-examples/total-supply-hand-written/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "guest-total-supply-hand-written" -version = "0.1.0" -edition = "2021" -publish = false -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -polkavm-derive = { workspace = true } -parity-scale-codec = { workspace = true, features = ["derive"] } diff --git a/guest-examples/total-supply-hand-written/src/main.rs b/guest-examples/total-supply-hand-written/src/main.rs deleted file mode 100644 index 244469a..0000000 --- a/guest-examples/total-supply-hand-written/src/main.rs +++ /dev/null @@ -1,71 +0,0 @@ -// Generated by macro -#![no_std] -#![no_main] -extern crate alloc; - -#[global_allocator] -static GLOBAL: polkavm_derive::LeakingAllocator = polkavm_derive::LeakingAllocator; - -#[panic_handler] -fn panic(_info: &core::panic::PanicInfo) -> ! { - unsafe { - core::arch::asm!("unimp", options(noreturn)); - } -} - -#[polkavm_derive::polkavm_import] -extern "C" { - fn host_call(extension_id: u64, call_ptr: u32, call_len: u32) -> u64; -} - -type AssetId = u32; -type Balance = u64; - -// #[program::extension(extension_id = 4071833530116166512u64, call_index = 1)] -// fn total_supply(asset: AssetId) -> Balance {} -// expands to -#[allow(non_camel_case_types)] -#[derive(parity_scale_codec::Encode, parity_scale_codec::Decode)] -enum TotalSupplyCall { - #[codec(index = 0)] - total_supply { asset: AssetId }, -} -fn total_supply(asset: AssetId) -> Balance { - let encoded_call = parity_scale_codec::Encode::encode(&TotalSupplyCall::total_supply { asset }); - let res = unsafe { - host_call( - 4071833530116166512u64, - encoded_call.as_ptr() as u32, - encoded_call.len() as u32, - ) - }; - let res_ptr = res as u32 as *const u8; - let res_len = (res >> 32) as usize; - let mut res_bytes = unsafe { core::slice::from_raw_parts(res_ptr, res_len) }; - parity_scale_codec::Decode::decode(&mut res_bytes).expect("Failed to decode result") -} - -// #[program::entrypoint] -// fn total_supply_(asset: AssetId) -> Balance { -// total_supply(asset) -// } -// expands to -#[polkavm_derive::polkavm_export] -extern "C" fn main(arg_ptr: u32, size: u32) -> u64 { - // Decode the arguments - let mut arg_bytes = unsafe { core::slice::from_raw_parts(arg_ptr as *const u8, size as usize) }; - let asset: AssetId = parity_scale_codec::Decode::decode(&mut arg_bytes).expect("Failed to decode asset"); - - // Call the function - let res = total_supply_(asset); - - // Encode the result - let encoded_res = parity_scale_codec::Encode::encode(&res); - - // Return the result - (encoded_res.len() as u64) << 32 | (encoded_res.as_ptr() as u64) -} - -fn total_supply_(asset: AssetId) -> Balance { - total_supply(asset) -} diff --git a/guest-examples/total-supply/Cargo.toml b/guest-examples/total-supply/Cargo.toml index eb1162c..17038f7 100644 --- a/guest-examples/total-supply/Cargo.toml +++ b/guest-examples/total-supply/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "guest-total-supply" +name = "total-supply" version = "0.1.0" edition = "2021" publish = false diff --git a/guest-examples/transparent-call-hand-written/Cargo.toml b/guest-examples/transparent-call-hand-written/Cargo.toml deleted file mode 100644 index dc04352..0000000 --- a/guest-examples/transparent-call-hand-written/Cargo.toml +++ /dev/null @@ -1,8 +0,0 @@ -[package] -name = "guest-transparent-call-hand-written" -version = "0.1.0" -edition = "2021" -publish = false - -[dependencies] -polkavm-derive = { workspace = true } diff --git a/guest-examples/transparent-call-hand-written/src/main.rs b/guest-examples/transparent-call-hand-written/src/main.rs deleted file mode 100644 index b6760bd..0000000 --- a/guest-examples/transparent-call-hand-written/src/main.rs +++ /dev/null @@ -1,20 +0,0 @@ -#![no_std] -#![no_main] - -#[panic_handler] -fn panic(_info: &core::panic::PanicInfo) -> ! { - unsafe { - core::arch::asm!("unimp", options(noreturn)); - } -} - -#[polkavm_derive::polkavm_import] -extern "C" { - fn host_call(extension_id: u64, call_ptr: u32, call_len: u32) -> u64; -} - -#[polkavm_derive::polkavm_export] -extern "C" fn main(ptr: u32, size: u32) -> u64 { - let extension_id = unsafe { core::ptr::read_volatile(ptr as *const u64) }; - unsafe { host_call(extension_id, ptr + 8, size - 8) } -}