X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=p2pool%2Fwork.py;h=df9f787061f1e5529a755100a11b5871d3070d8d;hb=4cde79363018833bd47e411d12dff8263a17c8e6;hp=9f8b11933da6840b3e4066be248566755275beaf;hpb=29493ba726ab40f78574361fdeabec075a8a685f;p=p2pool.git diff --git a/p2pool/work.py b/p2pool/work.py index 9f8b119..df9f787 100644 --- a/p2pool/work.py +++ b/p2pool/work.py @@ -31,6 +31,7 @@ class WorkerBridge(worker_interface.WorkerBridge): self.pseudoshare_received = variable.Event() self.share_received = variable.Event() self.local_rate_monitor = math.RateMonitor(10*60) + self.local_addr_rate_monitor = math.RateMonitor(10*60) self.removed_unstales_var = variable.Variable((0, 0, 0)) self.removed_doa_unstales_var = variable.Variable(0) @@ -178,6 +179,23 @@ class WorkerBridge(worker_interface.WorkerBridge): return hash_rate return None + def get_local_rates(self): + miner_hash_rates = {} + miner_dead_hash_rates = {} + datums, dt = self.local_rate_monitor.get_datums_in_last() + for datum in datums: + miner_hash_rates[datum['user']] = miner_hash_rates.get(datum['user'], 0) + datum['work']/dt + if datum['dead']: + miner_dead_hash_rates[datum['user']] = miner_dead_hash_rates.get(datum['user'], 0) + datum['work']/dt + return miner_hash_rates, miner_dead_hash_rates + + def get_local_addr_rates(self): + addr_hash_rates = {} + datums, dt = self.local_addr_rate_monitor.get_datums_in_last() + for datum in datums: + addr_hash_rates[datum['pubkey_hash']] = addr_hash_rates.get(datum['pubkey_hash'], 0) + datum['work']/dt + return addr_hash_rates + def get_work(self, pubkey_hash, desired_share_target, desired_pseudoshare_target): 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') @@ -202,10 +220,10 @@ class WorkerBridge(worker_interface.WorkerBridge): 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'])) - if self.node.best_share_var.value is None: + previous_share = self.node.tracker.items[self.node.best_share_var.value] if self.node.best_share_var.value is not None else None + if previous_share is None: share_type = p2pool_data.Share else: - previous_share = self.node.tracker.items[self.node.best_share_var.value] 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: @@ -231,6 +249,17 @@ class WorkerBridge(worker_interface.WorkerBridge): if local_hash_rate is not None: desired_share_target = min(desired_share_target, bitcoin_data.average_attempts_to_target(local_hash_rate * self.node.net.SHARE_PERIOD / 0.05)) # limit to 5% of pool shares by modulating share difficulty + + local_addr_rates = self.get_local_addr_rates() + lookbehind = 3600//self.node.net.SHARE_PERIOD + block_subsidy = self.node.bitcoind_work.value['subsidy'] + if previous_share is not None and self.node.tracker.get_height(previous_share.hash) > lookbehind: + expected_payout_per_block = local_addr_rates.get(pubkey_hash, 0)/p2pool_data.get_pool_attempts_per_second(self.node.tracker, self.node.best_share_var.value, lookbehind) \ + * block_subsidy*(1-self.donation_percentage/100) # XXX doesn't use global stale rate to compute pool hash + if expected_payout_per_block < self.node.net.PARENT.DUST_THRESHOLD: + desired_share_target = min(desired_share_target, + bitcoin_data.average_attempts_to_target((bitcoin_data.target_to_average_attempts(self.node.bitcoind_work.value['bits'].target)*self.node.net.SPREAD)*self.node.net.PARENT.DUST_THRESHOLD/block_subsidy) + ) if True: share_info, gentx, other_transaction_hashes, get_share = share_type.generate_transaction( @@ -393,7 +422,8 @@ class WorkerBridge(worker_interface.WorkerBridge): self.recent_shares_ts_work.append((time.time(), bitcoin_data.target_to_average_attempts(target))) while len(self.recent_shares_ts_work) > 50: self.recent_shares_ts_work.pop(0) - self.local_rate_monitor.add_datum(dict(work=bitcoin_data.target_to_average_attempts(target), dead=not on_time, user=user)) + self.local_rate_monitor.add_datum(dict(work=bitcoin_data.target_to_average_attempts(target), dead=not on_time, user=user, share_target=share_info['bits'].target)) + self.local_addr_rate_monitor.add_datum(dict(work=bitcoin_data.target_to_average_attempts(target), pubkey_hash=pubkey_hash)) return on_time