From b5eda325b52639598b85f357fba4919f4de4e1be Mon Sep 17 00:00:00 2001 From: Forrest Voight Date: Tue, 31 Jan 2012 14:41:03 -0500 Subject: [PATCH] moved util.bases into util.math --- p2pool/bitcoin/data.py | 8 ++++---- p2pool/bitcoin/script.py | 4 ++-- p2pool/test/util/test_bases.py | 23 ----------------------- p2pool/test/util/test_math.py | 19 +++++++++++++++++++ p2pool/util/bases.py | 25 ------------------------- p2pool/util/math.py | 26 ++++++++++++++++++++++++++ 6 files changed, 51 insertions(+), 54 deletions(-) delete mode 100644 p2pool/test/util/test_bases.py delete mode 100644 p2pool/util/bases.py diff --git a/p2pool/bitcoin/data.py b/p2pool/bitcoin/data.py index a8094e7..e50aba7 100644 --- a/p2pool/bitcoin/data.py +++ b/p2pool/bitcoin/data.py @@ -2,7 +2,7 @@ from __future__ import division import hashlib -from p2pool.util import bases, math, pack +from p2pool.util import math, pack def hash256(data): return pack.IntType(256).unpack(hashlib.sha256(hashlib.sha256(data).digest()).digest()) @@ -33,7 +33,7 @@ class FloatingInteger(object): @classmethod def from_target_upper_bound(cls, target): - n = bases.natural_to_string(target) + n = math.natural_to_string(target) if n and ord(n[0]) >= 128: n = '\x00' + n bits2 = (chr(len(n)) + (n + 3*chr(0))[:3])[::-1] @@ -193,11 +193,11 @@ base58_alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' 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) + return base58_alphabet[0]*(len(bindata) - len(bindata2)) + math.natural_to_string(math.string_to_natural(bindata2), 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)) + return chr(0)*(len(b58data) - len(b58data2)) + math.natural_to_string(math.string_to_natural(b58data2, base58_alphabet)) human_address_type = ChecksummedType(pack.ComposedType([ ('version', pack.IntType(8)), diff --git a/p2pool/bitcoin/script.py b/p2pool/bitcoin/script.py index 171c470..a63cf9c 100644 --- a/p2pool/bitcoin/script.py +++ b/p2pool/bitcoin/script.py @@ -1,4 +1,4 @@ -from p2pool.util import bases, pack +from p2pool.util import math, pack def reads_nothing(f): return '', f @@ -7,7 +7,7 @@ def protoPUSH(length): def protoPUSHDATA(size_len): def _(f): length_str, f = pack.read(f, size_len) - length = bases.string_to_natural(length_str[::-1].lstrip(chr(0))) + length = math.string_to_natural(length_str[::-1].lstrip(chr(0))) data, f = pack.read(f, length) return data, f return _ diff --git a/p2pool/test/util/test_bases.py b/p2pool/test/util/test_bases.py deleted file mode 100644 index 9a99ffd..0000000 --- a/p2pool/test/util/test_bases.py +++ /dev/null @@ -1,23 +0,0 @@ -import random -import unittest - -from p2pool.util import bases - -def generate_alphabet(): - if random.randrange(2): - return None - else: - a = map(chr, xrange(256)) - random.shuffle(a) - return a[:random.randrange(2, len(a))] - -class Test(unittest.TestCase): - def test_all(self): - for i in xrange(10): - alphabet = generate_alphabet() - for i in xrange(100): - n = random.randrange(100000000000000000000000000000) - s = bases.natural_to_string(n, alphabet) - n2 = bases.string_to_natural(s, alphabet) - #print n, s.encode('hex'), n2 - self.assertEquals(n, n2) diff --git a/p2pool/test/util/test_math.py b/p2pool/test/util/test_math.py index 86d81fc..4681ce3 100644 --- a/p2pool/test/util/test_math.py +++ b/p2pool/test/util/test_math.py @@ -1,7 +1,26 @@ +import random import unittest from p2pool.util import math +def generate_alphabet(): + if random.randrange(2): + return None + else: + a = map(chr, xrange(256)) + random.shuffle(a) + return a[:random.randrange(2, len(a))] + class Test(unittest.TestCase): def test_add_tuples(self): assert math.add_tuples((1, 2, 3), (4, 5, 6)) == (5, 7, 9) + + def test_bases(self): + for i in xrange(10): + alphabet = generate_alphabet() + for i in xrange(100): + n = random.randrange(100000000000000000000000000000) + s = math.natural_to_string(n, alphabet) + n2 = math.string_to_natural(s, alphabet) + #print n, s.encode('hex'), n2 + self.assertEquals(n, n2) diff --git a/p2pool/util/bases.py b/p2pool/util/bases.py deleted file mode 100644 index 1477010..0000000 --- a/p2pool/util/bases.py +++ /dev/null @@ -1,25 +0,0 @@ -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') - else: - assert len(set(alphabet)) == len(alphabet) - res = [] - while n: - n, x = divmod(n, len(alphabet)) - res.append(alphabet[x]) - res.reverse() - return ''.join(res) - -def string_to_natural(s, alphabet=None): - if alphabet is None: - assert not s.startswith('\x00') - return int(s.encode('hex'), 16) if s else 0 - else: - assert len(set(alphabet)) == len(alphabet) - assert not s.startswith(alphabet[0]) - return sum(alphabet.index(char) * len(alphabet)**i for i, char in enumerate(reversed(s))) diff --git a/p2pool/util/math.py b/p2pool/util/math.py index 06c9244..5db5616 100644 --- a/p2pool/util/math.py +++ b/p2pool/util/math.py @@ -183,6 +183,32 @@ def weighted_choice(choices): target -= weight raise AssertionError() +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') + else: + assert len(set(alphabet)) == len(alphabet) + res = [] + while n: + n, x = divmod(n, len(alphabet)) + res.append(alphabet[x]) + res.reverse() + return ''.join(res) + +def string_to_natural(s, alphabet=None): + if alphabet is None: + assert not s.startswith('\x00') + return int(s.encode('hex'), 16) if s else 0 + else: + assert len(set(alphabet)) == len(alphabet) + assert not s.startswith(alphabet[0]) + return sum(alphabet.index(char) * len(alphabet)**i for i, char in enumerate(reversed(s))) + if __name__ == '__main__': import random a = 1 -- 1.7.1