electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit c0ae7b5534853459e43265545d23e4a8adfaeeee
parent 7e76e821522eb0fcb6aef0fcbd9897d77606b382
Author: SomberNight <somber.night@protonmail.com>
Date:   Thu, 25 Oct 2018 23:30:36 +0200

after rebase clean-up

Diffstat:
Melectrum/lnbase.py | 4++--
Melectrum/lnchan.py | 8++++----
Melectrum/lnchannelverifier.py | 5+++--
Melectrum/lnrouter.py | 4++--
Melectrum/lnwatcher.py | 1+
Melectrum/lnworker.py | 7++++---
Melectrum/tests/test_lnchan.py | 22+++++++++++-----------
7 files changed, 27 insertions(+), 24 deletions(-)

diff --git a/electrum/lnbase.py b/electrum/lnbase.py @@ -16,7 +16,7 @@ import sys import aiorpcx -from .crypto import sha256 +from .crypto import sha256, sha256d from . import bitcoin from . import ecc from .ecc import sig_string_from_r_and_s, get_r_and_s_from_sig_string @@ -868,7 +868,7 @@ class Peer(PrintError): bitcoin_key_2=bitcoin_keys[1] ) to_hash = chan_ann[256+2:] - h = bitcoin.Hash(to_hash) + h = sha256d(to_hash) bitcoin_signature = ecc.ECPrivkey(chan.config[LOCAL].multisig_key.privkey).sign(h, sig_string_from_r_and_s, get_r_and_s_from_sig_string) node_signature = ecc.ECPrivkey(self.privkey).sign(h, sig_string_from_r_and_s, get_r_and_s_from_sig_string) self.send_message("announcement_signatures", diff --git a/electrum/lnchan.py b/electrum/lnchan.py @@ -29,9 +29,9 @@ from enum import Enum, auto from typing import Optional, Dict, List, Tuple from .util import bfh, PrintError, bh2u -from .bitcoin import Hash, TYPE_SCRIPT, TYPE_ADDRESS +from .bitcoin import TYPE_SCRIPT, TYPE_ADDRESS from .bitcoin import redeem_script_to_address -from .crypto import sha256 +from .crypto import sha256, sha256d from . import ecc from .lnutil import Outpoint, LocalConfig, RemoteConfig, Keypair, OnlyPubkeyKeypair, ChannelConstraints, RevocationStore, EncumberedTransaction from .lnutil import get_per_commitment_secret_from_seed @@ -328,7 +328,7 @@ class Channel(PrintError): pending_local_commitment = self.pending_local_commitment preimage_hex = pending_local_commitment.serialize_preimage(0) - pre_hash = Hash(bfh(preimage_hex)) + pre_hash = sha256d(bfh(preimage_hex)) if not ecc.verify_signature(self.config[REMOTE].multisig_key.pubkey, sig, pre_hash): raise Exception('failed verifying signature of our updated commitment transaction: ' + bh2u(sig) + ' preimage is ' + preimage_hex) @@ -357,7 +357,7 @@ class Channel(PrintError): def verify_htlc(self, htlc, htlc_sigs, we_receive): _, this_point, _ = self.points _script, htlc_tx = make_htlc_tx_with_open_channel(self, this_point, True, we_receive, self.pending_local_commitment, htlc) - pre_hash = Hash(bfh(htlc_tx.serialize_preimage(0))) + pre_hash = sha256d(bfh(htlc_tx.serialize_preimage(0))) remote_htlc_pubkey = derive_pubkey(self.config[REMOTE].htlc_basepoint.pubkey, this_point) for idx, sig in enumerate(htlc_sigs): if ecc.verify_signature(remote_htlc_pubkey, sig, pre_hash): diff --git a/electrum/lnchannelverifier.py b/electrum/lnchannelverifier.py @@ -38,6 +38,7 @@ from .lnutil import invert_short_channel_id, funding_output_script_from_keys from .verifier import verify_tx_is_in_block, MerkleVerificationFailure from .transaction import Transaction from .interface import GracefulDisconnect +from .crypto import sha256d if TYPE_CHECKING: from .network import Network @@ -185,7 +186,7 @@ class LNChannelVerifier(NetworkJobOnDefaultServer): def verify_sigs_for_channel_announcement(chan_ann: dict) -> bool: msg_bytes = lnbase.gen_msg('channel_announcement', **chan_ann) pre_hash = msg_bytes[2+256:] - h = bitcoin.Hash(pre_hash) + h = sha256d(pre_hash) pubkeys = [chan_ann['node_id_1'], chan_ann['node_id_2'], chan_ann['bitcoin_key_1'], chan_ann['bitcoin_key_2']] sigs = [chan_ann['node_signature_1'], chan_ann['node_signature_2'], chan_ann['bitcoin_signature_1'], chan_ann['bitcoin_signature_2']] for pubkey, sig in zip(pubkeys, sigs): @@ -197,7 +198,7 @@ def verify_sigs_for_channel_announcement(chan_ann: dict) -> bool: def verify_sig_for_channel_update(chan_upd: dict, node_id: bytes) -> bool: msg_bytes = lnbase.gen_msg('channel_update', **chan_upd) pre_hash = msg_bytes[2+64:] - h = bitcoin.Hash(pre_hash) + h = sha256d(pre_hash) sig = chan_upd['signature'] if not ecc.verify_signature(node_id, sig, h): return False diff --git a/electrum/lnrouter.py b/electrum/lnrouter.py @@ -37,7 +37,7 @@ from . import constants from .util import PrintError, bh2u, profiler, get_headers_dir, bfh, is_ip_address, list_enabled_bits from .storage import JsonDB from .lnchannelverifier import LNChannelVerifier, verify_sig_for_channel_update -from .crypto import Hash +from .crypto import sha256d from . import ecc from .lnutil import LN_GLOBAL_FEATURES_KNOWN_SET, LNPeerAddr, NUM_MAX_EDGES_IN_PAYMENT_PATH @@ -416,7 +416,7 @@ class ChannelDB(JsonDB): def on_node_announcement(self, msg_payload): pubkey = msg_payload['node_id'] signature = msg_payload['signature'] - h = Hash(msg_payload['raw'][66:]) + h = sha256d(msg_payload['raw'][66:]) if not ecc.verify_signature(pubkey, signature, h): return old_node_info = self.nodes.get(pubkey, None) diff --git a/electrum/lnwatcher.py b/electrum/lnwatcher.py @@ -7,6 +7,7 @@ from typing import NamedTuple, Iterable, TYPE_CHECKING import os from collections import defaultdict import asyncio + import jsonrpclib from .util import PrintError, bh2u, bfh, log_exceptions, ignore_exceptions diff --git a/electrum/lnworker.py b/electrum/lnworker.py @@ -17,9 +17,10 @@ import dns.exception from . import constants from . import keystore -from . import bitcoin from .keystore import BIP32_KeyStore -from .bitcoin import sha256, COIN +from .bitcoin import COIN +from .crypto import sha256 +from .bip32 import bip32_root from .util import bh2u, bfh, PrintError, InvoiceError, resolve_dns_srv, is_ip_address, log_exceptions from .lntransport import LNResponderTransport from .lnbase import Peer @@ -84,7 +85,7 @@ class LNWorker(PrintError): # TODO derive this deterministically from wallet.keystore at keystore generation time # probably along a hardened path ( lnd-equivalent would be m/1017'/coinType'/ ) seed = os.urandom(32) - xprv, xpub = bitcoin.bip32_root(seed, xtype='standard') + xprv, xpub = bip32_root(seed, xtype='standard') self.wallet.storage.put('lightning_privkey2', xprv) self.wallet.storage.write() return keystore.from_xprv(xprv) diff --git a/electrum/tests/test_lnchan.py b/electrum/tests/test_lnchan.py @@ -20,14 +20,14 @@ # THE SOFTWARE. import unittest -import electrum.bitcoin as bitcoin -import electrum.lnbase as lnbase -import electrum.lnchan as lnchan -import electrum.lnutil as lnutil -import electrum.util as util import os import binascii +from electrum import bitcoin +from electrum import lnbase +from electrum import lnchan +from electrum import lnutil +from electrum import bip32 as bip32_utils from electrum.lnutil import SENT, LOCAL, REMOTE, RECEIVED one_bitcoin_in_msat = bitcoin.COIN * 1000 @@ -96,9 +96,9 @@ def create_channel_state(funding_txid, funding_index, funding_sat, local_feerate } def bip32(sequence): - xprv, xpub = bitcoin.bip32_root(b"9dk", 'standard') - xprv, xpub = bitcoin.bip32_private_derivation(xprv, "m/", sequence) - xtype, depth, fingerprint, child_number, c, k = bitcoin.deserialize_xprv(xprv) + xprv, xpub = bip32_utils.bip32_root(b"9dk", 'standard') + xprv, xpub = bip32_utils.bip32_private_derivation(xprv, "m/", sequence) + xtype, depth, fingerprint, child_number, c, k = bip32_utils.deserialize_xprv(xprv) assert len(k) == 32 assert type(k) is bytes return k @@ -536,13 +536,13 @@ class TestChanReserve(unittest.TestCase): force_state_transition(self.alice_channel, self.bob_channel) self.check_bals(one_bitcoin_in_msat*3\ - self.alice_channel.pending_local_fee, - one_bitocin_in_msat*5) + one_bitcoin_in_msat*5) self.bob_channel.settle_htlc(paymentPreimage, bob_idx) self.alice_channel.receive_htlc_settle(paymentPreimage, alice_idx) force_state_transition(self.alice_channel, self.bob_channel) self.check_bals(one_bitcoin_in_msat*3\ - self.alice_channel.pending_local_fee, - one_bitocin_in_msat*7) + one_bitcoin_in_msat*7) # And now let Bob add an HTLC of 1 BTC. This will take Bob's balance # all the way down to his channel reserve, but since he is not paying # the fee this is okay. @@ -552,7 +552,7 @@ class TestChanReserve(unittest.TestCase): force_state_transition(self.alice_channel, self.bob_channel) self.check_bals(one_bitcoin_in_msat*3\ - self.alice_channel.pending_local_fee, - one_bitocin_in_msat*6) + one_bitcoin_in_msat*6) def check_bals(self, amt1, amt2): self.assertEqual(self.alice_channel.available_to_spend(LOCAL), amt1)