10 Commits

Author SHA1 Message Date
lash
ca059c5b30 Bump chaind dep 2022-05-14 16:23:33 +00:00
lash
30172798c0 Bump minor version 2022-05-14 16:20:09 +00:00
lash
df02af8b6d Load config for syncer executable 2022-05-14 16:15:02 +00:00
lash
0a44ceb364 Add session cli arg handling to send, queuer 2022-05-14 12:41:28 +00:00
lash
f49e4149fd Rehabilitate send 2022-05-14 12:25:02 +00:00
lash
7c0df3b967 Rehabilitate queuer and syncer cli 2022-05-13 13:47:58 +00:00
lash
acbbebd8da WIP implement chaind-eth on chainlib 0.3.0 structure 2022-05-13 10:32:28 +00:00
lash
96f58c5f41 Bump version 2022-05-09 20:21:44 +00:00
lash
0707291f8f Upgrade chainlib to 0.2.0 2022-05-09 19:54:17 +00:00
lash
ed7f0a3f71 Upgrade chaind to handle exception in filesystem shep list 2022-05-05 15:45:59 +00:00
9 changed files with 227 additions and 100 deletions

View File

@@ -21,7 +21,6 @@ class Normalizer(TxHexNormalizer, NoopNormalizer):
hexathon.to_int(v)
eth_normalizer = Normalizer()

View File

@@ -4,3 +4,6 @@ runtime_dir =
id =
data_dir =
dispatch_delay = 0.01
[tx]
digest_size = 32

View File

