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)
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)
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)
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)
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)
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([
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