code: func (db *Database) validateCallData(selector *string, data []byte, messages *core.ValidationMessages) {
  	// If the data is empty, we have a plain value transfer, nothing more to do
  	if len(data) == 0 {
  		return
  	}
  	// Validate the call data that it has the 4byte prefix and the rest divisible by 32 bytes
  	if len(data) < 4 {
  		messages.Warn("Transaction data is not valid ABI (missing the 4 byte call prefix)")
  		return
  	}
  	if n := len(data) - 4; n%32 != 0 {
  		messages.Warn(fmt.Sprintf("Transaction data is not valid ABI (length should be a multiple of 32 (was %d))", n))
  	}
  	// If a custom method selector was provided, validate with that
  	if selector != nil {
  		if info, err := verifySelector(*selector, data); err != nil {
  			messages.Warn(fmt.Sprintf("Transaction contains data, but provided ABI signature could not be matched: %v", err))
  		} else {
  			messages.Info(info.String())
  			db.AddSelector(*selector, data[:4])
  		}
  		return
  	}
  	// No method selector was provided, check the database for embedded ones
  	embedded, err := db.Selector(data[:4])
  	if err != nil {
  		messages.Warn(fmt.Sprintf("Transaction contains data, but the ABI signature could not be found: %v", err))
  		return
  	}
  	if info, err := verifySelector(embedded, data); err != nil {
  		messages.Warn(fmt.Sprintf("Transaction contains data, but provided ABI signature could not be varified: %v", err))
  	} else {
  		messages.Info(info.String())
  	}
  }
docs: // validateCallData checks if the ABI call-data + method selector (if given) can
  // be parsed and seems to match.