Advertisement
Guest User

merged mining manager diff

a guest
Oct 11th, 2011
284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 5.91 KB | None | 0 0
  1. From 237ae44ec9516c5826b698da9d8ea29d23b1fc08 Mon Sep 17 00:00:00 2001
  2. From: Luke Dashjr <luke-jr+git@utopios.org>
  3. Date: Mon, 10 Oct 2011 14:54:28 -0400
  4. Subject: [PATCH] Hack in support for getworkaux/gotwork design
  5.  
  6. ---
  7. contrib/merged-mine-proxy |   64 ++++++++++++++++++--------------------------
  8.  1 files changed, 26 insertions(+), 38 deletions(-)
  9.  
  10. diff --git a/contrib/merged-mine-proxy b/contrib/merged-mine-proxy
  11. index 4c38215..ab8b1dc 100755
  12. --- a/contrib/merged-mine-proxy
  13. +++ b/contrib/merged-mine-proxy
  14. @@ -282,10 +282,16 @@ class Listener(Server):
  15.              self.aux_targets[chain] = reverse_chunks(aux_block['target'], 2) # fix endian
  16.  
  17.          # create merkle tree
  18. -        merkle_tree = (yield self.parent.rpc_buildmerkletree(*merkle_leaves))
  19. +        #merkle_tree = (yield self.parent.rpc_buildmerkletree(*merkle_leaves))
  20. +        merkle_tree = merkle_leaves  # HACK
  21.          merkle_root = merkle_tree[-1]
  22.  
  23.          if not self.merkle_trees.has_key(merkle_root):
  24. +            # Tell bitcoind the new merkle root
  25. +            MMAux = merkle_root + ("%02x000000" % self.merkle_size) + "00000000"
  26. +            MMAux = '4d4d3d3d' + MMAux
  27. +            self.parent.rpc_setworkaux('MM', MMAux)
  28. +            
  29.              # remember new tree
  30.              self.merkle_trees[merkle_root] = merkle_tree
  31.              self.merkle_tree_queue.append(merkle_root)
  32. @@ -324,26 +330,23 @@ class Listener(Server):
  33.              raise
  34.  
  35.      @defer.inlineCallbacks
  36. -    def rpc_getwork(self, data=None):
  37. -        ''' This rpc call generates bitcoin miner compatible work from data received
  38. -        from the aux and parent chains.
  39. -        '''
  40. +    def rpc_gotwork(self, solution):
  41.          try:
  42. -            if data:
  43.                  # Submit work upstream
  44.                  any_solved = False
  45.                  aux_solved = []
  46.  
  47. -                # get merkle root
  48. -                solution = (yield self.parent.rpc_getworkaux("", data))
  49. -
  50. -                if solution is False:
  51. -                    logger.error("stale work")
  52. +                parent_hash = solution['hash']
  53. +                blkhdr = solution['header']
  54. +                coinbaseMerkle = solution['coinbaseMrkl']
  55. +                pos = coinbaseMerkle.find('4d4d3d3d') + 8
  56. +                if not pos:
  57. +                    logger.error("failed to find aux in coinbase")
  58.                      defer.returnValue(False)
  59.                      return
  60. +                slnaux = coinbaseMerkle[pos:pos+80]
  61.  
  62. -                parent_hash = solution['hash']
  63. -                merkle_root = solution['aux'][:-16] # strip off size and nonce
  64. +                merkle_root = slnaux[:-16] # strip off size and nonce
  65.                  if not self.merkle_trees.has_key(merkle_root):
  66.                      logger.error("stale merkle root %s", merkle_root)
  67.                      defer.returnValue(False)
  68. @@ -356,42 +359,27 @@ class Listener(Server):
  69.                      chain_merkle_index = self.calc_merkle_index(chain)
  70.                      aux_solved.append(False)
  71.                      # try submitting if under target
  72. -                    if self.aux_targets[chain] > parent_hash and not chain_merkle_index is None:
  73. +                    # TODO: self.aux_targets[chain] > parent_hash and
  74. +                    if not chain_merkle_index is None:
  75.                          branch = self.merkle_branch(chain_merkle_index, merkle_tree)
  76. +                        """
  77.                          proof = (
  78.                              yield self.parent.rpc_getworkaux("", data, chain_merkle_index, *branch))
  79.                          if proof is False:
  80.                              logger.error("aux pow request rejected by parent, chain %d", chain)
  81.                          else:
  82. -                            aux_hash = merkle_tree[chain_merkle_index]
  83. -                            aux_solved[-1] = (
  84. -                                yield self.auxs[chain].rpc_getauxblock(aux_hash, proof['auxpow']))
  85. -                            any_solved = any_solved or aux_solved[-1]
  86. -
  87. -                # submit to parent
  88. -                parent_solved = (yield self.parent.rpc_getworkaux("submit", data))
  89. -                any_solved = any_solved or parent_solved
  90. +                        """
  91. +                        auxpow = coinbaseMerkle + "0000000000" + blkhdr
  92. +                        aux_hash = merkle_tree[chain_merkle_index]
  93. +                        aux_solved[-1] = (
  94. +                                yield self.auxs[chain].rpc_getauxblock(aux_hash, auxpow))
  95. +                        any_solved = any_solved or aux_solved[-1]
  96.  
  97.                  logger.info("%s,solve,%s,%s,%s", datetime.utcnow().isoformat(),
  98. -                                            "1" if parent_solved else "0",
  99. +                                            "?",
  100.                                              ",".join(["1" if solve else "0" for solve in aux_solved]),
  101.                                              parent_hash)
  102.                  defer.returnValue(any_solved)
  103. -            else:
  104. -                # Get work based on the latest tree
  105. -                merkle_root = self.merkle_tree_queue[-1]
  106. -                # nonce = 0, one byte merkle size
  107. -                aux = merkle_root + ("%02x000000" % self.merkle_size) + "00000000"
  108. -                work = (yield self.parent.rpc_getworkaux(aux))
  109. -                if self.rewrite_target:
  110. -                    work['target'] = self.rewrite_target
  111. -                else:
  112. -                    # Find highest target
  113. -                    targets = [reverse_chunks(work['target'], 2)] # fix endian
  114. -                    targets.extend(self.aux_targets)
  115. -                    targets.sort()
  116. -                    work['target'] = reverse_chunks(targets[-1], 2) # fix endian
  117. -                defer.returnValue(work)
  118.          except Exception:
  119.              # Exceptions here are normally already handled by the rpc functions
  120.              #logger.debug(traceback.format_exc())
  121. --
  122. 1.7.3.4
  123.  
  124.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement