cache txs between peers
authorForrest Voight <forrest@forre.st>
Fri, 12 Oct 2012 17:28:52 +0000 (13:28 -0400)
committerForrest Voight <forrest@forre.st>
Mon, 15 Oct 2012 06:15:29 +0000 (02:15 -0400)
p2pool/main.py
p2pool/p2p.py

index 98b4e37..14e41ff 100644 (file)
@@ -245,12 +245,18 @@ def main(args, net, datadir_path, merged_urls, worker_endpoint):
         
         known_txs_var = variable.Variable({}) # hash -> tx
         mining_txs_var = variable.Variable({}) # hash -> tx
+        # update mining_txs according to getwork results
         @bitcoind_work.changed.watch
         def _(work):
             new_mining_txs = {}
             for tx in work['transactions']:
                 new_mining_txs[bitcoin_data.hash256(bitcoin_data.tx_type.pack(tx))] = tx
             mining_txs_var.set(new_mining_txs)
+        # forward transactions seen to bitcoind
+        @known_txs_var.transitioned.watch
+        def _(before, after):
+            for tx_hash in set(after) - set(before):
+                factory.conn.value.send_tx(tx=after[tx_hash])
         
         class Node(p2p.Node):
             def handle_shares(self, shares, peer):
index f08a6b7..4af2391 100644 (file)
@@ -297,10 +297,13 @@ class Protocol(p2protocol.Protocol):
         for tx_hash in tx_hashes:
             if tx_hash not in self.remembered_txs:
                 self.remembered_txs[tx_hash] = self.node.known_txs_var.value[tx_hash]
+        new_known_txs = dict(self.node.known_txs_var.value)
         for tx in txs:
             tx_hash = bitcoin_data.hash256(bitcoin_data.tx_type.pack(tx))
             if tx_hash not in self.remembered_txs:
                 self.remembered_txs[tx_hash] = tx
+            new_known_txs[tx_hash] = tx
+        self.node.known_txs_var.set(new_known_txs)
     message_forget_tx = pack.ComposedType([
         ('tx_hashes', pack.ListType(pack.IntType(256))),
     ])