Mysql share reporting fixed. Update config template.
[stratum-mining.git] / lib / util.py
index 3e88fd8..d9570c7 100644 (file)
@@ -4,6 +4,7 @@ import struct
 import StringIO
 import binascii
 from hashlib import sha256
+from ltc_scrypt import getPoWHash
 
 def deser_string(f):
     nit = struct.unpack("<B", f.read(1))[0]
@@ -139,19 +140,33 @@ def b58decode(v, length):
     result = chr(0)*nPad + result
     if length is not None and len(result) != length:
         return None
-    
+
     return result
 
+def b58encode(value):
+    """ encode integer 'value' as a base58 string; returns string
+    """
+    encoded = ''
+    while value >= __b58base:
+        div, mod = divmod(value, __b58base)
+        encoded = __b58chars[mod] + encoded # add to left
+        value = div
+    encoded = __b58chars[value] + encoded # most significant remainder
+    return encoded
+
 def reverse_hash(h):
     # This only revert byte order, nothing more
     if len(h) != 64:
         raise Exception('hash must have 64 hexa chars')
-    
+
     return ''.join([ h[56-i:64-i] for i in range(0, 64, 8) ])
 
 def doublesha(b):
     return sha256(sha256(b).digest()).digest()
 
+def scrypt(b):
+    return getPoWHash(b)
+
 def bits_to_target(bits):
     return struct.unpack('<L', bits[:3] + b'\0')[0] * 2**(8*(int(bits[3], 16) - 3))
 
@@ -160,17 +175,17 @@ def address_to_pubkeyhash(addr):
         addr = b58decode(addr, 25)
     except:
         return None
-    
+
     if addr is None:
         return None
-    
+
     ver = addr[0]
     cksumA = addr[-4:]
     cksumB = doublesha(addr[:-4])[:4]
-    
+
     if cksumA != cksumB:
         return None
-    
+
     return (ver, addr[1:-4])
 
 def ser_uint256_be(u):
@@ -179,7 +194,7 @@ def ser_uint256_be(u):
     for i in xrange(8):
         rs += struct.pack(">I", u & 0xFFFFFFFFL)
         u >>= 32
-    return rs    
+    return rs
 
 def deser_uint256_be(f):
     r = 0L
@@ -188,14 +203,19 @@ def deser_uint256_be(f):
         r += t << (i * 32)
     return r
 
-def ser_number(num):
+def ser_number(n):
     # For encoding nHeight into coinbase
-    d = struct.pack("<I", num).rstrip("\x00")
-    return chr(len(d)) + d
-    
+    s = bytearray(b'\1')
+    while n > 127:
+        s[0] += 1
+        s.append(n % 256)
+        n //= 256
+    s.append(n)
+    return bytes(s)
+
 def script_to_address(addr):
     d = address_to_pubkeyhash(addr)
     if not d:
         raise ValueError('invalid address')
     (ver, pubkeyhash) = d
-    return b'\x76\xa9\x14' + pubkeyhash + b'\x88\xac'
\ No newline at end of file
+    return b'\x76\xa9\x14' + pubkeyhash + b'\x88\xac'