Fix setup.py to include all modules
This commit is contained in:
parent
4df619f072
commit
646dbf5f79
4
crypto_dev_signer/__init__.py
Normal file
4
crypto_dev_signer/__init__.py
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
import crypto_dev_signer.eth.signer
|
||||||
|
import crypto_dev_signer.eth.web3ext
|
||||||
|
import crypto_dev_signer.eth.transaction
|
||||||
|
import crypto_dev_signer.common
|
0
crypto_dev_signer/eth/__init__.py
Normal file
0
crypto_dev_signer/eth/__init__.py
Normal file
1
crypto_dev_signer/eth/signer/__init__.py
Normal file
1
crypto_dev_signer/eth/signer/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
from crypto_dev_signer.eth.signer.defaultsigner import ReferenceSigner, Signer
|
@ -6,7 +6,7 @@ import binascii
|
|||||||
from rlp import encode as rlp_encode
|
from rlp import encode as rlp_encode
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from common import strip_hex_prefix, add_hex_prefix
|
from crypto_dev_signer.common import strip_hex_prefix, add_hex_prefix
|
||||||
|
|
||||||
logg = logging.getLogger(__name__)
|
logg = logging.getLogger(__name__)
|
||||||
|
|
@ -2,7 +2,7 @@ import re
|
|||||||
|
|
||||||
from web3 import Web3 as Web3super
|
from web3 import Web3 as Web3super
|
||||||
from web3 import WebsocketProvider, HTTPProvider
|
from web3 import WebsocketProvider, HTTPProvider
|
||||||
from web3ext.middleware import PlatformMiddleware
|
from .middleware import PlatformMiddleware
|
||||||
|
|
||||||
re_websocket = re.compile('^wss?://')
|
re_websocket = re.compile('^wss?://')
|
||||||
re_http = re.compile('^https?://')
|
re_http = re.compile('^https?://')
|
1
crypto_dev_signer/keystore/__init__.py
Normal file
1
crypto_dev_signer/keystore/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
from .postgres import ReferenceKeystore
|
@ -12,8 +12,8 @@ from eth_keys.backends import NativeECCBackend
|
|||||||
import sha3
|
import sha3
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from common import strip_hex_prefix
|
from crypto_dev_signer.common import strip_hex_prefix
|
||||||
from keystore.interface import Keystore
|
from .interface import Keystore
|
||||||
|
|
||||||
keyapi = KeyAPI(NativeECCBackend)
|
keyapi = KeyAPI(NativeECCBackend)
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
scripts/crypto-dev-daemon.py
|
|
158
scripts/crypto-dev-daemon
Executable file
158
scripts/crypto-dev-daemon
Executable file
@ -0,0 +1,158 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import socket
|
||||||
|
import json
|
||||||
|
import logging
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
|
from jsonrpc.exceptions import *
|
||||||
|
|
||||||
|
from crypto_dev_signer.eth.signer import ReferenceSigner
|
||||||
|
from crypto_dev_signer.eth.transaction import EIP155Transaction
|
||||||
|
from crypto_dev_signer.keystore import ReferenceKeystore
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
logg = logging.getLogger()
|
||||||
|
|
||||||
|
db = None
|
||||||
|
signer = None
|
||||||
|
chainId = 8995
|
||||||
|
|
||||||
|
|
||||||
|
def personal_new_account(p):
|
||||||
|
password = p
|
||||||
|
if p.__class__.__name__ != 'str':
|
||||||
|
if p.__class__.__name__ != 'list':
|
||||||
|
e = JSONRPCInvalidParams()
|
||||||
|
e.data = 'parameter must be list containing one string'
|
||||||
|
raise ValueError(e)
|
||||||
|
logg.error('foo {}'.format(p))
|
||||||
|
if len(p) != 1:
|
||||||
|
e = JSONRPCInvalidParams()
|
||||||
|
e.data = 'parameter must be list containing one string'
|
||||||
|
raise ValueError(e)
|
||||||
|
if p[0].__class__.__name__ != 'str':
|
||||||
|
e = JSONRPCInvalidParams()
|
||||||
|
e.data = 'parameter must be list containing one string'
|
||||||
|
raise ValueError(e)
|
||||||
|
password = p[0]
|
||||||
|
|
||||||
|
r = db.new(password)
|
||||||
|
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
def personal_sign_transaction(p):
|
||||||
|
t = EIP155Transaction(p[0], 0, 8995)
|
||||||
|
z = signer.signTransaction(t, p[1])
|
||||||
|
raw_signed_tx = t.rlp_serialize()
|
||||||
|
o = {
|
||||||
|
'raw': '0x' + raw_signed_tx.hex(),
|
||||||
|
'tx': t.serialize(),
|
||||||
|
}
|
||||||
|
return o
|
||||||
|
|
||||||
|
|
||||||
|
# TODO: temporary workaround for platform, since personal_signTransaction is missing from web3.py
|
||||||
|
def eth_signTransaction(tx):
|
||||||
|
return personal_sign_transaction([tx, ''])
|
||||||
|
|
||||||
|
|
||||||
|
methods = {
|
||||||
|
'personal_newAccount': personal_new_account,
|
||||||
|
'personal_signTransaction': personal_sign_transaction,
|
||||||
|
'eth_signTransaction': eth_signTransaction,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def jsonrpc_error(rpc_id, err):
|
||||||
|
return {
|
||||||
|
'json-rpc': '2.0',
|
||||||
|
'id': rpc_id,
|
||||||
|
'error': {
|
||||||
|
'code': err.CODE,
|
||||||
|
'message': err.MESSAGE,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def jsonrpc_ok(rpc_id, response):
|
||||||
|
return {
|
||||||
|
'json-rpc': '2.0',
|
||||||
|
'id': rpc_id,
|
||||||
|
'result': response,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def is_valid_json(j):
|
||||||
|
if j.get('id') == 'None':
|
||||||
|
raise ValueError('id missing')
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def process_input(j):
|
||||||
|
rpc_id = j['id']
|
||||||
|
m = j['method']
|
||||||
|
p = j['params']
|
||||||
|
return (rpc_id, methods[m](p))
|
||||||
|
|
||||||
|
|
||||||
|
def start_server():
|
||||||
|
try:
|
||||||
|
os.unlink('/tmp/foo.ipc')
|
||||||
|
except FileNotFoundError:
|
||||||
|
pass
|
||||||
|
s = socket.socket(family = socket.AF_UNIX, type = socket.SOCK_STREAM)
|
||||||
|
s.bind('/tmp/foo.ipc')
|
||||||
|
s.listen(10)
|
||||||
|
while True:
|
||||||
|
(csock, caddr) = s.accept()
|
||||||
|
d = csock.recv(4096)
|
||||||
|
j = None
|
||||||
|
try:
|
||||||
|
j = json.loads(d)
|
||||||
|
is_valid_json(j)
|
||||||
|
logg.debug('{}'.format(d.decode('utf-8')))
|
||||||
|
except:
|
||||||
|
csock.send(json.dumps(jsonrpc_error(None, JSONRPCParseError)).encode('utf-8'))
|
||||||
|
csock.close()
|
||||||
|
continue
|
||||||
|
|
||||||
|
try:
|
||||||
|
(rpc_id, r) = process_input(j)
|
||||||
|
csock.send(json.dumps(jsonrpc_ok(rpc_id, r)).encode('utf-8'))
|
||||||
|
except:
|
||||||
|
# TODO: handle cases to give better error context to caller
|
||||||
|
csock.send(json.dumps(jsonrpc_error(j['id'], JSONRPCServerError)).encode('utf-8'))
|
||||||
|
|
||||||
|
csock.close()
|
||||||
|
s.close()
|
||||||
|
|
||||||
|
os.unlink('/tmp/foo.ipc')
|
||||||
|
|
||||||
|
|
||||||
|
def init():
|
||||||
|
global db, signer
|
||||||
|
secret_hex = os.environ.get('SIGNER_SECRET')
|
||||||
|
secret = bytes.fromhex(secret_hex)
|
||||||
|
kw = {
|
||||||
|
'symmetric_key': secret,
|
||||||
|
}
|
||||||
|
db = ReferenceKeystore('cic_signer', **kw)
|
||||||
|
signer = ReferenceSigner(db)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
init()
|
||||||
|
arg = None
|
||||||
|
try:
|
||||||
|
arg = json.loads(sys.argv[1])
|
||||||
|
except:
|
||||||
|
logg.info('no json rpc command detected, starting socket server')
|
||||||
|
start_server()
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
(rpc_id, response) = process_input(arg)
|
||||||
|
r = jsonrpc_ok(rpc_id, response)
|
||||||
|
sys.stdout.write(json.dumps(r))
|
@ -1,158 +0,0 @@
|
|||||||
#!/usr/bin/python3
|
|
||||||
|
|
||||||
import socket
|
|
||||||
import json
|
|
||||||
import logging
|
|
||||||
import sys
|
|
||||||
import os
|
|
||||||
|
|
||||||
from jsonrpc.exceptions import *
|
|
||||||
|
|
||||||
from signer import ReferenceSigner
|
|
||||||
from keystore import ReferenceKeystore
|
|
||||||
from transaction import EIP155Transaction
|
|
||||||
|
|
||||||
logging.basicConfig(level=logging.DEBUG)
|
|
||||||
logg = logging.getLogger()
|
|
||||||
|
|
||||||
db = None
|
|
||||||
signer = None
|
|
||||||
chainId = 8995
|
|
||||||
|
|
||||||
|
|
||||||
def personal_new_account(p):
|
|
||||||
password = p
|
|
||||||
if p.__class__.__name__ != 'str':
|
|
||||||
if p.__class__.__name__ != 'list':
|
|
||||||
e = JSONRPCInvalidParams()
|
|
||||||
e.data = 'parameter must be list containing one string'
|
|
||||||
raise ValueError(e)
|
|
||||||
logg.error('foo {}'.format(p))
|
|
||||||
if len(p) != 1:
|
|
||||||
e = JSONRPCInvalidParams()
|
|
||||||
e.data = 'parameter must be list containing one string'
|
|
||||||
raise ValueError(e)
|
|
||||||
if p[0].__class__.__name__ != 'str':
|
|
||||||
e = JSONRPCInvalidParams()
|
|
||||||
e.data = 'parameter must be list containing one string'
|
|
||||||
raise ValueError(e)
|
|
||||||
password = p[0]
|
|
||||||
|
|
||||||
r = db.new(password)
|
|
||||||
|
|
||||||
return r
|
|
||||||
|
|
||||||
|
|
||||||
def personal_sign_transaction(p):
|
|
||||||
t = EIP155Transaction(p[0], 0, 8995)
|
|
||||||
z = signer.signTransaction(t, p[1])
|
|
||||||
raw_signed_tx = t.rlp_serialize()
|
|
||||||
o = {
|
|
||||||
'raw': '0x' + raw_signed_tx.hex(),
|
|
||||||
'tx': t.serialize(),
|
|
||||||
}
|
|
||||||
return o
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: temporary workaround for platform, since personal_signTransaction is missing from web3.py
|
|
||||||
def eth_signTransaction(tx):
|
|
||||||
return personal_sign_transaction([tx, ''])
|
|
||||||
|
|
||||||
|
|
||||||
methods = {
|
|
||||||
'personal_newAccount': personal_new_account,
|
|
||||||
'personal_signTransaction': personal_sign_transaction,
|
|
||||||
'eth_signTransaction': eth_signTransaction,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def jsonrpc_error(rpc_id, err):
|
|
||||||
return {
|
|
||||||
'json-rpc': '2.0',
|
|
||||||
'id': rpc_id,
|
|
||||||
'error': {
|
|
||||||
'code': err.CODE,
|
|
||||||
'message': err.MESSAGE,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def jsonrpc_ok(rpc_id, response):
|
|
||||||
return {
|
|
||||||
'json-rpc': '2.0',
|
|
||||||
'id': rpc_id,
|
|
||||||
'result': response,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def is_valid_json(j):
|
|
||||||
if j.get('id') == 'None':
|
|
||||||
raise ValueError('id missing')
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
def process_input(j):
|
|
||||||
rpc_id = j['id']
|
|
||||||
m = j['method']
|
|
||||||
p = j['params']
|
|
||||||
return (rpc_id, methods[m](p))
|
|
||||||
|
|
||||||
|
|
||||||
def start_server():
|
|
||||||
try:
|
|
||||||
os.unlink('/tmp/foo.ipc')
|
|
||||||
except FileNotFoundError:
|
|
||||||
pass
|
|
||||||
s = socket.socket(family = socket.AF_UNIX, type = socket.SOCK_STREAM)
|
|
||||||
s.bind('/tmp/foo.ipc')
|
|
||||||
s.listen(10)
|
|
||||||
while True:
|
|
||||||
(csock, caddr) = s.accept()
|
|
||||||
d = csock.recv(4096)
|
|
||||||
j = None
|
|
||||||
try:
|
|
||||||
j = json.loads(d)
|
|
||||||
is_valid_json(j)
|
|
||||||
logg.debug('{}'.format(d.decode('utf-8')))
|
|
||||||
except:
|
|
||||||
csock.send(json.dumps(jsonrpc_error(None, JSONRPCParseError)).encode('utf-8'))
|
|
||||||
csock.close()
|
|
||||||
continue
|
|
||||||
|
|
||||||
try:
|
|
||||||
(rpc_id, r) = process_input(j)
|
|
||||||
csock.send(json.dumps(jsonrpc_ok(rpc_id, r)).encode('utf-8'))
|
|
||||||
except:
|
|
||||||
# TODO: handle cases to give better error context to caller
|
|
||||||
csock.send(json.dumps(jsonrpc_error(j['id'], JSONRPCServerError)).encode('utf-8'))
|
|
||||||
|
|
||||||
csock.close()
|
|
||||||
s.close()
|
|
||||||
|
|
||||||
os.unlink('/tmp/foo.ipc')
|
|
||||||
|
|
||||||
|
|
||||||
def init():
|
|
||||||
global db, signer
|
|
||||||
secret_hex = os.environ.get('SIGNER_SECRET')
|
|
||||||
secret = bytes.fromhex(secret_hex)
|
|
||||||
kw = {
|
|
||||||
'symmetric_key': secret,
|
|
||||||
}
|
|
||||||
db = ReferenceKeystore('cic_signer', **kw)
|
|
||||||
signer = ReferenceSigner(db)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
init()
|
|
||||||
arg = None
|
|
||||||
try:
|
|
||||||
arg = json.loads(sys.argv[1])
|
|
||||||
except:
|
|
||||||
logg.info('no json rpc command detected, starting socket server')
|
|
||||||
start_server()
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
(rpc_id, response) = process_input(arg)
|
|
||||||
r = jsonrpc_ok(rpc_id, response)
|
|
||||||
sys.stdout.write(json.dumps(r))
|
|
1
scripts/crypto-dev-daemon.py
Symbolic link
1
scripts/crypto-dev-daemon.py
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
crypto-dev-daemon
|
12
setup.py
12
setup.py
@ -6,9 +6,15 @@ setup(
|
|||||||
description="A signer and keystore daemon and library for cryptocurrency software development",
|
description="A signer and keystore daemon and library for cryptocurrency software development",
|
||||||
author="Louis Holbrook",
|
author="Louis Holbrook",
|
||||||
author_email="dev@holbrook.no",
|
author_email="dev@holbrook.no",
|
||||||
packages=['crypto-dev-signer'],
|
packages=[
|
||||||
install_requires=['web3', 'psycopg2', 'cryptography', 'eth-keys', 'pysha3', 'rlp'],
|
'crypto_dev_signer.eth.signer',
|
||||||
|
'crypto_dev_signer.eth.web3ext',
|
||||||
|
'crypto_dev_signer.eth',
|
||||||
|
'crypto_dev_signer.keystore',
|
||||||
|
'crypto_dev_signer',
|
||||||
|
],
|
||||||
|
install_requires=['web3', 'psycopg2', 'cryptography', 'eth-keys', 'pysha3', 'rlp', 'json-rpc'],
|
||||||
scripts = [
|
scripts = [
|
||||||
'scripts/crypto-dev-daemon.py',
|
'scripts/crypto-dev-daemon',
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -1 +0,0 @@
|
|||||||
from keystore.postgres import ReferenceKeystore
|
|
@ -1 +0,0 @@
|
|||||||
from signer.defaultsigner import ReferenceSigner, Signer
|
|
@ -8,7 +8,7 @@ import psycopg2
|
|||||||
from psycopg2 import sql
|
from psycopg2 import sql
|
||||||
from cryptography.fernet import Fernet, InvalidToken
|
from cryptography.fernet import Fernet, InvalidToken
|
||||||
|
|
||||||
from keystore import ReferenceKeystore
|
from crypto_dev_signer.keystore import ReferenceKeystore
|
||||||
|
|
||||||
logging.basicConfig(level=logging.DEBUG)
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
logg = logging.getLogger()
|
logg = logging.getLogger()
|
||||||
|
@ -5,8 +5,8 @@ import logging
|
|||||||
|
|
||||||
from rlp import encode as rlp_encode
|
from rlp import encode as rlp_encode
|
||||||
|
|
||||||
from signer import ReferenceSigner
|
from crypto_dev_signer.eth.signer import ReferenceSigner
|
||||||
from transaction import EIP155Transaction
|
from crypto_dev_signer.eth.transaction import EIP155Transaction
|
||||||
|
|
||||||
logging.basicConfig(level=logging.DEBUG)
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
logg = logging.getLogger()
|
logg = logging.getLogger()
|
||||||
|
Loading…
Reference in New Issue
Block a user