URI: 
       tlnbase: add privkey derivation - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 6c4c2267f8b56570c067359e1e0f9aa2f6a6478e
   DIR parent 6d703db971769ed6410c25c4f998051c4e8a3128
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Tue, 17 Apr 2018 11:37:47 +0200
       
       lnbase: add privkey derivation
       
       Diffstat:
         M lib/lnbase.py                       |      10 ++++++----
         M lib/tests/test_lnbase.py            |       6 ++++--
       
       2 files changed, 10 insertions(+), 6 deletions(-)
       ---
   DIR diff --git a/lib/lnbase.py b/lib/lnbase.py
       t@@ -266,6 +266,10 @@ def derive_pubkey(basepoint, per_commitment_point):
            p2 = SECP256k1.generator * bitcoin.string_to_number(bitcoin.sha256(per_commitment_point + basepoint))
            return point_to_ser(p + p2)
        
       +def derive_privkey(secret, per_commitment_point):
       +    basepoint = point_to_ser(SECP256k1.generator * secret)
       +    return secret + bitcoin.string_to_number(bitcoin.sha256(per_commitment_point + basepoint))
       +
        def overall_weight(num_htlc):
            return 500 + 172 * num_htlc + 224
        
       t@@ -652,16 +656,13 @@ class Peer(PrintError):
                funding_pubkey, funding_privkey = next(keys)
                revocation_basepoint, revocation_privkey = next(keys)
                htlc_basepoint, htlc_privkey = next(keys)
       -        payment_basepoint, payment_privkey = next(keys)
                delayed_payment_basepoint, delayed_privkey = next(keys)
        
                funding_satoshis = 20000
                base_secret = 0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
                per_commitment_secret = 0x1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100
                base_point = secret_to_pubkey(base_secret)
       -        print('base_point', binascii.hexlify(base_point))
                per_commitment_point = secret_to_pubkey(per_commitment_secret)
       -        print('per_commitment_point', binascii.hexlify(per_commitment_point))
        
                msg = gen_msg(
                    "open_channel",
       t@@ -690,7 +691,8 @@ class Peer(PrintError):
                funding_tx = wallet.mktx([funding_output], None, config, 1000)
                funding_index = funding_tx.outputs().index(funding_output)
                remote_payment_basepoint = payload['payment_basepoint']
       -        localpubkey = derive_pubkey(payment_basepoint, per_commitment_point)
       +        localpubkey = derive_pubkey(base_point, per_commitment_point)
       +        localprivkey = derive_privkey(base_secret, per_commitment_point)
                self.print_error('localpubkey', binascii.hexlify(localpubkey))
                revocation_pubkey = derive_pubkey(revocation_basepoint, per_commitment_point)
                self.print_error('revocation_pubkey', binascii.hexlify(revocation_pubkey))
   DIR diff --git a/lib/tests/test_lnbase.py b/lib/tests/test_lnbase.py
       t@@ -4,7 +4,7 @@ import unittest
        
        from lib.util import bh2u, bfh
        from lib.lnbase import make_commitment, get_obscured_ctn, Peer, make_offered_htlc, make_received_htlc
       -from lib.lnbase import secret_to_pubkey, derive_pubkey
       +from lib.lnbase import secret_to_pubkey, derive_pubkey, derive_privkey
        from lib.transaction import Transaction
        from lib import bitcoin
        import ecdsa.ellipticcurve
       t@@ -172,7 +172,7 @@ class Test_LNBase(unittest.TestCase):
                print(p.find_route_for_payment('a', 'e', 100000))
        
            def test_key_derivation(self):
       -        print('test key derivation')
       +        # BOLT3, Appendix E
                base_secret = 0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
                per_commitment_secret = 0x1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100
                base_point = secret_to_pubkey(base_secret)
       t@@ -180,3 +180,5 @@ class Test_LNBase(unittest.TestCase):
                per_commitment_point = secret_to_pubkey(per_commitment_secret)
                localpubkey = derive_pubkey(base_point, per_commitment_point)
                self.assertEqual(localpubkey, bfh('0235f2dbfaa89b57ec7b055afe29849ef7ddfeb1cefdb9ebdc43f5494984db29e5'))
       +        localprivkey = derive_privkey(base_secret, per_commitment_point)
       +        self.assertEqual(localprivkey, 0xcbced912d3b21bf196a766651e436aff192362621ce317704ea2f75d87e7be0f)