commit b96542715d07674ebd0d024f9d1ba46bad5e1c77
parent 786e1a6029401701b027e50876e92497154fe67f
Author: lash <dev@holbrook.no>
Date: Tue, 15 Mar 2022 09:13:13 +0000
Code purge, start over with cache and test
Diffstat:
13 files changed, 95 insertions(+), 296 deletions(-)
diff --git a/chaind/eth/__init__.py b/chaind/eth/__init__.py
diff --git a/chaind/eth/cache.py b/chaind/eth/cache.py
@@ -0,0 +1,41 @@
+# external imports
+from hexathon import strip_0x
+from chainqueue.cache import (
+ CacheTx,
+ NoopNormalizer,
+ )
+from chainlib.eth.tx import unpack
+from chainlib.encode import TxHexNormalizer
+
+
+class Normalizer(TxHexNormalizer, NoopNormalizer):
+
+ def __init__(self):
+ super(Normalizer, self).__init__()
+ self.address = self.wallet_address
+ self.hash = self.tx_hash
+ #self.value = self.noop
+
+
+ def value(self, v):
+ hexathon.to_int(v)
+
+
+
+eth_normalizer = Normalizer()
+
+
+class EthCacheTx(CacheTx):
+
+ def __init__(self, chain_spec):
+ super(EthCacheTx, self).__init__(chain_spec)
+
+
+ def deserialize(self, signed_tx):
+ signed_tx_bytes = bytes.fromhex(strip_0x(signed_tx))
+ tx = unpack(signed_tx_bytes, self.chain_spec)
+ self.hash = eth_normalizer.hash(tx['hash'])
+ self.sender = eth_normalizer.address(tx['from'])
+ self.recipient = eth_normalizer.address(tx['to'])
+ self.nonce = eth_normalizer.value(tx['nonce'])
+ self.value = eth_normalizer.value(tx['value'])
diff --git a/chaind_eth/runnable/syncer.py b/chaind_eth/runnable/syncer.py
@@ -75,7 +75,7 @@ chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC'))
dsn = dsn_from_config(config)
logg.debug('dns {}'.format(dsn))
SQLBackend.setup(dsn, debug=config.true('DATABASE_DEBUG'))
-rpc = EthHTTPConnection(url=config.get('RPC_HTTP_PROVIDER'), chain_spec=chain_spec)
+rpc = EthHTTPConnection(url=config.get('RPC_PROVIDER'), chain_spec=chain_spec)
def register_filter_tags(filters, session):
for f in filters:
diff --git a/requirements.txt b/requirements.txt
@@ -1,4 +1,4 @@
-chaind<=0.0.3,>=0.0.3a6
-hexathon~=0.0.1a8
-chainlib-eth<=0.1.0,>=0.0.10a10
-eth-token-index<=0.3.0,>=0.2.4a1
+#chaind~=0.1.0
+hexathon~=0.1.5
+chainlib-eth>=0.1.0b3,<=0.1.0
+#eth-token-index~=0.2.4
diff --git a/run_tests.sh b/run_tests.sh
@@ -3,7 +3,7 @@
set -e
set -x
set -a
-export PYTHONPATH=${PYTHONPATH:.}
+export PYTHONPATH=${PYTHONPATH:-.}
for f in `ls tests/*.py`; do
python $f
done
diff --git a/setup.cfg b/setup.cfg
@@ -1,6 +1,6 @@
[metadata]
name = chaind-eth
-version = 0.0.3a5
+version = 0.1.0
description = Queue server for ethereum
author = Louis Holbrook
author_email = dev@holbrook.no
@@ -22,20 +22,20 @@ classifiers =
# Topic :: Blockchain :: EVM
license = GPL3
licence_files =
- LICENSE.txt
+ LICENSE
[options]
python_requires = >= 3.6
include_package_data = True
packages =
- chaind_eth
- chaind_eth.runnable
- chaind_eth.cli
- chainqueue.adapters
+ chaind.eth
+ chaind.eth.runnable
+ chaind.eth.cli
+# chainqueue.adapters
[options.entry_points]
console_scripts =
chaind-eth-server = chaind_eth.runnable.server:main
- chaind-eth-syncer = chaind_eth.runnable.syncer:main
+# chaind-eth-syncer = chaind_eth.runnable.syncer:main
chaind-eth-send = chaind_eth.runnable.send:main
chaind-eth-resend = chaind_eth.runnable.resend:main
diff --git a/tests/chaind_eth_base.py b/tests/chaind_eth_base.py
@@ -1,51 +0,0 @@
-# standard imports
-import os
-import unittest
-
-# external imports
-from chainsyncer.unittest.db import ChainSyncerDb
-from chainqueue.unittest.db import ChainQueueDb
-from chainlib.eth.unittest.ethtester import EthTesterCase
-from chainqueue.adapters.eth import EthAdapter
-from chainqueue.unittest.db import (
- db_config,
- dsn_from_config,
- )
-from chainqueue.sql.backend import SQLBackend
-from chainlib.eth.address import to_checksum_address
-from hexathon import add_0x
-
-# local imports
-from chaind_eth.chain import EthChainInterface
-
-class TestBase(EthTesterCase):
-
- def setUp(self):
- super(TestBase, self).setUp()
- self.db_chainsyncer = ChainSyncerDb(debug=bool(os.environ.get('DATABASE_DEBUG')))
- self.session_chainsyncer = self.db_chainsyncer.bind_session()
-
- self.db_chainqueue = ChainQueueDb(debug=bool(os.environ.get('DATABASE_DEBUG')))
- self.session_chainqueue = self.db_chainqueue.bind_session()
-
- self.interface = EthChainInterface()
-
- 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)
- super(TestBase, self).tearDown()
-
-
-class TestSQLBase(TestBase):
-
- example_tx_hex = 'f8650d8405f5e10082520894ee38d3a40e177608d41978778206831f60dd0fa88204008077a040adee2ad0a0e566bced4b76a8899549e86719eb8866b87674b6fdc88479c201a030b3ca061bb330f4d78bc9cb8144c8e570339496f56b7809387de2ffeaa585d5'
- example_tx = bytes.fromhex(example_tx_hex)
- example_tx_sender = add_0x(to_checksum_address('eb3907ecad74a0013c259d5874ae7f22dcbcc95c'))
- dsn = dsn_from_config(db_config)
-
- def setUp(self):
- super(TestSQLBase, self).setUp()
- self.backend = SQLBackend(self.dsn, debug=bool(os.environ.get('DATABASE_DEBUG')))
- self.adapter = EthAdapter(self.backend)
diff --git a/tests/test_adapter.py b/tests/test_adapter.py
@@ -1,26 +0,0 @@
-# stanndard imports
-import logging
-import unittest
-
-# external imports
-from chainlib.chain import ChainSpec
-
-# test imports
-from tests.chaind_eth_base import TestSQLBase
-
-logging.basicConfig(level=logging.DEBUG)
-
-
-class TestAdapter(TestSQLBase):
-
- def test_eth_adapter_translate(self):
- self.adapter.translate(self.example_tx, self.chain_spec)
- # succesful decode means translate is working, no further checks needed
-
-
- def test_eth_adapter_add(self):
- self.adapter.add(self.example_tx_hex, self.chain_spec, session=self.session_chainqueue)
-
-
-if __name__ == '__main__':
- unittest.main()
diff --git a/tests/test_chain.py b/tests/test_chain.py
@@ -1,38 +0,0 @@
-# standard imports
-import unittest
-
-# external imports
-from chainlib.eth.gas import (
- RPCGasOracle,
- Gas,
- )
-from chainlib.eth.nonce import (
- RPCNonceOracle,
- )
-from chainlib.eth.tx import (
- TxFormat,
- unpack,
- )
-from hexathon import (
- strip_0x,
- )
-
-# test imports
-from tests.chaind_eth_base import TestBase
-
-class TestChain(TestBase):
-
- def test_chain_interface(self):
- gas_oracle = RPCGasOracle(conn=self.rpc)
- nonce_oracle = RPCNonceOracle(self.accounts[0], conn=self.rpc)
- c = Gas(self.chain_spec, signer=self.signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle)
- (tx_hash, tx_raw_rlp_signed) = c.create(self.accounts[0], self.accounts[1], 1024, tx_format=TxFormat.RLP_SIGNED)
-
- tx_raw_rlp_signed_bytes = bytes.fromhex(strip_0x(tx_raw_rlp_signed))
- tx_src = unpack(tx_raw_rlp_signed_bytes, self.chain_spec)
- tx_src = self.interface.src_normalize(tx_src)
- assert tx_src['gas_price'] == tx_src['gasPrice']
-
-
-if __name__ == '__main__':
- unittest.main()
diff --git a/tests/test_dispatch.py b/tests/test_dispatch.py
@@ -1,52 +0,0 @@
-# stanndard imports
-import logging
-import unittest
-
-# external imports
-from hexathon import strip_0x
-from chainlib.eth.tx import (
- unpack,
- TxFormat,
- )
-from chainqueue.sql.query import get_tx
-from chainqueue.enum import StatusBits
-from chainlib.eth.gas import (
- RPCGasOracle,
- Gas,
- )
-from chainlib.eth.nonce import (
- RPCNonceOracle,
- )
-
-# local imports
-from chaind_eth.dispatch import Dispatcher
-
-# test imports
-from tests.chaind_eth_base import TestSQLBase
-
-logging.basicConfig(level=logging.DEBUG)
-
-
-class TestDispatcher(TestSQLBase):
-
- def test_dispatch_process(self):
- gas_oracle = RPCGasOracle(conn=self.rpc)
- nonce_oracle = RPCNonceOracle(self.accounts[0], conn=self.rpc)
- c = Gas(self.chain_spec, signer=self.signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle)
- (tx_hash, tx_raw_rlp_signed) = c.create(self.accounts[0], self.accounts[1], 1024, tx_format=TxFormat.RLP_SIGNED)
-
- tx_raw_rlp_signed_bytes = bytes.fromhex(strip_0x(tx_raw_rlp_signed))
- dispatcher = Dispatcher(self.chain_spec, self.adapter, 1)
- self.adapter.add(tx_raw_rlp_signed, self.chain_spec, session=self.session_chainqueue)
- #self.assertEqual(dispatcher.get_count(self.example_tx_sender, self.session_chainqueue), 1)
- self.assertEqual(dispatcher.get_count(self.accounts[0], self.session_chainqueue), 1)
-
- dispatcher.process(self.rpc, self.session_chainqueue)
- tx_obj = unpack(tx_raw_rlp_signed_bytes, self.chain_spec)
- o = get_tx(self.chain_spec, tx_obj['hash'], session=self.session_chainqueue)
- self.assertGreater(o['status'] & StatusBits.IN_NETWORK, 0)
- self.assertEqual(dispatcher.get_count(self.accounts[0], self.session_chainqueue), 0)
-
-
-if __name__ == '__main__':
- unittest.main()
diff --git a/tests/test_filter.py b/tests/test_filter.py
@@ -1,101 +0,0 @@
-# standard imports
-import unittest
-import logging
-import os
-
-# external imports
-from potaahto.symbols import snake_and_camel
-from hexathon import (
- strip_0x,
- )
-from chainqueue.adapters.eth import EthAdapter
-from chainqueue.unittest.db import (
- db_config,
- dsn_from_config,
- )
-from chainqueue.sql.backend import SQLBackend
-from chainqueue.enum import is_alive
-from chainqueue.sql.query import get_tx
-from chainlib.eth.gas import (
- RPCGasOracle,
- Gas,
- )
-from chainlib.eth.nonce import (
- RPCNonceOracle,
- )
-from chainlib.eth.tx import (
- TxFormat,
- raw,
- unpack,
- receipt,
- Tx,
- )
-from chainlib.eth.block import (
- block_by_hash,
- Block,
- )
-from chainqueue.sql.state import (
- set_sent,
- set_reserved,
- set_ready,
- )
-
-# local imports
-from chaind_eth.filter import StateFilter
-from chaind_eth.chain import EthChainInterface
-
-# test imports
-from tests.chaind_eth_base import TestBase
-
-logging.basicConfig(level=logging.DEBUG)
-logg = logging.getLogger()
-
-
-class TestFilter(TestBase):
-
- def test_filter(self):
- gas_oracle = RPCGasOracle(conn=self.rpc)
- nonce_oracle = RPCNonceOracle(self.accounts[0], conn=self.rpc)
- c = Gas(self.chain_spec, signer=self.signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle)
- (tx_hash, tx_raw_rlp_signed) = c.create(self.accounts[0], self.accounts[1], 1024, tx_format=TxFormat.RLP_SIGNED)
- o = raw(tx_raw_rlp_signed)
- self.rpc.do(o)
-
- #o = receipt(tx_hash)
- o = self.interface.tx_receipt(tx_hash)
- rcpt = self.rpc.do(o)
-
- #o = block_by_hash(rcpt['block_hash'])
- o = self.interface.block_by_number(rcpt['block_number'])
- block_src = self.rpc.do(o)
- #block = Block(block_src)
- block = self.interface.block_from_src(block_src)
-
- dsn = dsn_from_config(db_config)
- backend = SQLBackend(dsn, debug=bool(os.environ.get('DATABASE_DEBUG')))
- adapter = EthAdapter(backend)
-
- tx_raw_rlp_signed_bytes = bytes.fromhex(strip_0x(tx_raw_rlp_signed))
- #adapter.add(tx_raw_rlp_signed_bytes, self.chain_spec, session=self.session_chainqueue)
- adapter.add(tx_raw_rlp_signed, self.chain_spec, session=self.session_chainqueue)
-
- set_ready(self.chain_spec, tx_hash, session=self.session_chainqueue)
- set_reserved(self.chain_spec, tx_hash, session=self.session_chainqueue)
- set_sent(self.chain_spec, tx_hash, session=self.session_chainqueue)
-
- tx_src = unpack(tx_raw_rlp_signed_bytes, self.chain_spec)
- tx_src = self.interface.src_normalize(tx_src)
- tx = Tx(tx_src, block=block, rcpt=rcpt)
-
- tx_repr = get_tx(self.chain_spec, tx_hash, session=self.session_chainqueue)
- assert is_alive(tx_repr['status'])
-
- fltr = StateFilter(self.chain_spec)
- fltr.filter(self.rpc, block, tx, session=self.session_chainqueue)
-
- tx_repr = get_tx(self.chain_spec, tx_hash, session=self.session_chainqueue)
- assert not is_alive(tx_repr['status'])
-
-
-if __name__ == '__main__':
- unittest.main()
diff --git a/tests/test_helo.py b/tests/test_helo.py
@@ -1,15 +0,0 @@
-# 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()
diff --git a/tests/test_tx.py b/tests/test_tx.py
@@ -0,0 +1,41 @@
+# standard imports
+import os
+import tempfile
+import unittest
+import shutil
+import logging
+import hashlib
+
+# external imports
+from chainlib.chain import ChainSpec
+from chainqueue.cache import CacheTokenTx
+from chainlib.error import RPCException
+from chainlib.status import Status as TxStatus
+from chaind.unittest.common import TestChaindFsBase
+from chaind.driver import QueueDriver
+from chaind.filter import StateFilter
+from chainlib.eth.gas import Gas
+
+# local imports
+from chaind.eth.cache import EthCacheTx
+
+logging.basicConfig(level=logging.DEBUG)
+logg = logging.getLogger()
+
+
+class TestEthChaindFs(TestChaindFsBase):
+
+ def setUp(self):
+ self.cache_adapter = EthCacheTx
+ super(TestEthChaindFs, self).setUp()
+
+
+ def test_deserialize(self):
+ data = "f8610d2a82520894eb3907ecad74a0013c259d5874ae7f22dcbcc95c8204008078a0ddbebd76701f6531e5ea42599f890268716e2bb38e3e125874f47595c2338049a00f5648d17b20efac8cb7ff275a510ebef6815e1599e29067821372b83eb1d28c"
+ hsh = self.adapter.put(data)
+ v = self.adapter.get(hsh)
+ self.assertEqual(data, v)
+
+
+if __name__ == '__main__':
+ unittest.main()