From 991e909a2cf3482302bd9325264867a25e4528db Mon Sep 17 00:00:00 2001 From: nolash Date: Wed, 3 Feb 2021 23:03:39 +0100 Subject: [PATCH] Add abstracted block and tx objects --- cic_syncer/client/block.py | 16 ++++++++++ .../evm/__pycache__/response.cpython-38.pyc | Bin 975 -> 1886 bytes .../evm/__pycache__/websocket.cpython-38.pyc | Bin 1825 -> 2454 bytes cic_syncer/client/evm/response.py | 25 ++++++++++++++- cic_syncer/client/evm/websocket.py | 30 +++++++++++++++++- cic_syncer/client/translate.py | 6 ++++ cic_syncer/client/tx.py | 6 ++++ cic_syncer/driver.py | 26 +++++++++++++-- 8 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 cic_syncer/client/block.py create mode 100644 cic_syncer/client/tx.py diff --git a/cic_syncer/client/block.py b/cic_syncer/client/block.py new file mode 100644 index 0000000..06cbfb3 --- /dev/null +++ b/cic_syncer/client/block.py @@ -0,0 +1,16 @@ +class Block: + + def __init__(self, hsh, obj): + self.hash = hsh + self.obj = obj + + + def tx(self, idx): + return NotImplementedError + + + def number(self): + return NotImplementedError + + + diff --git a/cic_syncer/client/evm/__pycache__/response.cpython-38.pyc b/cic_syncer/client/evm/__pycache__/response.cpython-38.pyc index 081320736a4f57ddef5678524d49e1af98caa685..59f7df3747ddea05b00b849d5fadb909ee956904 100644 GIT binary patch literal 1886 zcmZux-EJH;6t+D-JNuKQr70zpRw@FCK_dGC2t`zgEB1mEkmkm0#!j=_`3d$c+D6-} zRO(A`kzD4Le9INDfI#9qo=m#Q;*mY)9NWjAzjKa%+S(d0w5LxV|N2kB*q@}Vw-Cw! zx;@39nBoP?=r0OhicD~lgCZ!yEc9|%L}i@CoM|!dX*N&jucAMKtp7bzvFg2Ls&_83 z0klN*q4jlq9%Mu412u#`)FJed;)g69{e@H6B;~H(m}zB;X``V;-xhWL3W9jCOanJM zB2`w4@<%aqf0mH?l{9CP8?UbTWEE0Y=&@aC{S0-?BMtJFXNNC)Z=1mPsY~dW4&y~`79s5 zG*fF$T{i$(S9LkdE!n@aud7@e5@jbAGhH=f{d+m?(CnYSc8Qd;YSu`3AII1j1LHBi zv)#4(?{|xGP7AIZ$wY=HVgvzKXBS-YOA4i!xJVmQn^gFlxBzjw;$|BQ{hiw39@I93 ze(@uyme^(d?BO~B3bJ2u3j(c-&^?4tA*|R1!QdAN?G#NUM>^@A1Na7^)wj8!wjiN%$r)QV% z@7OV7gPc#Y;2jH*@kEA;0Q^*1K(&9!Odpfv z!!Aw{oF~xyJ<_mcFlx)P-z>Xg4Nw4AsBS59`3(+)E?#F&#k6 z8>&0M!EIf;%5_n6?mT&v4#x9FxJdJk6X9`ga7L+gK#RzA$Jyo^0nQLlAoEXBPP@8B zbP;vW(JeuxdQkKjpuZ7BA<=gp`0B{o>YwHfRX=j>8Fm=jkA(F37tGYs@%l~{IMFP> zq!VZ<oPLkF$-@-gz^`5Y6p!rusK9T~EuTP~d2y2|dqf5i54 z|A=|8*`p2nzE3wpamaQzXPc#`*QA(tky@0e*3h%%Yp6|LI{5!Ey5#G&Y`-B+Ezy#Q S5yuyXsQvKYxVQb_Ui=^GB8H;? delta 492 zcmZutJ4?hs5Z>J+d$~u>*CFB+*5TkPu~HF4tjd497`)yIO^cAOFcd9dnxuauByeEb#z9xI@F9zYO5 z1LEP$0va-pQ6gE#kfdV@w1a5>#P23yTdJ&h zC}ThO^j~hMo1W4IrvMWa2N)4mPVeaft)_Lh+dx-lK*5MAB&*8bP{B~%ODYwqS~_IS zOIU+gpsS#I65xUiKs$861RcTwQfwpRO6nwtT|*TiCm*cF&>BbhGoyrjKMH0btQi2I z=hJIDtxc(WQCG|6XG$6wjU@+rOdw1l{B+ALq^*!58XEVrnayo8_qm1ij?cA9NAk>% nBmcM?XO>99o>ul(*?;{qdohee63AuTU*kvFtYVtfeB=Bb(^q1R diff --git a/cic_syncer/client/evm/__pycache__/websocket.cpython-38.pyc b/cic_syncer/client/evm/__pycache__/websocket.cpython-38.pyc index 289ec78dcf924c1aa8c42c57d165581bd071a8e2..58a6efe5cda7f8255fafbdcf624532e309d5667b 100644 GIT binary patch literal 2454 zcmbuBOK%)S5P-XT-s@ezu*k!Z@CZaJz-yu$5sDH8IKUnf@z7j`-RWj`oq5>Zy@_p& zFWH>=0f@uw1`~m~W_}*Tf$e))m`8DB`+nBS zm*OQ#1gYC|5_i5PJmBFo!owMhmpOe%y3uoZAL&1*AiLBo-T&dc2SV+Zg%U7qKM;FU zq4a$zO9|uP$wZHn?S1Hmu=8$KrjJrouy`>T+<{x&1|bNV52jPjo)IwJ;V!f;_qY$O z*BBK0JmM`F2Yd;PYMXV?{-YQw&@c48Y$6JsqTZ7W`{=TJaI3dLRJ0-q(X?h2onznO zEYE2t+3n97~#V+9^BRlj9qOZ%*l)%QG~7m&5Vu+ zcYb$|7?|kPuJ&rbVsijR(P*a*=H$rHA;*=da^`f#j@-(vTQKic9w(0+In+y)H=|D} z%tJIon0Wmc&aJKOctt=^4lx${(|jo8u^R_Fsx0JgYWy4)OK#YN8-I5o2e~qByEiH9 z=5EJ0N=xHTr?ACCdAso$#6rQ1i<*qbr}?fjt`zBGiGgRltQ>Gr%>sxOdUy8j1bUV-*DzR0@foINfke5NhRk#%jLfec{1`)yj@%?q$qN_B-A3MB$ z0h`57I+H0_c1{8P0fPlVkd+m!Z8@2<+MSb2fPq790yH+GmBalJ;{kwk0TV#eK^<1^ zDL8(=@`BOUd^`qZ00KJ-OGd~-FLcB8@RFVHu9zSzN25tGYVyfu3~r1= zC};NnLQ@x4U!8nguj*pFxiFpD193~sL7_4@h%K}D+Uq;u$lN;Bj=5)Z{9CX?K*2_P etZ^58jS0VKeDWn8lL~#%RL_vLA<5v!Lg!zau|w?u delta 724 zcmZvZPm9w)7{>EXlF779v)vkW-K}-~vq-wiidV(M3NEM=Sy9(kkpIp6=0?ibv<9RrKJ2;uwo}jm6hhxV-p&MU#Co*@77}q{jz^ zo5^PgU@57SN7txaatKFzp?AV)=sUnmvg77oluMnm z@RXj)U&ob+F^3l**OxN|@6ii8QP3$=X^@MT%GY(MV0fgf*&QKz?k*c|oSKEKVY zQhTQH_2<)8L8@*$jAoslQ{|_mz*i8bB?OBjw|yAnIXAv4=UBY2`i~Znb}NOsxAo`r4|1U>=ZLi{t&D|||hPlCk| zV`PNsOk>r2)hP)BFL^Ksj`GP9V96Ke+!2`JJt_K}Z~n3QpTA%?`jIyZ{hNS4!BZU_ KmJt(7!qnea!jKmL diff --git a/cic_syncer/client/evm/response.py b/cic_syncer/client/evm/response.py index 0d4e72c..c53933c 100644 --- a/cic_syncer/client/evm/response.py +++ b/cic_syncer/client/evm/response.py @@ -1,11 +1,14 @@ import json from cic_syncer.client import translate +from cic_syncer.client.block import Block +from cic_syncer.client.tx import Tx translations = { 'block_number': translate.hex_to_int, 'get_block': json.dumps, + 'number': translate.hex_to_int, } @@ -22,4 +25,24 @@ class EVMResponse: def get_result(self): - return self.fn(self.response_object.get('result')) + r = self.fn(self.response_object.get('result')) + if r == 'null': + return None + return r + + +class EVMTx(Tx): + + def __init__(self, block, tx_number, obj): + super(EVMTx, self).__init__(block, tx_number, obj) + + +class EVMBlock(Block): + + def tx(self, idx): + o = self.obj['transactions'][idx] + return Tx(self, idx, o) + + + def number(self): + return translate.hex_to_int(self.obj['number']) diff --git a/cic_syncer/client/evm/websocket.py b/cic_syncer/client/evm/websocket.py index 5b81282..8feadde 100644 --- a/cic_syncer/client/evm/websocket.py +++ b/cic_syncer/client/evm/websocket.py @@ -6,6 +6,8 @@ import websocket from .response import EVMResponse from cic_syncer.error import RequestError +from cic_syncer.client.translate import with_0x +from cic_syncer.client.evm.response import EVMBlock logg = logging.getLogger() @@ -55,5 +57,31 @@ class EVMWebsocketClient: if err != None: raise RequestError(err) - return res.get_result() + j = res.get_result() + if j == None: + return None + o = json.loads(j) + return EVMBlock(o['hash'], o) + + def get_block_by_hash(self, hx_in): + req_id = str(uuid.uuid4()) + hx = with_0x(hx_in) + req ={ + 'jsonrpc': '2.0', + 'method': 'eth_getBlockByHash', + 'id': str(req_id), + 'params': [hx, False], + } + self.conn.send(json.dumps(req)) + r = self.conn.recv() + res = EVMResponse('get_block', json.loads(r)) + err = res.get_error() + if err != None: + raise RequestError(err) + + j = res.get_result() + if j == None: + return None + o = json.loads(j) + return EVMBlock(o['hash'], o) diff --git a/cic_syncer/client/translate.py b/cic_syncer/client/translate.py index ad35fb4..4331afd 100644 --- a/cic_syncer/client/translate.py +++ b/cic_syncer/client/translate.py @@ -15,6 +15,12 @@ def strip_0x(hx): return is_hex(hx) +def with_0x(hx): + if len(hx) >= 2 and hx[:2] == '0x': + hx = hx[2:] + return '0x' + is_hex(hx) + + def hex_to_int(hx, endianness='big'): hx = strip_0x(hx) b = bytes.fromhex(hx) diff --git a/cic_syncer/client/tx.py b/cic_syncer/client/tx.py new file mode 100644 index 0000000..594491a --- /dev/null +++ b/cic_syncer/client/tx.py @@ -0,0 +1,6 @@ +class Tx: + + def __init__(self, block, tx_number, obj): + self.block = block + self.tx_number = tx_number + self.obj = obj diff --git a/cic_syncer/driver.py b/cic_syncer/driver.py index 6e5fb88..c2d0460 100644 --- a/cic_syncer/driver.py +++ b/cic_syncer/driver.py @@ -35,7 +35,9 @@ class MinedSyncer(Syncer): def loop(self, interval, getter): while self.running and Syncer.running_global: - e = self.get(getter) + block_hash = self.get(getter) + if block_hash != None: + self.process(getter, block_hash) time.sleep(interval) @@ -45,12 +47,30 @@ class HeadSyncer(MinedSyncer): super(HeadSyncer, self).__init__(backend) + def process(self, getter, block): + logg.debug('process block {}'.format(block)) + block = getter.get_block_by_hash(block.hash) + i = 0 + tx = None + while True: + try: + tx = block.tx(i) + logg.debug('tx {}'.format(tx)) + self.backend.set(block.number(), i) + for f in self.filter: + f(getter, block, tx) + except IndexError as e: + self.backend.set(block.number() + 1, 0) + break + i += 1 + + def get(self, getter): (block_number, tx_number) = self.backend.get() block_hash = [] uu = uuid.uuid4() res = getter.get_block_by_integer(block_number) - logg.debug(res) + logg.debug('get {}'.format(res)) - return block_hash + return res