removed getblockcount polling, made unnecessary by having height in getblocktemplate...
[p2pool.git] / p2pool / work.py
index 1a2cb3b..b389100 100644 (file)
@@ -14,7 +14,7 @@ from util import jsonrpc, variable, deferral, math, pack
 import p2pool, p2pool.data as p2pool_data
 
 class WorkerBridge(worker_interface.WorkerBridge):
-    def __init__(self, my_pubkey_hash, net, donation_percentage, bitcoind_work, best_block_header, merged_urls, best_share_var, tracker, my_share_hashes, my_doa_share_hashes, worker_fee, p2p_node, submit_block, set_best_share, broadcast_share, block_height_var):
+    def __init__(self, my_pubkey_hash, net, donation_percentage, bitcoind_work, best_block_header, merged_urls, best_share_var, tracker, my_share_hashes, my_doa_share_hashes, worker_fee, p2p_node, submit_block, set_best_share, broadcast_share):
         worker_interface.WorkerBridge.__init__(self)
         self.recent_shares_ts_work = []
         
@@ -32,7 +32,6 @@ class WorkerBridge(worker_interface.WorkerBridge):
         self.submit_block = submit_block
         self.set_best_share = set_best_share
         self.broadcast_share = broadcast_share
-        self.block_height_var = block_height_var
         
         self.pseudoshare_received = variable.Event()
         self.share_received = variable.Event()
@@ -93,7 +92,7 @@ class WorkerBridge(worker_interface.WorkerBridge):
                     time=bb['timestamp'] + 600, # better way?
                     transactions=[],
                     merkle_link=bitcoin_data.calculate_merkle_link([None], 0),
-                    subsidy=net.PARENT.SUBSIDY_FUNC(self.block_height_var.value),
+                    subsidy=net.PARENT.SUBSIDY_FUNC(self.bitcoind_work.value['height']),
                     last_update=self.bitcoind_work.value['last_update'],
                 )
             
@@ -183,8 +182,23 @@ 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']))
         
+        share_type = p2pool_data.NewShare
+        if self.best_share_var.value is not None:
+            previous_share = self.tracker.items[self.best_share_var.value]
+            if isinstance(previous_share, p2pool_data.Share):
+                # Share -> NewShare only valid if 85% of hashes in [net.CHAIN_LENGTH*9//10, net.CHAIN_LENGTH] for new version
+                if self.tracker.get_height(previous_share.hash) < self.net.CHAIN_LENGTH:
+                    share_type = p2pool_data.Share
+                elif time.time() < 1351383661 and self.net.NAME == 'bitcoin':
+                    share_type = p2pool_data.Share
+                else:
+                    counts = p2pool_data.get_desired_version_counts(self.tracker,
+                        self.tracker.get_nth_parent_hash(previous_share.hash, self.net.CHAIN_LENGTH*9//10), self.net.CHAIN_LENGTH//10)
+                    if counts.get(p2pool_data.NewShare.VERSION, 0) < sum(counts.itervalues())*95//100:
+                        share_type = p2pool_data.Share
+        
         if True:
-            share_info, gentx, other_transaction_hashes, get_share = p2pool_data.Share.generate_transaction(
+            share_info, gentx, other_transaction_hashes, get_share = share_type.generate_transaction(
                 tracker=self.tracker,
                 share_data=dict(
                     previous_share_hash=self.best_share_var.value,
@@ -201,7 +215,7 @@ class WorkerBridge(worker_interface.WorkerBridge):
                         'doa' if doas > doas_recorded_in_chain else
                         None
                     )(*self.get_stale_counts()),
-                    desired_version=5,
+                    desired_version=p2pool_data.NewShare.VERSION,
                 ),
                 block_target=self.current_work.value['bits'].target,
                 desired_timestamp=int(time.time() + 0.5),