commit 59aea60d87769e5c6a5495b1feb55dfb6ac62e7c
parent 15b4aa9c5af40c50f9aa71878362a17d1325f0dd
Author: nolash <dev@holbrook.no>
Date:   Fri, 16 Apr 2021 16:05:17 +0200
Add tag pool results backend, move filter to interface wrapper
Diffstat:
7 files changed, 108 insertions(+), 40 deletions(-)
diff --git a/taint/account.py b/taint/account.py
@@ -25,6 +25,14 @@ class Account(Salter):
             self.tags.create(tag)
 
 
+    def tag(self, value):
+        self.tags.create(value)
+
+
+    def sum(self):
+        return self.tags.get()
+
+
     def connect(self, account):
         if not isinstance(account, Account):
             raise TypeError('account must be type crypto_account_cache.account.Account')
diff --git a/taint/cache.py b/taint/cache.py
@@ -4,11 +4,9 @@ import logging
 
 # external imports
 from moolb import Bloom
-from hexathon import strip_0x
 
 # local imports
 from .name import for_label
-from .store import FileStore
 from .crypto import Salter
 from .account import Account
 
@@ -129,10 +127,9 @@ class CacheBloom:
 
 class Cache(Salter):
 
-    def __init__(self, chain_spec, bits_size, store=None, cache_bloom=None):
+    def __init__(self, chain_spec, bits_size, cache_bloom=None):
         super(Cache, self).__init__(chain_spec)
         self.bits_size = bits_size
-        self.store = store
         self.chain_spec = chain_spec
 
         if cache_bloom == None:
@@ -172,12 +169,6 @@ class Cache(Salter):
         return c
 
 
-    def set_store(self, store):
-        self.store = store
-        if not store.initd and self.cache_bloom:
-            self.store.save(self.cache_bloom.serialize())
-
-
     def divide(self, accounts):
         subjects = []
         objects = []
@@ -214,7 +205,7 @@ class Cache(Salter):
         match =  self.cache_bloom.register(accounts, block_height, tx_index)
 
         if not match:
-            return False
+            return None
 
         if self.first_block_height == -1:
             self.first_block_height = block_height
@@ -234,22 +225,8 @@ class Cache(Salter):
                     continue
                 subject.connect(other_subject)
 
-        return True
+        return (subjects, objects)
 
 
     def have(self, block_height, tx_index):
         return self.cache_bloom.have_index(block_height, tx_index)
-
-
-    def filter(self, conn, block, tx, storer):
-        for output in tx.outputs:
-            for inpt in tx.inputs:
-                sender = bytes.fromhex(strip_0x(output))
-                recipient = bytes.fromhex(strip_0x(inpt))
-                print('tx {} '.format(tx.index))
-                self.add_tx(
-                        self.sprinkle(sender),
-                        self.sprinkle(recipient),
-                        block.number,
-                        tx.index,
-                        )
diff --git a/taint/result.py b/taint/result.py
@@ -0,0 +1,21 @@
+# standard imports
+import logging
+
+logg = logging.getLogger().getChild(__name__)
+
+
+class Result:
+
+    def __init__(self):
+        self.handler = []
+
+
+    def add_handler(self, result_handler):
+        self.handlers.append(result_handler)
+        logg.debug('added handler {}'.format(str(result_handler)))
+
+
+    def register(self, account):
+        for h in self.handlers:
+            r = h(account)
+            logg.debug('processed handler {} -> {}'.format(str(h), r))
diff --git a/taint/tag.py b/taint/tag.py
@@ -5,6 +5,26 @@ import logging
 logg = logging.getLogger().getChild(__name__)
 
 
+
+class TagPool:
+
+    def __init__(self):
+        self.pool = {}
+
+
+    def register(self, account):
+        z = account.sum()
+        if self.pool.get(z) == None:
+            self.pool[z] = []
+
+        self.pool[z].append(account)
+        
+        logg.debug('pool register account {} to tag sum {}'.format(account, z.hex()))
+        
+
+        return True
+
+
 class Tag:
 
     def __init__(self):
@@ -43,7 +63,7 @@ class Tag:
 
     def merge(self, tags):
         if not isinstance(tags, Tag):
-            raise TypeError('tags must be type crypto_account_type.tag.Tag')
+            raise TypeError('tags must be type taint.tag.Tag')
         for tag in tags.tags:
             self.add(tag)
             self.tag_values[tag] = tags.tag_values[tag]
