Esempio n. 1
0
def decoderawblock(rawblock):
    block_hex = binascii.unhexlify(rawblock)
    bversion  = block_hex[:4]
    bpbhash   = block_hex[4:36]
    bmkroot   = block_hex[36:68]
    btime     = block_hex[68:72]
    bbits     = block_hex[72:76]
    bnonce    = block_hex[76:80]

    block = {}
    block['hash']       = format_hash(x11_hash.getPoWHash(block_hex[:80]))
    block['version']    = decode_uint32(bversion)
    block['p_b_hash']   = format_hash(bpbhash)
    block['merkleroot'] = format_hash(bmkroot)
    block['time']       = decode_uint32(btime)
    block['difficulty'] = calc_difficulty(decode_uint32(bbits))
    block['nonce']      = decode_uint32(bnonce)

    transaction_data = block_hex[80:]
    n_transactions, offset = decode_varint(transaction_data)

    txs = {}
    for i in range(n_transactions):
        transaction = Transactionfromhex(transaction_data[offset:])
        offset += transaction[0]
        rawtx = binascii.hexlify(transaction[1]).decode("utf-8")
        rawtx_hash = format_hash(double_sha256(transaction[1]))
        txs[rawtx_hash] = rawtx

    block['txs'] = txs

    return block
Esempio n. 2
0
 def header_hash(cls, header):
     '''
     Given a header return the hash for AXE.
     Need to download `axe_hash` module
     Source code: https://github.com/AXErunners/axe_hash
     '''
     import x11_hash
     return x11_hash.getPoWHash(header)
Esempio n. 3
0
 def calc_x11(self):
     if self.x11 is None:
         r = []
         r.append(struct.pack("<i", self.nVersion))
         r.append(ser_uint256(self.hashPrevBlock))
         r.append(ser_uint256(self.hashMerkleRoot))
         r.append(struct.pack("<I", self.nTime))
         r.append(struct.pack("<I", self.nBits))
         r.append(struct.pack("<I", self.nNonce))
         self.x11 = uint256_from_str(x11_hash.getPoWHash(''.join(r)))
     return self.x11
Esempio n. 4
0
 def calc_x11(self):
     if self.x11 is None:
        r = []
        r.append(struct.pack("<i", self.nVersion))
        r.append(ser_uint256(self.hashPrevBlock))
        r.append(ser_uint256(self.hashMerkleRoot))
        r.append(struct.pack("<I", self.nTime))
        r.append(struct.pack("<I", self.nBits))
        r.append(struct.pack("<I", self.nNonce))
        self.x11 = uint256_from_str(x11_hash.getPoWHash(''.join(r)))
     return self.x11                    
Esempio n. 5
0
def hash_func(string_value, algorithm):
    if algorithm.lower() == 'sha256':
        #  SHA256 хеш.
        hash_object = sha256(bytes(string_value, 'utf-8')).hexdigest()
        print('\nSHA256 хеш: ' + hash_object)
    elif algorithm.lower() == 'scrypt':
        #  SCrypt хеш.
        hash_object = scrypt.hash(password=string_value, salt=b'pass')
        print('\nSCrypt хеш: ' + str(hash_object))
    elif algorithm.lower() == 'x11':
        #  X11 хеш.
        hash_object = getPoWHash(bytes(string_value, 'utf-8'))
        print('\nX11 PoW: ' + str(hash_object))
    else:
        print(
            '\nФункция не поддерживает данный алгоритм или он написан с ошибкой.'
        )
Esempio n. 6
0
def PoWHash(x):
    if type(x) is unicode: x = x.encode('utf-8')
    return x11_hash.getPoWHash(x)
Esempio n. 7
0
 def test_x11(self):
     self.pow_hash = hexlify(x11_hash.getPoWHash(self.block_header))
     self.assertEqual(self.pow_hash, self.best_hash)
import x11_hash

__b58chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
__b58base = len(__b58chars)

