add missing files, make adapter test rely on chaintool alembic
This commit is contained in:
parent
1b82cb3118
commit
1929050e97
1
.gitignore
vendored
1
.gitignore
vendored
@ -4,3 +4,4 @@ gmon.out
|
||||
dist/
|
||||
build/
|
||||
*.egg-info
|
||||
*.sqlite
|
||||
|
18
chaind_eth/chain.py
Normal file
18
chaind_eth/chain.py
Normal file
@ -0,0 +1,18 @@
|
||||
# external imports
|
||||
from chainlib.interface import ChainInterface
|
||||
from chainlib.eth.block import (
|
||||
block_by_number,
|
||||
Block,
|
||||
)
|
||||
from chainlib.eth.tx import (
|
||||
receipt,
|
||||
Tx,
|
||||
)
|
||||
|
||||
class EthChainInterface(ChainInterface):
|
||||
|
||||
def __init__(self):
|
||||
self._block_by_number = block_by_number
|
||||
self._block_from_src = Block.from_src
|
||||
self._tx_receipt = receipt
|
||||
self._src_normalize = Tx.src_normalize
|
@ -16,6 +16,7 @@ from hexathon import strip_0x
|
||||
from chainlib.chain import ChainSpec
|
||||
from chainlib.eth.connection import EthHTTPConnection
|
||||
from chainqueue.sql.backend import SQLBackend
|
||||
from chainlib.error import JSONRPCException
|
||||
from chainqueue.db import dsn_from_config
|
||||
|
||||
# local imports
|
||||
@ -167,12 +168,15 @@ def main():
|
||||
|
||||
logg.debug('recv {} bytes'.format(len(data)))
|
||||
session = backend.create_session()
|
||||
r = adapter.add(chain_spec, data, session)
|
||||
try:
|
||||
r = adapter.add(data, chain_spec, session=session)
|
||||
try:
|
||||
r = srvs.send(r.to_bytes(4, byteorder='big'))
|
||||
logg.debug('{} bytes sent'.format(r))
|
||||
except BrokenPipeError:
|
||||
logg.debug('they just hung up. how rude.')
|
||||
except ValueError as e:
|
||||
logg.error('invalid input: {}'.format(e))
|
||||
session.close()
|
||||
srvs.close()
|
||||
|
||||
|
@ -16,10 +16,8 @@ from hexathon import strip_0x
|
||||
from chainlib.chain import ChainSpec
|
||||
from chainlib.eth.connection import EthHTTPConnection
|
||||
from chainlib.eth.block import block_latest
|
||||
from chainsyncer.driver import (
|
||||
HeadSyncer,
|
||||
HistorySyncer,
|
||||
)
|
||||
from chainsyncer.driver.head import HeadSyncer
|
||||
from chainsyncer.driver.history import HistorySyncer
|
||||
from chainsyncer.db import dsn_from_config
|
||||
from chainsyncer.db.models.base import SessionBase
|
||||
from chainsyncer.backend.sql import SQLBackend
|
||||
@ -27,6 +25,7 @@ from chainsyncer.error import SyncDone
|
||||
|
||||
# local imports
|
||||
from chaind_eth.filter import StateFilter
|
||||
from chaind_eth.chain import EthChainInterface
|
||||
|
||||
logging.basicConfig(level=logging.WARNING)
|
||||
logg = logging.getLogger()
|
||||
@ -113,11 +112,12 @@ def main():
|
||||
for syncer_backend in syncer_backends:
|
||||
logg.info('resuming sync session {}'.format(syncer_backend))
|
||||
|
||||
chain_interface = EthChainInterface()
|
||||
for syncer_backend in syncer_backends:
|
||||
syncers.append(HistorySyncer(syncer_backend))
|
||||
syncers.append(HistorySyncer(syncer_backend, chain_interface))
|
||||
|
||||
syncer_backend = SQLBackend.live(chain_spec, block_offset+1)
|
||||
syncers.append(HeadSyncer(syncer_backend))
|
||||
syncers.append(HeadSyncer(syncer_backend, chain_interface))
|
||||
|
||||
state_filter = StateFilter(chain_spec)
|
||||
filters = [
|
||||
|
@ -11,12 +11,11 @@ from hexathon import (
|
||||
|
||||
# local imports
|
||||
from chainqueue.adapters.base import Adapter
|
||||
from chainqueue.enum import StatusBits
|
||||
|
||||
|
||||
class EthAdapter(Adapter):
|
||||
|
||||
def translate(self, bytecode, chain_spec):
|
||||
def translate(self, chain_spec, bytecode):
|
||||
tx = unpack(bytecode, chain_spec)
|
||||
tx['source_token'] = ZERO_ADDRESS
|
||||
tx['destination_token'] = ZERO_ADDRESS
|
||||
@ -25,8 +24,8 @@ class EthAdapter(Adapter):
|
||||
return tx
|
||||
|
||||
|
||||
def add(self, chain_spec, bytecode, session):
|
||||
tx = self.translate(bytecode, chain_spec)
|
||||
def add(self, chain_spec, bytecode, session=None):
|
||||
tx = self.translate(chain_spec, bytecode)
|
||||
r = self.backend.create(chain_spec, tx['nonce'], tx['from'], tx['hash'], add_0x(bytecode.hex()), session=session)
|
||||
if r:
|
||||
session.rollback()
|
||||
@ -42,12 +41,3 @@ class EthAdapter(Adapter):
|
||||
# r = self.backend.create(chain_spec, tx['nonce'], tx['from'], tx['hash'], add_0x(bytecode.hex()), session=session)
|
||||
# session.close()
|
||||
|
||||
|
||||
def upcoming(self, chain_spec, session):
|
||||
return self.backend.get(chain_spec, StatusBits.QUEUED, unpack) # possible maldesign, up-stack should use our session?
|
||||
|
||||
|
||||
def dispatch(self, chain_spec, rpc, tx_hash, signed_tx, session):
|
||||
o = raw(signed_tx)
|
||||
r = self.backend.dispatch(chain_spec, rpc, tx_hash, o)
|
||||
return r
|
||||
|
@ -1,2 +1,3 @@
|
||||
chaind<=0.0.1,>=0.0.1a3
|
||||
hexathon~=0.0.1a7
|
||||
chainlib-eth<=0.0.5,>0.0.4
|
||||
|
22
tests/chaind_eth_base.py
Normal file
22
tests/chaind_eth_base.py
Normal file
@ -0,0 +1,22 @@
|
||||
# standard imports
|
||||
import unittest
|
||||
|
||||
# external imports
|
||||
from chainsyncer.unittest.db import ChainSyncerDb
|
||||
from chainqueue.unittest.db import ChainQueueDb
|
||||
|
||||
|
||||
class TestBase(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.db_chainsyncer = ChainSyncerDb()
|
||||
self.session_chainsyncer = self.db_chainsyncer.bind_session()
|
||||
|
||||
self.db_chainqueue = ChainQueueDb()
|
||||
self.session_chainqueue = self.db_chainqueue.bind_session()
|
||||
|
||||
def tearDown(self):
|
||||
self.session_chainsyncer.commit()
|
||||
self.db_chainsyncer.release_session(self.session_chainsyncer)
|
||||
self.session_chainqueue.commit()
|
||||
self.db_chainqueue.release_session(self.session_chainqueue)
|
45
tests/test_adapter.py
Normal file
45
tests/test_adapter.py
Normal file
@ -0,0 +1,45 @@
|
||||
# stanndard imports
|
||||
import logging
|
||||
import unittest
|
||||
import os
|
||||
|
||||
# external imports
|
||||
from chainqueue.sql.backend import SQLBackend
|
||||
from chainlib.chain import ChainSpec
|
||||
from chainqueue.unittest.db import (
|
||||
db_config,
|
||||
dsn_from_config,
|
||||
)
|
||||
|
||||
# local imports
|
||||
from chainqueue.adapters.eth import EthAdapter
|
||||
|
||||
# test imports
|
||||
from tests.chaind_eth_base import TestBase
|
||||
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
|
||||
|
||||
class TestAdapter(TestBase):
|
||||
|
||||
example_tx = bytes.fromhex('f8640183989680825208948311ad69b3429400ab795d45af85d204f73329ae8204d38026a097a7fd66548e4c116270b547ac7ed8cb531b0b97f80d49b45986144e47dbe44da07cc4345741dc0fabf65a473c0d3a1536cd501961f7e01b07dd8e107ff87d1556')
|
||||
dsn = dsn_from_config(db_config)
|
||||
|
||||
def setUp(self):
|
||||
super(TestAdapter, self).setUp()
|
||||
self.chain_spec = ChainSpec.from_chain_str('foo:bar:1:baz')
|
||||
self.backend = SQLBackend(self.dsn, debug=bool(os.environ.get('DATABASE_DEBUG')))
|
||||
self.adapter = EthAdapter(self.backend)
|
||||
|
||||
|
||||
def test_eth_adapter_translate(self):
|
||||
self.adapter.translate(self.chain_spec, self.example_tx)
|
||||
# succesful decode means translate is working, no further checks needed
|
||||
|
||||
|
||||
def test_eth_adapter_add(self):
|
||||
self.adapter.add(self.chain_spec, self.example_tx, session=self.session_chainqueue)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
15
tests/test_helo.py
Normal file
15
tests/test_helo.py
Normal file
@ -0,0 +1,15 @@
|
||||
# standard imports
|
||||
import unittest
|
||||
|
||||
# test imports
|
||||
from tests.chaind_eth_base import TestBase
|
||||
|
||||
|
||||
class TestHelo(TestBase):
|
||||
|
||||
def test_helo(self):
|
||||
pass
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
Loading…
Reference in New Issue
Block a user