import itertools
import os
import random
-import sqlite3
import struct
import sys
import time
import bitcoin.p2p as bitcoin_p2p, bitcoin.getwork as bitcoin_getwork, bitcoin.data as bitcoin_data
from bitcoin import worker_interface
-from util import db, expiring_dict, jsonrpc, variable, deferral, math
+from util import expiring_dict, jsonrpc, variable, deferral, math
from . import p2p, skiplists, networks
import p2pool, p2pool.data as p2pool_data
if net.NAME == 'litecoin':
nodes.add(((yield reactor.resolve('liteco.in')), net.P2P_PORT))
+ addrs = {}
+ try:
+ addrs = dict(eval(x) for x in open(os.path.join(os.path.dirname(sys.argv[0]), net.NAME + '_addrs.txt')))
+ except:
+ print "error reading addrs"
+
+ def save_addrs():
+ open(os.path.join(os.path.dirname(sys.argv[0]), net.NAME + '_addrs.txt'), 'w').writelines(repr(x) + '\n' for x in addrs.iteritems())
+ task.LoopingCall(save_addrs).start(60)
+
p2p_node = p2p.Node(
current_work=current_work,
port=args.p2pool_port,
net=net,
- addr_store=db.SQLiteDict(sqlite3.connect(os.path.join(os.path.dirname(sys.argv[0]), 'addrs.dat'), isolation_level=None), net.NAME),
+ addr_store=addrs,
preferred_addrs=set(map(parse, args.p2pool_nodes)) | nodes,
)
p2p_node.handle_shares = p2p_shares
def clientConnectionLost(self, connector, reason):
self.node.attempt_ended(connector)
-addrdb_key = bitcoin_data.ComposedType([
- ('address', bitcoin_data.IPV6AddressType()),
- ('port', bitcoin_data.StructType('>H')),
-])
-addrdb_value = bitcoin_data.ComposedType([
- ('services', bitcoin_data.StructType('<Q')),
- ('first_seen', bitcoin_data.StructType('<Q')),
- ('last_seen', bitcoin_data.StructType('<Q')),
-])
-
-class AddrStore(dicts.DictWrapper):
- def encode_key(self, (address, port)):
- return addrdb_key.pack(dict(address=address, port=port))
- def decode_key(self, encoded_key):
- k = addrdb_key.unpack(encoded_key)
- return k['address'], k['port']
-
- def encode_value(self, (services, first_seen, last_seen)):
- return addrdb_value.pack(dict(services=services, first_seen=first_seen, last_seen=last_seen))
- def decode_value(self, encoded_value):
- v = addrdb_value.unpack(encoded_value)
- return v['services'], v['first_seen'], v['last_seen']
-
class Node(object):
def __init__(self, current_work, port, net, addr_store=None, preferred_addrs=set(), desired_peers=10, max_attempts=30, preferred_storage=1000):
if addr_store is None:
self.port = port
self.net = net
- self.addr_store = AddrStore(addr_store)
+ self.addr_store = addr_store
self.preferred_addrs = preferred_addrs
self.desired_peers = desired_peers
self.max_attempts = max_attempts
+++ /dev/null
-from __future__ import division
-
-class SQLiteDict(object):
- def __init__(self, db, table):
- self._db = db
- self._table = table
-
- self._db.execute('CREATE TABLE IF NOT EXISTS %s(key BLOB PRIMARY KEY NOT NULL, value BLOB NOT NULL)' % (self._table,))
-
- def __len__(self):
- return self._db.execute('SELECT COUNT(key) FROM %s' % (self._table,)).fetchone()[0]
-
- def __iter__(self):
- for row in self._db.execute('SELECT key FROM %s' % (self._table,)):
- yield str(row[0])
- def iterkeys(self):
- return iter(self)
- def keys(self):
- return list(self)
-
- def itervalues(self):
- for row in self._db.execute('SELECT value FROM %s' % (self._table,)):
- yield str(row[0])
- def values(self):
- return list(self.itervalues)
-
- def iteritems(self):
- for row in self._db.execute('SELECT key, value FROM %s' % (self._table,)):
- yield (str(row[0]), str(row[1]))
- def items(self):
- return list(self.iteritems())
-
- def __setitem__(self, key, value):
- self._db.execute('INSERT OR REPLACE INTO %s (key, value) VALUES (?, ?)' % (self._table,), (buffer(key), buffer(value)))
-
- def __getitem__(self, key):
- row = self._db.execute('SELECT value FROM %s WHERE key=?' % (self._table,), (buffer(key),)).fetchone()
- if row is None:
- raise KeyError(key)
- else:
- return str(row[0])
-
- def __delitem__(self, key):
- self._db.execute('DELETE FROM %s WHERE key=?' % (self._table,), (buffer(key),))
-class DictWrapper(object):
- def encode_key(self, key):
- return key
- def decode_key(self, encoded_key):
- return encoded_key
- def encode_value(self, value):
- return value
- def decode_value(self, encoded_value):
- return encoded_value
-
- def __init__(self, inner):
- self.inner = inner
-
- def __len__(self):
- return len(self.inner)
-
- def __contains__(self, key):
- return self.encode_key(key) in self.inner
-
- def __getitem__(self, key):
- return self.decode_value(self.inner[self.encode_key(key)])
- def __setitem__(self, key, value):
- self.inner[self.encode_key(key)] = self.encode_value(value)
- def __delitem__(self, key):
- del self.inner[self.encode_key(key)]
-
- def __iter__(self):
- for encoded_key in self.inner:
- yield self.decode_key(encoded_key)
- def iterkeys(self):
- return iter(self)
- def keys(self):
- return list(self.iterkeys())
-
- def itervalue(self):
- for encoded_value in self.inner.itervalues():
- yield self.decode_value(encoded_value)
- def values(self):
- return list(self.itervalue())
-
- def iteritems(self):
- for key, value in self.inner.iteritems():
- yield self.decode_key(key), self.decode_value(value)
- def items(self):
- return list(self.iteritems())
-
def update_dict(d, **replace):
d = d.copy()
for k, v in replace.iteritems():