diff --git a/btcpy/lib/base58.py b/btcpy/lib/base58.py new file mode 100644 index 0000000..3412c45 --- /dev/null +++ b/btcpy/lib/base58.py @@ -0,0 +1,74 @@ +'''Base58 encoding + +Implementations of Base58 and Base58Check endcodings that are compatible +with the bitcoin network. +''' + +from hashlib import sha256 + +# 58 character alphabet used +alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' + +iseq = lambda s: s +bseq = bytes +buffer = lambda s: s.buffer + + +def b58encode(v: bytes) -> str: + '''Encode a string using Base58''' + + origlen = len(v) + v = v.lstrip(b'\0') + newlen = len(v) + + p, acc = 1, 0 + for c in iseq(v[::-1]): + acc += p * c + p = p << 8 + + result = '' + while acc > 0: + acc, mod = divmod(acc, 58) + result += alphabet[mod] + + return (result + alphabet[0] * (origlen - newlen))[::-1] + + +def b58decode(v: str) -> bytes: + '''Decode a Base58 encoded string''' + + origlen = len(v) + v = v.lstrip(alphabet[0]) + newlen = len(v) + + p, acc = 1, 0 + for c in v[::-1]: + acc += p * alphabet.index(c) + p *= 58 + + result = [] + while acc > 0: + acc, mod = divmod(acc, 256) + result.append(mod) + + return (bseq(result) + b'\0' * (origlen - newlen))[::-1] + + +def b58encode_check(v: bytes) -> str: + '''Encode a string using Base58 with a 4 character checksum''' + + digest = sha256(sha256(v).digest()).digest() + return b58encode(v + digest[:4]) + + +def b58decode_check(v: str) -> bytes: + '''Decode and verify the checksum of a Base58 encoded string''' + + result = b58decode(v) + result, check = result[:-4], result[-4:] + digest = sha256(sha256(result).digest()).digest() + + if check != digest[:4]: + raise ValueError("Invalid checksum") + + return result diff --git a/btcpy/lib/codecs.py b/btcpy/lib/codecs.py index 89919c0..1b30a2c 100644 --- a/btcpy/lib/codecs.py +++ b/btcpy/lib/codecs.py @@ -10,7 +10,7 @@ # LICENSE.md file. from abc import ABCMeta, abstractmethod -from base58 import b58encode_check, b58decode_check +from .base58 import b58encode_check, b58decode_check from .bech32 import decode, encode from ..setup import is_mainnet, net_name diff --git a/btcpy/structs/crypto.py b/btcpy/structs/crypto.py index 7d290fc..5b22ff8 100644 --- a/btcpy/structs/crypto.py +++ b/btcpy/structs/crypto.py @@ -10,7 +10,7 @@ # LICENSE.md file. from binascii import hexlify, unhexlify -from base58 import b58decode_check, b58encode_check +from ..lib.base58 import b58decode_check, b58encode_check from hashlib import sha256 from ecdsa import SigningKey, SECP256k1 from ecdsa.util import sigencode_der diff --git a/btcpy/structs/hd.py b/btcpy/structs/hd.py index ffa2cad..5488117 100644 --- a/btcpy/structs/hd.py +++ b/btcpy/structs/hd.py @@ -11,7 +11,7 @@ import hmac from hashlib import sha512 -from base58 import b58decode_check, b58encode_check +from ..lib.base58 import b58decode_check, b58encode_check from ecdsa import VerifyingKey from ecdsa.ellipticcurve import INFINITY from ecdsa.curves import SECP256k1 diff --git a/requirements.txt b/requirements.txt index ae7259a..342d194 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,2 @@ ecdsa==0.13 --hash=sha256:40d002cf360d0e035cf2cb985e1308d41aaa087cbfc135b2dc2d844296ea546c -base58==0.2.5 --hash=sha256:b1c481f2b8cfbc31f77dafc0e9690d92f7c03dc01481a4512eb1914e91744856 python-bitcoinlib==0.7.0 --hash=sha256:a083f61b30c7d748f8c785591fbdc26dbad98b64946cd1fbbf25c860b8ff7c3c diff --git a/setup.py b/setup.py index 2d1ba25..5d57929 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ setup(name='chainside-btcpy', version='0.3.0', packages=find_packages(), - install_requires=['ecdsa==0.13', 'base58==0.2.5'], + install_requires=['ecdsa==0.13'], extras_require={'develop': ['python-bitcoinlib==0.7.0']}, description='A Python3 SegWit-compliant library which provides tools to handle Bitcoin data structures in a simple fashion.', author='chainside srl', diff --git a/tests/data/base58.json b/tests/data/base58.json new file mode 100644 index 0000000..dd6dae8 --- /dev/null +++ b/tests/data/base58.json @@ -0,0 +1,114 @@ +[ + ["", ""], + ["61", "2g"], + ["626262", "a3gV"], + ["636363", "aPEr"], + ["73696d706c792061206c6f6e6720737472696e67", "2cFupjhnEsSn59qHXstmK2ffpLv2"], + ["00eb15231dfceb60925886b67d065299925915aeb172c06647", "1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L"], + ["516b6fcd0f", "ABnLTmg"], + ["bf4f89001e670274dd", "3SEo3LWLoPntC"], + ["572e4794", "3EFU7m"], + ["ecac89cad93923c02321", "EJDM8drfXA6uyA"], + ["10c8511e", "Rt5zm"], + ["00000000000000000000", "1111111111"], + ["304ffda1f73e96ccfc96a00dec8424026c73ee", "9qzGgs8TcMDGSynXLpPixJidDF"], + ["e2369ff4ca7851f802a7492e8db2a79d0c928f7ff9", "EunxRoC3JCKzMCfpuqGvxHnAz1iHe"], + ["237405d75ca870cea1e3e77e", "fodJhcFw797MzHwT"], + ["8f50fc35480f90", "6S13VsH7vP"], + ["0b08b8fefe33972f3b200e58", "D5Thbyu4FXgV7EJT"], + ["28f4b1f0d213", "MPu9buNr"], + ["1f", "Y"], + ["3c3f6da6fa02f47d", "B5UmiGvyWyA"], + ["a43c84656f5077dd6f73a7292e5d11", "5bVzeMJXFWyoTyaYrG6wS"], + ["0548f9416877d32bce9c06c683820f24aa8ce27b6fc058", "7LDHyizZAxy5kUiQ8wHkG2ugCmBdq83"], + ["11c470a1404d3087928f29fe9b", "2UqK9GynYu24Msrr1p"], + ["613b4042", "3V9he1"], + ["8cfa", "BjF"], + ["b91f4bb6e3e2bf6e3bd0d9d73f8b11756d", "2ju5bZjhEEqBGAkXAnUUhJZz"], + ["a1e985789ada4ba79c2540c6a0fa6973", "LzdVpBMAnxHXZ1MSksRSc2"], + ["63aa3104165bfa04dece6b", "RiS9ebNSQCckQ66"], + ["da048bd3a2f1", "2sZrdJuqz"], + ["c5996b9699116bd5bf9f47505c209f", "6XdvNYHkwX6nnXMhrFXve"], + ["12", "K"], + ["122bfe56131ddbdc6f", "ER7AXeVMwRot"], + ["bdc8ae0613870b75320731cc86", "GoqR6vtRybzfrDNUTo"], + ["c3e6", "Fuf"], + ["14358e62b04df7dc84249642", "P7uuRu62HjYBNBqs"], + ["a26ee5169d17c5f7108a73d8f74201307d6028e8f7", "AzKYC9zJDJ9C2me83sgJFuRo4a7PC"], + ["4e2c", "6x3"], + ["5d8dfb6f", "3PhYF8"], + ["25e02679ba609aa491ee93789879", "EvcXSxV9xLvQedYZFL4"], + ["53c652523f11", "iicAinU8"], + ["c594ca6c6dfa971ff616568887b04bb1ada658", "dAwZ3GWH6CNezHbax8dseWmoxT"], + ["c9a1cd34d9d6be48", "aj5qMDHdCoq"], + ["66445b5441e93db7028a20e351ecf002158ffb", "KitEBHVwDzeRWVurxHhuEmQ1sp"], + ["45bb531c10de9b433838702cb589", "SdsgqaVdCndWY3ZF8kY"], + ["76f7dde8178ea929eb8d53f56948427a19d4b00d6ca2", "ZHnAQEk6pPRaXfyo9jEPEJKmQYmf5s"], + ["09e7acd61468", "5w5Ziwnw"], + ["930bd166cdc15658c1eff3dbe209", "w4S3ZEzegEYekzBsi9e"], + ["3543d396e6b4a3d66e24", "3zZqr8tAPLgkdh"], + ["569f30cc51d9be1a7031e4d8", "2dotg4aigFb53HPvX"], + ["40a92ea8719f06", "3T815P93U1"], + ["597f87afa28ec2aae97c", "62dmBbPiz8CBzb"], + ["b87abe1a4d6048fab11ac33d13c753", "6AMA47wZVgz5fzpqMmrqp"], + ["a6771c5e193706a3b88c23394087aa1fe312243e45", "BEhcCqTUk2b4tM6FjrkZfKhmwubRE"], + ["7d06ba02bfe9a6", "5joR5CgLCu"], + ["2f", "p"], + ["b14c259842ff66", "7igyM8WvcD"], + ["e517650f3b92ec9b85a40b887c68b80f", "VHmogV2XkdDTfiE9DxRPkA"], + ["1ff2d207becacc28b5de797fd2f9fae6e93089af", "SpJgGMfV1jejF3qe7mHQtfjZC7g"], + ["356a7f2e339aaed947e4c21dbca210b994b6", "3DW4oVLcWYNSN1Ve95h4exRem"], + ["6bb4fef2074f", "vdpxwBrE"], + ["e167e0e0a50572e308c3929198448a07e64036a8b0", "Eruu1rQHgz37jjxzPmw94GTHVY6iT"], + ["d35823", "2DzKU"], + ["e6e63e64d1720be2985f8307db82842954e1b19804389790df", "2buj9dJ6eHWxpx58YGFJTz6nuxP93RLrdBt"], + ["59a78791cfc0", "meRiehVq"], + ["370bc93c4b42a6f9f411740578dbdfc673", "X17bttDnxRwe3xo5vtVE1xN"], + ["ffe15c1acfdfc2", "AhQkr8kE4y"], + ["f41f11e48eb72906880ef5381509238e6b8ab3b2", "4QG311W7iQNRXXz6bKCh8z3NEBE1"], + ["6cdd2b", "dZqk"], + ["41b6128d0713d9b6ca4efd91", "2EvTDGmmiuq9Pubrp"], + ["59701ff1775ca96b2b82", "62SPYM939x2jGV"], + ["bbe4a567e65a9c5bcd41d0389ac951333198f23f0b66", "sznT2mrmbNVeUHQMev7YwVCqmdG61T"], + ["34d8", "52F"], + ["cb", "4W"], + ["d539cabdfdab", "2qBTBNPqC"], + ["d35e760fe78d3811", "cMYYu3T8WaC"], + ["fb2aed258524dceeed356cf89bfb", "2bLbHbXfD3cQ4PeXY2TU"], + ["a11b15a3e728c1", "776rPYFtE4"], + ["32f3d5b2ddc8590eb7b8d3039dc7f5a577606b4e87d7", "Eq5yJcFhLizN1aciwzHHbG4ADYTHne"], + ["4accf963acc3d1a87e64ab7dfc5877d98349af60", "23Sd4SVfHmuyREYvF4g8gxedAXhH"], + ["12f42af9fc28aedc325d2e12a7376e12fdbf68", "4UFhgaM7RiyF6bk8xUdcq93fa7"], + ["cac1d529", "6Bbc6C"], + ["a30c0b97cc8b7d4ee720d6a9f5060dbb", "M8kvGc4NWUhUDZ9VgyDcmQ"], + ["4ae4089ba32a04f31118d0b7138dd91d7059e840dfbb7a51", "7pzBFUDXqmb6De1S9wXVejxuQXj3iqx4Q"], + ["deb48e4d383f6375d93dc0ee4fce", "2QshGK3jD5PLYoSoHMzM"], + ["1567bef40dc706d5ed9b287184dc29", "bjYNYXr2hEUDgzYMJ2EC"], + ["a7afa3d3cf0e02a1f8", "38oCt6EzVDvoR"], + ["1e3a9081218f770017d2280b66e6d6b9d13882", "6XyQrKpMNcdkkw1Fo8Br1g2YFb"], + ["1d", "W"], + ["6d9d900f", "3oWaHc"], + ["14dbb6e822fb8a7f28adcbaec4c2b7aec8bcc878", "HrYiYDNovvXud6WGDtJYcLsYdQT"], + ["8d4063c72bc5b40ffe0ced19838abd07", "JSf2sw5DRG87vREaviLBUS"], + ["2e0282dd277c4c95a7", "ay7K9X3Yw9Bc"], + ["3e8e0af9a8e93cdb08", "oBZH11JQR8Yw"], + ["45d0ef40a8773a", "3eTCZq1iWd"], + ["cdad528d06b719f02d83451966", "J8caxWWoKzXtL4fLNy"], + ["48895175f0f2dbe99c5442c923c93d05f8d7f4a28bb4", "LgrfXZJPNMWw8bVeUudUmvPPHFjiuy"], + ["ba5d42907133bc27ee5c8e0ee7", "GXKG5LtSJq9nviMKBC"], + ["fccaff45447af6abad1719560200", "2bwFJN7vu3FgGeDCr5g3"], + ["2085bbf383d29c01501d2a037a37336249", "Jj6dpSpcAqEU3XPTeX8GZXv"], + ["2838ad9429164e0c721fa9852ea585ff2d", "NvUhzLcdbgrc15SJaNUNBTA"], + ["84efa8fa8ffb319141d6bf50abfbf3804376b6e6adf7365a", "D7uJCLSUhZa6uFzFcBj97mJGSTZ3cZ5wX"], + ["6b4da2adf7", "D79yWDk"], + ["16f8e1788346785be7716ab369", "2uygawrJ4kzS8SJRS8"], + ["4a76c6602cc0995241643f9d2fefe5e0e23bd28b9b54", "MDCao29Skio2UBbdL8q3y6rEQGtmzs"], + ["155267c7a59213796e", "GjzNSsihtmAV"], + ["27ea8aab5131bc3db1c152", "Au6ahtAnCpJ6Nbs"], + ["be8e35f915bce4450ee5c8fc45f8d1caddae71f0d49fbcd514", "2KgBYgysKnpHmEbqN2KCbYSdbNzquRuBzKm"], + ["527dffe16919e82d50f145", "MTSxbHDUDGeNP48"], + ["fc57b4e425f80807950b5a95", "5mC7BGyBxfp2NyQJG"], + ["5b4845a68f67c43ad3685e670f66f73af637", "4nbW9bGaWF3bciiDVnh8m2JJr"], + ["59db683b72626131138d1b6148f065b37e3c5bffcaf9ed", "2reNvMBzUFvF2FwFmJ7WEQyvirkwhPRe"], + ["21b9", "3Zr"] +] diff --git a/tests/data/base58_check.json b/tests/data/base58_check.json new file mode 100644 index 0000000..bd22cea --- /dev/null +++ b/tests/data/base58_check.json @@ -0,0 +1,102 @@ +[ + ["e4d6ca132c7680bd645ee7caab8b32", "itqhWyXsrpQvfhkGCvF5pH8qNg"], + ["48ff61fffd0d9f41ca0f64", "33T7oKwqTF4gf5xGEjqZx"], + ["797396a977e8fa", "X7nMJvVM5ueQyyZ"], + ["70d064759a63925e2000e17057", "24VGtfiwtnc36ugbQD88Q5SG"], + ["bcc76a0258eba90fb1", "GiyqUKLbjyWp4u9ikp"], + ["49e7669f85dbfe415c4975bb60e814de470ac083d9c8a28f", "m63j5Vsumkxi6jXGoyv4DZ9zZuQuLa88JwJ3tD"], + ["d5fb89157ff2", "D2Gma9BJ59Srs2"], + ["9b1d012a", "Swo1g4Xda3a"], + ["0350f80496805ba7118e92ed84f9cf3cd9ef8ff1", "JY2PVLEq8KwzCmRMosbMqUuE7yayhD8Q"], + ["c0e47f48210a", "BqYrQuPFv63Xrm"], + ["1f0755a5664080", "8hGiWJvucykvmSW"], + ["3b9737387a8fc53355c2728e0b817e3c8977474247", "Qyj9HAoXRX8WNo6VtoNCvKbsGTD9ip2Ncc"], + ["8de269b35c9ba1fa97d43a48a1d774d8a8664b", "3vyJZHn68otyCeSmUGq9tunS2KEXVGZw"], + ["6ee07db5f20b86fd2efbc9db0a1aff86601f36ec05", "mceMGT36qgyimcVp2uphqaDiJpWUtoBMCM"], + ["f567083fca0bfba4d933d4ac74752de9907f497b5567", "8Wqg3QHUfhZu6afYG61yi7tpNDeD9mzWe9eL"], + ["57f983dd978cf001641f6b0e3c0658", "H78GkgDz3M6r6rUF68jiuhi4DQ"], + ["f4e20395de17f5da50", "MQ1qy3sEueE1e3SsDP"], + ["04f770924f0bc498353d7d9e71", "3i1AR3RdwNsgKJFSnkQ6cgL"], + ["015a", "g97xL3m"], + ["8a13ed498c9a365cadaa4563748fb4bd127c00d123", "xZTbye9yhgbhQHeYu4cj8j8HxFkPaqzF1u"], + ["fc44a099d11572b728c6b582e1e49404a62e5e", "6DCtoeGDGRDVZgjyVc9k4XRXBy7RVywT"], + ["986b369e9780a29e454e9fac4246b0a7032786", "49bF9w77qqrcqicnkg5FpdeXHA7kC9t3"], + ["7863214b2e1b19710c2280", "4NMAH2gDMREha3e6jpD1z"], + ["0c10", "71RwcpVB"], + ["ca907d29a13dfba0cecf8db799", "2uQThYR9MYZUpeV1Ztst1zaq"], + ["513c5d4d694f34bb491a1c44", "B2pSM5mbCadkZy3HfSmcjm"], + ["f3851b3da0cc1bcddd812b", "7p9iBg2icLezzGdWV7oUM"], + ["508ce7bb2253031d62f2770d53e982", "FkJ3858pzYrkiu3SMnVsUcKxsN"], + ["a74587876b37", "AQ4brnGTiRSo1f"], + ["439ba8bf979f2f", "HmNnvPjFUGRwhr8"], + ["7950", "23Qu4F5BF"], + ["eb359c0e9f33827f7b197d6ce7ee3e70394102", "5rmdv8zKiKKhLLzYfCLLxAbmZ8eijgeS"], + ["ab505c12dc932e1f9387240be7010f21fe2d5b86d175ab2e58", "8n5JG7B6PUNQQ3fmCQKBykK8ucmTTsxxU9DoSzFc"], + ["86435050526ad8b22fab1b466e075867dda9ca7be64f39", "K9V55MFVexYwryUKJPLyAZD67bR72AEUERizh"], + ["6470f4ec095e797706d2e3f8d16ec6a9328328d5359cd5", "EaMg2EhoifMSWMfjAXdDXgSdpp6wEFFhNfDn4"], + ["06fd459813e00640bcf2", "3a2sDcUgrsJQFp7Y15Q"], + ["c706927a65009e", "rMVkQPu1LZcMhzL"], + ["e14a617385f3c5e95e2e4c61", "UpYw8yGrJRTe9MqxMSW41d"], + ["bf94b2f06142c635291af4d0323a1364db419f57a887fef7", "2yHdD5Ce2MfGVAxV6xrS6drB8HFx2DNkUSWJDPV"], + ["020ec629d995b4f8acce54629e347fa3daf8df6e02cb49", "H8ZVZxmNUmivBUGXPhFcpmhv1WdnpP8gXRZ5"], + ["868716b8ee514c7b97b480719cdc5b9f3d37", "dWiN7hbKmSA6ZHWzFz5Tng1wt8JzMn"], + ["338204afbca0fa1b98", "5HqEEu8frfmSr25FqG"], + ["dfc9722c58e9", "DaDkEnKVNjLcCw"], + ["fd205e43a0fb7e2c6d8b3e1fec4542ed0b82", "2BhgBQJKHzwY89nzrZMzn9xTzgtAqLV"], + ["7539088ce999e27b", "3DJVGaZSeGEvvhxoQ"], + ["d402404b4a5e58053243186c", "TBRgKRB3jaS3Cu9PZqH1yC"], + ["4bf5b3499d0381", "KqVhMZuW9esbVJS"], + ["48903f5623879e923ee4a7f442cee939bd2d9a7f", "7cgTJFVmhBTNHU7dbT5dQyvcFkBuRQp8b"], + ["2490ae3a9e", "TzhKz54qgx8v"], + ["d1169c1fbdb8911361b055", "6rHCgn1dyAFwNuidCjKEK"], + ["b8c5", "2b1amL9tZ"], + ["404698ba159073", "GwT3peQtK23egjs"], + ["49611391a961ba65bd8b58fa58675db70d59882fe16a2095", "kmtm421Ms5jqckhUJyU9WX9rRiTtxnbgQy6noM"], + ["e8b861c048edaae169492fe4cc5cfe95", "4F3i2aay8bLPWfDg5PGJrQqpSWjT"], + ["9303a88b10b5fcd76811a7eea092fa99f68c6eab0d211800", "2Whe1sPj2b3DpuPDgQh6okaVE247LTtU4chhKPZ"], + ["fff5bff811", "4Fy2raGBoBbFQ"], + ["6f98f3bc72212bea8b6a4052d268c4ce822da735b608a735", "29aEKniWEztKxHX1TjkHfrExfbLN65BJzMmEMoy"], + ["2e3032f7a44b7c1241ca8672f18884e4a2", "3qjPyUG2mUiq1kV2h4612tmcYAkP5"], + ["7825f345ba98ebe15baa558d243fd3ac364102da", "BxHYrPWz8yboV2FtY2HsmMZDpDnsUVQp3"], + ["f9d29721c48b2dc7", "5iS8mJSXjgacQ5bqV"], + ["dceb2b2b9748d4d1530335f456574fd9", "45WcRx6uGkcdtGdV7xNojJLjhZdi"], + ["7f5684abc39b1e5ab50fef99e75c40dd2cdab72f722297e6a6", "6nHVFqaWXH3ycTyeZvKHXwa5WphU9Umox6aSCR9G"], + ["e3ae20872500bf604bba20437c65494d8b91f82ebb", "2acbd47BP7X1wF1p3RN8G1WTZburHJ68HR5"], + ["07", "sUnHff"], + ["e23941a498d55b", "y6fyHaNhYZ5bYs7"], + ["65225c45f60d5021f949b068815a2938d5a201", "369vsaipjhvJ1A83by9nnBLZkaZbXREL"], + ["75ecc5bd9e6b75ca2a5c", "kMVASTTy2NBYbgWjbV7"], + ["8f71", "2ES2o53j7"], + ["78c64f5e68263bebea66ee4926188d4470dc", "ZnDUHvUYGMwQCNuhPg85cfoBqTQ66t"], + ["144393e0", "4Paz7Vtd7LY"], + ["f4e60319e9e21a", "23jGHDL1UNiRZsp8"], + ["c2ad2175a57ec876d34511720730f8371aa0e8", "52DM4Zk5xCAVSiVQvBrtk4KEWizQV7Gh"], + ["bb05ffbbd409468a79377c", "6EUaePwYfQnyzY2PM8GJW"], + ["41ece9489aef08bcf535", "REiMXBPoit3QivC7Ejb"], + ["70ef5e28ca4645b1af75", "iX66dZzd2EaZ5AoKDCf"], + ["ac0436dfbcf346334627a6bb9b5a1a7b3f09fc", "4Z4uyT7xiCeT4QNrEQkf52nbkM7ffLmc"], + ["dc56ee8e3a5145d2fd", "KMSx16g9msH2DceTyG"], + ["f647452ae17ae91eee222cab8da214b8c8a9f87bb38352fd", "3Xv92ShRG4fCuXth3WEuzP1tRz3KsdPCZwwqwo8"], + ["6b2273ec", "JvLhZ9L5ogz"], + ["8ce0f7e52d", "2o1LNSjm3UzGF"], + ["b4f7e043b00b54c86f1511e045bd62ff190f4a", "4jntwbYoAWLUdEqMUPcv4uYURTvfWzm7"], + ["ecdd305ac0efe2ec5d581996cbfc6e6c1a9b", "27HgA8fE2jBexE2xbUeqGgQe1SRxEwa"], + ["300f1e1d98432db97bad08280f", "TCF18NR8SbG2LaT5L9SgZnL"], + ["96c6ea234d3ba1145284edabd892431d", "36qLpBxKHb4vU1ZGxy1Bnkzq4AQJ"], + ["bd772a8c3076", "BeP9hExkwrCV6A"], + ["97bc50f6539bed9c4a92ab9cfb09fb49921cb555ee", "244CohpDMcP9R7bzfwVktMYE6X2gfsRcA6g"], + ["283964ab5786c1578584a222c2ff", "2fmRuE69Edim35CfZr29ZTmcH"], + ["bd64ec12b6ba0c40c87b5712e10a25b4", "3e3Bc3fJiGLy9Ea8zDVAqAMUoVHS"], + ["8576", "29Tk4g7Br"], + ["90a3", "2F2VTRy8p"], + ["423b28e1", "C5XRdL8iH7T"], + ["54", "Aa4BM18"], + ["1a74e084", "5RfNuYEFAzG"], + ["1e266d905b9906be00f69f5db619055c30", "2rXnC1zEd5cqFwCPgKNnWzaPtK8pu"], + ["5ed09395eb10b6e838cc7f86cc", "tgHK3g7bfe9BdxU9efFq8mB"], + ["10651909ee2fec9e997f", "72avvW3Ynw7Qv8x23gm"], + ["8876b76c0ee0a41826a82ddee9d01b9b6a766c08fce0", "5BMzvTCWSaivVFyWhQyTZb6qdZjoveviKVQg"], + ["d5b8a41b4be551a0d6e7d994939090df9b42c8ec", "LV47wmoWcZreu7sZ6ZznQxAyV1VSJGsiu"], + ["e1d902c4d7992f2d21763959d72d402efc781eaa55", "2ZsqAVSvWxgABkxV9gYT66jZPT2rkVJtGrk"], + ["cf6982acbc209803671169", "6oZT6dFb5i6Zd78zVHz11"] +] diff --git a/tests/unit.py b/tests/unit.py index 6c677a9..5ba087b 100644 --- a/tests/unit.py +++ b/tests/unit.py @@ -21,6 +21,8 @@ from btcpy.lib.codecs import CouldNotDecode from btcpy.setup import setup from btcpy.structs.hd import * +from btcpy.lib.base58 import b58decode, b58encode +from btcpy.lib.base58 import b58decode_check, b58encode_check from btcpy.lib.parsing import IncompleteParsingException setup('regtest') @@ -50,6 +52,27 @@ def get_data(filename): segsig = get_data('segwitsig') p2sh = get_data('p2sh') priv_pub_hash_addr_p2pkh_segwit = get_data('priv_pub_hash_addr_p2pkh_segwit') +b58 = get_data('base58') +b58chk = get_data('base58_check') + + +class B58Test(unittest.TestCase): + + def test_b58encode(self): + for hexa, encoded in b58: + self.assertEqual(b58encode(unhexlify(hexa)), encoded) + + def test_b58encode_check(self): + for hexa, encoded in b58chk: + self.assertEqual(b58encode_check(unhexlify(hexa)), encoded) + + def test_b58decode(self): + for hexa, encoded in b58: + self.assertEqual(hexlify(b58decode(encoded)).decode(), hexa) + + def test_b58decode_check(self): + for hexa, encoded in b58chk: + self.assertEqual(hexlify(b58decode_check(encoded)).decode(), hexa) class TestUnknownScript(unittest.TestCase):