Ejemplo n.º 1
0
    def get_last_block_number(self):
        val = KeyValue(self.db).get_by_section_key('blocks',
                                                   'last_block_number')
        if not val:
            return 0

        last_block = val['last_block']
        return last_block
Ejemplo n.º 2
0
    def __init__(self):
        self.communication = OracleCommunication()
        self.db = OracleDb()
        self.btc = BitcoinClient()
        self.kv = KeyValue(self.db)

        self.task_queue = TaskQueue(self.db)

        self.handlers = op_handlers
        self.signer = TransactionSigner(self)
Ejemplo n.º 3
0
    def __init__(self):

        self.db = OracleDb()
        self.btc = BitcoinClient()
        self.kv = KeyValue(self.db)

        self.task_queue = TaskQueue(self.db)

        self.handlers = op_handlers
        self.signer = TransactionSigner(self)

        last_received = self.kv.get_by_section_key('fastcast', 'last_epoch')
        if not last_received:
            self.kv.store('fastcast', 'last_epoch', {'last': 0})

        self.set_fastcast_address()
Ejemplo n.º 4
0
    def set_last_block(self):
        last_block_number = self.btc.get_block_count()

        # We need to satisfy a condition on looking only for blocks with at
        # least CONFIRMATIONS of confirmations
        satisfied = False

        while not satisfied:
            block_hash = self.btc.get_block_hash(last_block_number)
            block = self.btc.get_block(block_hash)
            if block['confirmations'] >= CONFIRMATIONS:
                satisfied = True
            else:
                last_block_number -= 1

        KeyValue(self.db).store('blocks', 'last_block_number',
                                {'last_block': last_block_number})
        return last_block_number
Ejemplo n.º 5
0
    def __init__(self):

        self.db = OracleDb()
        self.btc = BitcoinClient()
        self.kv = KeyValue(self.db)

        self.task_queue = TaskQueue(self.db)

        self.handlers = op_handlers
        self.signer = TransactionSigner(self)

        last_received = self.kv.get_by_section_key('fastcast', 'last_epoch')
        if not last_received:
            self.kv.store('fastcast', 'last_epoch', {'last': 0})

        if not self.kv.exists('fastcast', 'address'):
            pub, priv = generateKey()
            self.kv.store('fastcast', 'address', {"pub": pub, "priv": priv})

        logging.info('fastcast pubkey: %r' %
                     self.kv.get_by_section_key('fastcast', 'address')['pub'])
Ejemplo n.º 6
0
    def run(self):

        if not ORACLE_ADDRESS:
            self.oracle_address = self.kv.get_by_section_key(
                'config', 'ORACLE_ADDRESS')

            if self.oracle_address is None:
                new_addr = self.btc.server.getnewaddress()
                self.oracle_address = new_addr
                logging.error("created a new address: '%s'" % new_addr)
                self.kv.store('config', 'ORACLE_ADDRESS', new_addr)
        else:
            self.oracle_address = ORACLE_ADDRESS

        logging.info("my fee: %r" % ORACLE_FEE)
        logging.info("my bitcoin address is %s" % self.oracle_address)
        logging.info("my bitcoin pubkey: %r" %
                     self.btc.validate_address(self.oracle_address)['pubkey'])

        while True:
            # Proceed all requests
            requests = getMessages()
            requests = requests['results']

            requests = self.filter_requests(requests)

            for prev_request in requests:
                try:
                    request = self.prepare_request(prev_request)
                except MissingOperationError:
                    logging.info(
                        'message doesn\'t have operation field, invalid')
                    logging.info(prev_request)
                    continue
                except FastcastProtocolError:
                    logging.info('message does not have all required fields')
                    logging.info(prev_request)
                    continue
                self.handle_request(request)

            task = self.task_queue.get_oldest_task()
            while task is not None:
                self.handle_task(task)
                self.task_queue.done(task)
                task = self.task_queue.get_oldest_task()

            try:
                new_block = self.get_new_block()
            except:
                new_block = None
                logging.exception('problematic block!')

            if new_block:
                handlers = op_handlers.iteritems()

                addresses_per_handler = {}
                all_addresses = set()

                # Every handler can wait for transactions occuring on some addresses
                for name, handler in handlers:
                    addresses = handler(self).get_observed_addresses()
                    addresses_per_handler[name] = addresses
                    for address in addresses:
                        all_addresses.add(address)

                transactions = self.btc.get_transactions_from_block(
                    new_block, list(all_addresses))

                handlers = op_handlers.iteritems()
                for name, handler in handlers:
                    addresses = addresses_per_handler[name]
                    handler_transactions = []
                    for address in addresses:
                        if address in transactions:
                            handler_transactions.extend(transactions[address])
                    handler(self).handle_new_transactions(handler_transactions)

                KeyValue(self.db).update('blocks', 'last_block_number',
                                         {'last_block': new_block['height']})

            time.sleep(10)