Skip to content

Commit

Permalink
Improve and update Electrum
Browse files Browse the repository at this point in the history
This contains several improvements:

* Updates the version
* Adds regtest support
* Adds integration test
* Fixes dependency specification
* Improves the launcher to be able to run daemon
  • Loading branch information
Kixunil committed Dec 13, 2023
1 parent a857485 commit 7047602
Show file tree
Hide file tree
Showing 9 changed files with 220 additions and 15 deletions.
6 changes: 4 additions & 2 deletions build_rules/electrum.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ get_assets:
signature: https://download.electrum.org/$(ELECTRUM_VERSION)/electrum-$(ELECTRUM_VERSION)-$(ARCH).AppImage.asc

copy_assets:
- from: electrum/assets/electrum-trustless-launcher
to: electrum-trustless-launcher
- from: electrum/assets/electrum-trustless-mainnet.desktop
to: electrum-trustless-mainnet.desktop
- from: electrum/assets/electrum-trustless-mainnet
to: electrum-trustless-mainnet
- from: electrum/assets/electrum-trustless-regtest.desktop
to: electrum-trustless-regtest.desktop
95 changes: 95 additions & 0 deletions electrum/assets/electrum-trustless-launcher
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
#!/bin/bash

function scan_args() {
local prog="$0";
network="`echo "$prog" | sed 's/^.*-//g'`"
case "$network" in
mainnet|regtest)
;;
testnet|signet|simnet)
echo "Network supported by Electrum but $network unsupported by CADR" >&2
echo "Use electrum directly, not this launcher" >&2
exit 1
;;
*)
echo "Unrecognized network $1. Launch the binary using a symlink."
exit 1
;;
esac
while [ $# -gt 0 ];
do
case "$1" in
--testnet|--regtest|--signet|--simnet)
echo "Network is implied by the binary name, don't use an argument" >&2
exit 1
;;
-h|--help)
echo "Launcher for electrum with a self-hosted server"
echo ""
echo "Usage: $prog [daemon|gui] [URLS...]"
echo ""
echo "This launcher supplies its own --oneserver and --server arguments to electrum. These are currently read from /etc/electrs-{network}/conf.d/interface.toml but this will change in the future."
echo "Note that for --offline or RPC use electrum binary directly. This launcher is only intended for GUI or daemon"
;;
daemon)
if [ "$is_daemon" = 1 ] || [ "$is_gui" = 1 ];
then
echo "Either daemon or gui have to be specified and at most once" >&2
exit 1
fi
is_daemon=1
;;
gui)
if [ "$is_daemon" = 1 ] || [ "$is_gui" = 1 ];
then
echo "Either daemon or gui have to be specified and at most once" >&2
exit 1
fi
is_gui=1
;;
--server)
echo "Error: --server would make this launcher pointless, use the electrum binary instead." >&2
exit 1
;;
--oneserver)
echo "Warning: --oneserver is already the default" >&2
;;
bitcoin:*)
break
;;
lightning:*)
break
;;
--)
break
;;
esac
shift
done
}

scan_args "$@"

first_arg=""
if [ "$is_daemon" = 1 ];
then
cmd="daemon"
shift
elif [ "$is_gui" = 1 ];
then
cmd="gui"
shift
fi

if [ "$network" = regtest ];
then
network_arg="--regtest"
fi

SERVER="`grep '^electrum_rpc_addr' "/etc/electrs-$network/conf.d/interface.toml" | sed -e 's/^electrum_rpc_addr *= *"//' -e 's/"$//'`:t" || exit 1

# Skipmerklecheck is safe because we connect to our own local server
# Currently this is hardcoded to electrs, but should use /etc/electrum-server/interface
# or something similar with update-alternatives. This needs implementation of interface
# feature in debcrafter (see #2).
exec electrum $network_arg $cmd --oneserver --skipmerklecheck --server "$SERVER" "$@"
9 changes: 0 additions & 9 deletions electrum/assets/electrum-trustless-mainnet

This file was deleted.

