Add upcoming getter
This commit is contained in:
parent
b0eb0c474d
commit
99af484f30
13
chainqueue/adapters/base.py
Normal file
13
chainqueue/adapters/base.py
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
|
||||||
|
class Adapter:
|
||||||
|
|
||||||
|
def __init__(self, backend):
|
||||||
|
self.backend = backend
|
||||||
|
|
||||||
|
|
||||||
|
def process(self, chain_spec):
|
||||||
|
raise NotImplementedEror()
|
||||||
|
|
||||||
|
|
||||||
|
def add(self, chain_spec, bytecode):
|
||||||
|
raise NotImplementedEror()
|
@ -1,21 +1,49 @@
|
|||||||
# external imports
|
# external imports
|
||||||
|
from chainlib.eth.constant import ZERO_ADDRESS
|
||||||
from chainlib.eth.tx import (
|
from chainlib.eth.tx import (
|
||||||
unpack,
|
unpack,
|
||||||
)
|
)
|
||||||
from hexathon import add_0x
|
from hexathon import (
|
||||||
|
add_0x,
|
||||||
|
strip_0x,
|
||||||
|
)
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
|
from chainqueue.adapters.base import Adapter
|
||||||
|
from chainqueue.enum import StatusBits
|
||||||
|
|
||||||
|
|
||||||
class EthAdapter:
|
class EthAdapter(Adapter):
|
||||||
|
|
||||||
def __init__(self, backend):
|
|
||||||
self.backend = backend
|
def translate(self, chain_spec, bytecode):
|
||||||
|
tx = unpack(bytecode, chain_spec)
|
||||||
|
tx['source_token'] = ZERO_ADDRESS
|
||||||
|
tx['destination_token'] = ZERO_ADDRESS
|
||||||
|
tx['from_value'] = tx['value']
|
||||||
|
tx['to_value'] = tx['value']
|
||||||
|
return tx
|
||||||
|
|
||||||
|
|
||||||
def add(self, chain_spec, bytecode):
|
def add(self, chain_spec, bytecode):
|
||||||
tx = unpack(bytecode, chain_spec)
|
tx = self.translate(chain_spec, bytecode)
|
||||||
|
session = self.backend.create_session()
|
||||||
|
r = self.backend.create(chain_spec, tx['nonce'], tx['from'], tx['hash'], add_0x(bytecode.hex()), session=session)
|
||||||
|
if r:
|
||||||
|
session.rollback()
|
||||||
|
session.close()
|
||||||
|
return r
|
||||||
|
r = self.backend.cache(tx, session=session)
|
||||||
|
session.commit()
|
||||||
|
session.close()
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
def cache(self, chain_spec):
|
||||||
session = self.backend.create_session()
|
session = self.backend.create_session()
|
||||||
r = self.backend.create(chain_spec, tx['nonce'], tx['from'], tx['hash'], add_0x(bytecode.hex()), session=session)
|
r = self.backend.create(chain_spec, tx['nonce'], tx['from'], tx['hash'], add_0x(bytecode.hex()), session=session)
|
||||||
session.close()
|
session.close()
|
||||||
return r
|
|
||||||
|
|
||||||
|
def process(self, chain_spec):
|
||||||
|
return self.backend.get(chain_spec, StatusBits.QUEUED, unpack)
|
||||||
|
@ -71,7 +71,7 @@ class SessionController:
|
|||||||
self.srv = socket.socket(family=socket.AF_UNIX, type=socket.SOCK_STREAM)
|
self.srv = socket.socket(family=socket.AF_UNIX, type=socket.SOCK_STREAM)
|
||||||
self.srv.bind(config.get('SESSION_SOCKET_PATH'))
|
self.srv.bind(config.get('SESSION_SOCKET_PATH'))
|
||||||
self.srv.listen(2)
|
self.srv.listen(2)
|
||||||
self.srv.settimeout(5.0)
|
self.srv.settimeout(1.0)
|
||||||
|
|
||||||
def shutdown(self, signo, frame):
|
def shutdown(self, signo, frame):
|
||||||
if self.dead:
|
if self.dead:
|
||||||
@ -99,7 +99,7 @@ signal.signal(signal.SIGINT, ctrl.shutdown)
|
|||||||
signal.signal(signal.SIGTERM, ctrl.shutdown)
|
signal.signal(signal.SIGTERM, ctrl.shutdown)
|
||||||
|
|
||||||
dsn = dsn_from_config(config)
|
dsn = dsn_from_config(config)
|
||||||
backend = SQLBackend(dsn)
|
backend = SQLBackend(dsn, debug=config.true('DATABASE_DEBUG'))
|
||||||
adapter = EthAdapter(backend)
|
adapter = EthAdapter(backend)
|
||||||
chain_spec = ChainSpec.from_chain_str('evm:mainnet:1')
|
chain_spec = ChainSpec.from_chain_str('evm:mainnet:1')
|
||||||
|
|
||||||
@ -118,7 +118,9 @@ if __name__ == '__main__':
|
|||||||
logg.error('entity on socket path is not a socket')
|
logg.error('entity on socket path is not a socket')
|
||||||
break
|
break
|
||||||
if srvs == None:
|
if srvs == None:
|
||||||
logg.debug('ping')
|
txs = adapter.process(chain_spec)
|
||||||
|
for k in txs.keys():
|
||||||
|
logg.debug('txs {} {}'.format(k, txs[k]))
|
||||||
continue
|
continue
|
||||||
srvs.setblocking(False)
|
srvs.setblocking(False)
|
||||||
data_in = srvs.recv(1024)
|
data_in = srvs.recv(1024)
|
||||||
|
@ -9,6 +9,9 @@ from sqlalchemy.exc import (
|
|||||||
# local imports
|
# local imports
|
||||||
from chainqueue.sql.tx import create as queue_create
|
from chainqueue.sql.tx import create as queue_create
|
||||||
from chainqueue.db.models.base import SessionBase
|
from chainqueue.db.models.base import SessionBase
|
||||||
|
from chainqueue.db.models.tx import TxCache
|
||||||
|
from chainqueue.sql.query import get_upcoming_tx
|
||||||
|
from chainqueue.sql.state import set_ready
|
||||||
|
|
||||||
logg = logging.getLogger(__name__)
|
logg = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -21,12 +24,26 @@ class SQLBackend:
|
|||||||
|
|
||||||
def create(self, chain_spec, nonce, holder_address, tx_hash, signed_tx, obsolete_predecessors=True, session=None):
|
def create(self, chain_spec, nonce, holder_address, tx_hash, signed_tx, obsolete_predecessors=True, session=None):
|
||||||
try:
|
try:
|
||||||
queue_create(chain_spec, nonce, holder_address, tx_hash, signed_tx, obsolete_predecessors=True, session=None)
|
queue_create(chain_spec, nonce, holder_address, tx_hash, signed_tx, obsolete_predecessors=True, session=session)
|
||||||
except IntegrityError as e:
|
except IntegrityError as e:
|
||||||
logg.warning('skipped possible duplicate insert {}'.format(e))
|
logg.warning('skipped possible duplicate insert {}'.format(e))
|
||||||
return 1
|
return 1
|
||||||
|
set_ready(chain_spec, tx_hash, session=session)
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
def cache(self, tx, session=None):
|
||||||
|
txc = TxCache(tx['hash'], tx['from'], tx['to'], tx['source_token'], tx['destination_token'], tx['from_value'], tx['to_value'], session=session)
|
||||||
|
session.add(txc)
|
||||||
|
session.flush()
|
||||||
|
logg.debug('cache {}'.format(txc))
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
def get(self, chain_spec, typ, decoder):
|
||||||
|
txs = get_upcoming_tx(chain_spec, typ, decoder=decoder)
|
||||||
|
return txs
|
||||||
|
|
||||||
|
|
||||||
def create_session(self):
|
def create_session(self):
|
||||||
return SessionBase.create_session()
|
return SessionBase.create_session()
|
||||||
|
@ -8,7 +8,10 @@ from sqlalchemy import or_
|
|||||||
from sqlalchemy import not_
|
from sqlalchemy import not_
|
||||||
from sqlalchemy import tuple_
|
from sqlalchemy import tuple_
|
||||||
from sqlalchemy import func
|
from sqlalchemy import func
|
||||||
from hexathon import add_0x
|
from hexathon import (
|
||||||
|
add_0x,
|
||||||
|
strip_0x,
|
||||||
|
)
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from chainqueue.db.models.otx import Otx
|
from chainqueue.db.models.otx import Otx
|
||||||
@ -274,7 +277,7 @@ def get_upcoming_tx(chain_spec, status=StatusEnum.READYSEND, not_status=None, re
|
|||||||
if o == None:
|
if o == None:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
tx_signed_bytes = bytes.fromhex(o.signed_tx[2:])
|
tx_signed_bytes = bytes.fromhex(strip_0x(o.signed_tx))
|
||||||
tx = decoder(tx_signed_bytes, chain_spec)
|
tx = decoder(tx_signed_bytes, chain_spec)
|
||||||
txs[o.tx_hash] = o.signed_tx
|
txs[o.tx_hash] = o.signed_tx
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user