diff --git a/taint/taint.py b/taint/taint.py
@@ -0,0 +1,36 @@
+# external imports
+from hexathon import strip_0x
+
+# local imports
+from .cache import Cache
+
+
+class Tainter(Cache):
+
+    def __init__(self, chain_spec, bits_size, result_handler=None, store_handler=None, cache_bloom=None):
+        super(Tainter, self).__init__(chain_spec, bits_size, cache_bloom=cache_bloom)
+        self.store_handler = store_handler
+        self.result_handler = result_handler
+
+
+    def set_store(self, store):
+        self.store = store
+        if not store.initd and self.cache_bloom:
+            self.store.save(self.cache_bloom.serialize())
+
+
+    def filter(self, conn, block, tx, storer):
+        for output in tx.outputs:
+            for inpt in tx.inputs:
+                sender = bytes.fromhex(strip_0x(output))
+                recipient = bytes.fromhex(strip_0x(inpt))
+                (subjects, objects) = self.add_tx(
+                        self.sprinkle(sender),
+                        self.sprinkle(recipient),
+                        block.number,
+                        tx.index,
+                        )
+                
+                if self.result_handler != None:
+                    for account in subjects:
+                        self.result_handler.register(account)
diff --git a/tests/eth/test_syncer.py b/tests/eth/test_syncer.py
@@ -13,8 +13,9 @@ from chainsyncer.backend.memory import MemBackend
 from hexathon import strip_0x
 
 # local imports
-from taint.cache import Cache
+from taint.taint import Tainter
 from taint.account import Account
+from taint.tag import TagPool
 
 
 class TestSyncer(EthTesterCase):
@@ -26,12 +27,17 @@ class TestSyncer(EthTesterCase):
 
         self.alice_account = bytes.fromhex(strip_0x(self.accounts[0]))
         self.alice = Account(self.chain_spec, self.alice_account, label='alice')
+        self.alice.tag(b'foo')
+        self.alice.tag(b'bar')
+
 
         self.filter_bits_size = 1024
-        self.cache = Cache(self.chain_spec, self.filter_bits_size)
-        self.cache.add_subject(self.alice)
+        self.result_handler = TagPool()
+        self.frontend = Tainter(self.chain_spec, self.filter_bits_size, result_handler=self.result_handler)
+        self.frontend.add_subject(self.alice)
+
 
-        self.syncer.add_filter(self.cache)
+        self.syncer.add_filter(self.frontend)
 
 
     def test_sync_single(self):
@@ -43,11 +49,11 @@ class TestSyncer(EthTesterCase):
         self.rpc.do(o)
         self.backend.mine_blocks(3)
         
-        self.assertFalse(self.cache.have(4, 0))
+        self.assertFalse(self.frontend.have(4, 0))
 
         self.syncer.loop(0.001, self.rpc)
 
-        self.assertTrue(self.cache.have(4, 0))
+        self.assertTrue(self.frontend.have(4, 0))
 
 
 if __name__ == '__main__':
diff --git a/tests/test_cache.py b/tests/test_cache.py
@@ -73,7 +73,7 @@ class TestBasic(TestBase):
         self.assertNotEqual(self.alice.tags.get(), self.bob.tags.get())
 
         match = cache.add_tx(self.alice.account, self.bob.account, block_height, tx_index)
-        self.assertTrue(match)
+        self.assertNotEqual(match, None)
 
         self.assertEqual(self.alice.tags.get(), self.bob.tags.get())
 
@@ -87,11 +87,11 @@ class TestBasic(TestBase):
 
         first_block_height = 42
         first_tx_index = 13
-        match = cache.add_tx(self.alice.account, self.bob.account, first_block_height, first_tx_index)
+        cache.add_tx(self.alice.account, self.bob.account, first_block_height, first_tx_index)
 
         new_block_height = 666
         new_tx_index = 1337
-        match = cache.add_tx(self.alice.account, self.eve.account, new_block_height, new_tx_index)
+        cache.add_tx(self.alice.account, self.eve.account, new_block_height, new_tx_index)
 
         cache.first_block_height == first_block_height
         cache.first_tx_index == first_tx_index
@@ -108,11 +108,11 @@ class TestBasic(TestBase):
 
         first_block_height = 42
         first_tx_index = 13
-        match = cache.add_tx(self.alice.account, self.bob.account, first_block_height, first_tx_index)
+        cache.add_tx(self.alice.account, self.bob.account, first_block_height, first_tx_index)
 
         new_block_height = 666
         new_tx_index = 1337
-        match = cache.add_tx(self.alice.account, self.eve.account, new_block_height, new_tx_index)
+        cache.add_tx(self.alice.account, self.eve.account, new_block_height, new_tx_index)
 
         self.assertTrue(cache.have(first_block_height, first_tx_index))
         self.assertTrue(cache.have(new_block_height, new_tx_index))
@@ -131,11 +131,11 @@ class TestBasic(TestBase):
 
         first_block_height = 42
         first_tx_index = 13
-        match = cache.add_tx(self.alice.account, self.bob.account, first_block_height, first_tx_index)
+        cache.add_tx(self.alice.account, self.bob.account, first_block_height, first_tx_index)
 
         new_block_height = 666
         new_tx_index = 1337
-        match = cache.add_tx(self.alice.account, self.eve.account, new_block_height, new_tx_index)
+        cache.add_tx(self.alice.account, self.eve.account, new_block_height, new_tx_index)
 
         b = cache.serialize()
         cache_recovered = cache.from_serialized(self.chain_spec, b)