rippled
Loading...
Searching...
No Matches
XChainAttestations.h
1#ifndef XRPL_PROTOCOL_STXATTESTATIONS_H_INCLUDED
2#define XRPL_PROTOCOL_STXATTESTATIONS_H_INCLUDED
3
4#include <xrpl/basics/Buffer.h>
5#include <xrpl/basics/Expected.h>
6#include <xrpl/protocol/AccountID.h>
7#include <xrpl/protocol/Issue.h>
8#include <xrpl/protocol/PublicKey.h>
9#include <xrpl/protocol/SField.h>
10#include <xrpl/protocol/STBase.h>
11#include <xrpl/protocol/STXChainBridge.h>
12#include <xrpl/protocol/SecretKey.h>
13#include <xrpl/protocol/TER.h>
14
15#include <boost/container/flat_set.hpp>
16#include <boost/container/vector.hpp>
17
18#include <cstddef>
19#include <vector>
20
21namespace ripple {
22
23namespace Attestations {
24
26{
27 // Account associated with the public key
29 // Public key from the witness server attesting to the event
31 // Signature from the witness server attesting to the event
33 // Account on the sending chain that triggered the event (sent the
34 // transaction)
36 // Amount transfered on the sending chain
38 // Account on the destination chain that collects a share of the attestation
39 // reward
41 // Amount was transfered on the locking chain
43
44 explicit AttestationBase(
45 AccountID attestationSignerAccount_,
46 PublicKey const& publicKey_,
47 Buffer signature_,
48 AccountID const& sendingAccount_,
49 STAmount const& sendingAmount_,
50 AccountID const& rewardAccount_,
51 bool wasLockingChainSend_);
52
54
55 virtual ~AttestationBase() = default;
56
58 operator=(AttestationBase const&) = default;
59
60 // verify that the signature attests to the data.
61 bool
62 verify(STXChainBridge const& bridge) const;
63
64protected:
65 explicit AttestationBase(STObject const& o);
66 explicit AttestationBase(Json::Value const& v);
67
68 [[nodiscard]] static bool
69 equalHelper(AttestationBase const& lhs, AttestationBase const& rhs);
70
71 [[nodiscard]] static bool
72 sameEventHelper(AttestationBase const& lhs, AttestationBase const& rhs);
73
74 void
75 addHelper(STObject& o) const;
76
77private:
78 [[nodiscard]] virtual std::vector<std::uint8_t>
79 message(STXChainBridge const& bridge) const = 0;
80};
81
82// Attest to a regular cross-chain transfer
84{
87
88 explicit AttestationClaim(
89 AccountID attestationSignerAccount_,
90 PublicKey const& publicKey_,
91 Buffer signature_,
92 AccountID const& sendingAccount_,
93 STAmount const& sendingAmount_,
94 AccountID const& rewardAccount_,
95 bool wasLockingChainSend_,
96 std::uint64_t claimID_,
97 std::optional<AccountID> const& dst_);
98
99 explicit AttestationClaim(
100 STXChainBridge const& bridge,
101 AccountID attestationSignerAccount_,
102 PublicKey const& publicKey_,
103 SecretKey const& secretKey_,
104 AccountID const& sendingAccount_,
105 STAmount const& sendingAmount_,
106 AccountID const& rewardAccount_,
107 bool wasLockingChainSend_,
108 std::uint64_t claimID_,
109 std::optional<AccountID> const& dst_);
110
111 explicit AttestationClaim(STObject const& o);
112 explicit AttestationClaim(Json::Value const& v);
113
114 [[nodiscard]] STObject
115 toSTObject() const;
116
117 // return true if the two attestations attest to the same thing
118 [[nodiscard]] bool
119 sameEvent(AttestationClaim const& rhs) const;
120
121 [[nodiscard]] static std::vector<std::uint8_t>
122 message(
123 STXChainBridge const& bridge,
125 STAmount const& sendingAmount,
130
131 [[nodiscard]] bool
132 validAmounts() const;
133
134private:
135 [[nodiscard]] std::vector<std::uint8_t>
136 message(STXChainBridge const& bridge) const override;
137
138 friend bool
139 operator==(AttestationClaim const& lhs, AttestationClaim const& rhs);
140};
141
143{
144 bool
145 operator()(AttestationClaim const& lhs, AttestationClaim const& rhs) const
146 {
147 return lhs.claimID < rhs.claimID;
148 }
149};
150
151// Attest to a cross-chain transfer that creates an account
153{
154 // createCount on the sending chain. This is the value of the `CreateCount`
155 // field of the bridge on the sending chain when the transaction was
156 // executed.
158 // Account to create on the destination chain
160 // Total amount of the reward pool
162
163 explicit AttestationCreateAccount(STObject const& o);
164
165 explicit AttestationCreateAccount(Json::Value const& v);
166
168 AccountID attestationSignerAccount_,
169 PublicKey const& publicKey_,
170 Buffer signature_,
171 AccountID const& sendingAccount_,
172 STAmount const& sendingAmount_,
173 STAmount const& rewardAmount_,
174 AccountID const& rewardAccount_,
175 bool wasLockingChainSend_,
176 std::uint64_t createCount_,
177 AccountID const& toCreate_);
178
180 STXChainBridge const& bridge,
181 AccountID attestationSignerAccount_,
182 PublicKey const& publicKey_,
183 SecretKey const& secretKey_,
184 AccountID const& sendingAccount_,
185 STAmount const& sendingAmount_,
186 STAmount const& rewardAmount_,
187 AccountID const& rewardAccount_,
188 bool wasLockingChainSend_,
189 std::uint64_t createCount_,
190 AccountID const& toCreate_);
191
192 [[nodiscard]] STObject
193 toSTObject() const;
194
195 // return true if the two attestations attest to the same thing
196 [[nodiscard]] bool
197 sameEvent(AttestationCreateAccount const& rhs) const;
198
199 friend bool
201 AttestationCreateAccount const& lhs,
202 AttestationCreateAccount const& rhs);
203
204 [[nodiscard]] static std::vector<std::uint8_t>
205 message(
206 STXChainBridge const& bridge,
208 STAmount const& sendingAmount,
209 STAmount const& rewardAmount,
213 AccountID const& dst);
214
215 [[nodiscard]] bool
216 validAmounts() const;
217
218private:
219 [[nodiscard]] std::vector<std::uint8_t>
220 message(STXChainBridge const& bridge) const override;
221};
222
224{
225 bool
227 AttestationCreateAccount const& lhs,
228 AttestationCreateAccount const& rhs) const
229 {
230 return lhs.createCount < rhs.createCount;
231 }
232};
233
234}; // namespace Attestations
235
236// Result when checking when two attestation match.
238 // One of the fields doesn't match, and it isn't the dst field
240 // all of the fields match, except the dst field
242 // all of the fields match
243 match
244};
245
247{
249 static SField const& ArrayFieldName;
250
257
259 {
265 STAmount const& a,
266 bool b,
268 : amount{a}, wasLockingChainSend{b}, dst{d}
269 {
270 }
271 };
272
273 explicit XChainClaimAttestation(
274 AccountID const& keyAccount_,
275 PublicKey const& publicKey_,
276 STAmount const& amount_,
277 AccountID const& rewardAccount_,
278 bool wasLockingChainSend_,
280
281 explicit XChainClaimAttestation(
282 STAccount const& keyAccount_,
283 PublicKey const& publicKey_,
284 STAmount const& amount_,
285 STAccount const& rewardAccount_,
286 bool wasLockingChainSend_,
288
289 explicit XChainClaimAttestation(TSignedAttestation const& claimAtt);
290
291 explicit XChainClaimAttestation(STObject const& o);
292
293 explicit XChainClaimAttestation(Json::Value const& v);
294
296 match(MatchFields const& rhs) const;
297
298 [[nodiscard]] STObject
299 toSTObject() const;
300
301 friend bool
303 XChainClaimAttestation const& lhs,
304 XChainClaimAttestation const& rhs);
305};
306
308{
310 static SField const& ArrayFieldName;
311
319
329
331 AccountID const& keyAccount_,
332 PublicKey const& publicKey_,
333 STAmount const& amount_,
334 STAmount const& rewardAmount_,
335 AccountID const& rewardAccount_,
336 bool wasLockingChainSend_,
337 AccountID const& dst_);
338
339 explicit XChainCreateAccountAttestation(TSignedAttestation const& claimAtt);
340
341 explicit XChainCreateAccountAttestation(STObject const& o);
342
344
345 [[nodiscard]] STObject
346 toSTObject() const;
347
349 match(MatchFields const& rhs) const;
350
351 friend bool
355};
356
357// Attestations from witness servers for a particular claimid and bridge.
358// Only one attestation per signature is allowed.
359template <class TAttestation>
361{
362public:
364
365private:
366 // Set a max number of allowed attestations to limit the amount of memory
367 // allocated and processing time. This number is much larger than the actual
368 // number of attestation a server would ever expect.
369 static constexpr std::uint32_t maxAttestations = 256;
371
372protected:
373 // Prevent slicing to the base class
375
376public:
380 operator=(XChainAttestationsBase const& rhs) = default;
381
383
384 explicit XChainAttestationsBase(Json::Value const& v);
385
386 explicit XChainAttestationsBase(STArray const& arr);
387
388 [[nodiscard]] STArray
389 toSTArray() const;
390
391 typename AttCollection::const_iterator
392 begin() const;
393
394 typename AttCollection::const_iterator
395 end() const;
396
397 typename AttCollection::iterator
398 begin();
399
400 typename AttCollection::iterator
401 end();
402
403 template <class F>
405 erase_if(F&& f);
406
408 size() const;
409
410 bool
411 empty() const;
412
413 AttCollection const&
415
416 template <class T>
417 void
418 emplace_back(T&& att);
419};
420
421template <class TAttestation>
422[[nodiscard]] inline bool
426{
427 return lhs.attestations() == rhs.attestations();
428}
429
430template <class TAttestation>
433{
434 return attestations_;
435};
436
437template <class TAttestation>
438template <class T>
439inline void
444
445template <class TAttestation>
446template <class F>
447inline std::size_t
449{
450 return std::erase_if(attestations_, std::forward<F>(f));
451}
452
453template <class TAttestation>
454inline std::size_t
456{
457 return attestations_.size();
458}
459
460template <class TAttestation>
461inline bool
463{
464 return attestations_.empty();
465}
466
468 : public XChainAttestationsBase<XChainClaimAttestation>
469{
471 using TBase::TBase;
472};
473
475 : public XChainAttestationsBase<XChainCreateAccountAttestation>
476{
478 using TBase::TBase;
479};
480
481} // namespace ripple
482
483#endif // STXCHAINATTESTATIONS_H_
Represents a JSON value.
Definition json_value.h:131
Like std::vector<char> but better.
Definition Buffer.h:17
A public key.
Definition PublicKey.h:43
Identifies fields.
Definition SField.h:127
A secret key.
Definition SecretKey.h:19
AttCollection::const_iterator end() const
static constexpr std::uint32_t maxAttestations
XChainAttestationsBase & operator=(XChainAttestationsBase const &rhs)=default
XChainAttestationsBase(XChainAttestationsBase const &rhs)=default
AttCollection::const_iterator begin() const
XChainAttestationsBase(AttCollection &&sigs)
AttCollection const & attestations() const
std::vector< TAttestation > AttCollection
T emplace_back(T... args)
T is_same_v
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:6
constexpr bool operator==(base_uint< Bits, Tag > const &lhs, base_uint< Bits, Tag > const &rhs)
Definition base_uint.h:566
AttestationBase & operator=(AttestationBase const &)=default
static bool equalHelper(AttestationBase const &lhs, AttestationBase const &rhs)
virtual std::vector< std::uint8_t > message(STXChainBridge const &bridge) const =0
static bool sameEventHelper(AttestationBase const &lhs, AttestationBase const &rhs)
bool verify(STXChainBridge const &bridge) const
AttestationBase(AttestationBase const &)=default
friend bool operator==(AttestationClaim const &lhs, AttestationClaim const &rhs)
bool sameEvent(AttestationClaim const &rhs) const
static std::vector< std::uint8_t > message(STXChainBridge const &bridge, AccountID const &sendingAccount, STAmount const &sendingAmount, AccountID const &rewardAccount, bool wasLockingChainSend, std::uint64_t claimID, std::optional< AccountID > const &dst)
static std::vector< std::uint8_t > message(STXChainBridge const &bridge, AccountID const &sendingAccount, STAmount const &sendingAmount, STAmount const &rewardAmount, AccountID const &rewardAccount, bool wasLockingChainSend, std::uint64_t createCount, AccountID const &dst)
friend bool operator==(AttestationCreateAccount const &lhs, AttestationCreateAccount const &rhs)
bool sameEvent(AttestationCreateAccount const &rhs) const
bool operator()(AttestationClaim const &lhs, AttestationClaim const &rhs) const
bool operator()(AttestationCreateAccount const &lhs, AttestationCreateAccount const &rhs) const
MatchFields(STAmount const &a, bool b, std::optional< AccountID > const &d)
Attestations::AttestationClaim TSignedAttestation
static SField const & ArrayFieldName
friend bool operator==(XChainClaimAttestation const &lhs, XChainClaimAttestation const &rhs)
std::optional< AccountID > dst
friend bool operator==(XChainCreateAccountAttestation const &lhs, XChainCreateAccountAttestation const &rhs)