mirror of
https://github.com/dashpay/dash.git
synced 2024-12-27 21:12:48 +01:00
17acd6b472
643aad17fa
Enable additional flake8 rules (practicalswift)f020aca297
Minor Python cleanups to make flake8 pass with the new rules enabled (practicalswift) Pull request description: Enabled rules: ``` * E242: tab after ',' * E266: too many leading '#' for block comment * E401: multiple imports on one line * E402: module level import not at top of file * E701: multiple statements on one line (colon) * E901: SyntaxError: invalid syntax * E902: TokenError: EOF in multi-line string * F821: undefined name 'Foo' * W293: blank line contains whitespace * W606: 'async' and 'await' are reserved keywords starting with Python 3.7 ``` Note to reviewers: * In general we don't allow whitespace cleanups to existing code, but in order to allow for enabling Travis checking for these rules a few smaller whitespace cleanups had to made as part of this PR. * Use [this `?w=1` link](https://github.com/bitcoin/bitcoin/pull/12987/files?w=1) to show a diff without whitespace changes. Before this commit: ``` $ flake8 -qq --statistics --ignore=B,C,E,F,I,N,W --select=E112,E113,E115,E116,E125,E131,E133,E223,E224,E242,E266,E271,E272,E273,E274,E275,E304,E306,E401,E402,E502,E701,E702,E703,E714,E721,E741,E742,E743,F401,E901,E902,F402,F404,F406,F407,F601,F602,F621,F622,F631,F701,F702,F703,F704,F705,F706,F707,F811,F812,F821,F822,F823,F831,F841,W292,W293,W504,W601,W602,W603,W604,W605,W606 . 5 E266 too many leading '#' for block comment 4 E401 multiple imports on one line 6 E402 module level import not at top of file 5 E701 multiple statements on one line (colon) 1 F812 list comprehension redefines 'n' from line 159 4 F821 undefined name 'ConnectionRefusedError' 28 W293 blank line contains whitespace ``` After this commit: ``` $ flake8 -qq --statistics --ignore=B,C,E,F,I,N,W --select=E112,E113,E115,E116,E125,E131,E133,E223,E224,E242,E266,E271,E272,E273,E274,E275,E304,E306,E401,E402,E502,E701,E702,E703,E714,E721,E741,E742,E743,F401,E901,E902,F402,F404,F406,F407,F601,F602,F621,F622,F631,F701,F702,F703,F704,F705,F706,F707,F811,F812,F821,F822,F823,F831,F841,W292,W293,W504,W601,W602,W603,W604,W605,W606 . $ ``` Tree-SHA512: fc7d5e752298a50d4248afc620ee2c173135b4ca008e48e02913ac968e5a24a5fd5396926047ec62f1d580d537434ccae01f249bb2f3338fa59dc630bf97ca7a Signed-off-by: pasta <pasta@dashboost.org>
133 lines
4.5 KiB
Python
Executable File
133 lines
4.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# Copyright (c) 2012 The Bitcoin Core developers
|
|
# Distributed under the MIT software license, see the accompanying
|
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
'''
|
|
Generate valid and invalid base58 address and private key test vectors.
|
|
|
|
Usage:
|
|
gen_base58_test_vectors.py valid 50 > ../../src/test/data/base58_keys_valid.json
|
|
gen_base58_test_vectors.py invalid 50 > ../../src/test/data/base58_keys_invalid.json
|
|
'''
|
|
# 2012 Wladimir J. van der Laan
|
|
# Released under MIT License
|
|
import os
|
|
from itertools import islice
|
|
from base58 import b58encode_chk, b58decode_chk, b58chars
|
|
import random
|
|
from binascii import b2a_hex
|
|
|
|
# key types
|
|
PUBKEY_ADDRESS = 76
|
|
SCRIPT_ADDRESS = 16
|
|
PUBKEY_ADDRESS_TEST = 140
|
|
SCRIPT_ADDRESS_TEST = 19
|
|
PRIVKEY = 204
|
|
PRIVKEY_TEST = 239
|
|
|
|
metadata_keys = ['isPrivkey', 'isTestnet', 'addrType', 'isCompressed']
|
|
# templates for valid sequences
|
|
templates = [
|
|
# prefix, payload_size, suffix, metadata
|
|
# None = N/A
|
|
((PUBKEY_ADDRESS,), 20, (), (False, False, 'pubkey', None)),
|
|
((SCRIPT_ADDRESS,), 20, (), (False, False, 'script', None)),
|
|
((PUBKEY_ADDRESS_TEST,), 20, (), (False, True, 'pubkey', None)),
|
|
((SCRIPT_ADDRESS_TEST,), 20, (), (False, True, 'script', None)),
|
|
((PRIVKEY,), 32, (), (True, False, None, False)),
|
|
((PRIVKEY,), 32, (1,), (True, False, None, True)),
|
|
((PRIVKEY_TEST,), 32, (), (True, True, None, False)),
|
|
((PRIVKEY_TEST,), 32, (1,), (True, True, None, True))
|
|
]
|
|
|
|
def is_valid(v):
|
|
'''Check vector v for validity'''
|
|
result = b58decode_chk(v)
|
|
if result is None:
|
|
return False
|
|
for template in templates:
|
|
prefix = bytearray(template[0])
|
|
suffix = bytearray(template[2])
|
|
if result.startswith(prefix) and result.endswith(suffix):
|
|
if (len(result) - len(prefix) - len(suffix)) == template[1]:
|
|
return True
|
|
return False
|
|
|
|
def gen_valid_vectors():
|
|
'''Generate valid test vectors'''
|
|
while True:
|
|
for template in templates:
|
|
prefix = bytearray(template[0])
|
|
payload = bytearray(os.urandom(template[1]))
|
|
suffix = bytearray(template[2])
|
|
rv = b58encode_chk(prefix + payload + suffix)
|
|
assert is_valid(rv)
|
|
metadata = {x: y for x, y in zip(metadata_keys,template[3]) if y is not None}
|
|
hexrepr = b2a_hex(payload)
|
|
if isinstance(hexrepr, bytes):
|
|
hexrepr = hexrepr.decode('utf8')
|
|
yield (rv, hexrepr, metadata)
|
|
|
|
def gen_invalid_vector(template, corrupt_prefix, randomize_payload_size, corrupt_suffix):
|
|
'''Generate possibly invalid vector'''
|
|
if corrupt_prefix:
|
|
prefix = os.urandom(1)
|
|
else:
|
|
prefix = bytearray(template[0])
|
|
|
|
if randomize_payload_size:
|
|
payload = os.urandom(max(int(random.expovariate(0.5)), 50))
|
|
else:
|
|
payload = os.urandom(template[1])
|
|
|
|
if corrupt_suffix:
|
|
suffix = os.urandom(len(template[2]))
|
|
else:
|
|
suffix = bytearray(template[2])
|
|
|
|
return b58encode_chk(prefix + payload + suffix)
|
|
|
|
def randbool(p = 0.5):
|
|
'''Return True with P(p)'''
|
|
return random.random() < p
|
|
|
|
def gen_invalid_vectors():
|
|
'''Generate invalid test vectors'''
|
|
# start with some manual edge-cases
|
|
yield "",
|
|
yield "x",
|
|
while True:
|
|
# kinds of invalid vectors:
|
|
# invalid prefix
|
|
# invalid payload length
|
|
# invalid (randomized) suffix (add random data)
|
|
# corrupt checksum
|
|
for template in templates:
|
|
val = gen_invalid_vector(template, randbool(0.2), randbool(0.2), randbool(0.2))
|
|
if random.randint(0,10)<1: # line corruption
|
|
if randbool(): # add random character to end
|
|
val += random.choice(b58chars)
|
|
else: # replace random character in the middle
|
|
n = random.randint(0, len(val))
|
|
val = val[0:n] + random.choice(b58chars) + val[n+1:]
|
|
if not is_valid(val):
|
|
yield val,
|
|
|
|
if __name__ == '__main__':
|
|
import sys
|
|
import json
|
|
iters = {'valid':gen_valid_vectors, 'invalid':gen_invalid_vectors}
|
|
try:
|
|
uiter = iters[sys.argv[1]]
|
|
except IndexError:
|
|
uiter = gen_valid_vectors
|
|
try:
|
|
count = int(sys.argv[2])
|
|
except IndexError:
|
|
count = 0
|
|
|
|
data = list(islice(uiter(), count))
|
|
json.dump(data, sys.stdout, sort_keys=True, indent=4)
|
|
sys.stdout.write('\n')
|
|
|