rippled
Loading...
Searching...
No Matches
XChainAttestations.h
1#pragma once
2
3#include <xrpl/basics/Buffer.h>
4#include <xrpl/basics/Expected.h>
5#include <xrpl/protocol/AccountID.h>
6#include <xrpl/protocol/Issue.h>
7#include <xrpl/protocol/PublicKey.h>
8#include <xrpl/protocol/SField.h>
9#include <xrpl/protocol/STBase.h>
10#include <xrpl/protocol/STXChainBridge.h>
11#include <xrpl/protocol/SecretKey.h>
12#include <xrpl/protocol/TER.h>
13
14#include <boost/container/flat_set.hpp>
15#include <boost/container/vector.hpp>
16
17#include <cstddef>
18#include <vector>
19
20namespace xrpl {
21
22namespace Attestations {
23
25{
26 // Account associated with the public key
28 // Public key from the witness server attesting to the event
30 // Signature from the witness server attesting to the event
32 // Account on the sending chain that triggered the event (sent the
33 // transaction)
35 // Amount transferred on the sending chain
37 // Account on the destination chain that collects a share of the attestation
38 // reward
40 // Amount was transferred on the locking chain
42
43 explicit AttestationBase(
44 AccountID attestationSignerAccount_,
45 PublicKey const& publicKey_,
46 Buffer signature_,
47 AccountID const& sendingAccount_,
48 STAmount const& sendingAmount_,
49 AccountID const& rewardAccount_,
50 bool wasLockingChainSend_);
51
53
54 virtual ~AttestationBase() = default;
55
57 operator=(AttestationBase const&) = default;
58
59 // verify that the signature attests to the data.
60 bool
61 verify(STXChainBridge const& bridge) const;
62
63protected:
64 explicit AttestationBase(STObject const& o);
65 explicit AttestationBase(Json::Value const& v);
66
67 [[nodiscard]] static bool
68 equalHelper(AttestationBase const& lhs, AttestationBase const& rhs);
69
70 [[nodiscard]] static bool
71 sameEventHelper(AttestationBase const& lhs, AttestationBase const& rhs);
72
73 void
74 addHelper(STObject& o) const;
75
76private:
77 [[nodiscard]] virtual std::vector<std::uint8_t>
78 message(STXChainBridge const& bridge) const = 0;
79};
80
81// Attest to a regular cross-chain transfer
83{
86
87 explicit AttestationClaim(
88 AccountID attestationSignerAccount_,
89 PublicKey const& publicKey_,
90 Buffer signature_,
91 AccountID const& sendingAccount_,
92 STAmount const& sendingAmount_,
93 AccountID const& rewardAccount_,
94 bool wasLockingChainSend_,
95 std::uint64_t claimID_,
96 std::optional<AccountID> const& dst_);
97
98 explicit AttestationClaim(
99 STXChainBridge const& bridge,
100 AccountID attestationSignerAccount_,
101 PublicKey const& publicKey_,
102 SecretKey const& secretKey_,
103 AccountID const& sendingAccount_,
104 STAmount const& sendingAmount_,
105 AccountID const& rewardAccount_,
106 bool wasLockingChainSend_,
107 std::uint64_t claimID_,
108 std::optional<AccountID> const& dst_);
109
110 explicit AttestationClaim(STObject const& o);
111 explicit AttestationClaim(Json::Value const& v);
112
113 [[nodiscard]] STObject
114 toSTObject() const;
115
116 // return true if the two attestations attest to the same thing
117 [[nodiscard]] bool
118 sameEvent(AttestationClaim const& rhs) const;
119
120 [[nodiscard]] static std::vector<std::uint8_t>
121 message(
122 STXChainBridge const& bridge,
124 STAmount const& sendingAmount,
129
130 [[nodiscard]] bool
131 validAmounts() const;
132
133private:
134 [[nodiscard]] std::vector<std::uint8_t>
135 message(STXChainBridge const& bridge) const override;
136
137 friend bool
138 operator==(AttestationClaim const& lhs, AttestationClaim const& rhs);
139};
140
142{
143 bool
144 operator()(AttestationClaim const& lhs, AttestationClaim const& rhs) const
145 {
146 return lhs.claimID < rhs.claimID;
147 }
148};
149
150// Attest to a cross-chain transfer that creates an account
152{
153 // createCount on the sending chain. This is the value of the `CreateCount`
154 // field of the bridge on the sending chain when the transaction was
155 // executed.
157 // Account to create on the destination chain
159 // Total amount of the reward pool
161
162 explicit AttestationCreateAccount(STObject const& o);
163
164 explicit AttestationCreateAccount(Json::Value const& v);
165
167 AccountID attestationSignerAccount_,
168 PublicKey const& publicKey_,
169 Buffer signature_,
170 AccountID const& sendingAccount_,
171 STAmount const& sendingAmount_,
172 STAmount const& rewardAmount_,
173 AccountID const& rewardAccount_,
174 bool wasLockingChainSend_,
175 std::uint64_t createCount_,
176 AccountID const& toCreate_);
177
179 STXChainBridge const& bridge,
180 AccountID attestationSignerAccount_,
181 PublicKey const& publicKey_,
182 SecretKey const& secretKey_,
183 AccountID const& sendingAccount_,
184 STAmount const& sendingAmount_,
185 STAmount const& rewardAmount_,
186 AccountID const& rewardAccount_,
187 bool wasLockingChainSend_,
188 std::uint64_t createCount_,
189 AccountID const& toCreate_);
190
191 [[nodiscard]] STObject
192 toSTObject() const;
193
194 // return true if the two attestations attest to the same thing
195 [[nodiscard]] bool
196 sameEvent(AttestationCreateAccount const& rhs) const;
197
198 friend bool
200
201 [[nodiscard]] static std::vector<std::uint8_t>
202 message(
203 STXChainBridge const& bridge,
205 STAmount const& sendingAmount,
206 STAmount const& rewardAmount,
210 AccountID const& dst);
211
212 [[nodiscard]] bool
213 validAmounts() const;
214
215private:
216 [[nodiscard]] std::vector<std::uint8_t>
217 message(STXChainBridge const& bridge) const override;
218};
219
221{
222 bool
224 {
225 return lhs.createCount < rhs.createCount;
226 }
227};
228
229}; // namespace Attestations
230
231// Result when checking when two attestation match.
233 // One of the fields doesn't match, and it isn't the dst field
235 // all of the fields match, except the dst field
237 // all of the fields match
238 match
239};
240
242{
244 static SField const& ArrayFieldName;
245
252
264
265 explicit XChainClaimAttestation(
266 AccountID const& keyAccount_,
267 PublicKey const& publicKey_,
268 STAmount const& amount_,
269 AccountID const& rewardAccount_,
270 bool wasLockingChainSend_,
272
273 explicit XChainClaimAttestation(
274 STAccount const& keyAccount_,
275 PublicKey const& publicKey_,
276 STAmount const& amount_,
277 STAccount const& rewardAccount_,
278 bool wasLockingChainSend_,
280
281 explicit XChainClaimAttestation(TSignedAttestation const& claimAtt);
282
283 explicit XChainClaimAttestation(STObject const& o);
284
285 explicit XChainClaimAttestation(Json::Value const& v);
286
288 match(MatchFields const& rhs) const;
289
290 [[nodiscard]] STObject
291 toSTObject() const;
292
293 friend bool
295};
296
298{
300 static SField const& ArrayFieldName;
301
309
319
321 AccountID const& keyAccount_,
322 PublicKey const& publicKey_,
323 STAmount const& amount_,
324 STAmount const& rewardAmount_,
325 AccountID const& rewardAccount_,
326 bool wasLockingChainSend_,
327 AccountID const& dst_);
328
329 explicit XChainCreateAccountAttestation(TSignedAttestation const& claimAtt);
330
331 explicit XChainCreateAccountAttestation(STObject const& o);
332
334
335 [[nodiscard]] STObject
336 toSTObject() const;
337
339 match(MatchFields const& rhs) const;
340
341 friend bool
343};
344
345// Attestations from witness servers for a particular claim ID and bridge.
346// Only one attestation per signature is allowed.
347template <class TAttestation>
349{
350public:
352
353private:
354 // Set a max number of allowed attestations to limit the amount of memory
355 // allocated and processing time. This number is much larger than the actual
356 // number of attestation a server would ever expect.
357 static constexpr std::uint32_t maxAttestations = 256;
359
360protected:
361 // Prevent slicing to the base class
363
364public:
368 operator=(XChainAttestationsBase const& rhs) = default;
369
371
372 explicit XChainAttestationsBase(Json::Value const& v);
373
374 explicit XChainAttestationsBase(STArray const& arr);
375
376 [[nodiscard]] STArray
377 toSTArray() const;
378
379 typename AttCollection::const_iterator
380 begin() const;
381
382 typename AttCollection::const_iterator
383 end() const;
384
385 typename AttCollection::iterator
386 begin();
387
388 typename AttCollection::iterator
389 end();
390
391 template <class F>
393 erase_if(F&& f);
394
396 size() const;
397
398 bool
399 empty() const;
400
401 AttCollection const&
403
404 template <class T>
405 void
406 emplace_back(T&& att);
407};
408
409template <class TAttestation>
410[[nodiscard]] inline bool
415
416template <class TAttestation>
419{
420 return attestations_;
421};
422
423template <class TAttestation>
424template <class T>
425inline void
430
431template <class TAttestation>
432template <class F>
433inline std::size_t
435{
436 return std::erase_if(attestations_, std::forward<F>(f));
437}
438
439template <class TAttestation>
440inline std::size_t
442{
443 return attestations_.size();
444}
445
446template <class TAttestation>
447inline bool
449{
450 return attestations_.empty();
451}
452
453class XChainClaimAttestations final : public XChainAttestationsBase<XChainClaimAttestation>
454{
456 using TBase::TBase;
457};
458
459class XChainCreateAccountAttestations final : public XChainAttestationsBase<XChainCreateAccountAttestation>
460{
462 using TBase::TBase;
463};
464
465} // namespace xrpl
Represents a JSON value.
Definition json_value.h:130
Like std::vector<char> but better.
Definition Buffer.h:16
A public key.
Definition PublicKey.h:42
Identifies fields.
Definition SField.h:126
A secret key.
Definition SecretKey.h:18
XChainAttestationsBase(AttCollection &&sigs)
std::vector< TAttestation > AttCollection
AttCollection::const_iterator end() const
XChainAttestationsBase(XChainAttestationsBase const &rhs)=default
AttCollection const & attestations() const
AttCollection::const_iterator begin() const
XChainAttestationsBase & operator=(XChainAttestationsBase const &rhs)=default
static constexpr std::uint32_t maxAttestations
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:5
constexpr bool operator==(base_uint< Bits, Tag > const &lhs, base_uint< Bits, Tag > const &rhs)
Definition base_uint.h:552
AttestationBase & operator=(AttestationBase const &)=default
bool verify(STXChainBridge const &bridge) const
static bool equalHelper(AttestationBase const &lhs, AttestationBase const &rhs)
static bool sameEventHelper(AttestationBase const &lhs, AttestationBase const &rhs)
virtual std::vector< std::uint8_t > message(STXChainBridge const &bridge) const =0
AttestationBase(AttestationBase const &)=default
bool sameEvent(AttestationClaim const &rhs) const
friend bool operator==(AttestationClaim const &lhs, AttestationClaim const &rhs)
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)
bool sameEvent(AttestationCreateAccount const &rhs) const
friend bool operator==(AttestationCreateAccount const &lhs, AttestationCreateAccount const &rhs)
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)
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)
static SField const & ArrayFieldName
std::optional< AccountID > dst
Attestations::AttestationClaim TSignedAttestation
friend bool operator==(XChainClaimAttestation const &lhs, XChainClaimAttestation const &rhs)
friend bool operator==(XChainCreateAccountAttestation const &lhs, XChainCreateAccountAttestation const &rhs)