示例#1
0
 def mine_block(hash_prev,
                block_height,
                time_source,
                difficulty_bits,
                transactions,
                coinbase_txout_list,
                coinbase_flags=["/P2SH/"],
                nonce_changer=default_nonce_changer):
     template = BlockheaderTemplate(hash_prev,
                                    block_height,
                                    coinbase_txout_list,
                                    transactions,
                                    time_source.get_time(),
                                    difficulty_bits,
                                    coinbase_flags=coinbase_flags)
     difficulty_target = uint256_difficulty(difficulty_bits)
     hash_found = False
     while not hash_found:
         hash = Uint256.from_bytestr(doublesha256(
             template.get_serialized()))
         if (hash <= difficulty_target):
             hash_found = True
         else:
             nonce_changer(template)
     return (template.get_block(), template)
示例#2
0
def retarget(time_2weekago, 
             time_now, 
             target_timespan,
             current_target, # compact format
             proof_of_work_limit):
    actual_timespan = time_now - time_2weekago
    # Limit adjustment step
    if actual_timespan < target_timespan/4:
        actual_timespan = target_timespan/4;
    if actual_timespan > target_timespan*4:
        actual_timespan = target_timespan*4;
    # Retarget
    new_target = Uint256.from_bignum(uint256_difficulty(current_target).get_bignum() * actual_timespan / target_timespan)
    if new_target > proof_of_work_limit:
        new_target = proof_of_work_limit
    return compact_difficulty(new_target)
示例#3
0
def retarget(
        time_2weekago,
        time_now,
        target_timespan,
        current_target,  # compact format
        proof_of_work_limit):
    actual_timespan = time_now - time_2weekago
    # Limit adjustment step
    if actual_timespan < target_timespan / 4:
        actual_timespan = target_timespan / 4
    if actual_timespan > target_timespan * 4:
        actual_timespan = target_timespan * 4
    # Retarget
    new_target = Uint256.from_bignum(
        uint256_difficulty(current_target).get_bignum() * actual_timespan /
        target_timespan)
    if new_target > proof_of_work_limit:
        new_target = proof_of_work_limit
    return compact_difficulty(new_target)
示例#4
0
文件: mining.py 项目: sirk390/coinpy
 def mine_block(hash_prev,
                block_height,
                time_source,
                difficulty_bits,
                transactions, 
                coinbase_txout_list,
                coinbase_flags=["/P2SH/"],
                nonce_changer=default_nonce_changer):
     template = BlockheaderTemplate(hash_prev, 
                                    block_height,
                                    coinbase_txout_list, 
                                    transactions, 
                                    time_source.get_time(), 
                                    difficulty_bits,
                                    coinbase_flags=coinbase_flags)
     difficulty_target = uint256_difficulty(difficulty_bits)
     hash_found = False
     while not hash_found:
         hash = Uint256.from_bytestr(doublesha256(template.get_serialized()))
         if (hash <= difficulty_target):
             hash_found = True
         else:
             nonce_changer(template)
     return (template.get_block(), template)
示例#5
0
 def test_uint256_difficulty(self):
     value = uint256_difficulty(0x1d00ffff)
     assert value == Uint256.from_bignum(0x00000000FFFF0000000000000000000000000000000000000000000000000000)
     value = uint256_difficulty(0x1b0404cb)
     assert value == Uint256.from_bignum(0x00000000000404cb000000000000000000000000000000000000000000000000)
示例#6
0

if __name__ == '__main__':
    from coinpy.model.genesis import GENESIS
    from coinpy.model.protocol.runmode import UNITNET
    from coinpy.lib.blocks.difficulty import uint256_difficulty
    from coinpy.tools.hex import decodehexstr
    from coinpy.model.scripts.instruction import Instruction
    from coinpy.model.scripts.opcodes import OP_CHECKSIG
    from coinpy.model.scripts.opcodes import OP_PUSHDATA
    from coinpy.model.scripts.script import Script
    import struct
    from coinpy.tools.hex import hexstr

    print hexstr(struct.pack("<I", 213566))
    print uint256_difficulty(524287999)
    time_source = SystemTimeSource()
    miner = BitcoinMiner()

    block = miner.mine_block(
        hash_prev=Uint256.from_hexstr(
            "0000000000000000000000000000000000000000000000000000000000000000"
        ),
        block_height=0,
        time_source=time_source,
        difficulty_bits=524287999,
        transactions=[],
        coinbase_txout_list=[
            TxOut(
                5000000000,
                Script([
示例#7
0
文件: mining.py 项目: sirk390/coinpy
                hash_found = True
            else:
                nonce_changer(template)
        return (template.get_block(), template)

if __name__ == '__main__':
    from coinpy.model.genesis import GENESIS
    from coinpy.model.protocol.runmode import UNITNET
    from coinpy.lib.blocks.difficulty import uint256_difficulty
    from coinpy.tools.hex import decodehexstr
    from coinpy.model.scripts.instruction import Instruction
    from coinpy.model.scripts.opcodes import OP_CHECKSIG
    from coinpy.model.scripts.opcodes import OP_PUSHDATA
    from coinpy.model.scripts.script import Script
    import struct
    from coinpy.tools.hex import hexstr
    
    print hexstr(struct.pack("<I", 213566))
    print  uint256_difficulty(524287999)
    time_source = SystemTimeSource()
    miner = BitcoinMiner()
    
    block = miner.mine_block(hash_prev=Uint256.from_hexstr("0000000000000000000000000000000000000000000000000000000000000000"), 
                             block_height=0,
                             time_source=time_source, 
                             difficulty_bits=524287999, 
                             transactions=[], 
                             coinbase_txout_list=[TxOut(5000000000, Script([Instruction(OP_PUSHDATA, decodehexstr("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f")),Instruction(OP_CHECKSIG)]))],
                             coinbase_flags=[])
    print block