Skip to content

Commit f92b94a

Browse files
authored
feat: private key from wif (#159)
1 parent 5096149 commit f92b94a

File tree

7 files changed

+40
-13
lines changed

7 files changed

+40
-13
lines changed

crypto/configuration/network.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
class NetworkType(TypedDict):
77
epoch: datetime
8-
wif: int
8+
wif: str
99
chain_id: int
1010

1111
network: NetworkType = {
@@ -36,12 +36,12 @@ def get_network() -> NetworkType:
3636
"""
3737
return network
3838

39-
def set_custom_network(epoch: datetime, wif: int, chain_id: int) -> None:
39+
def set_custom_network(epoch: datetime, wif: str, chain_id: int) -> None:
4040
"""Set custom network
4141
4242
Args:
4343
epoch (datetime): chains epoch time
44-
wif (int): chains wif
44+
wif (str): chains wif
4545
chain_id (int): chain id
4646
"""
4747
global network

crypto/identity/private_key.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
from hashlib import sha256
33
from coincurve import PrivateKey as PvtKey
44
from Cryptodome.Hash import keccak
5+
from base58 import b58decode
56

7+
from crypto.configuration.network import get_network
68
from crypto.enums.constants import Constants
79

810
def keccak256(data: bytes) -> bytes:
@@ -74,3 +76,24 @@ def from_hex(cls, private_key: str):
7476
PrivateKey: Private key object
7577
"""
7678
return cls(private_key)
79+
80+
@classmethod
81+
def from_wif(cls, wif: str):
82+
"""Create PrivateKey object from a given wif
83+
84+
Args:
85+
wif (str):
86+
87+
Returns:
88+
PrivateKey: Private key object
89+
"""
90+
91+
wif = b58decode(wif).hex()
92+
93+
version = wif[0:2]
94+
if version != get_network()['wif']:
95+
raise ValueError(f"Invalid network version: {version}")
96+
97+
private_key = wif[2:66]
98+
99+
return cls(private_key)

crypto/identity/wif.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77

88
from crypto.configuration.network import get_network
99

10-
def wif_from_passphrase(passphrase: str, network_wif: Optional[int] = None):
10+
def wif_from_passphrase(passphrase: str, network_wif: Optional[str] = None):
1111
"""Get wif from passphrase
1212
1313
Args:
1414
passphrase (str):
15-
network_wif (int, optional):
15+
network_wif (str, optional):
1616
1717
Returns:
1818
string: wif
@@ -23,6 +23,6 @@ def wif_from_passphrase(passphrase: str, network_wif: Optional[int] = None):
2323
network_wif = network['wif']
2424

2525
private_key = hashlib.sha256(passphrase.encode())
26-
seed = write_bit8(network_wif) + private_key.digest() + write_bit8(0x01)
26+
seed = write_bit8(int(network_wif, 16)) + private_key.digest() + write_bit8(0x01)
2727

2828
return b58encode_check(seed).decode()

crypto/networks/mainnet.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22

33
class Mainnet(object):
44
epoch = datetime(2017, 3, 21, 13, 00, 00)
5-
wif = 186
5+
wif = 'ba'
66
chain_id = 10000

crypto/networks/testnet.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22

33
class Testnet(object):
44
epoch = datetime(2017, 3, 21, 13, 00, 00)
5-
wif = 186
5+
wif = 'ba'
66
chain_id = 10000

tests/configuration/test_network.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from crypto.configuration.network import get_network, set_custom_network, set_network
44
from crypto.networks.testnet import Testnet
55
from crypto.networks.mainnet import Mainnet
6-
from crypto.networks.testnet import Testnet
76

87

98
def test_get_network():
@@ -14,22 +13,22 @@ def test_set_network():
1413
# mainnet
1514
set_network(Mainnet)
1615
result = get_network()
17-
assert result['wif'] == 186
16+
assert result['wif'] == 'ba'
1817
assert result['chain_id'] == 10000
1918

2019
# testnet
2120
set_network(Testnet)
2221
result = get_network()
23-
assert result['wif'] == 186
22+
assert result['wif'] == 'ba'
2423
assert result['chain_id'] == 10000
2524

2625
set_network(Testnet) # set back to Testnet so other tests don't fail
2726

2827
def test_set_custom_network():
2928
epoch_time = datetime(2017, 1, 1, 13, 00, 00)
30-
set_custom_network(epoch_time, 130, 10000)
29+
set_custom_network(epoch_time, '82', 10000)
3130
result = get_network()
32-
assert result['wif'] == 130
31+
assert result['wif'] == '82'
3332
assert result['epoch'] == epoch_time
3433
assert result['chain_id'] == 10000
3534

tests/identity/test_private_key.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,8 @@ def test_sign_compact(sign_compact):
2121
assert signature[1:33] == bytes.fromhex(sign_compact['data']['r'])
2222
assert signature[33:] == bytes.fromhex(sign_compact['data']['s'])
2323
assert signature.hex() == sign_compact['data']['serialized']
24+
25+
def test_it_should_parse_the_private_key_from_wif(identity):
26+
private_key = PrivateKey.from_wif(identity['data']['wif'])
27+
assert isinstance(private_key, PrivateKey)
28+
assert private_key.to_hex() == identity['data']['private_key']

0 commit comments

Comments
 (0)