thashes.py - electrum-personal-server - Maximally lightweight electrum server for a single user
HTML git clone https://git.parazyd.org/electrum-personal-server
DIR Log
DIR Files
DIR Refs
DIR README
---
thashes.py (2865B)
---
1
2 import hashlib
3 import binascii
4 import math
5
6 ## stuff copied from electrum's source
7
8 def to_bytes(something, encoding='utf8'):
9 """
10 cast string to bytes() like object, but for python2 support
11 it's bytearray copy
12 """
13 if isinstance(something, bytes):
14 return something
15 if isinstance(something, str):
16 return something.encode(encoding)
17 elif isinstance(something, bytearray):
18 return bytes(something)
19 else:
20 raise TypeError("Not a string or bytes like object")
21
22 def sha256(x):
23 x = to_bytes(x, 'utf8')
24 return bytes(hashlib.sha256(x).digest())
25
26 def bh2u(x):
27 return binascii.hexlify(x).decode('ascii')
28
29 def script_to_scripthash(script):
30 """Electrum uses a format hash(scriptPubKey) as the index keys"""
31 h = sha256(bytes.fromhex(script))[0:32]
32 return bh2u(bytes(reversed(h)))
33
34 #the 'result' field in the blockchain.scripthash.subscribe method
35 # reply uses this as a summary of the address
36 def get_status_electrum(h):
37 if not h:
38 return None
39 if len(h) == 0:
40 return None
41 status = ''
42 for tx_hash, height in h:
43 status += tx_hash + ':%d:' % height
44 return bh2u(hashlib.sha256(status.encode('ascii')).digest())
45
46 bfh = bytes.fromhex
47 hash_encode = lambda x: bh2u(x[::-1])
48 hash_decode = lambda x: bfh(x)[::-1]
49
50 def Hash(x):
51 x = to_bytes(x, 'utf8')
52 out = bytes(sha256(sha256(x)))
53 return out
54
55 def hash_merkle_root(merkle_s, target_hash, pos):
56 h = hash_decode(target_hash)
57 for i in range(len(merkle_s)):
58 item = merkle_s[i]
59 h = Hash(hash_decode(item) + h) if ((pos >> i) & 1) else Hash(
60 h + hash_decode(item))
61 return hash_encode(h)
62
63 def hash_160(public_key):
64 try:
65 md = hashlib.new('ripemd160')
66 md.update(sha256(public_key))
67 return md.digest()
68 except BaseException:
69 from . import ripemd
70 md = ripemd.new(sha256(public_key))
71 return md.digest()
72
73 ## end of electrum copypaste
74
75 def script_to_address(scriptPubKey, rpc):
76 return rpc.call("decodescript", [scriptPubKey])["addresses"][0]
77
78 def address_to_script(addr, rpc):
79 return rpc.call("validateaddress", [addr])["scriptPubKey"]
80
81 def address_to_scripthash(addr, rpc):
82 return script_to_scripthash(address_to_script(addr, rpc))
83
84 # doesnt really fit here but i dont want to clutter up server.py
85
86 unit_list = list(zip(['B', 'kB', 'MB', 'GB', 'TB', 'PB'], [0, 0, 1, 2, 2, 2]))
87
88 def bytes_fmt(num):
89 """Human friendly file size"""
90 if num > 1:
91 exponent = min(int(math.log(num, 1000)), len(unit_list) - 1)
92 quotient = float(num) / 1000**exponent
93 unit, num_decimals = unit_list[exponent]
94 format_string = '{:.%sf} {}' % (num_decimals)
95 return format_string.format(quotient, unit)
96 if num == 0:
97 return '0 bytes'
98 if num == 1:
99 return '1 byte'
100