Builds reproduzíveis fornecem um vínculo verificável entre o código-fonte publicado e o binário de uma versão. Nossa cobertura atual de builds reproduzíveis se aplica à versão do F-Droid para Android. Pretendemos expandir essa cobertura para outros canais de distribuição do Android e do iOS.

Android

F-Droid

A Gem Wallet usa a infraestrutura de build independente do F-Droid para recompilar o APK do F-Droid e verificá-lo antes da publicação.

Modelo de verificação

A Gem Wallet publica um APK do F-Droid assinado para cada versão. Separadamente, os servidores de build do F-Droid executam a receita pública de build a partir de um ambiente limpo:

  1. Os metadados do F-Droid selecionam um commit exato do Git e uma versão exata do NDK do Android.
  2. O F-Droid obtém esse commit do repositório público da Gem Wallet.
  3. Os scripts públicos de build reproduzível instalam a toolchain nativa fixada e executam :app:assembleFdroidRelease.
  4. A build produz um APK não assinado. O F-Droid baixa o APK correspondente assinado pelo desenvolvedor e confirma que ele está assinado pelo certificado cuja impressão digital está declarada em AllowedAPKSigningKeys.
  5. O F-Droid copia a assinatura do APK para o artefato recompilado e o verifica. As assinaturas do APK Signature Scheme v2/v3 do Android cobrem o APK completo fora do bloco de assinatura, de modo que uma verificação bem-sucedida exige que o conteúdo do APK recompilado corresponda byte a byte à versão publicada da Gem Wallet.
  6. O F-Droid publica o APK assinado pelo desenvolvedor somente quando a verificação é bem-sucedida. Uma versão que não se reproduz não é publicada.

Controles de build determinística

A Gem Wallet inclui bibliotecas nativas em Rust, o que torna o resultado sensível a diferenças de compilador, linker, NDK, plataforma host e otimizador. A build do F-Droid controla essas entradas da seguinte forma:

  • fixando as versões da toolchain do Rust e do cargo-ndk em android/reproducible/versions.sh;
  • instalando o cargo-ndk com --locked, enquanto as dependências Rust do aplicativo são resolvidas pelo Cargo.lock versionado no repositório;
  • fixando a revisão exata do NDK do Android tanto no projeto Android quanto nos metadados do F-Droid;
  • compilando em um host Linux x86_64 com caminhos explícitos do linker e do arquivador do NDK;
  • restringindo os alvos nativos do APK a armeabi-v7a e arm64-v8a, independentemente do host de build x86_64;
  • usando o canal de produto dedicado fdroid, sem os módulos de notificações push e de avaliações do Google;
  • desativando a otimização do R8 com -dontoptimize para evitar saída DEX e identificadores de mapeamento não determinísticos;
  • executando o Gradle sem o daemon ou o cache de configuração e limpando os caches de transformação antes da build de lançamento.

O commit exato do código-fonte, os comandos de build, o caminho de saída, a revisão do NDK, a URL do APK upstream e o certificado de assinatura permitido são públicos nos metadados do F-Droid. Os scripts que configuram o Rust, o Cargo, a toolchain do NDK e o Gradle são mantidos junto com o código-fonte do aplicativo em android/reproducible.

Propriedades de segurança e limitações

Uma verificação bem-sucedida do F-Droid demonstra que o APK assinado publicado pela Gem Wallet pode ser reproduzido a partir do commit de código-fonte e da receita de build declarados. A recompilação é realizada fora da infraestrutura da Gem Wallet, o que reduz a dependência do nosso pipeline de lançamento como ponto único de confiança.

A reprodutibilidade não prova que o código-fonte esteja livre de vulnerabilidades, que cada dependência seja confiável ou que a toolchain de compilação selecionada não tenha sido comprometida. Esses riscos exigem revisão do código-fonte, controles de dependências e segurança da toolchain, além das builds reproduzíveis.

O status das builds e as versões verificadas estão disponíveis na página da Gem Wallet no F-Droid.

Universal APK e Google Play

O APK universal da Gem Wallet e a versão do Google Play atualmente não são cobertos pela verificação do F-Droid descrita acima. O suporte a builds reproduzíveis para esses canais de distribuição do Android está planejado como trabalho futuro.

iOS

A versão da App Store atualmente não é reproduzível. O suporte a builds reproduzíveis para iOS e a verificação independente do binário da App Store estão planejados como trabalho futuro.

Frequently Asked Questions

Builds reproduzíveis permitem que qualquer pessoa compile a Gem Wallet a partir do código-fonte público e verifique que o aplicativo resultante corresponde à versão oficial. Isso oferece transparência adicional e ajuda a confirmar que o aplicativo publicado foi compilado a partir do mesmo código-fonte disponível no GitHub.
Código aberto significa que o código-fonte da Gem Wallet está disponível publicamente e pode ser revisado por qualquer pessoa. As builds reproduzíveis vão um passo além, permitindo que desenvolvedores independentes e serviços como o F-Droid compilem o aplicativo a partir do código-fonte declarado e verifiquem que o APK do Android resultante corresponde byte a byte à versão oficial da Gem Wallet.
Sim. Você pode compilar tanto o aplicativo do Android quanto o do iOS a partir do código-fonte público da Gem Wallet. O aplicativo do Android oferece suporte a builds reproduzíveis usando os scripts públicos de build e a toolchain fixada. Você também pode compilar e executar o aplicativo do iOS localmente.
Os scripts de build reproduzível e a configuração da toolchain fixada são públicos. Os metadados do F-Droid declaram o commit exato do código-fonte, a revisão do NDK do Android, os comandos de build e o APK esperado para cada versão. O F-Droid recompila o aplicativo do Android de forma independente e o publica somente quando o conteúdo do APK corresponde byte a byte à versão da Gem Wallet.
Se você tiver uma dúvida, encontrar um problema de build ou identificar uma divergência, abra uma issue no repositório da Gem Wallet no GitHub. Inclua informações sobre seu ambiente, as etapas de build e quaisquer mensagens de erro relevantes para nos ajudar a investigar o problema.