docs: 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