Beispiel #1
0
def get_block(rpc, session, hash):
    block = session.query(core.Block).filter_by(hash=hash).first()
    if block is not None:
        return block, block.transactions

    try:
        hash_string = hash_integer_to_string(hash)
        block_dict = rpc.getblock(hash_string)
    except HTTPError:
        raise MissingBlockHeader(hash)

    kwargs = {}
    kwargs['version'] = int(block_dict['version'])
    if int(block_dict['height']) > 0:
        kwargs['parent_hash'] = hash_string_to_integer(
            block_dict['previousblockhash'])
    else:
        kwargs['parent_hash'] = 0
    kwargs['merkle_hash'] = hash_string_to_integer(block_dict['merkleroot'])
    kwargs['time'] = datetime.utcfromtimestamp(block_dict['time'])
    kwargs['bits'] = hash_string_to_integer(block_dict['bits'], 4)
    kwargs['nonce'] = int(block_dict['nonce'])
    block = core.Block(**kwargs)
    assert block.hash == hash

    for tx_hash_string in block_dict['tx']:
        tx_hash = hash_string_to_integer(tx_hash_string)
        tx = session.query(core.Transaction).filter_by(hash=tx_hash).first()
        if tx is None:
            try:
                tx_raw = rpc.getrawtransaction(tx_hash_string)
            except HTTPError:
                raise MissingTransaction(tx_hash)
            tx_file = StringIO(tx_raw.decode('hex'))
            tx = core.Transaction.deserialize(tx_file)
            assert not tx_file.read()
            assert tx.hash == tx_hash
        block.transactions.append(tx)

    session.add(block)
    session.flush()

    return block, block.transactions
Beispiel #2
0
def get_block(rpc, session, hash):
    block = session.query(core.Block).filter_by(hash=hash).first()
    if block is not None:
        return block, block.transactions

    try:
        hash_string = hash_integer_to_string(hash)
        block_dict = rpc.getblock(hash_string)
    except HTTPError:
        raise MissingBlockHeader(hash)

    kwargs = {}
    kwargs['version'] = int(block_dict['version'])
    if int(block_dict['height']) > 0:
        kwargs['parent_hash'] = hash_string_to_integer(block_dict['previousblockhash'])
    else:
        kwargs['parent_hash'] = 0
    kwargs['merkle_hash'] = hash_string_to_integer(block_dict['merkleroot'])
    kwargs['time']        = datetime.utcfromtimestamp(block_dict['time'])
    kwargs['bits']        = hash_string_to_integer(block_dict['bits'], 4)
    kwargs['nonce']       = int(block_dict['nonce'])
    block = core.Block(**kwargs)
    assert block.hash == hash

    for tx_hash_string in block_dict['tx']:
        tx_hash = hash_string_to_integer(tx_hash_string)
        tx = session.query(core.Transaction).filter_by(hash=tx_hash).first()
        if tx is None:
            try:
                tx_raw = rpc.getrawtransaction(tx_hash_string)
            except HTTPError:
                raise MissingTransaction(tx_hash)
            tx_file = StringIO(tx_raw.decode('hex'))
            tx = core.Transaction.deserialize(tx_file)
            assert not tx_file.read()
            assert tx.hash == tx_hash
        block.transactions.append(tx)

    session.add(block)
    session.flush()

    return block, block.transactions
 def process_result_value(self, value, dialect):
     if value is None:
         return None
     file_ = StringIO(value)
     bitlength = deserialize_varint(file_)
     return self._implicit + Bits(bytes=file_.read(), length=bitlength)
Beispiel #4
0
            genesis_hash       = hash256(parameters.genesis[:80]).intdigest(),
            testnet            = parameters.testnet,
            pubkey_hash_prefix = parameters.pubkey_hash_prefix,
            script_hash_prefix = parameters.script_hash_prefix,
            secret_prefix      = parameters.secret_prefix)

        session.add(chain)
        session.commit()

    genesis_block_hash_string = rpc.getblockhash(0)
    genesis_block_hash = hash_string_to_integer(genesis_block_hash_string)

    genesis_file = StringIO(CHAIN_PARAMETERS[FLAGS.network].genesis)
    genesis_block = core.Block.deserialize(genesis_file)
    genesis_transactions = list(deserialize_list(genesis_file, core.Transaction.deserialize))
    assert not genesis_file.read()

    for tx in genesis_transactions:
        genesis_block.transactions.append(
            session.query(core.Transaction).filter_by(hash=tx.hash).first() or tx)

    assert genesis_block.hash == genesis_block_hash
    assert genesis_block.merkle_hash == merkle(genesis_transactions)

    query = session.query(core.Block).filter_by(hash=genesis_block.hash)
    if query.count():
        genesis_block = query.first()
    else:
        session.add(genesis_block)
        session.commit()
Beispiel #5
0
 def process_result_value(self, value, dialect):
     if value is None:
         return None
     file_ = StringIO(value)
     bitlength = deserialize_varint(file_)
     return self._implicit + Bits(bytes=file_.read(), length=bitlength)
Beispiel #6
0
                           testnet=parameters.testnet,
                           pubkey_hash_prefix=parameters.pubkey_hash_prefix,
                           script_hash_prefix=parameters.script_hash_prefix,
                           secret_prefix=parameters.secret_prefix)

        session.add(chain)
        session.commit()

    genesis_block_hash_string = rpc.getblockhash(0)
    genesis_block_hash = hash_string_to_integer(genesis_block_hash_string)

    genesis_file = StringIO(CHAIN_PARAMETERS[FLAGS.network].genesis)
    genesis_block = core.Block.deserialize(genesis_file)
    genesis_transactions = list(
        deserialize_list(genesis_file, core.Transaction.deserialize))
    assert not genesis_file.read()

    for tx in genesis_transactions:
        genesis_block.transactions.append(
            session.query(core.Transaction).filter_by(hash=tx.hash).first()
            or tx)

    assert genesis_block.hash == genesis_block_hash
    assert genesis_block.merkle_hash == merkle(genesis_transactions)

    query = session.query(core.Block).filter_by(hash=genesis_block.hash)
    if query.count():
        genesis_block = query.first()
    else:
        session.add(genesis_block)
        session.commit()