Skip to content

Reproducibility Verification Report – Ginger Wallet Desktop v2.0.21 #152

@xrviv

Description

@xrviv

Hi Ginger Wallet team 👋,

We at WalletScrutiny.com performed an independent reproducibility verification of Ginger Wallet Desktop v2.0.21. Thank you for making the source code fully available and for adopting strong reproducibility-friendly practices in the project configuration.

Unfortunately, our builds did not match the official release binaries. Below is a detailed breakdown of what we found, along with some suggestions on how we can work together to close the gap.


🔧 Verification Summary

  • App Name: Ginger Wallet Desktop
  • Version Tested: v2.0.21 (e524d22035)
  • Official Release: Ginger-2.0.21-linux-x64.zip
  • Official SHA256: fa149b5382e4237a3405752e19584a93c5ee4475e8d1be2fb3f0ed1096e293c0
  • Build Environment: Docker container, Ubuntu 22.04, .NET SDK 8.0.100
  • Method: Deterministic build (dotnet build -c Release --no-restore) and SHA256 comparison of assemblies

📦 Assemblies Compared

Assembly Our Build SHA256 Official SHA256 Status
WalletWasabi.Fluent.Desktop.dll 5c54ba7ceb001bbc82d656568d7978b9bdc2dd99893be7017605fa6e4adbbd34 008a4972ac58e953dcf28d4ac86828eca6559937c0bcc0ec021341b9da138582
WalletWasabi.dll 002724119a43c32252647188693b4c5607fcf228b77dc20d72610a548e930e1c 276179c0a21a03387e47ab387cf5511934f05a25439a6484c296c95a3bf02c4e
GingerCommon.dll 01f9ed9bc5670a1ee5a7fde96cee95f375b9d93321f545187598a19f8892fcc1 7ee83b9b5fb4fc928b672634038d93d19481c1011c1ecec23e41b0587671f305

🔍 Observations

✅ Strong Points

  • Deterministic build settings enabled (Deterministic=true, DebugType=none, DebugSymbols=false).
  • SDK pinned (8.0.100) via global.json.
  • Centralized package management and lock files in place.
  • Package sources explicitly cleared and defined (nuget.org + Avalonia feed).
  • Path mapping configured to normalize builds.

❌ Where Divergence Appears

  • Assembly versions differ (1.0.0.0 vs 2.0.21.0) unless parameters are injected.
  • Even after injecting version parameters, hashes still diverge by ±1KB–100KB.
  • WalletWasabi.csproj embeds a CommitHash value that may vary between CI and local builds.
  • TargetLatestRuntimePatch=true could introduce runtime-level variation.
  • Prebuilt binaries (Tor, bitcoind, HWI) are bundled directly—unclear if these are deterministically sourced.

💡 Recommendations

To enable full reproducibility verification, it would help the community if you could:

  1. Document the official build process
    • Exact dotnet publish / dotnet build commands (including AssemblyVersion, FileVersion, InformationalVersion, CommitHash parameters).
    • Whether dotnet publish with RIDs, trimming, or ReadyToRun is used.
    • Post-build steps (signing, zipping, stripping).
  2. Provide environment details
    • The Docker image or VM used for official builds.
    • Confirm whether SDK 8.0.100 patch levels and runtime patching affect outputs.
  3. Clarify bundled binaries
    • Provenance of Tor, bitcoind, and HWI binaries.
    • Ideally link to deterministic upstream builds or provide reproducible instructions.
  4. Consider a CI reproducibility check
    • Add a GitHub Action that rebuilds from source and compares to the official release artifacts.
    • This would allow independent parties to confirm reproducibility automatically.

🤝 Invitation

We appreciate the great work already done to make Ginger Wallet reproducible-friendly. With a little more transparency about the official build process, we’re confident this can be fully reproducible.

Would you be open to:

  • Sharing the exact build scripts/parameters used in your release pipeline?
  • Clarifying the origin of the bundled binaries?
  • Working with us on a reproducible build attestation?

This would let us mark Ginger Wallet as ✅ Reproducible on WalletScrutiny instead of ❌ Non-Reproducible.


Thanks for your time and for all the work you’re doing on privacy-preserving Bitcoin wallets! 🙏

Daniel (WalletScrutiny)
https://walletscrutiny.com


https://walletscrutiny.com/verifier/?pubkey=1f9e547c2f31942623b8ad1d07713282e8640fd8cf474e9f79f18ace8af216ed#verificationId=d3ffaa521b8f7e79dc3ab14488e581cd1c51b094582b0b0819a3555a56f0ea68

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions