Example #1
0
    def load(cls, filename: str):
        """Load a previously stored state."""
        assert filename is not None
        assert isinstance(filename, str)

        recover_filename = filename + '.tmp'

        if os.path.isfile(filename) is False:
            log.error("State file  %s doesn't exist" % filename)
            return None
        if not check_permission_safety(filename):
            raise InsecureStateFile(filename)
        if os.path.getsize(filename) == 0:
            log.warning("Empty state file. Trying to recover from %s" % recover_filename)
            return ChannelManagerState.load(recover_filename)
        json_state = json.loads(open(filename, 'r').read())
        json_state['filename'] = filename
        json_state['tmp_filename'] = recover_filename

        ret = cls.from_dict(json_state)
        log.debug("loaded saved state. head_number=%d receiver=%s" %
                  (ret.confirmed_head_number, ret.receiver))
        for sender, block in ret.channels.keys():
            log.debug("loaded channel info from the saved state sender=%s open_block=%s" %
                      (sender, block))
        return ret
Example #2
0
def main(
    ctx,
    channel_manager_address,
    ssl_key,
    ssl_cert,
    state_file,
    private_key,
    paywall_info,
    rpc_provider,
):
    if private_key is None:
        log.fatal("No private key provided")
        sys.exit(1)
    if utils.check_permission_safety(private_key) is False:
        log.fatal("Private key file %s must be readable only by its owner." %
                  (private_key))
        sys.exit(1)
    with open(private_key) as keyfile:
        private_key = keyfile.readline()[:-1]
    if not is_hex(private_key) or len(decode_hex(private_key)) != 32:
        log.fatal("Private key must be specified as 32 hex encoded bytes")
        sys.exit(1)

    receiver_address = privkey_to_addr(private_key)
    channel_manager_address = channel_manager_address or config.CHANNEL_MANAGER_ADDRESS

    if not state_file:
        state_file_name = "%s_%s.json" % (channel_manager_address[:10],
                                          receiver_address[:10])
        app_dir = click.get_app_dir('microraiden')
        if not os.path.exists(app_dir):
            os.makedirs(app_dir)
        state_file = os.path.join(app_dir, state_file_name)

    config.paywall_html_dir = paywall_info
    web3 = Web3(HTTPProvider(rpc_provider, request_kwargs={'timeout': 60}))
    try:
        app = make_paywalled_proxy(private_key, state_file, web3=web3)
    except StateFileLocked as ex:
        log.fatal('Another uRaiden process is already running (%s)!' % str(ex))
        sys.exit(1)
    except InsecureStateFile as ex:
        msg = (
            'The permission bits of the state file (%s) are set incorrectly (others can '
            'read or write) or you are not the owner. For reasons of security, '
            'startup is aborted.' % state_file)
        log.fatal(msg)
        sys.exit(1)
    except NetworkIdMismatch as ex:
        log.fatal(str(ex))
        sys.exit(1)
    except requests.exceptions.ConnectionError as ex:
        log.fatal("Ethereum node refused connection: %s" % str(ex))
        sys.exit(1)
    ctx.obj = app
 def load(cls, filename):
     """Load a previously stored state."""
     assert filename is not None
     assert isinstance(filename, str)
     if not check_permission_safety(filename):
         raise InsecureStateFile(filename)
     json_state = json.loads(open(filename, 'r').read())
     ret = cls.from_dict(json_state)
     log.debug("loaded saved state. head_number=%d receiver=%s" %
               (ret.confirmed_head_number, ret.receiver))
     for sender, block in ret.channels.keys():
         log.debug(
             "loaded channel info from the saved state sender=%s open_block=%s"
             % (sender, block))
     return ret
Example #4
0
 def load(cls, filename: str, check_permissions=True):
     """Load a previously stored state."""
     assert filename and isinstance(filename, str)
     if filename != ':memory:':
         if os.path.isfile(filename) is False:
             log.error("State file  %s doesn't exist" % filename)
             return None
         if check_permissions and not check_permission_safety(filename):
             raise InsecureStateFile(filename)
     ret = cls(filename)
     log.debug("loaded saved state. head_number=%s receiver=%s" %
               (ret.confirmed_head_number, ret.receiver))
     # for sender, block in ret.channels.keys():
     #     log.debug("loaded channel info from the saved state sender=%s open_block=%s" %
     #               (sender, block))
     return ret
Example #5
0
def main(private_key, state_file, channel_manager_address):
    if private_key is None:
        log.fatal("No private key provided")
        sys.exit(1)
    if utils.check_permission_safety(private_key) is False:
        log.fatal("Private key file %s must be readable only by its owner." %
                  (private_key))
        sys.exit(1)
    with open(private_key) as keyfile:
        private_key = keyfile.readline()[:-1]
    print(len(decode_hex(private_key)), is_hex(private_key))
    if not is_hex(private_key) or len(decode_hex(private_key)) != 32:
        log.fatal("Private key must be specified as 32 hex encoded bytes")
        sys.exit(1)

    receiver_address = privkey_to_addr(private_key)
    channel_manager_address = channel_manager_address or config.CHANNEL_MANAGER_ADDRESS

    if not state_file:
        state_file_name = "%s_%s.json" % (channel_manager_address[:10],
                                          receiver_address[:10])
        app_dir = click.get_app_dir('microraiden')
        state_file = os.path.join(app_dir, state_file_name)

    web3 = Web3(config.WEB3_PROVIDER)
    web3.eth.defaultAccount = receiver_address
    contract_proxy = make_contract_proxy(web3, private_key,
                                         config.CHANNEL_MANAGER_ADDRESS)

    try:
        click.echo('Loading state file from {}'.format(state_file))
        state = ChannelManagerState.load(state_file)
    except StateFileException:
        click.echo('Error reading state file')
        traceback.print_exc()
        sys.exit(1)
    if not is_same_address(state.receiver, receiver_address):
        click.echo('Private key does not match receiver address in state file')
        sys.exit(1)
    elif not is_same_address(state.contract_address, channel_manager_address):
        click.echo('Channel manager contract address mismatch')
        sys.exit(1)

    click.echo('Closing all open channels with valid balance proofs for '
               'receiver {}'.format(receiver_address))
    close_open_channels(state, contract_proxy)