Example #1
0
def process_new_block(request_data: bytes) -> str:
    global BLOCKCHAIN
    block_json = decompress(request_data)
    if block_json:
        try:
            block = Block.from_json(block_json).object()
            # Check if block already exists
            if get_block_from_db(dhash(block.header)):
                logger.info("Server: Received block exists, doing nothing")
                return "Block already Received Before"
            if BLOCKCHAIN.add_block(block):
                logger.info(
                    "Server: Received a New Valid Block, Adding to Chain")

                logger.debug("Server: Sending new block to peers")
                # Broadcast block to other peers
                send_to_all_peers("/newblock", request_data)
            else:
                return "Block Received, but was not added, due to some error"
        except Exception as e:
            logger.error("Server: New Block: invalid block received " + str(e))
            return "Invalid Block Received"

        # Kill Miner
        t = Timer(1, miner.stop_mining)
        t.start()
        return "Block Received"
    logger.error("Server: Invalid Block Received")
    return "Invalid Block"
Example #2
0
def render_block_header(hdr):
    html = "<table>"

    html += "<tr><th>" + "Height" + "</th>"
    html += "<td>" + str(hdr.height) + "</td></tr>"

    html += "<tr><th>" + "Block Hash" + "</th>"
    html += "<td>" + dhash(hdr) + "</td></tr>"

    html += "<tr><th>" + "Prev Block Hash" + "</th>"
    html += "<td>" + str(hdr.prev_block_hash) + "</td></tr>"

    html += "<tr><th>" + "Merkle Root" + "</th>"
    html += "<td>" + str(hdr.merkle_root) + "</td></tr>"

    html += "<tr><th>" + "Timestamp" + "</th>"
    html += ("<td>" + str(
        datetime.fromtimestamp(hdr.timestamp).strftime("%d-%m-%Y %H:%M:%S")) +
             " (" + str(hdr.timestamp) + ")</td></tr>")

    # get block
    block = Block.from_json(get_block_from_db(dhash(hdr))).object()

    html += "<tr><th>" + "Transactions" + "</th>"
    html += "<td>" + str(len(block.transactions)) + "</td></tr>"

    # for i, transaction in enumerate(block.transactions):
    #     s = "coinbase: " + str(transaction.is_coinbase) + ", fees: " + str(transaction.fees)
    #     html += "<tr><th>Transaction " + str(i) + "</th><td>" + str(s) + "</td></tr>"

    html += "</table>"
    return str(html)
Example #3
0
def block(blockhash):
    log_ip(request, inspect.stack()[0][3])
    try:
        block = Block.from_json(get_block_from_db(blockhash)).object()
    except Exception as e:
        logger.debug("BLOCK/blockhash: " + str(e))
        return template("error.html")
    return template("block.html", block=block)
Example #4
0
def explorer():
    log_ip(request, inspect.stack()[0][3])
    prev = int(request.query.prev or 0)
    if prev < 0:
        prev = 0
    hdr_list = list(reversed(BLOCKCHAIN.active_chain.header_list))
    indexes = [i for i in range(prev * 8, (prev + 1) * 8) if i < len(hdr_list)]
    blocks = [Block.from_json(get_block_from_db(dhash(hdr_list[i]))).object() for i in indexes]
    transactions = list(BLOCKCHAIN.mempool)
    return template("explorer.html", blocks=blocks, transactions=transactions, prev=prev)
Example #5
0
def sync(peer_list):
    max_peer = max(peer_list, key=lambda k: k["blockheight"])
    r = requests.post(get_peer_url(max_peer) + "/getblockhashes/",
                      data={"myheight": len(ACTIVE_CHAIN)})
    hash_list = json.loads(r.text)
    for hhash in hash_list:
        peer_url = get_peer_url(random.choice(peer_list)) + "/getblock/"
        r = requests.post(peer_url, data={"headerhash": hhash})
        block = Block.from_json(r.text)
        if not ACTIVE_CHAIN.add_block(block):
            raise Exception("WTF")
Example #6
0
def transaction(blockhash, txhash):
    log_ip(request, inspect.stack()[0][3])
    try:
        block = Block.from_json(get_block_from_db(blockhash)).object()
        tx = None
        for t in block.transactions:
            if t.hash() == txhash:
                tx = t
    except Exception as e:
        logger.debug("Transaction/bhash/tx: " + str(e))
        return template("error.html")
    return template("transaction.html", tx=tx, block=block)
Example #7
0
def get_cc_co_cp_by_contract_address(
        contract_address: str) -> Tuple[str, str, str]:
    global BLOCKCHAIN

    tx_history = BLOCKCHAIN.active_chain.transaction_history
    txns = tx_history.get(contract_address)
    if len(txns) == 0:
        header_list = read_header_list_from_db()
        for header in reversed(header_list):
            block = Block.from_json(get_block_from_db(header)).object()
            for tx in block.transactions:
                if tx.get_contract_address() == contract_address:
                    return tx.contract_code, tx.contract_output, tx.contract_priv_key
    else:
        for tx in txns:
            tx = json.loads(tx)
            cc = tx.get('contract_code', '')
            if cc != '':
                return cc, tx.get('contract_output',
                                  ''), tx.get('contract_priv_key', '')
    return '', '', ''
Example #8
0
def receive_block_from_peer(peer: Dict[str, Any], header_hash) -> Block:
    r = requests.post(get_peer_url(peer) + "/getblock",
                      data={"headerhash": header_hash})
    return Block.from_json(decompress(r.text)).object()
Example #9
0
def receive_block_from_peer(peer: Dict[str, Any], header_hash) -> Block:
    r = requests.post(get_peer_url(peer), data={"header_hash": header_hash})
    return Block.from_json(r.text)