util.bases.string_to_natural no longer accepts zero-characters at the start. changed...
authorForrest Voight <forrest@forre.st>
Sun, 4 Dec 2011 03:59:10 +0000 (22:59 -0500)
committerForrest Voight <forrest@forre.st>
Sun, 4 Dec 2011 03:59:10 +0000 (22:59 -0500)
p2pool/bitcoin/base58.py
p2pool/bitcoin/script.py
p2pool/test/util/test_bases.py
p2pool/util/bases.py

index c798e39..daf44c8 100644 (file)
@@ -2,9 +2,11 @@ from p2pool.util import bases
 
 base58_alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
 
-def base58_encode(data):
-    return base58_alphabet[0]*(len(data) - len(data.lstrip(chr(0)))) + bases.natural_to_string(bases.string_to_natural(data), base58_alphabet)
+def base58_encode(bindata):
+    bindata2 = bindata.lstrip(chr(0))
+    return base58_alphabet[0]*(len(bindata) - len(bindata2)) + bases.natural_to_string(bases.string_to_natural(bindata2), base58_alphabet)
 
-def base58_decode(data):
-    return chr(0)*(len(data) - len(data.lstrip(base58_alphabet[0]))) + bases.natural_to_string(bases.string_to_natural(data, base58_alphabet))
+def base58_decode(b58data):
+    b58data2 = b58data.lstrip(base58_alphabet[0])
+    return chr(0)*(len(b58data) - len(b58data2)) + bases.natural_to_string(bases.string_to_natural(b58data2, base58_alphabet))
 
index 3a0b658..f6a0b93 100644 (file)
@@ -8,7 +8,7 @@ def protoPUSH(length):
 def protoPUSHDATA(size_len):
     def _(f):
         length_str, f = bitcoin_data.read(f, size_len)
-        length = bases.string_to_natural(length_str[::-1])
+        length = bases.string_to_natural(length_str[::-1].lstrip(chr(0)))
         data, f = bitcoin_data.read(f, length)
         return data, f
     return _
index 10a72ca..9a99ffd 100644 (file)
@@ -20,4 +20,4 @@ class Test(unittest.TestCase):
                 s = bases.natural_to_string(n, alphabet)
                 n2 = bases.string_to_natural(s, alphabet)
                 #print n, s.encode('hex'), n2
-                assert n == n2
+                self.assertEquals(n, n2)
index 11ddc90..1477010 100644 (file)
@@ -1,9 +1,11 @@
 def natural_to_string(n, alphabet=None):
+    if n < 0:
+        raise TypeError('n must be a natural')
     if alphabet is None:
         s = '%x' % (n,)
         if len(s) % 2:
             s = '0' + s
-        return s.decode('hex').lstrip('\x00')
+        return s.decode('hex')
     else:
         assert len(set(alphabet)) == len(alphabet)
         res = []
@@ -15,11 +17,9 @@ def natural_to_string(n, alphabet=None):
 
 def string_to_natural(s, alphabet=None):
     if alphabet is None:
-        #if s.startswith('\x00'):
-        #    raise ValueError()
-        return int('0' + s.encode('hex'), 16)
+        assert not s.startswith('\x00')
+        return int(s.encode('hex'), 16) if s else 0
     else:
         assert len(set(alphabet)) == len(alphabet)
-        #if s.startswith(alphabet[0]):
-        #    raise ValueError()
+        assert not s.startswith(alphabet[0])
         return sum(alphabet.index(char) * len(alphabet)**i for i, char in enumerate(reversed(s)))