remove unsubscribed addresses
[electrum-server.git] / backends / bitcoind / deserialize.py
index d92a2b5..60af334 100644 (file)
@@ -258,8 +258,9 @@ def parse_TxIn(vds):
   d['prevout_n'] = vds.read_uint32()
   scriptSig = vds.read_bytes(vds.read_compact_size())
   d['sequence'] = vds.read_uint32()
-  d['address'] = extract_public_key(scriptSig)
-  #d['script'] = decode_script(scriptSig)
+  # actually I don't need that at all
+  # if not is_coinbase: d['address'] = extract_public_key(scriptSig)
+  # d['script'] = decode_script(scriptSig)
   return d
 
 
@@ -274,18 +275,27 @@ def parse_TxOut(vds, i):
   return d
 
 
-def parse_Transaction(vds):
+def parse_Transaction(vds, is_coinbase):
   d = {}
   start = vds.read_cursor
   d['version'] = vds.read_int32()
   n_vin = vds.read_compact_size()
   d['inputs'] = []
   for i in xrange(n_vin):
-    d['inputs'].append(parse_TxIn(vds))
+      o = parse_TxIn(vds)
+      if not is_coinbase: 
+          d['inputs'].append(o)
   n_vout = vds.read_compact_size()
   d['outputs'] = []
   for i in xrange(n_vout):
-    d['outputs'].append(parse_TxOut(vds, i))
+      o = parse_TxOut(vds, i)
+
+      #if o['address'] == "None" and o['value']==0:
+      #    print("skipping strange tx output with zero value")
+      #    continue
+      # if o['address'] != "None":
+      d['outputs'].append(o)
+
   d['lockTime'] = vds.read_uint32()
   return d
 
@@ -381,10 +391,22 @@ def extract_public_key(bytes):
   if match_decoded(decoded, match):
     return public_key_to_bc_address(decoded[0][1])
 
+  # coins sent to black hole
+  # DUP HASH160 20 BYTES:... EQUALVERIFY CHECKSIG
+  match = [ opcodes.OP_DUP, opcodes.OP_HASH160, opcodes.OP_0, opcodes.OP_EQUALVERIFY, opcodes.OP_CHECKSIG ]
+  if match_decoded(decoded, match):
+    return "None"
+
   # Pay-by-Bitcoin-address TxOuts look like:
   # DUP HASH160 20 BYTES:... EQUALVERIFY CHECKSIG
   match = [ opcodes.OP_DUP, opcodes.OP_HASH160, opcodes.OP_PUSHDATA4, opcodes.OP_EQUALVERIFY, opcodes.OP_CHECKSIG ]
   if match_decoded(decoded, match):
     return hash_160_to_bc_address(decoded[2][1])
 
-  return "(None)"
+  # strange tx
+  match = [ opcodes.OP_DUP, opcodes.OP_HASH160, opcodes.OP_PUSHDATA4, opcodes.OP_EQUALVERIFY, opcodes.OP_CHECKSIG, opcodes.OP_NOP ]
+  if match_decoded(decoded, match):
+    return hash_160_to_bc_address(decoded[2][1])
+
+  #raise BaseException("address not found in script") see ce35795fb64c268a52324b884793b3165233b1e6d678ccaadf760628ec34d76b
+  return "None"