CONF_FILE_FUNC=lambda: os.path.join(os.path.join(os.environ['APPDATA'], 'Litecoin') if platform.system() == 'Windows' else os.path.expanduser('~/Library/Application Support/Litecoin/') if platform.system() == 'Darwin' else os.path.expanduser('~/.litecoin'), 'litecoin.conf'),
BLOCK_EXPLORER_URL_PREFIX='http://nonexistent-litecoin-testnet-explorer/block/',
ADDRESS_EXPLORER_URL_PREFIX='http://nonexistent-litecoin-testnet-explorer/address/',
- SANE_TARGET_RANGE=(2**256//1000000000 - 1, 2**256//1000 - 1),
+ SANE_TARGET_RANGE=(2**256//1000000000 - 1, 2**256 - 1),
),
)
for net_name, net in nets.iteritems():
IDENTIFIER='cca5e24ec6408b1e'.decode('hex'),
PREFIX='ad9614f6466a39cf'.decode('hex'),
P2P_PORT=19338,
- MAX_TARGET=2**256//2000 - 1,
+ MAX_TARGET=2**256 - 1,
PERSIST=False,
WORKER_PORT=19327,
BOOTSTRAP_ADDRS='72.14.191.28'.split(' '),
self.bitcoind_work = variable.Variable((yield helper.getwork(self.bitcoind)))
@defer.inlineCallbacks
def work_poller():
- while True:
+ while stop_signal.times == 0:
flag = self.factory.new_block.get_deferred()
try:
self.bitcoind_work.set((yield helper.getwork(self.bitcoind, self.bitcoind_work.value['use_getblocktemplate'])))
self.handle_header = handle_header
@defer.inlineCallbacks
def poll_header():
+ if self.factory.conn.value is None:
+ return
handle_header((yield self.factory.conn.value.get_block_header(self.bitcoind_work.value['previous_block'])))
self.bitcoind_work.changed.watch(lambda _: poll_header())
yield deferral.retry('Error while requesting best block header:')(poll_header)()
if tx_hash in self.known_txs_var.value:
new_known_txs[tx_hash] = self.known_txs_var.value[tx_hash]
self.known_txs_var.set(new_known_txs)
- task.LoopingCall(forget_old_txs).start(10)
+ t = task.LoopingCall(forget_old_txs)
+ t.start(10)
+ stop_signal.watch(t.stop)
- task.LoopingCall(self.clean_tracker).start(5)
+ t = task.LoopingCall(self.clean_tracker)
+ t.start(5)
+ stop_signal.watch(t.stop)
def set_best_share(self):
best, desired, decorated_heads = self.tracker.think(self.get_height_rel_highest, self.bitcoind_work.value['previous_block'], self.bitcoind_work.value['bits'], self.known_txs_var.value)
--- /dev/null
+from twisted.internet import defer
+from twisted.trial import unittest
+
+from p2pool import networks, node, work
+from p2pool.util import deferral, variable
+
+class factory(object):
+ new_headers = variable.Event()
+ new_block = variable.Event()
+ new_tx = variable.Event()
+ conn = variable.Variable(None)
+ @classmethod
+ def getProtocol(self):
+ return defer.Deferred()
+
+class bitcoind(object):
+ @classmethod
+ def rpc_help(self):
+ return '\ngetblock '
+
+ @classmethod
+ def rpc_getblock(self, block_hash_hex):
+ return dict(height=42)
+
+ @classmethod
+ def rpc_getmemorypool(self):
+ return {
+ "version" : 2,
+ "previousblockhash" : "000000000000016c169477c25421250ec5d32cf9c6d38538b5de970a2355fd89",
+ "transactions" : [
+ ],
+ "coinbaseaux" : {
+ "flags" : "062f503253482f"
+ },
+ "coinbasevalue" : 5044450000,
+ "target" : "0000000000000513c50000000000000000000000000000000000000000000000",
+ "mintime" : 1351655621,
+ "mutable" : [
+ "time",
+ "transactions",
+ "prevblock"
+ ],
+ "noncerange" : "00000000ffffffff",
+ "sigoplimit" : 20000,
+ "sizelimit" : 1000000,
+ "curtime" : 1351659940,
+ "bits" : "1a0513c5",
+ "height" : 205801
+ }
+
+class FakeRequest(object):
+ def getUser(self):
+ return 'fakeuser'
+ def getClientIP(self):
+ return 'fakeclientip'
+
+class Test(unittest.TestCase):
+ @defer.inlineCallbacks
+ def test_node(self):
+ net = networks.nets['litecoin_testnet']
+ n = node.Node(factory, bitcoind, [], [], net)
+ yield n.start()
+
+ wb = work.WorkerBridge(node=n, my_pubkey_hash=42, donation_percentage=2, merged_urls=[], worker_fee=3)
+
+ yield deferral.sleep(3)
+
+ for i in xrange(100):
+ ba, got_resp = wb.get_work(pubkey_hash=4242, desired_share_target=2**256-1, desired_pseudoshare_target=2**256-1)
+ got_resp(dict(version=ba.version, previous_block=ba.previous_block, merkle_root=ba.merkle_root, timestamp=ba.timestamp, bits=ba.bits, nonce=42), FakeRequest())
+ yield deferral.sleep(.01)
+
+ yield deferral.sleep(3)
+
+ assert len(n.tracker.items) == 100
+ assert n.tracker.verified.get_height(n.best_share_var.value) == 100
+
+ n.stop()
+
+ yield deferral.sleep(20) # waiting for work_poller to exit
return pubkey_hash, desired_share_target, desired_pseudoshare_target
def get_work(self, pubkey_hash, desired_share_target, desired_pseudoshare_target):
- if len(self.node.p2p_node.peers) == 0 and self.node.net.PERSIST:
+ if (self.node.p2p_node is None or len(self.node.p2p_node.peers) == 0) and self.node.net.PERSIST:
raise jsonrpc.Error_for_code(-12345)(u'p2pool is not connected to any peers')
if self.node.best_share_var.value is None and self.node.net.PERSIST:
raise jsonrpc.Error_for_code(-12345)(u'p2pool is downloading shares')