global PUBKEY_ADDRESS
global SCRIPT_ADDRESS
PUBKEY_ADDRESS = 118
SCRIPT_ADDRESS = 28

def rev_hex(s):
    return s.decode('hex')[::-1].encode('hex')


Hash = lambda x: hashlib.sha256(hashlib.sha256(x).digest()).digest()
HashX11 = lambda x: x11_hash.getPoWHash(x)

hash_encode = lambda x: x[::-1].encode('hex')


hash_decode = lambda x: x.decode('hex')[::-1]


def header_to_string(res):
    pbh = res.get('prev_block_hash')
    if pbh is None:
        pbh = '0'*64

    return int_to_hex4(res.get('version')) \
           + rev_hex(pbh) \
           + rev_hex(res.get('merkle_root')) \
Esempio n. 9
0
 def test_x11_hash(self):
     self.pow_hash = hexlify(x11_hash.getPoWHash(self.block_header))
     self.assertEqual(self.pow_hash, self.best_hash)
Esempio n. 10
0
 def test_powhash(self):
     teststart = '700000005d385ba114d079970b29a9418fd0549e7d68a95c7f168621a314201000000000578586d149fd07b22f3a8a347c516de7052f034d2b76ff68e0d6ecff9b77a45489e3fd511732011df0731000';
     testbin = unhexlify(teststart)
     hash_bin = x11_hash.getPoWHash(testbin)
     self.assertEqual(hash_bin, unhexlify('ff2ca7dfd56dd50d25e77bfef267b82ade47f74f931b416aef35c70096d9d7b3'))
Esempio n. 11
0
__b58chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
__b58base = len(__b58chars)

global PUBKEY_ADDRESS
global SCRIPT_ADDRESS
PUBKEY_ADDRESS = 0
SCRIPT_ADDRESS = 5


def rev_hex(s):
    return s.decode('hex')[::-1].encode('hex')


# Use Seci's X11 Hash Function
HashX11 = lambda x: x11_hash.getPoWHash(x)

Hash = lambda x: hashlib.sha256(hashlib.sha256(x).digest()).digest()

hash_encode = lambda x: x[::-1].encode('hex')

hash_decode = lambda x: x.decode('hex')[::-1]


def header_to_string(res):
    pbh = res.get('prev_block_hash')
    if pbh is None:
        pbh = '0' * 64

    return int_to_hex4(res.get('version')) \
           + rev_hex(pbh) \
Esempio n. 12
0
def X11(x):
    return x11_hash.getPoWHash(x)
