rippled
compression_test.cpp
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright 2020 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #include <ripple/app/ledger/Ledger.h>
21 #include <ripple/app/ledger/LedgerMaster.h>
22 #include <ripple/app/misc/Manifest.h>
23 #include <ripple/beast/unit_test.h>
24 #include <ripple/beast/utility/Journal.h>
25 #include <ripple/core/TimeKeeper.h>
26 #include <ripple/overlay/Compression.h>
27 #include <ripple/overlay/Message.h>
28 #include <ripple/overlay/impl/ProtocolMessage.h>
29 #include <ripple/overlay/impl/ZeroCopyStream.h>
30 #include <ripple/protocol/HashPrefix.h>
31 #include <ripple/protocol/PublicKey.h>
32 #include <ripple/protocol/SecretKey.h>
33 #include <ripple/protocol/Sign.h>
34 #include <ripple/protocol/digest.h>
35 #include <ripple/protocol/jss.h>
36 #include <ripple/shamap/SHAMapNodeID.h>
37 #include <boost/asio/ip/address_v4.hpp>
38 #include <boost/beast/core/multi_buffer.hpp>
39 #include <boost/endian/conversion.hpp>
40 #include <algorithm>
41 #include <ripple.pb.h>
42 #include <test/jtx/Account.h>
43 #include <test/jtx/Env.h>
44 #include <test/jtx/WSClient.h>
45 #include <test/jtx/amount.h>
46 #include <test/jtx/pay.h>
47 
48 namespace ripple {
49 
50 namespace test {
51 
52 using namespace ripple::test;
53 using namespace ripple::test::jtx;
54 
55 static uint256
56 ledgerHash(LedgerInfo const& info)
57 {
58  return ripple::sha512Half(
60  std::uint32_t(info.seq),
61  std::uint64_t(info.drops.drops()),
62  info.parentHash,
63  info.txHash,
64  info.accountHash,
68  std::uint8_t(info.closeFlags));
69 }
70 
71 class compression_test : public beast::unit_test::suite
72 {
75 
76 public:
78  {
79  }
80 
81  template <typename T>
82  void
84  std::shared_ptr<T> proto,
85  protocol::MessageType mt,
86  uint16_t nbuffers,
87  const char* msg,
88  bool log = false)
89  {
90  if (log)
91  printf("=== compress/decompress %s ===\n", msg);
92  Message m(*proto, mt);
93 
94  auto& buffer = m.getBuffer(Compressed::On);
95 
96  if (log)
97  printf(
98  "==> compressed, original %d bytes, compressed %d bytes\n",
99  (int)m.getBuffer(Compressed::Off).size(),
100  (int)m.getBuffer(Compressed::On).size());
101 
102  boost::beast::multi_buffer buffers;
103 
104  // simulate multi-buffer
105  auto sz = buffer.size() / nbuffers;
106  for (int i = 0; i < nbuffers; i++)
107  {
108  auto start = buffer.begin() + sz * i;
109  auto end = i < nbuffers - 1 ? (buffer.begin() + sz * (i + 1))
110  : buffer.end();
111  std::vector<std::uint8_t> slice(start, end);
112  buffers.commit(boost::asio::buffer_copy(
113  buffers.prepare(slice.size()), boost::asio::buffer(slice)));
114  }
115  auto header =
116  ripple::detail::parseMessageHeader(buffers.data(), buffer.size());
117 
118  if (log)
119  printf(
120  "==> parsed header: buffers size %d, compressed %d, algorithm "
121  "%d, header size %d, payload size %d, buffer size %d\n",
122  (int)buffers.size(),
123  header->algorithm != Algorithm::None,
124  (int)header->algorithm,
125  (int)header->header_size,
126  (int)header->payload_wire_size,
127  (int)buffer.size());
128 
129  if (header->algorithm == Algorithm::None)
130  {
131  if (log)
132  printf("==> NOT COMPRESSED\n");
133  return;
134  }
135 
136  std::vector<std::uint8_t> decompressed;
137  decompressed.resize(header->uncompressed_size);
138 
139  BEAST_EXPECT(
140  header->payload_wire_size == buffer.size() - header->header_size);
141 
142  ZeroCopyInputStream stream(buffers.data());
143  stream.Skip(header->header_size);
144 
145  auto decompressedSize = ripple::compression::decompress(
146  stream,
147  header->payload_wire_size,
148  decompressed.data(),
149  header->uncompressed_size);
150  BEAST_EXPECT(decompressedSize == header->uncompressed_size);
151  auto const proto1 = std::make_shared<T>();
152 
153  BEAST_EXPECT(
154  proto1->ParseFromArray(decompressed.data(), decompressedSize));
155  auto uncompressed = m.getBuffer(Compressed::Off);
156  BEAST_EXPECT(std::equal(
157  uncompressed.begin() + ripple::compression::headerBytes,
158  uncompressed.end(),
159  decompressed.begin()));
160  if (log)
161  printf("\n");
162  }
163 
166  {
167  auto manifests = std::make_shared<protocol::TMManifests>();
168  manifests->mutable_list()->Reserve(n);
169  for (int i = 0; i < n; i++)
170  {
171  auto master = randomKeyPair(KeyType::ed25519);
172  auto signing = randomKeyPair(KeyType::ed25519);
173  STObject st(sfGeneric);
174  st[sfSequence] = i;
175  st[sfPublicKey] = std::get<0>(master);
176  st[sfSigningPubKey] = std::get<0>(signing);
177  st[sfDomain] = makeSlice(
178  std::string("example") + std::to_string(i) +
179  std::string(".com"));
180  sign(
181  st,
184  std::get<1>(master),
186  sign(
187  st,
190  std::get<1>(signing));
191  Serializer s;
192  st.add(s);
193  auto* manifest = manifests->add_list();
194  manifest->set_stobject(s.data(), s.size());
195  }
196  return manifests;
197  }
198 
201  {
202  auto endpoints = std::make_shared<protocol::TMEndpoints>();
203  endpoints->mutable_endpoints()->Reserve(n);
204  for (int i = 0; i < n; i++)
205  {
206  auto* endpoint = endpoints->add_endpoints();
207  endpoint->set_hops(i);
208  std::string addr = std::string("10.0.1.") + std::to_string(i);
209  endpoint->mutable_ipv4()->set_ipv4(boost::endian::native_to_big(
210  boost::asio::ip::address_v4::from_string(addr).to_uint()));
211  endpoint->mutable_ipv4()->set_ipv4port(i);
212  }
213  endpoints->set_version(2);
214 
215  return endpoints;
216  }
217 
220  {
221  Env env(*this, envconfig());
222  int fund = 10000;
223  auto const alice = Account("alice");
224  auto const bob = Account("bob");
225  env.fund(XRP(fund), "alice", "bob");
226  env.trust(bob["USD"](fund), alice);
227  env.close();
228 
229  auto toBinary = [](std::string const& text) {
230  std::string binary;
231  for (size_t i = 0; i < text.size(); ++i)
232  {
233  unsigned int c = charUnHex(text[i]);
234  c = c << 4;
235  ++i;
236  c = c | charUnHex(text[i]);
237  binary.push_back(c);
238  }
239 
240  return binary;
241  };
242 
243  std::string usdTxBlob = "";
244  auto wsc = makeWSClient(env.app().config());
245  {
246  Json::Value jrequestUsd;
247  jrequestUsd[jss::secret] = toBase58(generateSeed("bob"));
248  jrequestUsd[jss::tx_json] =
249  pay("bob", "alice", bob["USD"](fund / 2));
250  Json::Value jreply_usd = wsc->invoke("sign", jrequestUsd);
251 
252  usdTxBlob =
253  toBinary(jreply_usd[jss::result][jss::tx_blob].asString());
254  }
255 
256  auto transaction = std::make_shared<protocol::TMTransaction>();
257  transaction->set_rawtransaction(usdTxBlob);
258  transaction->set_status(protocol::tsNEW);
259  auto tk = make_TimeKeeper(logs.journal("TimeKeeper"));
260  transaction->set_receivetimestamp(tk->now().time_since_epoch().count());
261  transaction->set_deferred(true);
262 
263  return transaction;
264  }
265 
268  {
269  auto getLedger = std::make_shared<protocol::TMGetLedger>();
270  getLedger->set_itype(protocol::liTS_CANDIDATE);
271  getLedger->set_ltype(protocol::TMLedgerType::ltACCEPTED);
272  uint256 const hash(ripple::sha512Half(123456789));
273  getLedger->set_ledgerhash(hash.begin(), hash.size());
274  getLedger->set_ledgerseq(123456789);
275  ripple::SHAMapNodeID sha(hash.data(), hash.size());
276  getLedger->add_nodeids(sha.getRawString());
277  getLedger->set_requestcookie(123456789);
278  getLedger->set_querytype(protocol::qtINDIRECT);
279  getLedger->set_querydepth(3);
280  return getLedger;
281  }
282 
284  buildLedgerData(uint32_t n, Logs& logs)
285  {
286  auto ledgerData = std::make_shared<protocol::TMLedgerData>();
287  uint256 const hash(ripple::sha512Half(12356789));
288  ledgerData->set_ledgerhash(hash.data(), hash.size());
289  ledgerData->set_ledgerseq(123456789);
290  ledgerData->set_type(protocol::TMLedgerInfoType::liAS_NODE);
291  ledgerData->set_requestcookie(123456789);
292  ledgerData->set_error(protocol::TMReplyError::reNO_LEDGER);
293  ledgerData->mutable_nodes()->Reserve(n);
294  uint256 parentHash(0);
295  for (int i = 0; i < n; i++)
296  {
297  LedgerInfo info;
298  auto tk = make_TimeKeeper(logs.journal("TimeKeeper"));
299  info.seq = i;
300  info.parentCloseTime = tk->now();
301  info.hash = ripple::sha512Half(i);
302  info.txHash = ripple::sha512Half(i + 1);
303  info.accountHash = ripple::sha512Half(i + 2);
304  info.parentHash = parentHash;
305  info.drops = XRPAmount(10);
306  info.closeTimeResolution = tk->now().time_since_epoch();
307  info.closeTime = tk->now();
308  parentHash = ledgerHash(info);
309  Serializer nData;
310  ripple::addRaw(info, nData);
311  ledgerData->add_nodes()->set_nodedata(
312  nData.getDataPtr(), nData.getLength());
313  }
314 
315  return ledgerData;
316  }
317 
320  {
321  auto getObject = std::make_shared<protocol::TMGetObjectByHash>();
322 
323  getObject->set_type(protocol::TMGetObjectByHash_ObjectType::
324  TMGetObjectByHash_ObjectType_otTRANSACTION);
325  getObject->set_query(true);
326  getObject->set_seq(123456789);
327  uint256 hash(ripple::sha512Half(123456789));
328  getObject->set_ledgerhash(hash.data(), hash.size());
329  getObject->set_fat(true);
330  for (int i = 0; i < 100; i++)
331  {
332  uint256 hash(ripple::sha512Half(i));
333  auto object = getObject->add_objects();
334  object->set_hash(hash.data(), hash.size());
335  ripple::SHAMapNodeID sha(hash.data(), hash.size());
336  object->set_nodeid(sha.getRawString());
337  object->set_index("");
338  object->set_data("");
339  object->set_ledgerseq(i);
340  }
341  return getObject;
342  }
343 
346  {
347  auto list = std::make_shared<protocol::TMValidatorList>();
348 
349  auto master = randomKeyPair(KeyType::ed25519);
350  auto signing = randomKeyPair(KeyType::ed25519);
351  STObject st(sfGeneric);
352  st[sfSequence] = 0;
353  st[sfPublicKey] = std::get<0>(master);
354  st[sfSigningPubKey] = std::get<0>(signing);
355  st[sfDomain] = makeSlice(std::string("example.com"));
356  sign(
357  st,
360  std::get<1>(master),
362  sign(st, HashPrefix::manifest, KeyType::ed25519, std::get<1>(signing));
363  Serializer s;
364  st.add(s);
365  list->set_manifest(s.data(), s.size());
366  list->set_version(3);
367  STObject signature(sfSignature);
368  ripple::sign(
369  st, HashPrefix::manifest, KeyType::ed25519, std::get<1>(signing));
370  Serializer s1;
371  st.add(s1);
372  list->set_signature(s1.data(), s1.size());
373  list->set_blob(strHex(s.getString()));
374  return list;
375  }
376 
377  void
379  {
380  testcase("Message Compression");
381 
382  auto thresh = beast::severities::Severity::kInfo;
383  auto logs = std::make_unique<Logs>(thresh);
384 
385  protocol::TMManifests manifests;
386  protocol::TMEndpoints endpoints;
387  protocol::TMTransaction transaction;
388  protocol::TMGetLedger get_ledger;
389  protocol::TMLedgerData ledger_data;
390  protocol::TMGetObjectByHash get_object;
391  protocol::TMValidatorList validator_list;
392 
393  // 4.5KB
394  doTest(buildManifests(20), protocol::mtMANIFESTS, 4, "TMManifests20");
395  // 22KB
396  doTest(buildManifests(100), protocol::mtMANIFESTS, 4, "TMManifests100");
397  // 131B
398  doTest(buildEndpoints(10), protocol::mtENDPOINTS, 4, "TMEndpoints10");
399  // 1.3KB
400  doTest(buildEndpoints(100), protocol::mtENDPOINTS, 4, "TMEndpoints100");
401  // 242B
402  doTest(
403  buildTransaction(*logs),
404  protocol::mtTRANSACTION,
405  1,
406  "TMTransaction");
407  // 87B
408  doTest(buildGetLedger(), protocol::mtGET_LEDGER, 1, "TMGetLedger");
409  // 61KB
410  doTest(
411  buildLedgerData(500, *logs),
412  protocol::mtLEDGER_DATA,
413  10,
414  "TMLedgerData500");
415  // 122 KB
416  doTest(
417  buildLedgerData(1000, *logs),
418  protocol::mtLEDGER_DATA,
419  20,
420  "TMLedgerData1000");
421  // 1.2MB
422  doTest(
423  buildLedgerData(10000, *logs),
424  protocol::mtLEDGER_DATA,
425  50,
426  "TMLedgerData10000");
427  // 12MB
428  doTest(
429  buildLedgerData(100000, *logs),
430  protocol::mtLEDGER_DATA,
431  100,
432  "TMLedgerData100000");
433  // 61MB
434  doTest(
435  buildLedgerData(500000, *logs),
436  protocol::mtLEDGER_DATA,
437  100,
438  "TMLedgerData500000");
439  // 7.7KB
440  doTest(
441  buildGetObjectByHash(),
442  protocol::mtGET_OBJECTS,
443  4,
444  "TMGetObjectByHash");
445  // 895B
446  doTest(
447  buildValidatorList(),
448  protocol::mtVALIDATORLIST,
449  4,
450  "TMValidatorList");
451  }
452 
453  void
454  run() override
455  {
456  testProtocol();
457  }
458 };
459 
460 BEAST_DEFINE_TESTSUITE_MANUAL_PRIO(compression, ripple_data, ripple, 20);
461 
462 } // namespace test
463 } // namespace ripple
ripple::test::ledgerHash
static uint256 ledgerHash(LedgerInfo const &info)
Definition: compression_test.cpp:56
std::vector::resize
T resize(T... args)
ripple::HashPrefix::ledgerMaster
@ ledgerMaster
ledger master data for signing
ripple::test::jtx::XRP
const XRP_t XRP
Converts to XRP Issue or STAmount.
Definition: amount.cpp:105
ripple::Message::getBuffer
std::vector< uint8_t > const & getBuffer(Compressed tryCompressed)
Retrieve the packed message data.
Definition: Message.cpp:153
ripple::makeSlice
std::enable_if_t< std::is_same< T, char >::value||std::is_same< T, unsigned char >::value, Slice > makeSlice(std::array< T, N > const &a)
Definition: Slice.h:194
std::string
STL class.
std::equal
T equal(T... args)
std::shared_ptr
STL class.
ripple::LedgerInfo::parentHash
uint256 parentHash
Definition: ReadView.h:99
ripple::Logs
Manages partitions for logging.
Definition: Log.h:48
ripple::test::compression_test::buildEndpoints
std::shared_ptr< protocol::TMEndpoints > buildEndpoints(int n)
Definition: compression_test.cpp:200
ripple::charUnHex
int charUnHex(unsigned char c)
Converts a hex digit to the corresponding integer.
Definition: strHex.cpp:27
ripple::sfGeneric
const SField sfGeneric(access, 0)
Definition: SField.h:332
ripple::test::compression_test::testProtocol
void testProtocol()
Definition: compression_test.cpp:378
ripple::test::compression_test::buildLedgerData
std::shared_ptr< protocol::TMLedgerData > buildLedgerData(uint32_t n, Logs &logs)
Definition: compression_test.cpp:284
ripple::LedgerInfo::hash
uint256 hash
Definition: ReadView.h:96
ripple::XRPAmount::drops
constexpr value_type drops() const
Returns the number of drops.
Definition: XRPAmount.h:172
ripple::HashPrefix::manifest
@ manifest
Manifest.
ripple::sfSigningPubKey
const SF_Blob sfSigningPubKey(access, STI_VL, 3, "SigningPubKey")
Definition: SField.h:458
std::vector
STL class.
std::vector::size
T size(T... args)
ripple::Serializer::getString
std::string getString() const
Definition: Serializer.h:202
ripple::sfSequence
const SF_U32 sfSequence(access, STI_UINT32, 4, "Sequence")
Definition: SField.h:355
ripple::compression::headerBytes
constexpr std::size_t headerBytes
Definition: Compression.h:31
ripple::sfMasterSignature
const SF_Blob sfMasterSignature(access, STI_VL, 18, "MasterSignature", SField::sMD_Default, SField::notSigning)
Definition: SField.h:473
ripple::toBase58
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
Definition: AccountID.cpp:29
ripple::test::compression_test::buildValidatorList
std::shared_ptr< protocol::TMValidatorList > buildValidatorList()
Definition: compression_test.cpp:345
ripple::test::compression_test::compression_test
compression_test()
Definition: compression_test.cpp:77
ripple::addRaw
void addRaw(LedgerInfo const &info, Serializer &s)
Definition: View.cpp:43
ripple::ZeroCopyInputStream
Implements ZeroCopyInputStream around a buffer sequence.
Definition: ZeroCopyStream.h:35
ripple::test::jtx::Env::app
Application & app()
Definition: Env.h:238
ripple::LedgerInfo::seq
LedgerIndex seq
Definition: ReadView.h:88
ripple::test::compression_test::buildGetObjectByHash
std::shared_ptr< protocol::TMGetObjectByHash > buildGetObjectByHash()
Definition: compression_test.cpp:319
ripple::SHAMapNodeID
Definition: SHAMapNodeID.h:33
ripple::test::jtx::envconfig
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
Definition: envconfig.h:49
ripple::test::jtx::sign
void sign(Json::Value &jv, Account const &account)
Sign automatically.
Definition: utility.cpp:44
ripple::test::compression_test
Definition: compression_test.cpp:71
ripple::LedgerInfo::txHash
uint256 txHash
Definition: ReadView.h:97
ripple::base_uint::data
pointer data()
Definition: base_uint.h:103
ripple::test::jtx::Env::trust
void trust(STAmount const &amount, Account const &account)
Establish trust lines.
Definition: Env.cpp:240
ripple::sfSignature
const SF_Blob sfSignature(access, STI_VL, 6, "Signature", SField::sMD_Default, SField::notSigning)
Definition: SField.h:460
algorithm
ripple::base_uint::size
constexpr static std::size_t size()
Definition: base_uint.h:462
ripple::Serializer::data
void const * data() const noexcept
Definition: Serializer.h:75
ripple::uint256
base_uint< 256 > uint256
Definition: base_uint.h:493
std::string::push_back
T push_back(T... args)
ripple::LedgerInfo::closeTime
NetClock::time_point closeTime
Definition: ReadView.h:119
ripple::KeyType::ed25519
@ ed25519
ripple::base_uint< 256 >
ripple::test::compression_test::run
void run() override
Definition: compression_test.cpp:454
std::chrono::time_point::time_since_epoch
T time_since_epoch(T... args)
ripple::test::BEAST_DEFINE_TESTSUITE_MANUAL_PRIO
BEAST_DEFINE_TESTSUITE_MANUAL_PRIO(CrossingLimits, tx, ripple, 10)
ripple::Serializer::getDataPtr
const void * getDataPtr() const
Definition: Serializer.h:187
ripple::Application::config
virtual Config & config()=0
ripple::SHAMapNodeID::getRawString
std::string getRawString() const
Definition: SHAMapNodeID.cpp:92
ripple::LedgerInfo::closeFlags
int closeFlags
Definition: ReadView.h:110
std::to_string
T to_string(T... args)
ripple::compression::Compressed
Compressed
Definition: Compression.h:36
std::uint32_t
ripple::detail::parseMessageHeader
boost::optional< MessageHeader > parseMessageHeader(BufferSequence const &bufs, std::size_t size)
Definition: ProtocolMessage.h:125
ripple::compression::Algorithm
Algorithm
Definition: Compression.h:34
ripple::test::compression_test::buildTransaction
std::shared_ptr< protocol::TMTransaction > buildTransaction(Logs &logs)
Definition: compression_test.cpp:219
ripple::LedgerInfo::drops
XRPAmount drops
Definition: ReadView.h:101
ripple::Serializer
Definition: Serializer.h:39
ripple::Message
Definition: overlay/Message.h:49
ripple::randomKeyPair
std::pair< PublicKey, SecretKey > randomKeyPair(KeyType type)
Create a key pair using secure random numbers.
Definition: SecretKey.cpp:260
ripple::generateSeed
Seed generateSeed(std::string const &passPhrase)
Generate a seed deterministically.
Definition: Seed.cpp:69
ripple::test::compression_test::buildGetLedger
std::shared_ptr< protocol::TMGetLedger > buildGetLedger()
Definition: compression_test.cpp:267
ripple::STObject
Definition: STObject.h:51
ripple::sfPublicKey
const SF_Blob sfPublicKey(access, STI_VL, 1, "PublicKey")
Definition: SField.h:456
ripple::compression::decompress
std::size_t decompress(InputStream &in, std::size_t inSize, std::uint8_t *decompressed, std::size_t decompressedSize, Algorithm algorithm=Algorithm::LZ4)
Decompress input stream.
Definition: Compression.h:48
ripple::test::jtx
Definition: Check_test.cpp:26
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::test
Definition: BookStep.cpp:1091
ripple::Serializer::size
std::size_t size() const noexcept
Definition: Serializer.h:69
ripple::Logs::journal
beast::Journal journal(std::string const &name)
Definition: Log.cpp:144
ripple::STObject::add
virtual void add(Serializer &s) const override
Definition: STObject.h:351
ripple::base_uint::begin
iterator begin()
Definition: base_uint.h:114
ripple::test::jtx::pay
Json::Value pay(Account const &account, Account const &to, AnyAmount amount)
Create a payment.
Definition: pay.cpp:29
ripple::sign
Buffer sign(PublicKey const &pk, SecretKey const &sk, Slice const &m)
Generate a signature for a message.
Definition: SecretKey.cpp:124
ripple::test::jtx::Env::close
bool close(NetClock::time_point closeTime, boost::optional< std::chrono::milliseconds > consensusDelay=boost::none)
Close and advance the ledger.
Definition: Env.cpp:111
std::vector::begin
T begin(T... args)
ripple::LedgerInfo::closeTimeResolution
NetClock::duration closeTimeResolution
Definition: ReadView.h:113
ripple::sha512Half
sha512_half_hasher::result_type sha512Half(Args const &... args)
Returns the SHA512-Half of a series of objects.
Definition: digest.h:227
ripple::test::jtx::Env::fund
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
Definition: Env.cpp:209
ripple::test::compression_test::doTest
void doTest(std::shared_ptr< T > proto, protocol::MessageType mt, uint16_t nbuffers, const char *msg, bool log=false)
Definition: compression_test.cpp:83
ripple::make_TimeKeeper
std::unique_ptr< TimeKeeper > make_TimeKeeper(beast::Journal j)
Definition: TimeKeeper.cpp:119
std::chrono::duration::count
T count(T... args)
ripple::test::compression_test::buildManifests
std::shared_ptr< protocol::TMManifests > buildManifests(int n)
Definition: compression_test.cpp:165
ripple::test::makeWSClient
std::unique_ptr< WSClient > makeWSClient(Config const &cfg, bool v2, unsigned rpc_version, std::unordered_map< std::string, std::string > const &headers)
Returns a client operating through WebSockets/S.
Definition: WSClient.cpp:299
ripple::test::jtx::Account
Immutable cryptographic account descriptor.
Definition: Account.h:37
ripple::LedgerInfo
Information about the notional ledger backing the view.
Definition: ReadView.h:80
ripple::strHex
std::string strHex(FwdIt begin, FwdIt end)
Definition: strHex.h:67
ripple::Serializer::getLength
int getLength() const
Definition: Serializer.h:197
std::vector::data
T data(T... args)
ripple::LedgerInfo::accountHash
uint256 accountHash
Definition: ReadView.h:98
ripple::test::jtx::Env
A transaction testing environment.
Definition: Env.h:114
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::XRPAmount
Definition: XRPAmount.h:46
ripple::LedgerInfo::parentCloseTime
NetClock::time_point parentCloseTime
Definition: ReadView.h:89
ripple::sfDomain
const SF_Blob sfDomain(access, STI_VL, 7, "Domain")
Definition: SField.h:461