/ src / clientversion.cpp
clientversion.cpp
 1  // Copyright (c) 2012-present The Bitcoin Core developers
 2  // Distributed under the MIT software license, see the accompanying
 3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
 4  
 5  #include <bitcoin-build-config.h> // IWYU pragma: keep
 6  
 7  #include <clientversion.h>
 8  
 9  #include <tinyformat.h>
10  #include <util/string.h>
11  
12  #include <string>
13  #include <vector>
14  
15  using util::Join;
16  
17  /**
18   * Name of client reported in the 'version' message. Report the same name
19   * for both bitcoind and bitcoin-qt, to make it harder for attackers to
20   * target servers or GUI users specifically.
21   */
22  const std::string UA_NAME("Satoshi");
23  
24  
25  #include <bitcoin-build-info.h>
26  // The <bitcoin-build-info.h>, which is generated by the build environment (cmake/script/GenerateBuildInfo.cmake),
27  // could contain only one line of the following:
28  //   - "#define BUILD_GIT_TAG ...", if the top commit is tagged
29  //   - "#define BUILD_GIT_COMMIT ...", if the top commit is not tagged
30  //   - "// No build information available", if proper git information is not available
31  
32  // git will expand the next line to "#define GIT_COMMIT_ID ..." inside archives:
33  //$Format:%n#define GIT_COMMIT_ID "%H"$
34  
35  #ifdef BUILD_GIT_TAG
36      #define BUILD_DESC BUILD_GIT_TAG
37      #define BUILD_SUFFIX ""
38  #else
39      #define BUILD_DESC "v" CLIENT_VERSION_STRING
40      #if CLIENT_VERSION_IS_RELEASE
41          #define BUILD_SUFFIX ""
42      #elif defined(BUILD_GIT_COMMIT)
43          #define BUILD_SUFFIX "-" BUILD_GIT_COMMIT
44      #elif defined(GIT_COMMIT_ID)
45          #define BUILD_SUFFIX "-g" GIT_COMMIT_ID
46      #else
47          #define BUILD_SUFFIX "-unk"
48      #endif
49  #endif
50  
51  static std::string FormatVersion(int nVersion)
52  {
53      return strprintf("%d.%d.%d", nVersion / 10000, (nVersion / 100) % 100, nVersion % 100);
54  }
55  
56  std::string FormatFullVersion()
57  {
58      static const std::string CLIENT_BUILD(BUILD_DESC BUILD_SUFFIX);
59      return CLIENT_BUILD;
60  }
61  
62  /**
63   * Format the subversion field according to BIP 14 spec (https://github.com/bitcoin/bips/blob/master/bip-0014.mediawiki)
64   */
65  std::string FormatSubVersion(const std::string& name, int nClientVersion, const std::vector<std::string>& comments)
66  {
67      std::string comments_str;
68      if (!comments.empty()) comments_str = strprintf("(%s)", Join(comments, "; "));
69      return strprintf("/%s:%s%s/", name, FormatVersion(nClientVersion), comments_str);
70  }