<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def run( self ):
 """ Interact with the blockchain peer, until we get a socket error or we exit the loop explicitly. The order of operations is: * send version * receive version * send verack * send getdata * receive blocks * for each block: * for each transaction with nulldata: * for each input: * get the transaction that produced the consumed input Return True on success Return False on error """

        
        log.debug("Segwit support: {}".format(get_features('segwit')))

        self.begin()

        try:
            self.loop()
        except socket.error, se:
            if not self.finished:
                # unexpected
                log.exception(se)
                return False

        # fetch remaining sender transactions
        try:
            self.fetch_sender_txs()
        except Exception, e:
            log.exception(e)
            return False

        # should be done now
        try:
            self.block_data_sanity_checks()
        except AssertionError, ae:
            log.exception(ae)
            return False

        return True