xrpld
Loading...
Searching...
No Matches
XChainAttestations.h
1#pragma once
2
3#include <xrpl/basics/Buffer.h>
4#include <xrpl/protocol/AccountID.h>
5#include <xrpl/protocol/Issue.h>
6#include <xrpl/protocol/PublicKey.h>
7#include <xrpl/protocol/SField.h>
8#include <xrpl/protocol/STBase.h>
9#include <xrpl/protocol/STXChainBridge.h>
10#include <xrpl/protocol/SecretKey.h>
11#include <xrpl/protocol/TER.h>
12
13#include <boost/container/flat_set.hpp>
14#include <boost/container/vector.hpp>
15
16#include <cstddef>
17#include <expected>
18#include <utility>
19#include <vector>
20
21namespace xrpl {
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 transferred on the sending chain
38 // Account on the destination chain that collects a share of the attestation
39 // reward
41 // Amount was transferred on the locking chain
43
44 explicit AttestationBase(
46 PublicKey const& publicKey,
52
54
55 virtual ~AttestationBase() = default;
56
58 operator=(AttestationBase const&) = default;
59
60 // verify that the signature attests to the data.
61 [[nodiscard]] 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(
90 PublicKey const& publicKey,
96 std::uint64_t claimId,
98
99 explicit AttestationClaim(
100 STXChainBridge const& bridge,
102 PublicKey const& publicKey,
103 SecretKey const& secretKey,
105 STAmount const& sendingAmount,
108 std::uint64_t claimId,
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
169 PublicKey const& publicKey,
172 STAmount const& sendingAmount,
177 AccountID const& toCreate);
178
180 STXChainBridge const& bridge,
182 PublicKey const& publicKey,
183 SecretKey const& secretKey,
185 STAmount const& sendingAmount,
186 STAmount const& rewardAmount,
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
202 [[nodiscard]] static std::vector<std::uint8_t>
203 message(
204 STXChainBridge const& bridge,
206 STAmount const& sendingAmount,
207 STAmount const& rewardAmount,
211 AccountID const& dst);
212
213 [[nodiscard]] bool
214 validAmounts() const;
215
216private:
217 [[nodiscard]] std::vector<std::uint8_t>
218 message(STXChainBridge const& bridge) const override;
219};
220
222{
223 bool
225 {
226 return lhs.createCount < rhs.createCount;
227 }
228};
229
230}; // namespace Attestations
231
232// Result when checking when two attestation match.
234 // One of the fields doesn't match, and it isn't the dst field
236 // all of the fields match, except the dst field
238 // all of the fields match
240};
241
243{
245 static SField const& arrayFieldName;
246
253
265
266 explicit XChainClaimAttestation(
267 AccountID const& keyAccount,
268 PublicKey const& publicKey,
269 STAmount const& amount,
273
274 explicit XChainClaimAttestation(
275 STAccount const& keyAccount,
276 PublicKey const& publicKey,
277 STAmount const& amount,
281
282 explicit XChainClaimAttestation(TSignedAttestation const& claimAtt);
283
284 explicit XChainClaimAttestation(STObject const& o);
285
286 explicit XChainClaimAttestation(json::Value const& v);
287
288 [[nodiscard]] AttestationMatch
289 match(MatchFields const& rhs) const;
290
291 [[nodiscard]] STObject
292 toSTObject() const;
293
294 friend bool
296};
297
347
348// Attestations from witness servers for a particular claim ID and bridge.
349// Only one attestation per signature is allowed.
350template <class TAttestation>
352{
353public:
355
356private:
357 // Set a max number of allowed attestations to limit the amount of memory
358 // allocated and processing time. This number is much larger than the actual
359 // number of attestation a server would ever expect.
360 static constexpr std::uint32_t kMaxAttestations = 256;
362
363protected:
364 // Prevent slicing to the base class
366
367public:
371 operator=(XChainAttestationsBase const& rhs) = default;
372
374
376
377 explicit XChainAttestationsBase(STArray const& arr);
378
379 [[nodiscard]] STArray
380 toSTArray() const;
381
382 [[nodiscard]] AttCollection::const_iterator
383 begin() const;
384
385 [[nodiscard]] AttCollection::const_iterator
386 end() const;
387
388 AttCollection::iterator
390
391 AttCollection::iterator
393
394 template <class F>
396 eraseIf(F&& f);
397
398 [[nodiscard]] std::size_t
399 size() const;
400
401 [[nodiscard]] bool
402 empty() const;
403
404 [[nodiscard]] AttCollection const&
406
407 template <class T>
408 void
409 emplaceBack(T&& att);
410};
411
412template <class TAttestation>
413[[nodiscard]] inline bool
417{
418 return lhs.attestations() == rhs.attestations();
419}
420
421template <class TAttestation>
427
428template <class TAttestation>
429template <class T>
430inline void
435
436template <class TAttestation>
437template <class F>
438inline std::size_t
443
444template <class TAttestation>
445inline std::size_t
450
451template <class TAttestation>
452inline bool
454{
455 return attestations_.empty();
456}
457
458class XChainClaimAttestations final : public XChainAttestationsBase<XChainClaimAttestation>
459{
461 using TBase::TBase;
462};
463
465 : public XChainAttestationsBase<XChainCreateAccountAttestation>
466{
468 using TBase::TBase;
469};
470
471} // 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:130
A secret key.
Definition SecretKey.h:18
AttCollection::iterator end()
XChainAttestationsBase(AttCollection &&sigs)
XChainAttestationsBase(STArray const &arr)
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
XChainAttestationsBase(json::Value const &v)
AttCollection::iterator begin()
XChainAttestationsBase< XChainClaimAttestation > TBase
XChainAttestationsBase< XChainCreateAccountAttestation > TBase
T forward(T... args)
STL namespace.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
constexpr bool operator==(BaseUInt< Bits, Tag > const &lhs, BaseUInt< Bits, Tag > const &rhs)
Definition base_uint.h:588
BaseUInt< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
Definition AccountID.h:28
AttestationBase & operator=(AttestationBase const &)=default
AttestationBase(AccountID attestationSignerAccount, PublicKey const &publicKey, Buffer signature, AccountID const &sendingAccount, STAmount sendingAmount, AccountID const &rewardAccount, bool wasLockingChainSend)
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
AttestationClaim(AccountID attestationSignerAccount, PublicKey const &publicKey, Buffer signature, AccountID const &sendingAccount, STAmount const &sendingAmount, AccountID const &rewardAccount, bool wasLockingChainSend, std::uint64_t claimId, std::optional< AccountID > const &dst)
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 a, bool b, std::optional< AccountID > const &d)
std::optional< AccountID > dst
Attestations::AttestationClaim TSignedAttestation
friend bool operator==(XChainClaimAttestation const &lhs, XChainClaimAttestation const &rhs)
XChainClaimAttestation(AccountID const &keyAccount, PublicKey const &publicKey, STAmount const &amount, AccountID const &rewardAccount, bool wasLockingChainSend, std::optional< AccountID > const &dst)
static SField const & arrayFieldName
AttestationMatch match(MatchFields const &rhs) const
Attestations::AttestationCreateAccount TSignedAttestation
XChainCreateAccountAttestation(AccountID const &keyAccount, PublicKey const &publicKey, STAmount const &amount, STAmount const &rewardAmount, AccountID const &rewardAccount, bool wasLockingChainSend, AccountID const &dst)
friend bool operator==(XChainCreateAccountAttestation const &lhs, XChainCreateAccountAttestation const &rhs)
AttestationMatch match(MatchFields const &rhs) const