URI: 
       tMerge pull request #3367 from SomberNight/tx_size_est_uncompressed_pk - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 9425319dcd4c16a63ee3559bde433472b44ec165
   DIR parent 24af61816414927392142ec6f28e7c7e859b500f
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Fri, 24 Nov 2017 10:26:08 +0100
       
       Merge pull request #3367 from SomberNight/tx_size_est_uncompressed_pk
       
       ttx size estimation: handle uncompressed pubkeys
       Diffstat:
         M lib/transaction.py                  |      29 ++++++++++++++++++++++++++++-
       
       1 file changed, 28 insertions(+), 1 deletion(-)
       ---
   DIR diff --git a/lib/transaction.py b/lib/transaction.py
       t@@ -613,13 +613,40 @@ class Transaction:
                    raise TypeError('Unknown output type')
        
            @classmethod
       +    def estimate_pubkey_size_from_x_pubkey(cls, x_pubkey):
       +        try:
       +            if x_pubkey[0:2] in ['02', '03']:  # compressed pubkey
       +                return 0x21
       +            elif x_pubkey[0:2] == '04':  # uncompressed pubkey
       +                return 0x41
       +            elif x_pubkey[0:2] == 'ff':  # bip32 extended pubkey
       +                return 0x21
       +            elif x_pubkey[0:2] == 'fe':  # old electrum extended pubkey
       +                return 0x41
       +        except Exception as e:
       +            pass
       +        return 0x21  # just guess it is compressed
       +
       +    @classmethod
       +    def estimate_pubkey_size_for_txin(cls, txin):
       +        pubkeys = txin.get('pubkeys', [])
       +        x_pubkeys = txin.get('x_pubkeys', [])
       +        if len(pubkeys) > 0:
       +            return cls.estimate_pubkey_size_from_x_pubkey(pubkeys[0])
       +        elif len(x_pubkeys) > 0:
       +            return cls.estimate_pubkey_size_from_x_pubkey(x_pubkeys[0])
       +        else:
       +            return 0x21  # just guess it is compressed
       +
       +    @classmethod
            def get_siglist(self, txin, estimate_size=False):
                # if we have enough signatures, we use the actual pubkeys
                # otherwise, use extended pubkeys (with bip32 derivation)
                num_sig = txin.get('num_sig', 1)
                if estimate_size:
       +            pubkey_size = self.estimate_pubkey_size_for_txin(txin)
       +            pk_list = ["00" * pubkey_size] * num_sig
                    # we assume that signature will be 0x48 bytes long
       -            pk_list = [ "00" * 0x21 ] * num_sig
                    sig_list = [ "00" * 0x48 ] * num_sig
                else:
                    pubkeys, x_pubkeys = self.get_sorted_pubkeys(txin)