support for BIP 34 - version 2 blocks with height included in coinbase
authorForrest Voight <forrest@forre.st>
Wed, 8 Aug 2012 06:13:13 +0000 (02:13 -0400)
committerForrest Voight <forrest@forre.st>
Wed, 8 Aug 2012 14:24:07 +0000 (10:24 -0400)
p2pool/main.py
p2pool/work.py

index 9a52190..4cdc3b7 100644 (file)
@@ -37,6 +37,8 @@ def getwork(bitcoind):
             raise deferral.RetrySilentlyException()
         raise
     packed_transactions = [x.decode('hex') for x in work['transactions']]
+    if 'height' not in work:
+        work['height'] = (yield bitcoind.rpc_getblock(work['previousblockhash']))['height'] + 1
     defer.returnValue(dict(
         previous_block=int(work['previousblockhash'], 16),
         transactions=map(bitcoin_data.tx_type.unpack, packed_transactions),
@@ -45,6 +47,7 @@ def getwork(bitcoind):
         time=work['time'],
         bits=bitcoin_data.FloatingIntegerType().unpack(work['bits'].decode('hex')[::-1]) if isinstance(work['bits'], (str, unicode)) else bitcoin_data.FloatingInteger(work['bits']),
         coinbaseflags=work['coinbaseflags'].decode('hex') if 'coinbaseflags' in work else ''.join(x.decode('hex') for x in work['coinbaseaux'].itervalues()) if 'coinbaseaux' in work else '',
+        height=work['height'],
         clock_offset=time.time() - work['time'],
         last_update=time.time(),
     ))
index 84d6cb5..5ba9025 100644 (file)
@@ -9,7 +9,7 @@ from twisted.internet import defer
 from twisted.python import log
 
 import bitcoin.getwork as bitcoin_getwork, bitcoin.data as bitcoin_data
-from bitcoin import worker_interface
+from bitcoin import script, worker_interface
 from util import jsonrpc, variable, deferral, math, pack
 import p2pool, p2pool.data as p2pool_data
 
@@ -79,8 +79,7 @@ class WorkerBridge(worker_interface.WorkerBridge):
         
         self.current_work = variable.Variable(None)
         def compute_work():
-            t = dict(self.bitcoind_work.value)
-            
+            t = self.bitcoind_work.value
             bb = self.best_block_header.value
             if bb is not None and bb['previous_block'] == t['previous_block'] and net.PARENT.POW_FUNC(bitcoin_data.block_header_type.pack(bb)) <= t['bits'].target:
                 print 'Skipping from block %x to block %x!' % (bb['previous_block'],
@@ -89,6 +88,7 @@ class WorkerBridge(worker_interface.WorkerBridge):
                     previous_block=bitcoin_data.hash256(bitcoin_data.block_header_type.pack(bb)),
                     bits=bb['bits'], # not always true
                     coinbaseflags='',
+                    height=t['height'] + 1,
                     time=bb['timestamp'] + 600, # better way?
                     transactions=[],
                     merkle_link=bitcoin_data.calculate_merkle_link([None], 0),
@@ -185,7 +185,10 @@ class WorkerBridge(worker_interface.WorkerBridge):
                 tracker=self.tracker,
                 share_data=dict(
                     previous_share_hash=self.best_share_var.value,
-                    coinbase=(mm_data + self.current_work.value['coinbaseflags'])[:100],
+                    coinbase=(script.create_push_script([
+                        self.current_work.value['height'],
+                        mm_data,
+                    ]) + self.current_work.value['coinbaseflags'])[:100],
                     nonce=random.randrange(2**32),
                     pubkey_hash=pubkey_hash,
                     subsidy=self.current_work.value['subsidy'],
@@ -237,7 +240,7 @@ class WorkerBridge(worker_interface.WorkerBridge):
         bits = self.current_work.value['bits']
         previous_block = self.current_work.value['previous_block']
         ba = bitcoin_getwork.BlockAttempt(
-            version=1,
+            version=2,
             previous_block=self.current_work.value['previous_block'],
             merkle_root=merkle_root,
             timestamp=self.current_work.value['time'],