a92dede490545b04bbfb199064abd48aa46e3116
- rm the `_get_channel_ids` abstraction as each of its usages needs subtle differences. Some code duplication is preferable in this case. - raise exceptions in `wait_for_message`, so that callers such as the GUI can show user-feedback - on_error/on_warning were dropping messages with temp_chan_ids if they were not stored in `temp_id_to_id` - which was only done once the mapping was known (so the normal chan_id was known). To fix this, we now store temp_chan_ids into `temp_id_to_id` early. - `schedule_force_closing` only works if the chan_id is already in `channels` related: https://github.com/spesmilo/electrum/pull/7645 (and related commits) ----- example before commit: ``` D/P | lnpeer.Peer.[LNWallet, 03933884aa-3b53e4ab] | Sending OPEN_CHANNEL D/P | lnpeer.Peer.[LNWallet, 03933884aa-3b53e4ab] | Received ERROR I/P | lnpeer.Peer.[LNWallet, 03933884aa-3b53e4ab] | remote peer sent error [DO NOT TRUST THIS MESSAGE]: invalid funding_satoshis=10000 sat (min=400000 sat max=1500000000 sat) E | gui.qt.main_window.[test_segwit_2] | Could not open channel Traceback (most recent call last): File "...\electrum\electrum\util.py", line 1160, in wrapper return await func(*args, **kwargs) File "...\electrum\electrum\lnpeer.py", line 661, in wrapper return await func(self, *args, **kwargs) File "...\electrum\electrum\lnpeer.py", line 742, in channel_establishment_flow payload = await self.wait_for_message('accept_channel', temp_channel_id) # File "...\electrum\electrum\lnpeer.py", line 315, in wait_for_message name, payload = await asyncio.wait_for(q.get(), LN_P2P_NETWORK_TIMEOUT) File "...\Python39\lib\asyncio\tasks.py", line 468, in wait_for await waiter asyncio.exceptions.CancelledError During handling of the above exception, another exception occurred: Traceback (most recent call last): File "...\Python39\lib\asyncio\tasks.py", line 492, in wait_for fut.result() asyncio.exceptions.CancelledError The above exception was the direct cause of the following exception: Traceback (most recent call last): File "...\electrum\electrum\gui\qt\util.py", line 914, in run result = task.task() File "...\electrum\electrum\gui\qt\main_window.py", line 1875, in task return self.wallet.lnworker.open_channel( File "...\electrum\electrum\lnworker.py", line 1075, in open_channel chan, funding_tx = fut.result() File "...\Python39\lib\concurrent\futures\_base.py", line 445, in result return self.__get_result() File "...\Python39\lib\concurrent\futures\_base.py", line 390, in __get_result raise self._exception File "...\electrum\electrum\util.py", line 1160, in wrapper return await func(*args, **kwargs) File "...\electrum\electrum\lnworker.py", line 1006, in _open_channel_coroutine chan, funding_tx = await asyncio.wait_for(coro, LN_P2P_NETWORK_TIMEOUT) File "...\Python39\lib\asyncio\tasks.py", line 494, in wait_for raise exceptions.TimeoutError() from exc asyncio.exceptions.TimeoutError ``` example after commit: ``` D/P | lnpeer.Peer.[LNWallet, 03933884aa-ff3a866f] | Sending OPEN_CHANNEL D/P | lnpeer.Peer.[LNWallet, 03933884aa-ff3a866f] | Received ERROR I/P | lnpeer.Peer.[LNWallet, 03933884aa-ff3a866f] | remote peer sent error [DO NOT TRUST THIS MESSAGE]: invalid funding_satoshis=10000 sat (min=400000 sat max=1500000000 sat). chan_id=124ca21fa6aa2993430ad71f465f0d44731ef87f7478e4b31327e4459b5a3988 E | lnworker.LNWallet.[test_segwit_2] | Exception in _open_channel_coroutine: GracefulDisconnect('remote peer sent error [DO NOT TRUST THIS MESSAGE]: invalid funding_satoshis=10000 sat (min=400000 sat max=1500000000 sat)') Traceback (most recent call last): File "...\electrum\electrum\util.py", line 1160, in wrapper return await func(*args, **kwargs) File "...\electrum\electrum\lnworker.py", line 1006, in _open_channel_coroutine chan, funding_tx = await asyncio.wait_for(coro, LN_P2P_NETWORK_TIMEOUT) File "...\Python39\lib\asyncio\tasks.py", line 481, in wait_for return fut.result() File "...\electrum\electrum\lnpeer.py", line 673, in wrapper return await func(self, *args, **kwargs) File "...\electrum\electrum\lnpeer.py", line 755, in channel_establishment_flow payload = await self.wait_for_message('accept_channel', temp_channel_id) File "...\electrum\electrum\lnpeer.py", line 326, in wait_for_message raise GracefulDisconnect( electrum.interface.GracefulDisconnect: remote peer sent error [DO NOT TRUST THIS MESSAGE]: invalid funding_satoshis=10000 sat (min=400000 sat max=1500000000 sat) I/P | lnpeer.Peer.[LNWallet, 03933884aa-ff3a866f] | Disconnecting: GracefulDisconnect() ```
Electrum - Lightweight Bitcoin client
=====================================
::
Licence: MIT Licence
Author: Thomas Voegtlin
Language: Python (>= 3.8)
Homepage: https://electrum.org/
.. image:: https://api.cirrus-ci.com/github/spesmilo/electrum.svg?branch=master
:target: https://cirrus-ci.com/github/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
===============
(*If you've come here looking to simply run Electrum,* `you may download it here`_.)
.. _you may download it here: https://electrum.org/#download
Electrum itself is pure Python, and so are most of the required dependencies,
but not everything. The following sections describe how to run from source, but here
is a TL;DR::
sudo apt-get install libsecp256k1-0
python3 -m pip install --user .[gui,crypto]
Not pure-python dependencies
----------------------------
If you want to use the Qt interface, install the Qt dependencies::
sudo apt-get install python3-pyqt5
For elliptic curve operations, `libsecp256k1`_ is a required dependency::
sudo apt-get install libsecp256k1-0
Alternatively, when running from a cloned repository, a script is provided to build
libsecp256k1 yourself::
sudo apt-get install automake libtool
./contrib/make_libsecp256k1.sh
Due to the need for fast symmetric ciphers, `cryptography`_ is required.
Install from your package manager (or from pip)::
sudo apt-get install python3-cryptography
If you would like hardware wallet support, see `this`_.
.. _libsecp256k1: https://github.com/bitcoin-core/secp256k1
.. _pycryptodomex: https://github.com/Legrandin/pycryptodome
.. _cryptography: https://github.com/pyca/cryptography
.. _this: https://github.com/spesmilo/electrum-docs/blob/master/hardware-linux.rst
Running from tar.gz
-------------------
If you downloaded the official package (tar.gz), you can run
Electrum from its root directory without installing it on your
system; all the pure 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-pip
python3 -m pip install --user .
This will download and install the Python dependencies used by
Electrum instead of using the 'packages' directory.
It will also place an executable named :code:`electrum` in :code:`~/.local/bin`,
so make sure that is on your :code:`PATH` variable.
Development version (git clone)
-------------------------------
Check out the code from GitHub::
git clone git://github.com/spesmilo/electrum.git
cd electrum
git submodule update --init
Run install (this should install dependencies)::
python3 -m pip install --user -e .
Create translations (optional)::
sudo apt-get install python-requests gettext
./contrib/pull_locale
Finally, to start Electrum::
./run_electrum
Run unit tests with `pytest`:
pytest electrum/tests -v
To run a single file, specify it directly like this:
pytest electrum/tests/test_bitcoin.py -v
Creating Binaries
=================
Linux (tarball)
---------------
See :code:`contrib/build-linux/sdist/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:`contrib/android/Readme.md`.
Contributing
============
Any help testing the software, reporting or fixing bugs, reviewing pull requests
and recent changes, writing tests, or helping with outstanding issues is very welcome.
Implementing new features, or improving/refactoring the codebase, is of course
also welcome, but to avoid wasted effort, especially for larger changes,
we encourage discussing these on the issue tracker or IRC first.
Besides `GitHub`_, most communication about Electrum development happens on IRC, in the
:code:`#electrum` channel on Libera Chat. The easiest way to participate on IRC is
with the web client, `web.libera.chat`_.
.. _web.libera.chat: https://web.libera.chat/#electrum
.. _GitHub: https://github.com/spesmilo/electrum
Description
Languages
Python
89.1%
QML
8.4%
Shell
2%
Dockerfile
0.2%
Java
0.2%
Other
0.1%