@@ -5,8 +5,23 @@ import signal
# external imports
import chainlib.eth.cli
import chaind.cli
import chainqueue.cli
from chainlib.eth.cli.arg import (
Arg,
ArgFlag,
process_args,
)
from chainlib.eth.cli.config import (
Config,
process_config,
)
from chainqueue.cli.arg import (
apply_arg as apply_arg_queue,
apply_flag as apply_flag_queue,
)
from chaind.cli.arg import (
apply_arg,
apply_flag,
)
from chaind.session import SessionController
from chaind.setup import Environment
from chaind.error import (
@@ -29,11 +44,21 @@ from chainlib.encode import TxHexNormalizer
from chainlib.chain import ChainSpec
from chaind.adapters.fs import ChaindFsAdapter
from chaind.dispatch import DispatchProcessor
from chainqueue.data import config_dir as chainqueue_config_dir
from chaind.data import config_dir as chaind_config_dir
from chainlib.eth.cli.log import process_log
from chaind.cli.config import process_config as process_config_local
# local imports
from chaind.eth.cache import EthCacheTx
from chaind.eth.settings import ChaindEthSettings
from chaind.eth.settings import ChaindSettings
from chaind.eth.dispatch import EthDispatcher
from chaind.eth.settings import process_settings
from chaind.settings import (
process_queue,
process_socket,
process_dispatch,
)
logging.basicConfig(level=logging.WARNING)
logg = logging.getLogger()
@@ -43,37 +68,42 @@ config_dir = os.path.join(script_dir, '..', 'data', 'config')
env = Environment(domain='eth', env=os.environ)
arg_flags = chainlib.eth.cli.argflag_std_read
argparser = chainlib.eth.cli.ArgumentParser(arg_flags)
arg_flags = ArgFlag()
arg_flags = apply_flag_queue(arg_flags)
arg_flags = apply_flag(arg_flags)
queue_arg_flags = 0
chainqueue.cli.process_flags(argparser, queue_arg_flags)
arg = Arg(arg_flags)
arg = apply_arg_queue(arg)
arg = apply_arg(arg)
local_arg_flags = chaind.cli.argflag_local_base | chaind.cli.ChaindFlag.DISPATCH | chaind.cli.ChaindFlag.SOCKET
chaind.cli.process_flags(argparser, local_arg_flags)
flags = arg_flags.STD_READ | arg_flags.QUEUE | arg_flags.STATE | arg_flags.SESSION
argparser = chainlib.eth.cli.ArgumentParser()
argparser = process_args(argparser, arg, flags)
args = argparser.parse_args()
base_config_dir = [chainqueue.cli.config_dir, chaind.cli.config_dir]
config = chainlib.eth.cli.Config.from_args(args, arg_flags, base_config_dir=base_config_dir)
config = chaind.cli.process_config(config, args, local_arg_flags)
config = chainqueue.cli.process_config(config, args, queue_arg_flags)
logg = process_log(args, logg)
config = Config()
config.add_schema_dir(chainqueue_config_dir)
config.add_schema_dir(chaind_config_dir)
config = process_config(config, arg, args, flags)
config = process_config_local(config, arg, args, flags)
config.add('eth', 'CHAIND_ENGINE', False)
config.add('queue', 'CHAIND_COMPONENT', False)
config.add('sync', 'CHAIND_COMPONENT', False)
logg.debug('config loaded:\n{}'.format(config))
settings = ChaindEthSettings(include_queue=True)
settings.process(config)
logg.debug('settings:\n{}'.format(settings))
rpc = chainlib.eth.cli.Rpc()
conn = rpc.connect_by_config(config)
settings = ChaindSettings(include_sync=True)
settings = process_settings(settings, config)
settings = process_queue(settings, config)
settings = process_socket(settings, config)
settings = process_dispatch(settings, config)
logg.debug('settings loaded:\n{}'.format(settings))
tx_normalizer = TxHexNormalizer().tx_hash
token_cache_store = CacheTokenTx(settings.get('CHAIN_SPEC'), normalizer=tx_normalizer)
dispatcher = EthDispatcher(conn)
dispatcher = EthDispatcher(settings.get('CONN'))
processor = DispatchProcessor(settings.get('CHAIN_SPEC'), settings.dir_for('queue'), dispatcher)
ctrl = SessionController(settings, processor.process)
@@ -110,7 +140,7 @@ def main():
pass
if v == None:
ctrl.process(conn)
ctrl.process(settings.get('CONN'))
#queue_adapter = create_adapter(settings, dispatcher)
continue

View File

@@ -10,15 +10,40 @@ import socket
# external imports
import chainlib.eth.cli
import chainqueue.cli
import chaind.cli
from chainlib.eth.cli.arg import (
Arg,
ArgFlag,
process_args,
)
from chainlib.eth.cli.config import (
Config,
process_config,
)
from chaind.setup import Environment
from chainlib.eth.gas import price
from chainlib.chain import ChainSpec
from hexathon import strip_0x
from chainqueue.cli.arg import (
apply_arg as apply_arg_queue,
apply_flag as apply_flag_queue,
)
from chainqueue.data import config_dir as chainqueue_config_dir
from chaind.data import config_dir as chaind_config_dir
from chaind.cli.arg import (
apply_arg,
apply_flag,
)
from chainlib.eth.cli.log import process_log
from chaind.settings import process_queue
from chaind.settings import ChaindSettings
from chaind.error import TxSourceError
from chainlib.error import (
InitializationError,
SignerMissingException,
)
from chaind.cli.config import process_config as process_config_local
# local imports
from chaind.error import TxSourceError
from chaind.eth.token.process import Processor
from chaind.eth.token.gas import GasTokenResolver
from chaind.eth.cli.csv import CSVProcessor
@@ -26,45 +51,56 @@ from chaind.eth.cli.output import (
Outputter,
OpMode,
)
from chaind.eth.settings import ChaindEthSettings
from chaind.eth.settings import process_settings
logging.basicConfig(level=logging.WARNING)
logg = logging.getLogger()
arg_flags = chainlib.eth.cli.argflag_std_write
argparser = chainlib.eth.cli.ArgumentParser(arg_flags, arg_long={'-s': '--send-rpc'})
argparser.add_positional('source', required=False, type=str, help='Transaction source file')
local_arg_flags = chaind.cli.argflag_local_socket_client | chaind.cli.ChaindFlag.TOKEN
chaind.cli.process_flags(argparser, local_arg_flags)
def process_settings_local(settings, config):
# if settings.get('SIGNER') == None:
# raise SignerMissingException('signer missing')
return settings
chainqueue.cli.process_flags(argparser, 0)
args = argparser.parse_args()
env = Environment(domain='eth', env=os.environ)
base_config_dir = [chaind.cli.config_dir, chainqueue.cli.config_dir]
config = chainlib.eth.cli.Config.from_args(args, arg_flags, base_config_dir=base_config_dir)
config = chainqueue.cli.process_config(config, args, 0)
config = chaind.cli.process_config(config, args, local_arg_flags)
arg_flags = ArgFlag()
arg_flags = apply_flag_queue(arg_flags)
arg_flags = apply_flag(arg_flags)
arg = Arg(arg_flags)
arg = apply_arg_queue(arg)
arg = apply_arg(arg)
arg.set_long('s', 'send-rpc')
flags = arg_flags.STD_WRITE | arg_flags.TOKEN | arg_flags.SOCKET_CLIENT | arg_flags.STATE | arg_flags.WALLET | arg_flags.SESSION
argparser = chainlib.eth.cli.ArgumentParser()
argparser = process_args(argparser, arg, flags)
argparser.add_argument('source', help='Transaction source file')
args = argparser.parse_args()
logg = process_log(args, logg)
config = Config()
config.add_schema_dir(chainqueue_config_dir)
config.add_schema_dir(chaind_config_dir)
config = process_config(config, arg, args, flags)
config = process_config_local(config, arg, args, flags)
config.add(args.source, '_SOURCE', False)
config.add('eth', 'CHAIND_ENGINE', False)
config.add('queue', 'CHAIND_COMPONENT', False)
config.add('eth', 'CHAIND_ENGINE', False)
logg.debug('config loaded:\n{}'.format(config))
wallet = chainlib.eth.cli.Wallet()
wallet.from_config(config)
settings = ChaindEthSettings(include_queue=True)
settings.process(config)
logg.debug('settings:\n{}'.format(settings))
rpc = chainlib.eth.cli.Rpc(wallet=wallet)
conn = rpc.connect_by_config(config)
chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC'))
try:
settings = ChaindSettings(include_sync=True)
settings = process_settings(settings, config)
settings = process_queue(settings, config)
settings = process_settings_local(settings, config)
except InitializationError as e:
sys.stderr.write('Initialization error: ' + str(e) + '\n')
sys.exit(1)
logg.debug('settings loaded:\n{}'.format(settings))
mode = OpMode.STDOUT
@@ -100,7 +136,14 @@ class SocketSender:
def send(self, tx):
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect(self.path)
err = None
try:
s.connect(self.path)
except FileNotFoundError as e:
err = e
if err != None:
s.close()
raise err
s.sendall(tx.encode('utf-8'))
r = s.recv(68)
s.close()
@@ -108,6 +151,7 @@ class SocketSender:
def main():
conn = settings.get('CONN')
token_resolver = None
if settings.get('TOKEN_MODULE') != None:
import importlib
@@ -116,7 +160,13 @@ def main():
else:
from chaind.eth.token.gas import GasTokenResolver
m = GasTokenResolver
token_resolver = m(chain_spec, rpc.get_sender_address(), rpc.get_signer(), rpc.get_gas_oracle(), rpc.get_nonce_oracle())
token_resolver = m(
settings.get('CHAIN_SPEC'),
settings.get('SENDER_ADDRESS'),
settings.get('SIGNER'),
settings.get('GAS_ORACLE'),
settings.get('NONCE_ORACLE'),
)
processor = Processor(token_resolver, config.get('_SOURCE'), use_checksum=not config.get('_UNSAFE'))
processor.add_processor(CSVProcessor())
@@ -143,7 +193,12 @@ def main():
break
tx_hex = tx_bytes.hex()
if sender != None:
r = sender.send(tx_hex)
r = None
try:
r = sender.send(tx_hex)
except FileNotFoundError as e:
sys.stderr.write('send to socket {} failed: {}\n'.format(sender.path, e))
sys.exit(1)
logg.info('sent {} result {}'.format(tx_hex, r))
print(out.do(tx_hex))

View File

@@ -3,9 +3,7 @@ import os
import logging
# external imports
import chainlib.cli
import chainsyncer.cli
import chaind.cli
import chainlib.eth.cli
from chaind.setup import Environment
from chaind.filter import StateFilter
from chainlib.eth.block import block_latest
@@ -13,15 +11,38 @@ from hexathon import strip_0x
from chainsyncer.store.fs import SyncFsStore
from chainsyncer.driver.chain_interface import ChainInterfaceDriver
from chainsyncer.error import SyncDone
# local imports
from chaind.eth.settings import ChaindEthSettings
from chainlib.eth.cli.arg import (
Arg,
ArgFlag,
process_args,
)
from chainlib.eth.cli.config import (
Config,
process_config,
)
from chainsyncer.cli.arg import (
apply_arg as apply_arg_sync,
apply_flag as apply_flag_sync,
)
from chainsyncer.data import config_dir as chainsyncer_config_dir
from chaind.data import config_dir as chaind_config_dir
from chaind.cli.arg import (
apply_arg,
apply_flag,
)
from chainlib.eth.cli.log import process_log
from chaind.settings import ChaindSettings
from chaind.cli.config import process_config as process_config_local
from chainsyncer.cli.config import process_config as process_config_syncer
# local imports
from chaind.eth.cache import EthCacheTx
from chaind.eth.settings import (
process_settings,
process_sync,
)
logging.basicConfig(level=logging.WARNING)
logg = logging.getLogger()
script_dir = os.path.dirname(os.path.realpath(__file__))
@@ -29,44 +50,50 @@ config_dir = os.path.join(script_dir, '..', 'data', 'config')
env = Environment(domain='eth', env=os.environ)
arg_flags = chainlib.cli.argflag_std_base | chainlib.cli.Flag.CHAIN_SPEC
argparser = chainlib.cli.ArgumentParser(arg_flags)
arg_flags = ArgFlag()
arg_flags = apply_flag_sync(arg_flags)
arg_flags = apply_flag(arg_flags)
local_arg_flags = chaind.cli.argflag_local_base
chaind.cli.process_flags(argparser, local_arg_flags)
arg = Arg(arg_flags)
arg = apply_arg_sync(arg)
arg = apply_arg(arg)
sync_flags = chainsyncer.cli.SyncFlag.RANGE | chainsyncer.cli.SyncFlag.HEAD
chainsyncer.cli.process_flags(argparser, sync_flags)
flags = arg_flags.STD_BASE | arg_flags.CHAIN_SPEC | arg_flags.PROVIDER | arg_flags.SEQ | arg_flags.STATE
flags = arg_flags.more(flags, arg_flags.SYNC_RANGE_EXT)
flags = arg_flags.more(flags, arg_flags.CHAIND_BASE)
argparser = chainlib.eth.cli.ArgumentParser()
argparser = process_args(argparser, arg, flags)
args = argparser.parse_args()
base_config_dir = [
chainsyncer.cli.config_dir,
chaind.cli.config_dir,
]
config = chainlib.cli.Config.from_args(args, arg_flags, base_config_dir=base_config_dir)
config = chainsyncer.cli.process_config(config, args, sync_flags)
config = chaind.cli.process_config(config, args, local_arg_flags)
logg = process_log(args, logg)
config = Config()
config.add_schema_dir(chainsyncer_config_dir)
config.add_schema_dir(chaind_config_dir)
config = process_config(config, arg, args, flags)
config = process_config_local(config, arg, args, flags)
config = process_config_syncer(config, arg, args, flags)
config.add('eth', 'CHAIND_ENGINE', False)
config.add('sync', 'CHAIND_COMPONENT', False)
logg.debug('config loaded:\n{}'.format(config))
settings = ChaindEthSettings(include_sync=True)
settings.process(config)
logg.debug('settings:\n{}'.format(settings))
settings = ChaindSettings(include_sync=True)
settings = process_settings(settings, config)
settings = process_sync(settings, config)
logg.debug('settings loaded:\n{}'.format(settings))
def main():
fltr = StateFilter(settings.get('CHAIN_SPEC'), settings.dir_for('queue'), EthCacheTx)
sync_store = SyncFsStore(settings.get('SESSION_DATA_DIR'), session_id=settings.get('SESSION_ID'))
sync_store = SyncFsStore(settings.get('SESSION_DATA_PATH'), session_id=settings.get('SESSION_ID'))
sync_store.register(fltr)
logg.debug('session block offset {}'.format(settings.get('SYNCER_OFFSET')))
drv = ChainInterfaceDriver(sync_store, settings.get('SYNCER_INTERFACE'), offset=settings.get('SYNCER_OFFSET'), target=settings.get('SYNCER_LIMIT'))
try:
drv.run(settings.get('RPC'))
drv.run(settings.get('CONN'))
except SyncDone as e:
logg.info('sync done: {}'.format(e))

View File

@@ -1,18 +1,31 @@
# external imports
from chainlib.eth.connection import EthHTTPConnection
from chaind.settings import ChaindSettings
from chainlib.eth.settings import process_settings as base_process_settings
from chaind.eth.chain import EthChainInterface
from chaind.settings import *
from chainsyncer.settings import process_sync_range
class ChaindEthSettings(ChaindSettings):
def process_sync_interface(self, config):
self.o['SYNCER_INTERFACE'] = EthChainInterface()
def process_common(settings, config):
rpc_provider = config.get('RPC_PROVIDER')
if rpc_provider == None:
rpc_provider = 'http://localhost:8545'
conn = EthHTTPConnection(url=rpc_provider, chain_spec=settings.get('CHAIN_SPEC'))
settings.set('RPC', conn)
return settings
def process_common(self, config):
super(ChaindEthSettings, self).process_common(config)
rpc_provider = config.get('RPC_PROVIDER')
if rpc_provider == None:
rpc_provider = 'http://localhost:8545'
self.o['RPC'] = EthHTTPConnection(url=rpc_provider, chain_spec=self.o['CHAIN_SPEC'])
def process_sync(settings, config):
settings.set('SYNCER_INTERFACE', EthChainInterface())
settings = process_sync_range(settings, config)
return settings
def process_settings(settings, config):
settings = base_process_settings(settings, config)
settings = process_common(settings, config)
settings = process_backend(settings, config)
settings = process_session(settings, config)
settings = process_socket(settings, config)
return settings

View File

@@ -1 +1 @@
eth-erc20~=0.3.0
eth-erc20~=0.3.2

View File

@@ -1,5 +1,5 @@
chaind~=0.2.10
hexathon~=0.1.6
chainlib-eth~=0.1.2
chaind~=0.3.0
hexathon~=0.1.7
chainlib-eth~=0.3.0
pyxdg~=0.27
funga-eth~=0.6.1

View File

@@ -1,6 +1,6 @@
[metadata]
name = chaind-eth
version = 0.2.9
version = 0.3.0
description = Queue server for ethereum
author = Louis Holbrook
author_email = dev@holbrook.no