code: public void appendToSubVer(String name, String version, @Nullable String comments) {
          checkSubVerComponent(name);
          checkSubVerComponent(version);
          if (comments != null) {
              checkSubVerComponent(comments);
              subVer = subVer.concat(String.format(Locale.US, "%s:%s(%s)/", name, version, comments));
          } else {
              subVer = subVer.concat(String.format(Locale.US, "%s:%s/", name, version));
          }
      }
docs: <p>Appends the given user-agent information to the subVer field. The subVer is composed of a series of
  name:version pairs separated by slashes in the form of a path. For example a typical subVer field for bitcoinj
  users might look like "/bitcoinj:0.13/MultiBit:1.2/" where libraries come further to the left.</p>
  
  <p>There can be as many components as you feel a need for, and the version string can be anything, but it is
  recommended to use A.B.C where A = major, B = minor and C = revision for software releases, and dates for
  auto-generated source repository snapshots. A valid subVer begins and ends with a slash, therefore name
  and version are not allowed to contain such characters.</p>
  
  <p>Anything put in the "comments" field will appear in brackets and may be used for platform info, or anything
  else. For example, calling {@code appendToSubVer("MultiBit", "1.0", "Windows")} will result in a subVer being
  set of "/bitcoinj:1.0/MultiBit:1.0(Windows)/". Therefore the / ( and ) characters are reserved in all these
  components. If you don't want to add a comment (recommended), pass null.</p>
  
  <p>See <a href="https://github.com/bitcoin/bips/blob/master/bip-0014.mediawiki">BIP 14</a> for more information.</p>
  
  @param comments Optional (can be null) platform or other node specific information.
  @throws IllegalArgumentException if name, version or comments contains invalid characters.