14 changes: 14 additions & 0 deletions electrum/assets/electrum-trustless-regtest.desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
[Desktop Entry]
Comment=Trustless Bitcoin Client - Regtest
Exec=electrum-trustless-regtest %u
GenericName[en_US]=Bitcoin Wallet
GenericName=Bitcoin Wallet
Icon=electrum
Name[en_US]=Electrum Bitcoin Wallet - Regtest (trustless)
Name=Electrum Bitcoin Wallet - Regtest (trustless)
Categories=Finance;Network;
StartupNotify=true
StartupWMClass=electrum
Terminal=false
Type=Application
MimeType=x-scheme-handler/bitcoin;
5 changes: 3 additions & 2 deletions pkg_specs/[email protected]
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
name = "electrum-trustless-@variant"
architecture = "all"
summary = "Electrum - Lightweight Bitcoin client (secure launcher)"
recommends = ["electrum-trustless-{variant} | electrum-trustless-regtest", "python3-pyqt5"]
add_files = ["electrum-trustless-{variant} /usr/bin/", "electrum-trustless-{variant}.desktop /usr/share/applications/"]
depends = ["electrum (>= 4.4.6)"]
add_files = ["electrum-trustless-{variant}.desktop /usr/share/applications/"]
add_links = ["/usr/share/electrum/electrum-trustless-launcher /usr/bin/electrum-trustless-{variant}"]
long_doc = """Electrum is a powerful Bitcoin wallet capable of using hardware wallets.
This package contains a launcher configured to make sure you don't leak
Expand Down
6 changes: 6 additions & 0 deletions pkg_specs/electrum.changelog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
electrum (4.4.6-1) buster; urgency=medium

* Updated upstream version

-- Martin Habovstiak <[email protected]> Wed, 22 Feb 2023 11:56:32 +0100

electrum (4.0.9-1) buster; urgency=medium

* Updated upstream version
Expand Down
2 changes: 1 addition & 1 deletion pkg_specs/electrum.sps
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ name = "electrum"
architecture = "any"
summary = "Electrum - Lightweight Bitcoin client (exeutable)"
recommends = ["electrum-trustless-mainnet | electrum-trustless-regtest", "python3-pyqt5"]
add_files = ["electrum /usr/bin"]
add_files = ["electrum /usr/bin", "electrum-trustless-launcher /usr/share/electrum"]
long_doc = """Electrum is a powerful Bitcoin wallet capable of using hardware wallets."""
2 changes: 1 addition & 1 deletion pkg_specs/electrum.sss
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name = "electrum"
section = "net"
variants = ["mainnet"]
variants = ["mainnet", "regtest"]
build_depends = [
"python3:native | python3-all:native | python3-all-dev:native"
]
Expand Down
96 changes: 96 additions & 0 deletions tests/multi-package/electrum.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
#!/bin/bash

set -e

test_dir="$(realpath "$(dirname "$0")/..")"

. "$test_dir/common.sh"

preload_config

sudo apt-get install -y bitcoin-regtest bitcoin-cli electrs electrum-trustless-regtest jq

# Heavily inspired by the one in electrs itself

cleanup() {
trap - SIGTERM SIGINT
set +eo pipefail
jobs
for j in `jobs -rp`
do
kill $j
wait $j
done
}
trap cleanup SIGINT SIGTERM EXIT

BTC="sudo bitcoin-cli -chain=regtest"
ELECTRUM="electrum-trustless-regtest"
EL="electrum --regtest"

tail_log() {
tail -n +0 -F $1 || true
}

$BTC -rpcwait getblockcount > /dev/null

echo "Creating Electrum `electrum version --offline` wallet..."
WALLET=`$EL --offline create --seed_type=segwit`
MINING_ADDR=`$EL --offline getunusedaddress`

$BTC generatetoaddress 110 $MINING_ADDR > /dev/null
echo `$BTC getblockchaininfo | jq -r '"Generated \(.blocks) regtest blocks (\(.size_on_disk/1e3) kB)"'` to $MINING_ADDR

TIP=`$BTC getbestblockhash`

wget -O metrics.txt http://localhost:24224

$ELECTRUM daemon -vDEBUG 2> ~/electrum-debug.log &
ELECTRUM_PID=$!
tail_log ~/electrum-debug.log | grep -m1 "connection established"
$EL getinfo | jq .

echo "Loading Electrum wallet..."
$EL load_wallet

echo "Running integration tests:"

echo " * getbalance"
test "`$EL getbalance | jq -c .`" == '{"confirmed":"550","unmatured":"4950"}'

echo " * getunusedaddress"
NEW_ADDR=`$EL getunusedaddress`

echo " * payto & broadcast"
TXID=$($EL broadcast $($EL payto $NEW_ADDR 123 --fee 0.001 --password=''))

echo " * get_tx_status"
test "`$EL get_tx_status $TXID | jq -c .`" == '{"confirmations":0}'

echo " * getaddresshistory"
test "`$EL getaddresshistory $NEW_ADDR | jq -c .`" == "[{\"fee\":100000,\"height\":0,\"tx_hash\":\"$TXID\"}]"

echo " * getbalance"
test "`$EL getbalance | jq -c .`" == '{"confirmed":"549.999","unmatured":"4950"}'

echo "Generating bitcoin block..."
$BTC generatetoaddress 1 $MINING_ADDR > /dev/null
$BTC getblockcount > /dev/null

echo " * wait for new block"
sudo killall -USR1 electrs # notify server to index new block
tail_log ~/electrum-debug.log | grep -m1 "verified $TXID" > /dev/null

echo " * get_tx_status"
test "`$EL get_tx_status $TXID | jq -c .`" == '{"confirmations":1}'

echo " * getaddresshistory"
test "`$EL getaddresshistory $NEW_ADDR | jq -c .`" == "[{\"height\":111,\"tx_hash\":\"$TXID\"}]"

echo " * getbalance"
test "`$EL getbalance | jq -c .`" == '{"confirmed":"599.999","unmatured":"4950.001"}'

echo "Electrum `$EL stop`" # disconnect wallet
wait $ELECTRUM_PID

echo "=== PASSED ==="

0 comments on commit 7047602

Please sign in to comment.