code: func IsValidAttribute(e *Entry) bool {
  	// Check ExtIDs for valid formatting, then process them
  	if len(e.ExtIDs) < 5 || bytes.Compare(e.ExtIDs[0], []byte("IdentityAttribute")) != 0 {
  		return false
  	}
  	receiverChainID := string(e.ExtIDs[1])
  	signerChainID := string(e.ExtIDs[4])
  	if len(receiverChainID) != 64 || len(signerChainID) != 64 {
  		return false
  	}
  	var signature [ed.SignatureSize]byte
  	copy(signature[:], e.ExtIDs[2])
  	var signerKey [ed.PublicKeySize]byte
  	signerPubString := string(e.ExtIDs[3])
  	if IdentityKeyStringType(signerPubString) != IDPub {
  		return false
  	}
  	b := base58.Decode(signerPubString)
  	copy(signerKey[:], b[IDKeyPrefixLength:IDKeyBodyLength])
  
  	// Message that was signed = ReceiverChainID + DestinationChainID + AttributesJSON
  	msg := []byte(receiverChainID + e.ChainID)
  	attributesHash := sha256.Sum256(e.Content)
  	msg = append(msg, attributesHash[:]...)
  	return ed.Verify(&signerKey, msg, &signature)
  }
docs: // IsValidAttribute returns true if the entry is a properly formatted attribute with a verifiable signature.
  // Note: does not check that the signer key was valid for the signer identity at the time of publishing.