Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add missing functionalities (identity, slot) + additional tests #26

Merged
merged 5 commits into from Aug 13, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 5 additions & 5 deletions README.md
Expand Up @@ -69,9 +69,9 @@ We will not be accepting new PRs until we are happy with the base of the client
- [x] toJson - it returns a dictionary object

### Address Identity
- [ ] fromPassphrase
- [ ] fromPublicKey
- [ ] fromPrivateKey
- [x] fromPassphrase
- [x] fromPublicKey
- [x] fromPrivateKey
- [ ] validate

### Private Key Identity
Expand All @@ -83,7 +83,7 @@ We will not be accepting new PRs until we are happy with the base of the client
- [ ] fromHex

### WIF Identity
- [ ] fromPassphrase
- [x] fromPassphrase

### Configuration
- [x] getNetwork
Expand All @@ -93,7 +93,7 @@ We will not be accepting new PRs until we are happy with the base of the client

### Slot
- [x] time
- [ ] epoch
- [x] epoch

### Networks (Mainnet, Devnet & Testnet)
- [x] epoch
Expand Down
41 changes: 40 additions & 1 deletion crypto/identity/address.py
Expand Up @@ -6,6 +6,7 @@
from binary.unsigned_integer.writer import write_bit8

from crypto.conf import get_network
from crypto.identity.keys import compress_ecdsa_public_key


def address_from_public_key(public_key, network_version=None):
Expand All @@ -22,7 +23,45 @@ def address_from_public_key(public_key, network_version=None):
network = get_network()
network_version = network['version']

network_version = network_version
ripemd160 = hashlib.new('ripemd160', unhexlify(public_key))
seed = write_bit8(network_version) + ripemd160.digest()
return b58encode_check(seed)


def address_from_private_key(private_key, network_version=None):
"""Get an address from private key

Args:
private_key (string):
network_version (int, optional):

Returns:
TYPE: Description
"""
if not network_version:
network = get_network()
network_version = network['version']

public_key = compress_ecdsa_public_key(unhexlify(private_key))
ripemd160 = hashlib.new('ripemd160', unhexlify(public_key))
seed = write_bit8(network_version) + ripemd160.digest()
return b58encode_check(seed)


def address_from_passphrase(passphrase, network_version=None):
"""Get an address from passphrase

Args:
passphrase (bytes):
network_version (int, optional):

Returns:
string: address
"""
if not network_version:
network = get_network()
network_version = network['version']

private_key = hashlib.sha256(passphrase).hexdigest()
address = address_from_private_key(private_key)
return address
2 changes: 1 addition & 1 deletion crypto/identity/keys.py
Expand Up @@ -6,7 +6,7 @@
from ecdsa.util import number_to_string


def privat_key_from_passphrase(passphrase):
def private_key_from_passphrase(passphrase):
"""Get a private key from a given passphrase

Args:
Expand Down
26 changes: 26 additions & 0 deletions crypto/identity/wif.py
@@ -0,0 +1,26 @@
import hashlib

from base58 import b58encode_check

from binary.unsigned_integer.writer import write_bit8

from crypto.conf import get_network


def wif_from_passphrase(passphrase, network_wif=None):
"""Get wif from passphrase

Args:
passphrase (bytes):
network_wif (int, optional):

Returns:
string: wif
"""
if not network_wif:
network = get_network()
network_wif = network['wif']

private_key = hashlib.sha256(passphrase)
seed = write_bit8(network_wif) + private_key.digest() + write_bit8(0x01)
return b58encode_check(seed)
4 changes: 2 additions & 2 deletions crypto/message.py
Expand Up @@ -7,7 +7,7 @@

from crypto.exceptions import ArkBadDigestException, ArkBadSignatureException
from crypto.identity.keys import (
privat_key_from_passphrase, public_key_from_passphrase, uncompress_ecdsa_public_key
private_key_from_passphrase, public_key_from_passphrase, uncompress_ecdsa_public_key
)


Expand All @@ -21,7 +21,7 @@ def sign_message(message, passphrase):
Returns:
dict: dict containing message, public_key and a signature data
"""
private_key = privat_key_from_passphrase(passphrase)
private_key = private_key_from_passphrase(passphrase)
signin_key = SigningKey.from_string(unhexlify(private_key), SECP256k1)
signature = hexlify(
signin_key.sign_deterministic(message, hashfunc=sha256, sigencode=sigencode_der_canonize)
Expand Down
5 changes: 5 additions & 0 deletions crypto/slot.py
Expand Up @@ -13,3 +13,8 @@ def get_time():
network = get_network()
diff = (now - network['epoch']).seconds
return diff


def get_epoch():
network = get_network()
return network['epoch']
18 changes: 17 additions & 1 deletion tests/identity/test_address.py
@@ -1,9 +1,25 @@
from crypto.conf import use_network
from crypto.identity.address import address_from_public_key
from crypto.identity.address import (
address_from_passphrase, address_from_private_key, address_from_public_key
)


def test_address_from_public_key():
use_network('devnet')
public_key = '03bd4f16e39aaba5cba6a87b7498b08ce540f279be367e68ae96fb05dfabe203ad'.encode()
address = address_from_public_key(public_key)
assert address == 'DBi2HdDY8TqMCD2aFLVomEF92gzeDmEHmR'.encode()


def test_address_from_private_key():
use_network('devnet')
private_key = 'd8839c2432bfd0a67ef10a804ba991eabba19f154a3d707917681d45822a5712'.encode()
address = address_from_private_key(private_key)
assert address == 'D61mfSggzbvQgTUe6JhYKH2doHaqJ3Dyib'.encode()


def test_address_from_passphrase():
use_network('devnet')
passphrase = 'this is a top secret passphrase'.encode()
address = address_from_passphrase(passphrase)
assert address == 'D61mfSggzbvQgTUe6JhYKH2doHaqJ3Dyib'.encode()
6 changes: 3 additions & 3 deletions tests/identity/test_keys.py
@@ -1,8 +1,8 @@
from crypto.identity.keys import privat_key_from_passphrase, public_key_from_passphrase
from crypto.identity.keys import private_key_from_passphrase, public_key_from_passphrase


def test_privat_key_from_passphrase():
private_key = privat_key_from_passphrase('this is a top secret passphrase'.encode())
def test_private_key_from_passphrase():
private_key = private_key_from_passphrase('this is a top secret passphrase'.encode())
assert private_key == b'd8839c2432bfd0a67ef10a804ba991eabba19f154a3d707917681d45822a5712'


Expand Down
8 changes: 8 additions & 0 deletions tests/identity/test_wif.py
@@ -0,0 +1,8 @@
from crypto.conf import use_network
from crypto.identity.wif import wif_from_passphrase


def test_wif_from_passphrase():
use_network('devnet')
result = wif_from_passphrase('this is a top secret passphrase'.encode())
assert result == 'SGq4xLgZKCGxs7bjmwnBrWcT4C1ADFEermj846KC97FSv1WFD1dA'.encode()
16 changes: 16 additions & 0 deletions tests/test_slot.py
@@ -0,0 +1,16 @@
from datetime import datetime

from crypto.conf import use_network
from crypto.slot import get_epoch, get_time


def test_get_epoch():
use_network('devnet')
result = get_epoch()
assert isinstance(result, datetime)


def test_get_time():
use_network('devnet')
result = get_time()
assert isinstance(result, int)