بیلدهای تکرارپذیر پیوندی قابل‌تأیید میان کد منبع منتشرشده و فایل باینری نسخه نهایی فراهم می‌کنند. پوشش فعلی بیلد تکرارپذیر ما شامل نسخه F-Droid برای Android است. قصد داریم این پوشش را به کانال‌های توزیع دیگر Android و iOS گسترش دهیم.

Android

F-Droid

Gem Wallet از زیرساخت بیلد مستقل F-Droid برای بازسازی فایل APK نسخه F-Droid و تأیید آن پیش از انتشار استفاده می‌کند.

مدل تأیید

Gem Wallet برای هر نسخه یک فایل APK امضاشده F-Droid منتشر می‌کند. به‌طور جداگانه، سرورهای بیلد F-Droid دستورالعمل بیلد عمومی را در یک محیط پاک اجرا می‌کنند:

  1. متادیتای F-Droid یک کامیت دقیق Git و نسخه Android NDK را انتخاب می‌کند.
  2. F-Droid آن کامیت را از مخزن عمومی Gem Wallet دریافت می‌کند.
  3. اسکریپت‌های عمومی بیلد تکرارپذیر زنجیره ابزار بومی پین‌شده را نصب و :app:assembleFdroidRelease را اجرا می‌کنند.
  4. بیلد یک فایل APK بدون امضا تولید می‌کند. F-Droid فایل APK متناظر امضاشده توسط توسعه‌دهنده را دانلود می‌کند و تأیید می‌کند که با اثر انگشت گواهی اعلام‌شده در AllowedAPKSigningKeys امضا شده است.
  5. F-Droid امضای APK را در فایل بازسازی‌شده کپی می‌کند و آن را تأیید می‌کند. امضاهای Android APK Signature Scheme v2/v3 کل فایل APK خارج از بلوک امضا را پوشش می‌دهند؛ بنابراین موفقیت تأیید مستلزم آن است که محتوای APK بازسازی‌شده بایت‌به‌بایت با نسخه Gem Wallet مطابقت داشته باشد.
  6. F-Droid فایل APK امضاشده توسط توسعه‌دهنده را تنها در صورت موفقیت تأیید منتشر می‌کند. نسخه‌ای که تکرارپذیر نباشد منتشر نمی‌شود.

کنترل‌های بیلد قطعی

Gem Wallet شامل کتابخانه‌های بومی Rust است و همین موضوع خروجی را نسبت به تفاوت‌های کامپایلر، لینکر، NDK، پلتفرم میزبان و بهینه‌ساز حساس می‌کند. بیلد F-Droid این ورودی‌ها را از راه‌های زیر کنترل می‌کند:

  • پین کردن نسخه‌های زنجیره ابزار Rust و cargo-ndk در android/reproducible/versions.sh؛
  • نصب cargo-ndk با --locked، در حالی که وابستگی‌های Rust برنامه از طریق فایل کامیت‌شده Cargo.lock تعیین می‌شوند؛
  • پین کردن نسخه دقیق Android NDK هم در پروژه Android و هم در متادیتای F-Droid؛
  • بیلد روی میزبان Linux با معماری x86_64 همراه با مسیرهای صریح لینکر و آرشیوساز NDK؛
  • محدود کردن اهداف بومی APK به armeabi-v7a و arm64-v8a، مستقل از میزبان بیلد x86_64؛
  • استفاده از کانال محصول اختصاصی fdroid، بدون ماژول‌های پوش و بازبینی Google؛
  • غیرفعال کردن بهینه‌سازی R8 با -dontoptimize برای جلوگیری از خروجی غیرقطعی DEX و شناسه‌های mapping؛
  • اجرای Gradle بدون daemon یا کش پیکربندی و پاک کردن کش‌های transformation پیش از بیلد نسخه نهایی.

کامیت دقیق منبع، دستورهای بیلد، مسیر خروجی، نسخه NDK، آدرس APK بالادستی و گواهی امضای مجاز همگی به‌صورت عمومی در متادیتای F-Droid موجودند. اسکریپت‌هایی که Rust، Cargo، زنجیره ابزار NDK و Gradle را پیکربندی می‌کنند همراه با کد منبع برنامه در android/reproducible نگهداری می‌شوند.

ویژگی‌های امنیتی و محدودیت‌ها

تأیید موفق F-Droid نشان می‌دهد که فایل APK امضاشده منتشرشده توسط Gem Wallet را می‌توان از کامیت منبع اعلام‌شده و دستورالعمل بیلد بازتولید کرد. بازسازی خارج از زیرساخت Gem Wallet انجام می‌شود و این موضوع اتکا به خط انتشار ما به‌عنوان تنها نقطه اعتماد را کاهش می‌دهد.

تکرارپذیری ثابت نمی‌کند که کد منبع بدون آسیب‌پذیری است، همه وابستگی‌ها قابل‌اعتمادند یا زنجیره ابزار کامپایلر انتخاب‌شده از دستکاری در امان است. این ریسک‌ها علاوه بر بیلدهای تکرارپذیر، به بازبینی کد منبع، کنترل وابستگی‌ها و امنیت زنجیره ابزار نیاز دارند.

وضعیت بیلد و نسخه‌های تأییدشده در صفحه Gem Wallet در F-Droid در دسترس است.

Universal APK و Google Play

فایل Universal APK برنامه Gem Wallet و نسخه Google Play در حال حاضر تحت پوشش تأیید F-Droid توضیح‌داده‌شده در بالا نیستند. پشتیبانی از بیلد تکرارپذیر برای این کانال‌های توزیع Android در کارهای آینده برنامه‌ریزی شده است.

iOS

نسخه App Store در حال حاضر تکرارپذیر نیست. پشتیبانی از بیلد تکرارپذیر برای iOS و تأیید مستقل باینری App Store در کارهای آینده برنامه‌ریزی شده است.

Frequently Asked Questions

بیلدهای تکرارپذیر به هر کسی امکان می‌دهند Gem Wallet را از کد منبع عمومی بسازد و تأیید کند که برنامه حاصل با نسخه رسمی مطابقت دارد. این امر شفافیت بیشتری فراهم می‌کند و به تأیید این موضوع کمک می‌کند که برنامه منتشرشده از همان کد منبعی ساخته شده است که در GitHub در دسترس است.
متن‌باز بودن یعنی کد منبع Gem Wallet به‌صورت عمومی در دسترس است و هر کسی می‌تواند آن را بررسی کند. بیلدهای تکرارپذیر یک گام فراتر می‌روند و به توسعه‌دهندگان مستقل و سرویس‌هایی مانند F-Droid امکان می‌دهند برنامه را از کد منبع اعلام‌شده بسازند و تأیید کنند که فایل APK حاصل برای Android بایت‌به‌بایت با نسخه رسمی Gem Wallet مطابقت دارد.
بله. می‌توانید هر دو برنامه Android و iOS را از کد منبع عمومی Gem Wallet بسازید. برنامه Android با استفاده از اسکریپت‌های بیلد عمومی و پیکربندی زنجیره ابزار پین‌شده از بیلدهای تکرارپذیر پشتیبانی می‌کند. همچنین می‌توانید برنامه iOS را به‌صورت محلی بسازید و اجرا کنید.
اسکریپت‌های بیلد تکرارپذیر و پیکربندی زنجیره ابزار پین‌شده عمومی هستند. متادیتای F-Droid کامیت دقیق منبع، نسخه Android NDK، دستورهای بیلد و خروجی موردانتظار APK را برای هر نسخه اعلام می‌کند. F-Droid برنامه Android را به‌طور مستقل دوباره می‌سازد و تنها زمانی آن را منتشر می‌کند که محتوای APK بایت‌به‌بایت با نسخه Gem Wallet مطابقت داشته باشد.
اگر پرسشی دارید، با مشکلی در فرایند بیلد روبه‌رو شدید یا مغایرتی یافتید، لطفاً یک issue در مخزن Gem Wallet در GitHub ثبت کنید. اطلاعات مربوط به محیط خود، مراحل بیلد و هر پیام خطای مرتبط را نیز درج کنید تا به ما در بررسی مشکل کمک کند.