Esempio n. 13
0
    def submit_share(self, job_id, worker_name, session, extranonce1_bin,
                     extranonce2, ntime, nonce, difficulty, ip, submit_time):
        '''Check parameters and finalize block template. If it leads
           to valid block candidate, asynchronously submits the block
           back to the bitcoin network.
        
            - extranonce1_bin is binary. No checks performed, it should be from session data
            - job_id, extranonce2, ntime, nonce - in hex form sent by the client
            - difficulty - decimal number from session, again no checks performed
            - submitblock_callback - reference to method which receive result of submitblock()
        '''

        # Check if extranonce2 looks correctly. extranonce2 is in hex form...
        if len(extranonce2) != self.extranonce2_size * 2:
            raise SubmitException(
                "Incorrect size of extranonce2. Expected %d chars" %
                (self.extranonce2_size * 2))

        # Check for job
        job = self.get_job(job_id)
        if job == None:
            raise SubmitException("Job '%s' not found" % job_id)

        # Check if ntime looks correct
        if len(ntime) != 8:
            raise SubmitException("Incorrect size of ntime. Expected 8 chars")

        if not job.check_ntime(int(ntime, 16)):
            raise SubmitException("Ntime out of range")

        # Check nonce
        if len(nonce) != 8:
            raise SubmitException("Incorrect size of nonce. Expected 8 chars")

        # Check for duplicated submit
        if not job.register_submit(extranonce1_bin, extranonce2, ntime, nonce):
            log.info("Duplicate from %s, (%s %s %s %s)" % \
                    (worker_name, binascii.hexlify(extranonce1_bin), extranonce2, ntime, nonce))
            raise SubmitException("Duplicate share")

        # Now let's do the hard work!
        # ---------------------------

        # 0. Some sugar
        extranonce2_bin = binascii.unhexlify(extranonce2)
        ntime_bin = binascii.unhexlify(ntime)
        nonce_bin = binascii.unhexlify(nonce)

        # 1. Build coinbase
        coinbase_bin = job.serialize_coinbase(extranonce1_bin, extranonce2_bin)
        coinbase_hash = util.doublesha(coinbase_bin)

        # 2. Calculate merkle root
        merkle_root_bin = job.merkletree.withFirst(coinbase_hash)
        merkle_root_int = util.uint256_from_str(merkle_root_bin)

        # 3. Serialize header with given merkle, ntime and nonce
        header_bin = job.serialize_header(merkle_root_int, ntime_bin,
                                          nonce_bin)

        # 4. Reverse header and compare it with target of the user
        if settings.DAEMON_ALGO == 'scrypt':
            hash_bin = ltc_scrypt.getPoWHash(''.join(
                [header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
        elif settings.DAEMON_ALGO == 'x11':
            hash_bin = x11_hash.getPoWHash(''.join(
                [header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
        else:
            hash_bin = util.doublesha(''.join(
                [header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))

        hash_int = util.uint256_from_str(hash_bin)
        pow_hash_hex = "%064x" % hash_int
        header_hex = binascii.hexlify(header_bin)

        target_user = self.diff_to_target(difficulty)
        if hash_int > target_user:
            raise SubmitException("Share is above target")

        # Mostly for debugging purposes
        target_info = self.diff_to_target(50)
        if hash_int <= target_info:
            log.info("YAY, share with diff above 50")

        # Algebra tells us the diff_to_target is the same as hash_to_diff
        share_diff = float(self.diff_to_target(hash_int))

        block_hash_bin = util.doublesha(header_bin)
        block_hash_hex = block_hash_bin[::-1].encode('hex_codec')
        on_submit = None

        if hash_int <= job.target:
            log.info(
                "BLOCK CANDIDATE! %s diff(%f/%f)" %
                (block_hash_hex, share_diff, self.diff_to_target(job.target)))
            job.finalize(merkle_root_int, extranonce1_bin, extranonce2_bin,
                         int(ntime, 16), int(nonce, 16))

            if not job.is_valid():
                log.exception("FINAL JOB VALIDATION FAILED!")

            serialized = binascii.hexlify(job.serialize())
            if settings.SOLUTION_BLOCK_HASH:
                on_submit = self.bitcoin_rpc.submitblock(
                    serialized, block_hash_hex)
            else:
                on_submit = self.bitcoin_rpc.submitblock(
                    serialized, pow_hash_hex)

            if on_submit:
                self.update_block()

        if settings.SOLUTION_BLOCK_HASH:
            return (header_hex, block_hash_hex, share_diff, on_submit)
        else:
            return (header_hex, pow_hash_hex, share_diff, on_submit)
Esempio n. 14
0
    def submit_share(self,
                     job_id,
                     worker_name,
                     session,
                     extranonce1_bin,
                     extranonce2,
                     ntime,
                     nonce,
                     difficulty,
                     ip=False):
        '''Check parameters and finalize block template. If it leads
           to valid block candidate, asynchronously submits the block
           back to the bitcoin network.

            - extranonce1_bin is binary. No checks performed, it should be from session data
            - job_id, extranonce2, ntime, nonce - in hex form sent by the client
            - difficulty - decimal number from session
            - submitblock_callback - reference to method which receive result of submitblock()
            - difficulty is checked to see if its lower than the vardiff minimum target or pool target
              from conf/config.py and if it is the share is rejected due to it not meeting the requirements for a share

        '''
        if settings.VARIABLE_DIFF == True:
            # Share Diff Should never be 0
            if difficulty < settings.VDIFF_MIN_TARGET:
                log.exception(
                    "Worker %s @ IP: %s seems to be submitting Fake Shares" %
                    (worker_name, ip))
                raise SubmitException(
                    "Diff is %s Share Rejected Reporting to Admin" %
                    (difficulty))
        else:
            if difficulty < settings.POOL_TARGET:
                log.exception(
                    "Worker %s @ IP: %s seems to be submitting Fake Shares" %
                    (worker_name, ip))
                raise SubmitException(
                    "Diff is %s Share Rejected Reporting to Admin" %
                    (difficulty))

        # Check if extranonce2 looks correctly. extranonce2 is in hex form...
        if len(extranonce2) != self.extranonce2_size * 2:
            raise SubmitException(
                "Incorrect size of extranonce2. Expected %d chars" %
                (self.extranonce2_size * 2))

        # Check for job
        job = self.get_job(job_id, worker_name, ip)
        if job == None:
            raise SubmitException("Job '%s' not found" % job_id)

        # Check if ntime looks correct
        if len(ntime) != 8:
            raise SubmitException("Incorrect size of ntime. Expected 8 chars")

        if not job.check_ntime(int(ntime, 16)):
            raise SubmitException("Ntime out of range")

        # Check nonce
        if len(nonce) != 8:
            raise SubmitException("Incorrect size of nonce. Expected 8 chars")

        # Check for duplicated submit
        if not job.register_submit(extranonce1_bin, extranonce2, ntime, nonce):
            log.info("Duplicate from %s, (%s %s %s %s)" %
                     (worker_name, binascii.hexlify(extranonce1_bin),
                      extranonce2, ntime, nonce))
            raise SubmitException("Duplicate share")

        # Now let's do the hard work!
        # ---------------------------

        # 0. Some sugar
        extranonce2_bin = binascii.unhexlify(extranonce2)
        ntime_bin = binascii.unhexlify(ntime)
        nonce_bin = binascii.unhexlify(nonce)

        # 1. Build coinbase
        coinbase_bin = job.serialize_coinbase(extranonce1_bin, extranonce2_bin)
        coinbase_hash = util.doublesha(coinbase_bin)

        # 2. Calculate merkle root
        merkle_root_bin = job.merkletree.withFirst(coinbase_hash)
        merkle_root_int = util.uint256_from_str(merkle_root_bin)

        # 3. Serialize header with given merkle, ntime and nonce
        header_bin = job.serialize_header(merkle_root_int, ntime_bin,
                                          nonce_bin)

        # 4. Reverse header and compare it with target of the user
        if settings.COINDAEMON_ALGO == 'scrypt':
            hash_bin = ltc_scrypt.getPoWHash(''.join(
                [header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
        elif settings.COINDAEMON_ALGO == 'scrypt-jane':

            if settings.SCRYPTJANE_NAME == 'vtc_scrypt':
                hash_bin = scryptjane.getPoWHash(''.join(
                    [header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
            else:
                hash_bin = scryptjane.getPoWHash(
                    ''.join([
                        header_bin[i * 4:i * 4 + 4][::-1]
                        for i in range(0, 20)
                    ]), int(ntime, 16))

        elif settings.COINDAEMON_ALGO == 'nist5':
            hash_bin = nist5_hash.getPoWHash(''.join(
                [header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
        elif settings.COINDAEMON_ALGO == 'x11':
            hash_bin = x11_hash.getPoWHash(''.join(
                [header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
        elif settings.COINDAEMON_ALGO == 'x13':
            hash_bin = x13_hash.getPoWHash(''.join(
                [header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
        elif settings.COINDAEMON_ALGO == 'x15':
            hash_bin = x15_hash.getPoWHash(''.join(
                [header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
        elif settings.COINDAEMON_ALGO == 'quark':
            hash_bin = quark_hash.getPoWHash(''.join(
                [header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
        elif settings.COINDAEMON_ALGO == 'skeinhash':
            hash_bin = skeinhash.skeinhash(''.join(
                [header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
        else:
            hash_bin = util.doublesha(''.join(
                [header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))

        hash_int = util.uint256_from_str(hash_bin)
        scrypt_hash_hex = "%064x" % hash_int
        header_hex = binascii.hexlify(header_bin)
        if settings.COINDAEMON_ALGO == 'scrypt' or settings.COINDAEMON_ALGO == 'scrypt-jane':
            header_hex = header_hex + \
                "000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000"
        elif settings.COINDAEMON_ALGO == 'quark' or 'nist5' or 'x11' or 'x13' or 'x15':
            header_hex = header_hex + \
                "000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000"
        else:
            pass

        target_user = self.diff_to_target(difficulty)
        if hash_int > target_user:
            raise SubmitException("Share is above target")

        # Mostly for debugging purposes
        target_info = self.diff_to_target(100000)
        if hash_int <= target_info:
            log.info("Yay, share with diff above 100000")

        # Algebra tells us the diff_to_target is the same as hash_to_diff
        share_diff = int(self.diff_to_target(hash_int))

        # 5. Compare hash with target of the network
        if hash_int <= job.target:
            # Yay! It is block candidate!
            log.info("We found a block candidate! %s" % scrypt_hash_hex)

            # Reverse the header and get the potential block hash (for scrypt only)
            # if settings.COINDAEMON_ALGO == 'scrypt' or settings.COINDAEMON_ALGO == 'sha256d':
            #   if settings.COINDAEMON_Reward == 'POW':
            block_hash_bin = util.doublesha(''.join(
                [header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
            block_hash_hex = block_hash_bin[::-1].encode('hex_codec')
            # else:   block_hash_hex = hash_bin[::-1].encode('hex_codec')
            # else:  block_hash_hex = hash_bin[::-1].encode('hex_codec')
            # 6. Finalize and serialize block object
            job.finalize(merkle_root_int, extranonce1_bin, extranonce2_bin,
                         int(ntime, 16), int(nonce, 16))

            if not job.is_valid():
                # Should not happen
                log.exception(
                    "FINAL JOB VALIDATION FAILED!(Try enabling/disabling tx messages)"
                )

            # 7. Submit block to the network
            serialized = binascii.hexlify(job.serialize())
            on_submit = self.bitcoin_rpc.submitblock(serialized,
                                                     block_hash_hex,
                                                     scrypt_hash_hex)
            if on_submit:
                self.update_block()

            if settings.SOLUTION_BLOCK_HASH:
                return (header_hex, block_hash_hex, share_diff, on_submit)
            else:
                return (header_hex, scrypt_hash_hex, share_diff, on_submit)

        if settings.SOLUTION_BLOCK_HASH:
            # Reverse the header and get the potential block hash (for scrypt only)
            # only do this if we want to send in the block hash to the shares table
            block_hash_bin = util.doublesha(''.join(
                [header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
            block_hash_hex = block_hash_bin[::-1].encode('hex_codec')
            return (header_hex, block_hash_hex, share_diff, None)
        else:
            return (header_hex, scrypt_hash_hex, share_diff, None)
Esempio n. 15
0
def X11Hash(x):
    return x11_hash.getPoWHash(x)
Esempio n. 16
0
    def submit_share(
        self, job_id, worker_name, session, extranonce1_bin, extranonce2, ntime, nonce,
        difficulty, ip=False):
        '''Check parameters and finalize block template. If it leads
           to valid block candidate, asynchronously submits the block
           back to the bitcoin network.

            - extranonce1_bin is binary. No checks performed, it should be from session data
            - job_id, extranonce2, ntime, nonce - in hex form sent by the client
            - difficulty - decimal number from session
            - submitblock_callback - reference to method which receive result of submitblock()
            - difficulty is checked to see if its lower than the vardiff minimum target or pool target
              from conf/config.py and if it is the share is rejected due to it not meeting the requirements for a share

        '''
        if settings.VARIABLE_DIFF == True:
            # Share Diff Should never be 0
            if difficulty < settings.VDIFF_MIN_TARGET:
                log.exception(
                    "Worker %s @ IP: %s seems to be submitting Fake Shares" % (worker_name, ip))
                raise SubmitException(
                    "Diff is %s Share Rejected Reporting to Admin" % (difficulty))
        else:
            if difficulty < settings.POOL_TARGET:
                log.exception(
                    "Worker %s @ IP: %s seems to be submitting Fake Shares" % (worker_name, ip))
                raise SubmitException(
                    "Diff is %s Share Rejected Reporting to Admin" % (difficulty))

        # Check if extranonce2 looks correctly. extranonce2 is in hex form...
        if len(extranonce2) != self.extranonce2_size * 2:
            raise SubmitException(
                "Incorrect size of extranonce2. Expected %d chars" % (self.extranonce2_size * 2))

        # Check for job
        job = self.get_job(job_id, worker_name, ip)
        if job == None:
            raise SubmitException("Job '%s' not found" % job_id)

        # Check if ntime looks correct
        if len(ntime) != 8:
            raise SubmitException("Incorrect size of ntime. Expected 8 chars")

        if not job.check_ntime(int(ntime, 16)):
            raise SubmitException("Ntime out of range")

        # Check nonce
        if len(nonce) != 8:
            raise SubmitException("Incorrect size of nonce. Expected 8 chars")

        # Check for duplicated submit
        if not job.register_submit(extranonce1_bin, extranonce2, ntime, nonce):
            log.info("Duplicate from %s, (%s %s %s %s)" %
                    (worker_name, binascii.hexlify(extranonce1_bin), extranonce2, ntime, nonce))
            raise SubmitException("Duplicate share")

        # Now let's do the hard work!
        # ---------------------------

        # 0. Some sugar
        extranonce2_bin = binascii.unhexlify(extranonce2)
        ntime_bin = binascii.unhexlify(ntime)
        nonce_bin = binascii.unhexlify(nonce)

        # 1. Build coinbase
        coinbase_bin = job.serialize_coinbase(extranonce1_bin, extranonce2_bin)
        coinbase_hash = util.doublesha(coinbase_bin)

        # 2. Calculate merkle root
        merkle_root_bin = job.merkletree.withFirst(coinbase_hash)
        merkle_root_int = util.uint256_from_str(merkle_root_bin)

        # 3. Serialize header with given merkle, ntime and nonce
        header_bin = job.serialize_header(
            merkle_root_int, ntime_bin, nonce_bin)

        # 4. Reverse header and compare it with target of the user
        if settings.COINDAEMON_ALGO == 'scrypt':
            hash_bin = ltc_scrypt.getPoWHash(
                ''.join([header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
        elif settings.COINDAEMON_ALGO == 'scrypt-jane':

            if settings.SCRYPTJANE_NAME == 'vtc_scrypt':
                hash_bin = scryptjane.getPoWHash(
                ''.join([header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
            else:
                hash_bin = scryptjane.getPoWHash(
                    ''.join([header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]), int(ntime, 16))

        elif settings.COINDAEMON_ALGO == 'nist5':
            hash_bin = nist5_hash.getPoWHash(
                ''.join([header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
        elif settings.COINDAEMON_ALGO == 'x11':
            hash_bin = x11_hash.getPoWHash(
                ''.join([header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
        elif settings.COINDAEMON_ALGO == 'x13':
            hash_bin = x13_hash.getPoWHash(
                ''.join([header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
        elif settings.COINDAEMON_ALGO == 'x15':
            hash_bin = x15_hash.getPoWHash(
                ''.join([header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
        elif settings.COINDAEMON_ALGO == 'quark':
            hash_bin = quark_hash.getPoWHash(
                ''.join([header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
        elif settings.COINDAEMON_ALGO == 'skeinhash':
            hash_bin = skeinhash.skeinhash(
                ''.join([header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
        else:
            hash_bin = util.doublesha(
                ''.join([header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))

        hash_int = util.uint256_from_str(hash_bin)
        scrypt_hash_hex = "%064x" % hash_int
        header_hex = binascii.hexlify(header_bin)
        if settings.COINDAEMON_ALGO == 'scrypt' or settings.COINDAEMON_ALGO == 'scrypt-jane':
            header_hex = header_hex + \
                "000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000"
        elif settings.COINDAEMON_ALGO == 'quark' or 'nist5' or 'x11' or 'x13' or 'x15':
            header_hex = header_hex + \
                "000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000"
        else:
            pass

        target_user = self.diff_to_target(difficulty)
        if hash_int > target_user:
            raise SubmitException("Share is above target")

        # Mostly for debugging purposes
        target_info = self.diff_to_target(100000)
        if hash_int <= target_info:
            log.info("Yay, share with diff above 100000")

        # Algebra tells us the diff_to_target is the same as hash_to_diff
        share_diff = int(self.diff_to_target(hash_int))

        # 5. Compare hash with target of the network
        if hash_int <= job.target:
            # Yay! It is block candidate!
            log.info("We found a block candidate! %s" % scrypt_hash_hex)

            # Reverse the header and get the potential block hash (for scrypt only)
            # if settings.COINDAEMON_ALGO == 'scrypt' or settings.COINDAEMON_ALGO == 'sha256d':
            #   if settings.COINDAEMON_Reward == 'POW':
            block_hash_bin = util.doublesha(
                ''.join([header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
            block_hash_hex = block_hash_bin[::-1].encode('hex_codec')
            # else:   block_hash_hex = hash_bin[::-1].encode('hex_codec')
            # else:  block_hash_hex = hash_bin[::-1].encode('hex_codec')
            # 6. Finalize and serialize block object
            job.finalize(merkle_root_int, extranonce1_bin,
                         extranonce2_bin, int(ntime, 16), int(nonce, 16))

            if not job.is_valid():
            # Should not happen
                log.exception(
                    "FINAL JOB VALIDATION FAILED!(Try enabling/disabling tx messages)")

            # 7. Submit block to the network
            serialized = binascii.hexlify(job.serialize())
            on_submit = self.bitcoin_rpc.submitblock(
                serialized, block_hash_hex, scrypt_hash_hex)
            if on_submit:
                self.update_block()

            if settings.SOLUTION_BLOCK_HASH:
                return (header_hex, block_hash_hex, share_diff, on_submit)
            else:
                return (header_hex, scrypt_hash_hex, share_diff, on_submit)

        if settings.SOLUTION_BLOCK_HASH:
        # Reverse the header and get the potential block hash (for scrypt only)
        # only do this if we want to send in the block hash to the shares table
            block_hash_bin = util.doublesha(
                ''.join([header_bin[i * 4:i * 4 + 4][::-1] for i in range(0, 20)]))
            block_hash_hex = block_hash_bin[::-1].encode('hex_codec')
            return (header_hex, block_hash_hex, share_diff, None)
        else:
            return (header_hex, scrypt_hash_hex, share_diff, None)
Esempio n. 17
0
def PoWHash(x):
    return x11_hash.getPoWHash(to_bytes(x))
Esempio n. 18
0
def PoWHash(x):
    if type(x) is unicode: x=x.encode('utf-8')
    return x11_hash.getPoWHash(x)
Esempio n. 19
0
 def header_hash(cls, header):
     '''Given a header return the hash.'''
     import x11_hash
     return x11_hash.getPoWHash(header)
Esempio n. 20
0
def hash_x11(data):
    import x11_hash
    return x11_hash.getPoWHash(data)