tfix: var_int encoding - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 4038c0273fa5a1d0aa787f392ad8a8e58afb148b DIR parent 3216c0467d2bb99ef4e6a2d94fe6eab791fa8b66 HTML Author: ThomasV <thomasv@gitorious> Date: Fri, 26 Oct 2012 22:49:06 +0200 fix: var_int encoding Diffstat: M lib/bitcoin.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) --- DIR diff --git a/lib/bitcoin.py b/lib/bitcoin.py t@@ -28,6 +28,17 @@ def int_to_hex(i, length=1): s = "0"*(2*length - len(s)) + s return rev_hex(s) +def var_int(i): + if i<0xfd: + return int_to_hex(i) + elif i<0xffff: + return "fd"+int_to_hex(i,2) + elif i<0xffffffff: + return "fe"+int_to_hex(i,4) + else: + return "ff"+int_to_hex(i,8) + + Hash = lambda x: hashlib.sha256(hashlib.sha256(x).digest()).digest() hash_encode = lambda x: x[::-1].encode('hex') hash_decode = lambda x: x.decode('hex')[::-1] t@@ -172,9 +183,10 @@ def filter(s): out = out.replace('\n','') return out +# https://en.bitcoin.it/wiki/Protocol_specification#Variable_length_integer def raw_tx( inputs, outputs, for_sig = None ): s = int_to_hex(1,4) + ' version\n' - s += int_to_hex( len(inputs) ) + ' number of inputs\n' + s += var_int( len(inputs) ) + ' number of inputs\n' for i in range(len(inputs)): _, _, p_hash, p_index, p_script, pubkey, sig = inputs[i] s += p_hash.decode('hex')[::-1].encode('hex') + ' prev hash\n' t@@ -190,10 +202,10 @@ def raw_tx( inputs, outputs, for_sig = None ): script = p_script + ' scriptsig \n' else: script='' - s += int_to_hex( len(filter(script))/2 ) + ' script length \n' + s += var_int( len(filter(script))/2 ) + ' script length \n' s += script s += "ffffffff" + ' sequence\n' - s += int_to_hex( len(outputs) ) + ' number of outputs\n' + s += var_int( len(outputs) ) + ' number of outputs\n' for output in outputs: addr, amount = output s += int_to_hex( amount, 8) + ' amount: %d\n'%amount t@@ -201,7 +213,7 @@ def raw_tx( inputs, outputs, for_sig = None ): script += '14' # push 0x14 bytes script += bc_address_to_hash_160(addr).encode('hex') script += '88ac' # op_equalverify, op_checksig - s += int_to_hex( len(filter(script))/2 ) + ' script length \n' + s += var_int( len(filter(script))/2 ) + ' script length \n' s += script + ' script \n' s += int_to_hex(0,4) # lock time if for_sig is not None: s += int_to_hex(1, 4) # hash type