Esempio n. 1
0
                              settings['db'],
                              log,
                              mempool,
                              netmagic,
                              False,
                              False,
                              compression=settings['compression'])
    peermgr = PeerManager(log, mempool, chaindb, netmagic)

    if 'loadblock' in settings:
        chaindb.loadfile(settings['loadblock'])

    threads = []

    # start HTTP server for JSON-RPC
    rpcexec = rpc.RPCExec(peermgr, mempool, chaindb, log, settings['rpcuser'],
                          settings['rpcpass'])
    rpcserver = gevent.pywsgi.WSGIServer(('', settings['rpcport']),
                                         rpcexec.handle_request)
    t = gevent.Greenlet(rpcserver.serve_forever)
    threads.append(t)

    # connect to specified remote node
    c = peermgr.add(settings['host'], settings['port'])
    threads.append(c)

    if 'addnodes' in settings and settings['addnodes']:
        for node in settings['addnodes'].split():
            c = peermgr.add(node, settings['port'])
            threads.append(c)
            time.sleep(2)
Esempio n. 2
0
def run(config_file = '~/.bitcoinpy.cfg'):
    # check if configuration file exists
    if not os.path.isfile(os.path.expanduser(config_file)):
        print('No configuration file: {0}'.format(config_file))
        sys.exit(1)

    settings = {}
    f = open(os.path.expanduser(config_file))
    for line in f:
        m = re.search('^(\w+)\s*=\s*(\S.*)$', line)
        if m is None:
            continue
        settings[m.group(1)] = m.group(2)
    f.close()

    if 'host' not in settings:
        settings['host'] = '127.0.0.1'
    if 'port' not in settings:
        settings['port'] = 8333
    if 'rpcport' not in settings:
        settings['rpcport'] = 9332
    if 'db' not in settings:
        settings['db'] = '/tmp/chaindb'
    if 'chain' not in settings:
        settings['chain'] = 'mainnet'
    chain = settings['chain']
    if 'log' not in settings or (settings['log'] == '-'):
        settings['log'] = None

    # setup logging
    if settings['log']:
        logging.basicConfig(filename=settings['log'], level=logging.DEBUG)
    else:
        logging.basicConfig(level=logging.DEBUG)
    logger = logging.getLogger(__name__)

    if ('rpcuser' not in settings or
        'rpcpass' not in settings):
        logger.error("You must set the following in config: rpcuser, rpcpass")
        sys.exit(1)

    settings['port'] = int(settings['port'])
    settings['rpcport'] = int(settings['rpcport'])
    settings['db'] = os.path.expanduser(settings['db'])

    if chain not in NETWORKS:
        logger.error("invalid network, exiting")
        sys.exit(2)

    netmagic = NETWORKS[chain]
    datadir = settings['db']

    # initialize
    new_install = False
    if not os.path.isdir(os.path.expanduser(datadir)):
        new_install = True
        initialize(datadir)

    # create wallet
    walletdb = Wallet()
    if new_install:
        walletdb.initialize()
    mempool = MemPool()
    chaindb = ChainDb(settings, settings['db'], mempool, walletdb,  netmagic, False, False)
    node = Node(None, mempool, chaindb, netmagic)
    peermgr = PeerManager(node, mempool, chaindb, netmagic)
    node.peermgr = peermgr
    walletdb.chaindb = chaindb

    # load blocks.dat into db, if db is newly created
    if new_install:
        chaindb.loadfile(datadir + '/blocks.dat')

    if 'loadblock' in settings:
        chaindb.loadfile(os.path.expanduser(settings['loadblock']))

    threads = []

    def new_connection_handler(socket, address):
        logger.info("New incoming connection")
        connection = Connection(node, socket, address)
        connection.start()

    # start HTTP server for JSON-RPC
    rpcexec = rpc.RPCExec(peermgr, mempool, chaindb, walletdb, settings['rpcuser'], settings['rpcpass'])
    rpcserver = gevent.pywsgi.WSGIServer(('', settings['rpcport']),  rpcexec.handle_request, log = None)
    rpc_server_thread = gevent.Greenlet(rpcserver.serve_forever)
    threads.append(rpc_server_thread)

    # start server
    server = StreamServer((settings['host'], settings['port']), new_connection_handler)
    server_thread = gevent.Greenlet(server.serve_forever)
    threads.append(server_thread)

    # connect to specified peers
    if 'peers' in settings and settings['peers']:
        for ipport in settings['peers'].split():
            peerip, peerport = ipport.split(":")
            peer = peermgr.add(peerip, int(peerport))
            threads.append(peer)
            time.sleep(2)

    # program main loop
    def start(timeout=None):
        for thread in threads:
            thread.start()
        try:
            gevent.joinall(threads, timeout=timeout, raise_error=True)
        finally:
            for t in threads: t.kill()
            gevent.joinall(threads)
            logger.info('Flushing database')
            del chaindb.db
            chaindb.blk_write.close()
            logger.info('Finished flushing database')

    start()
Esempio n. 3
0
    if 'port' in settings:
        settings['port'] = int(settings['port'])
    settings['rpcport'] = int(settings['rpcport'])
    settings['dhtport'] = int(settings['dhtport'])

    log = Log.Log(settings['log'])

    log.write("\n\n\n\n")

    peermgr = PeerManager(log)

    threads = []

    # start HTTP server for JSON-RPC
    rpcexec = rpc.RPCExec(peermgr, log, settings['rpcuser'],
                          settings['rpcpass'])
    rpcserver = gevent.pywsgi.WSGIServer(('', settings['rpcport']),
                                         rpcexec.handle_request)
    t = gevent.Greenlet(rpcserver.serve_forever)
    threads.append(t)

    dht = dht.DHT(log, settings['dhtport'], NODE_ID)
    threads.append(dht)

    if ('dht_add_host' in settings and 'dht_add_port' in settings):
        dht.add_node(settings['dht_add_host'], settings['dht_add_port'])

    if settings['listen']:
        p2pserver = NodeServer(settings['listen_host'],
                               settings['listen_port'], log, peermgr)