From 88293752080208c3e7c32c72abd8155a47696d0f Mon Sep 17 00:00:00 2001 From: Michael Taylor Date: Mon, 7 Sep 2026 19:42:07 -0700 Subject: [PATCH 1/3] chore: open lane for #2917 From a9c3dc11f27d167586acfe26c50cf89745ca5d3b Mon Sep 17 00:00:00 2001 From: Michael Taylor Date: Mon, 7 Sep 2026 19:46:15 -0700 Subject: [PATCH 2/3] chore(icon): vendor canonical branded DIG icon + drift gate script Refs #2917 --- assets/dig.ico | Bin 0 -> 50443 bytes assets/dig.rc | 18 ++++++++++++++++++ scripts/check-icon.sh | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 assets/dig.ico create mode 100644 assets/dig.rc create mode 100644 scripts/check-icon.sh diff --git a/assets/dig.ico b/assets/dig.ico new file mode 100644 index 0000000000000000000000000000000000000000..e10b838a2d0384d7c08fe3f1b783ab3ff3aaf28b GIT binary patch literal 50443 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 + exit 1 +fi + +actual="$(sha256sum "$ICON" | cut -d' ' -f1)" + +if [[ "$actual" != "$EXPECTED_SHA256" ]]; then + echo "FAIL: $ICON has drifted from the canonical DIG icon." >&2 + echo " expected sha256: $EXPECTED_SHA256" >&2 + echo " actual sha256: $actual" >&2 + echo "Restore the canonical bytes; do not re-save or re-export the icon." >&2 + exit 1 +fi + +echo "OK: $ICON matches the canonical DIG icon ($EXPECTED_SHA256)." From bb5b665eec6be0e7e54ff0681283a41cb9714dec Mon Sep 17 00:00:00 2001 From: Michael Taylor Date: Mon, 7 Sep 2026 23:19:43 -0700 Subject: [PATCH 3/3] feat(build): embed the branded DIG icon in every shipped Windows binary MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a build script to the three crates that produce shipped binaries so `digs`, `dig-store`, `dig-resolver` and `dighost` carry the canonical DIG mark in Explorer, the taskbar, Task Manager and shortcut targets instead of the generic default. Mechanism is the one already proven in dig-installer: `embed-resource` under `[target.'cfg(windows)'.build-dependencies]` compiling the vendored `assets/dig.rc`, whose single ICON statement is ordinal 1 because Windows renders a binary's lowest-ordinal icon resource. Gated to Windows targets so Linux and macOS builds cannot break on it. `embed_resource::compile` emits `cargo:rustc-link-arg-bins`, which reaches every `[[bin]]` in a crate; that is correct here because every bin in these three crates ships. `crates/digstore-prover/guest` is a separate crate and is deliberately untouched — a wasm guest has no icon. Adds the `icon asset (sha256 pin)` CI job, which fails loudly if `assets/dig.ico` ever drifts from the canonical bytes. The asset is vendored rather than shared through a crate because a build script cannot read a normal dependency's files, so sharing it would mean a build-dependency and a much wider build graph for every binary. Refs #2917 --- .github/workflows/ci.yml | 15 ++++++ CHANGELOG.md | 5 ++ Cargo.lock | 84 ++++++++++++++++++++++++++++----- Cargo.toml | 24 +++++----- crates/dig-resolver/Cargo.toml | 3 ++ crates/dig-resolver/build.rs | 26 ++++++++++ crates/digstore-cli/Cargo.toml | 3 ++ crates/digstore-cli/build.rs | 28 +++++++++++ crates/digstore-host/Cargo.toml | 3 ++ crates/digstore-host/build.rs | 28 +++++++++++ 10 files changed, 196 insertions(+), 23 deletions(-) create mode 100644 crates/dig-resolver/build.rs create mode 100644 crates/digstore-cli/build.rs create mode 100644 crates/digstore-host/build.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4a8bdc9..a07f4f3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -237,3 +237,18 @@ jobs: # by hand at each call site. - name: Workspace dependency versions track the workspace version run: bash scripts/check-workspace-dep-versions.sh + + # The vendored branded icon is byte-pinned; see scripts/check-icon.sh for why + # drift is made loud rather than impossible. Cheap and dependency-free, so it + # runs as its own job and reports independently of the compile gates. + icon: + name: icon asset (sha256 pin) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + # Invoked through `bash` rather than relying on the file mode: a checkout + # that loses the executable bit would otherwise fail this gate for a + # reason that has nothing to do with the icon. + - run: bash scripts/check-icon.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e6f308..18f8912 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ All notable changes to this project are documented here. This project adheres to [Semantic Versioning](https://semver.org) and [Conventional Commits](https://www.conventionalcommits.org). +## [Unreleased] + +### Features +- **icon:** Embed the canonical branded DIG icon in `digs`/`dig-store`, `dig-resolver` and `dighost` on Windows, gated on a vendored sha256 pin (#2917) + ## [0.29.6] - 2026-09-06 ### Bug Fixes diff --git a/Cargo.lock b/Cargo.lock index f966ffd..f1aa3d7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2550,6 +2550,7 @@ version = "0.1.0" dependencies = [ "chia-protocol", "digstore-chain", + "embed-resource", "hex", "tokio", ] @@ -2665,7 +2666,7 @@ dependencies = [ [[package]] name = "digstore-chain" -version = "0.29.9" +version = "0.29.10" dependencies = [ "aes-gcm", "anyhow", @@ -2707,7 +2708,7 @@ dependencies = [ [[package]] name = "digstore-chunker" -version = "0.29.9" +version = "0.29.10" dependencies = [ "digstore-core", "hex", @@ -2717,7 +2718,7 @@ dependencies = [ [[package]] name = "digstore-cli" -version = "0.29.9" +version = "0.29.10" dependencies = [ "anstream 0.6.21", "anstyle", @@ -2743,6 +2744,7 @@ dependencies = [ "digstore-stage", "digstore-store", "dirs", + "embed-resource", "flate2", "getrandom 0.2.17", "globset", @@ -2786,7 +2788,7 @@ dependencies = [ [[package]] name = "digstore-core" -version = "0.29.9" +version = "0.29.10" dependencies = [ "aes-gcm-siv", "hex", @@ -2798,7 +2800,7 @@ dependencies = [ [[package]] name = "digstore-crypto" -version = "0.29.9" +version = "0.29.10" dependencies = [ "chia-bls 0.36.1", "digstore-core", @@ -2832,7 +2834,7 @@ dependencies = [ [[package]] name = "digstore-host" -version = "0.29.9" +version = "0.29.10" dependencies = [ "anyhow", "clap", @@ -2840,6 +2842,7 @@ dependencies = [ "digstore-core", "digstore-crypto", "digstore-prover", + "embed-resource", "futures", "hex", "httpmock", @@ -2857,7 +2860,7 @@ dependencies = [ [[package]] name = "digstore-prover" -version = "0.29.9" +version = "0.29.10" dependencies = [ "bincode 1.3.3", "digstore-core", @@ -2873,7 +2876,7 @@ dependencies = [ [[package]] name = "digstore-remote" -version = "0.29.9" +version = "0.29.10" dependencies = [ "async-trait", "axum", @@ -2902,7 +2905,7 @@ dependencies = [ [[package]] name = "digstore-stage" -version = "0.29.9" +version = "0.29.10" dependencies = [ "digstore-chunker", "digstore-compiler", @@ -2918,7 +2921,7 @@ dependencies = [ [[package]] name = "digstore-store" -version = "0.29.9" +version = "0.29.10" dependencies = [ "digstore-chunker", "digstore-core", @@ -2933,7 +2936,7 @@ dependencies = [ [[package]] name = "digstore-subscription" -version = "0.29.9" +version = "0.29.10" dependencies = [ "async-trait", "digstore-core", @@ -3082,6 +3085,20 @@ dependencies = [ "zeroize", ] +[[package]] +name = "embed-resource" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbfdaacccebec3b28e4866b8973543c7647797db5ada1bdab552e48fe665fbbd" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 1.1.2+spec-1.1.0", + "vswhom", + "winreg", +] + [[package]] name = "embedded-io" version = "0.4.0" @@ -7022,6 +7039,21 @@ dependencies = [ "winnow 0.7.15", ] +[[package]] +name = "toml" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.3", +] + [[package]] name = "toml_datetime" version = "0.6.11" @@ -7407,6 +7439,26 @@ version = "0.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "wait-timeout" version = "0.2.1" @@ -8180,6 +8232,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + [[package]] name = "wit-bindgen" version = "0.57.1" diff --git a/Cargo.toml b/Cargo.toml index eb1f3c1..4fe4bbd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ exclude = ["crates/digstore-prover/guest", "crates/dig-client-wasm"] [workspace.package] edition = "2021" -version = "0.29.9" +version = "0.29.10" license = "GPL-2.0-only" [workspace.dependencies] @@ -28,17 +28,17 @@ license = "GPL-2.0-only" # The version MUST equal `[workspace.package].version`, because every member inherits # that value. `scripts/check-workspace-dep-versions.sh` enforces it in CI, so a release # bump can never silently leave a published crate pointing at the previous version. -digstore-core = { path = "crates/digstore-core", version = "0.29.9" } -digstore-chain = { path = "crates/digstore-chain", version = "0.29.9" } -digstore-chunker = { path = "crates/digstore-chunker", version = "0.29.9" } -digstore-crypto = { path = "crates/digstore-crypto", version = "0.29.9" } -digstore-store = { path = "crates/digstore-store", version = "0.29.9" } -digstore-prover = { path = "crates/digstore-prover", version = "0.29.9" } -digstore-host = { path = "crates/digstore-host", version = "0.29.9" } -digstore-stage = { path = "crates/digstore-stage", version = "0.29.9" } -digstore-remote = { path = "crates/digstore-remote", version = "0.29.9" } -digstore-cli = { path = "crates/digstore-cli", version = "0.29.9" } -digstore-subscription = { path = "crates/digstore-subscription", version = "0.29.9" } +digstore-core = { path = "crates/digstore-core", version = "0.29.10" } +digstore-chain = { path = "crates/digstore-chain", version = "0.29.10" } +digstore-chunker = { path = "crates/digstore-chunker", version = "0.29.10" } +digstore-crypto = { path = "crates/digstore-crypto", version = "0.29.10" } +digstore-store = { path = "crates/digstore-store", version = "0.29.10" } +digstore-prover = { path = "crates/digstore-prover", version = "0.29.10" } +digstore-host = { path = "crates/digstore-host", version = "0.29.10" } +digstore-stage = { path = "crates/digstore-stage", version = "0.29.10" } +digstore-remote = { path = "crates/digstore-remote", version = "0.29.10" } +digstore-cli = { path = "crates/digstore-cli", version = "0.29.10" } +digstore-subscription = { path = "crates/digstore-subscription", version = "0.29.10" } sha2 = "0.10" proptest = "1" diff --git a/crates/dig-resolver/Cargo.toml b/crates/dig-resolver/Cargo.toml index 9bfaac4..4b695e5 100644 --- a/crates/dig-resolver/Cargo.toml +++ b/crates/dig-resolver/Cargo.toml @@ -9,6 +9,9 @@ description = "Resolve a DIG store's current (tip) root from coinset.org by walk name = "dig-resolver" path = "src/main.rs" +[target.'cfg(windows)'.build-dependencies] +embed-resource = "3" + [dependencies] digstore-chain = { workspace = true } chia-protocol = "0.36.1" diff --git a/crates/dig-resolver/build.rs b/crates/dig-resolver/build.rs new file mode 100644 index 0000000..f328004 --- /dev/null +++ b/crates/dig-resolver/build.rs @@ -0,0 +1,26 @@ +//! Build script: compile the branded DIG icon into `dig-resolver`. +//! +//! `embed_resource::compile` links the compiled `.res` with +//! `cargo:rustc-link-arg-bins`, which reaches every bin this crate ships — +//! here, just `dig-resolver` — so no `compile_for` scoping is needed. +//! +//! The result is checked rather than discarded: an environment that cannot +//! compile a resource would otherwise silently produce an unbranded binary, +//! which is precisely the failure this build step exists to prevent. +//! +//! No-op on non-Windows. + +fn main() { + #[cfg(windows)] + embed_icon(); +} + +#[cfg(windows)] +fn embed_icon() { + embed_resource::compile("../../assets/dig.rc", embed_resource::NONE) + .manifest_required() + .expect("failed to compile assets/dig.rc — no usable Windows resource compiler?"); + + println!("cargo:rerun-if-changed=../../assets/dig.rc"); + println!("cargo:rerun-if-changed=../../assets/dig.ico"); +} diff --git a/crates/digstore-cli/Cargo.toml b/crates/digstore-cli/Cargo.toml index f43ec3c..ae838c5 100644 --- a/crates/digstore-cli/Cargo.toml +++ b/crates/digstore-cli/Cargo.toml @@ -24,6 +24,9 @@ path = "src/bin/digs.rs" name = "digstore_cli" path = "src/lib.rs" +[target.'cfg(windows)'.build-dependencies] +embed-resource = "3" + [dependencies] digstore-core = { workspace = true } digstore-chain = { workspace = true } diff --git a/crates/digstore-cli/build.rs b/crates/digstore-cli/build.rs new file mode 100644 index 0000000..71903a1 --- /dev/null +++ b/crates/digstore-cli/build.rs @@ -0,0 +1,28 @@ +//! Build script: compile the branded DIG icon into `dig-store` and `digs`. +//! +//! `embed_resource::compile` links the compiled `.res` with +//! `cargo:rustc-link-arg-bins`, so it reaches every `[[bin]]` this crate ships +//! (`dig-store` AND its `digs` alias) without needing `compile_for`. This crate +//! also has a `digstore_cli` lib target, but `-bins` link args never touch a +//! lib, so the library build is unaffected. +//! +//! The result is checked rather than discarded: an environment that cannot +//! compile a resource would otherwise silently produce an unbranded binary, +//! which is precisely the failure this build step exists to prevent. +//! +//! No-op on non-Windows. + +fn main() { + #[cfg(windows)] + embed_icon(); +} + +#[cfg(windows)] +fn embed_icon() { + embed_resource::compile("../../assets/dig.rc", embed_resource::NONE) + .manifest_required() + .expect("failed to compile assets/dig.rc — no usable Windows resource compiler?"); + + println!("cargo:rerun-if-changed=../../assets/dig.rc"); + println!("cargo:rerun-if-changed=../../assets/dig.ico"); +} diff --git a/crates/digstore-host/Cargo.toml b/crates/digstore-host/Cargo.toml index 48729af..f1b04e7 100644 --- a/crates/digstore-host/Cargo.toml +++ b/crates/digstore-host/Cargo.toml @@ -5,6 +5,9 @@ version.workspace = true edition = "2021" description = "wasmtime runtime for serving compiled Digstore WASM modules (paper 6.3, 6.4, 18)." +[target.'cfg(windows)'.build-dependencies] +embed-resource = "3" + [dependencies] digstore-core = { workspace = true } digstore-crypto = { workspace = true } diff --git a/crates/digstore-host/build.rs b/crates/digstore-host/build.rs new file mode 100644 index 0000000..2abb852 --- /dev/null +++ b/crates/digstore-host/build.rs @@ -0,0 +1,28 @@ +//! Build script: compile the branded DIG icon into `dighost`. +//! +//! `embed_resource::compile` links the compiled `.res` with +//! `cargo:rustc-link-arg-bins`, which reaches every bin this crate ships — +//! here, just `dighost` — so no `compile_for` scoping is needed. This crate's +//! `digstore_host` lib target is unaffected: `-bins` link args never touch a +//! lib. +//! +//! The result is checked rather than discarded: an environment that cannot +//! compile a resource would otherwise silently produce an unbranded binary, +//! which is precisely the failure this build step exists to prevent. +//! +//! No-op on non-Windows. + +fn main() { + #[cfg(windows)] + embed_icon(); +} + +#[cfg(windows)] +fn embed_icon() { + embed_resource::compile("../../assets/dig.rc", embed_resource::NONE) + .manifest_required() + .expect("failed to compile assets/dig.rc — no usable Windows resource compiler?"); + + println!("cargo:rerun-if-changed=../../assets/dig.rc"); + println!("cargo:rerun-if-changed=../../assets/dig.ico"); +}