self.donation_percentage = donation_percentage
self.worker_fee = worker_fee
+ self.running = True
self.pseudoshare_received = variable.Event()
self.share_received = variable.Event()
self.local_rate_monitor = math.RateMonitor(10*60)
@defer.inlineCallbacks
def set_merged_work(merged_url, merged_userpass):
merged_proxy = jsonrpc.Proxy(merged_url, dict(Authorization='Basic ' + base64.b64encode(merged_userpass)))
- while True:
+ while self.running:
auxblock = yield deferral.retry('Error while calling merged getauxblock:', 30)(merged_proxy.rpc_getauxblock)()
self.merged_work.set(dict(self.merged_work.value, **{auxblock['chainid']: dict(
hash=int(auxblock['hash'], 16),
self.merged_work.changed.watch(lambda _: self.new_work_event.happened())
self.node.best_share_var.changed.watch(lambda _: self.new_work_event.happened())
+ def stop(self):
+ self.running = False
+
def get_stale_counts(self):
'''Returns (orphans, doas), total, (orphans_recorded_in_chain, doas_recorded_in_chain)'''
my_shares = len(self.my_share_hashes)
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')
tx_hashes = [bitcoin_data.hash256(bitcoin_data.tx_type.pack(tx)) for tx in self.current_work.value['transactions']]
tx_map = dict(zip(tx_hashes, self.current_work.value['transactions']))
- share_type = p2pool_data.NewShare
- if self.node.best_share_var.value is not None:
+ if self.node.best_share_var.value is None:
+ share_type = p2pool_data.Share
+ else:
previous_share = self.node.tracker.items[self.node.best_share_var.value]
- if isinstance(previous_share, p2pool_data.Share):
+ previous_share_type = type(previous_share)
+
+ if previous_share_type.SUCCESSOR is None or self.node.tracker.get_height(previous_share.hash) < self.node.net.CHAIN_LENGTH:
+ share_type = previous_share_type
+ else:
+ successor_type = previous_share_type.SUCCESSOR
+
+ counts = p2pool_data.get_desired_version_counts(self.node.tracker,
+ self.node.tracker.get_nth_parent_hash(previous_share.hash, self.node.net.CHAIN_LENGTH*9//10), self.node.net.CHAIN_LENGTH//10)
# Share -> NewShare only valid if 85% of hashes in [net.CHAIN_LENGTH*9//10, net.CHAIN_LENGTH] for new version
- if self.node.tracker.get_height(previous_share.hash) < self.node.net.CHAIN_LENGTH:
- share_type = p2pool_data.Share
- elif time.time() < 1351383661 and self.node.net.NAME == 'bitcoin':
- share_type = p2pool_data.Share
+ if counts.get(successor_type.VERSION, 0) > sum(counts.itervalues())*95//100:
+ share_type = successor_type
else:
- counts = p2pool_data.get_desired_version_counts(self.node.tracker,
- self.node.tracker.get_nth_parent_hash(previous_share.hash, self.node.net.CHAIN_LENGTH*9//10), self.node.net.CHAIN_LENGTH//10)
- if counts.get(p2pool_data.NewShare.VERSION, 0) < sum(counts.itervalues())*95//100:
- share_type = p2pool_data.Share
+ share_type = previous_share_type
if True:
share_info, gentx, other_transaction_hashes, get_share = share_type.generate_transaction(
'doa' if doas > doas_recorded_in_chain else
None
)(*self.get_stale_counts()),
- desired_version=p2pool_data.NewShare.VERSION,
+ desired_version=share_type.SUCCESSOR.VERSION if share_type.SUCCESSOR is not None else share_type.VERSION,
),
block_target=self.current_work.value['bits'].target,
desired_timestamp=int(time.time() + 0.5),
self.node.set_best_share()
try:
- if pow_hash <= header['bits'].target or p2pool.DEBUG:
+ if (pow_hash <= header['bits'].target or p2pool.DEBUG) and self.node.p2p_node is not None:
self.node.p2p_node.broadcast_share(share.hash)
except:
log.err(None, 'Error forwarding block solution:')