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),
height=t['height'] + 1,
time=bb['timestamp'] + 600, # better way?
transactions=[],
+ transaction_fees=[],
merkle_link=bitcoin_data.calculate_merkle_link([None], 0),
subsidy=self.node.net.PARENT.SUBSIDY_FUNC(self.node.bitcoind_work.value['height']),
last_update=self.node.bitcoind_work.value['last_update'],
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=7,
+ 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),
desired_target=desired_share_target,
ref_merkle_link=dict(branch=[], index=0),
- desired_other_transaction_hashes=tx_hashes,
+ desired_other_transaction_hashes_and_fees=zip(tx_hashes, self.current_work.value['transaction_fees']),
net=self.node.net,
known_txs=tx_map,
+ base_subsidy=self.node.net.PARENT.SUBSIDY_FUNC(self.current_work.value['height']),
)
transactions = [gentx] + [tx_map[tx_hash] for tx_hash in other_transaction_hashes]
log.err(None, 'Error while processing merged mining POW:')
if pow_hash <= share_info['bits'].target and header_hash not in received_header_hashes:
- share = get_share(header, transactions)
+ share = get_share(header)
print 'GOT SHARE! %s %s prev %s age %.2fs%s' % (
request.getUser(),
self.my_doa_share_hashes.add(share.hash)
self.node.tracker.add(share)
- if not p2pool.DEBUG:
- self.node.tracker.verified.add(share)
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:')