def test_miner_verify(self): class CustomQMiner(Qryptominer): def __init__(self): Qryptominer.__init__(self) def handleEvent(self, event): if event.type == pyqryptonight.SOLUTION: print("Hey a solution has been found!", event.nonce) self.python_nonce = event.nonce return True input_bytes = [ 0x03, 0x05, 0x07, 0x09, 0x03, 0x05, 0x07, 0x09, 0x03, 0x05, 0x07, 0x09, 0x03, 0x05, 0x07, 0x09, 0x03, 0x05, 0x07, 0x09, 0x03, 0x05, 0x07, 0x09, 0x03, 0x05, 0x07, 0x09, 0x03, 0x05, 0x07, 0x09, 0x03, 0x05, 0x07, 0x09, 0x03, 0x05, 0x07, 0x09, 0x03, 0x05, 0x07, 0x09, 0x03, 0x05, 0x07, 0x09, 0x03, 0x05, 0x07, 0x09, 0x03, 0x05, 0x07, 0x09, 0x03, 0x05, 0x07, 0x09, 0x03, 0x05, 0x07, 0x09 ] target = [ 0x1E, 0xE5, 0x3F, 0xE1, 0xAC, 0xF3, 0x55, 0x92, 0x66, 0xD8, 0x43, 0x89, 0xCE, 0xDE, 0x99, 0x33, 0xC6, 0x8F, 0xC5, 0x1E, 0xD0, 0xA6, 0xC7, 0x91, 0xF8, 0xF9, 0xE8, 0x9D, 0xB6, 0x23, 0xF0, 0x0C ] # Create a customized miner qm = CustomQMiner() # Set input bytes, nonce qm.start(input=input_bytes, nonceOffset=0, target=target, thread_count=2) # Python can sleep or do something else.. the callback will happen in the background time.sleep(5) # This property has been just created in the python custom class when the event is received self.assertEqual(37, qm.python_nonce) self.assertEqual(True, qm.solutionAvailable()) self.assertEqual(37, qm.solutionNonce()) solution_input = list(qm.solutionInput()) print("input_bytes ", input_bytes) print("solution_input ", solution_input) print("target ", target) print("solutionHash ", qm.solutionHash()) qn = Qryptonight() output = qn.hash(solution_input) print("raw Hash ", output) ph = PoWHelper() self.assertTrue(ph.verifyInput(solution_input, target)) solution_input[4] = 0x29 self.assertFalse(ph.verifyInput(solution_input, target))
def validate_mining_nonce(self, block, enable_logging=False): parent_metadata = self.state.get_block_metadata(block.prev_headerhash) parent_block = self.state.get_block(block.prev_headerhash) input_bytes = StringToUInt256(str(block.mining_nonce))[-4:] + tuple(block.mining_hash) measurement = self.state.get_measurement(block.timestamp, block.prev_headerhash) diff, target = self._difficulty_tracker.get( measurement=measurement, parent_difficulty=parent_metadata.block_difficulty) if enable_logging: logger.debug('-----------------START--------------------') logger.debug('Validate #%s', block.block_number) logger.debug('block.timestamp %s', block.timestamp) logger.debug('parent_block.timestamp %s', parent_block.timestamp) logger.debug('parent_block.difficulty %s', UInt256ToString(parent_metadata.block_difficulty)) logger.debug('input_bytes %s', UInt256ToString(input_bytes)) logger.debug('diff : %s | target : %s', UInt256ToString(diff), target) logger.debug('-------------------END--------------------') if not PoWHelper.verifyInput(input_bytes, target): if enable_logging: logger.warning("PoW verification failed") qn = Qryptonight() tmp_hash = qn.hash(input_bytes) logger.warning("{}".format(tmp_hash)) logger.debug('%s', block.to_json()) return False return True
class PoWValidator(object, metaclass=Singleton): def __init__(self): self.lock = threading.Lock() self._powv = PoWHelper() def verify_input(self, mining_blob, target): return self._verify_input_cached(mining_blob, target) @functools.lru_cache(maxsize=5) def _verify_input_cached(self, mining_blob, target): return self._powv.verifyInput(mining_blob, target)
def verify_input_cached(self, mining_blob, target): return PoWHelper.verifyInput(mining_blob, target)