570c0aeca39e56c742b77380ec274d178d660c29
see bitcoin/bitcoin@217208a36d ----- A lot of time was wasted on this... over the years actually... Some notes and rant here, for future reference. During the initial effort to try to make binaries reproducible, out of the three windows binaries being distributed (standalone, portable, setup), only the first two were successfully made deterministic. Later, we started to use Docker-based builds. At that point ThomasV and I could reproducibly build the same setup/nsis exe but Travis kept building a different one. Recently I have noticed that if I do two subsequent builds of the setup exe on the same machine, adding a new file in contrib/build-wine/ between the builds, then I get different binaries. Playing around with this a bit, it seems: - other files that are in the same folder as contrib/build-wine/electrum.nsi affect the binary - only files that are in exactly the same folder matter (not recursively) - only filenames matter (not permission, owner, timestamps, or file contents) To see the difference in the binaries, use vbindiff, and disable the compression done by nsis (SetCompress off). There is a ~48 byte diff near the very beginning of the "Uninstaller" section. I am only guessing it is the uninstaller section based on the sizes of the sections printed by nsis during the build. I have downloaded the binary built by Travis, and the diff is consistent with this (i.e. it's the same kind of diff that manifests if I change the filename of one of the supposedly unrelated files). Commenting out the "WriteUninstaller" line in .nsi fixes the issue. i.e. if no uninstaller is created then the binary becomes deterministic. Commenting out the "!define MUI_ICON" line in .nsi also fixes the issue. At this point I remembered the above referenced commit by bluematt; which I had thought we had already followed up on... Replacing the .ico file fixes the issue. Note that it's not actually clear what the exact requirements for the .ico file are. Removing any of the layers in the image seems to introduce non-determinicity. The new .ico file has layers with resolutions and properties the bitcoin.ico file has. I guess NSIS must have strict requirements for the icon size, and if a given size icon is missing it might be creating it itself?? And during the downscaling it uses a non-deterministic algorithm that initialises some RNG from the directory listing (bauerj's guess somewhat adapted :D). Just crazy.
Electrum - Lightweight Bitcoin client
=====================================
::
Licence: MIT Licence
Author: Thomas Voegtlin
Language: Python (>= 3.6)
Homepage: https://electrum.org/
.. image:: https://travis-ci.org/spesmilo/electrum.svg?branch=master
:target: https://travis-ci.org/spesmilo/electrum
:alt: Build Status
.. image:: https://coveralls.io/repos/github/spesmilo/electrum/badge.svg?branch=master
:target: https://coveralls.io/github/spesmilo/electrum?branch=master
:alt: Test coverage statistics
.. image:: https://d322cqt584bo4o.cloudfront.net/electrum/localized.svg
:target: https://crowdin.com/project/electrum
:alt: Help translate Electrum online
Getting started
===============
Electrum is a pure python application. If you want to use the
Qt interface, install the Qt dependencies::
sudo apt-get install python3-pyqt5
If you downloaded the official package (tar.gz), you can run
Electrum from its root directory without installing it on your
system; all the python dependencies are included in the 'packages'
directory. To run Electrum from its root directory, just do::
./run_electrum
You can also install Electrum on your system, by running this command::
sudo apt-get install python3-setuptools
python3 -m pip install .[fast]
This will download and install the Python dependencies used by
Electrum instead of using the 'packages' directory.
The 'fast' extra contains some optional dependencies that we think
are often useful but they are not strictly needed.
If you cloned the git repository, you need to compile extra files
before you can run Electrum. Read the next section, "Development
Version".
Development version
===================
Check out the code from GitHub::
git clone git://github.com/spesmilo/electrum.git
cd electrum
Run install (this should install dependencies)::
python3 -m pip install .[fast]
Compile the protobuf description file::
sudo apt-get install protobuf-compiler
protoc --proto_path=electrum --python_out=electrum electrum/paymentrequest.proto
Create translations (optional)::
sudo apt-get install python-requests gettext
./contrib/make_locale
Creating Binaries
=================
Linux (tarball)
---------------
See :code:`contrib/build-linux/README.md`.
Linux (AppImage)
----------------
See :code:`contrib/build-linux/appimage/README.md`.
Mac OS X / macOS
----------------
See :code:`contrib/osx/README.md`.
Windows
-------
See :code:`contrib/build-wine/README.md`.
Android
-------
See :code:`electrum/gui/kivy/Readme.md`.
Description
Languages
Python
89.1%
QML
8.4%
Shell
2%
Dockerfile
0.2%
Java
0.2%
Other
0.1%