add attestation API
[oweals/gnunet.git] / src / consensus / consensus_protocol.h
1 /*
2       This file is part of GNUnet
3       Copyright (C) 2012 GNUnet e.V.
4
5       GNUnet is free software: you can redistribute it and/or modify it
6       under the terms of the GNU Affero General Public License as published
7       by the Free Software Foundation, either version 3 of the License,
8       or (at your option) any later version.
9
10       GNUnet is distributed in the hope that it will be useful, but
11       WITHOUT ANY WARRANTY; without even the implied warranty of
12       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13       Affero General Public License for more details.
14
15       You should have received a copy of the GNU Affero General Public License
16       along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18      SPDX-License-Identifier: AGPL3.0-or-later
19  */
20
21
22 /**
23  * @file consensus/consensus_protocol.h
24  * @brief p2p message definitions for consensus
25  * @author Florian Dold
26  */
27
28 #ifndef GNUNET_CONSENSUS_PROTOCOL_H
29 #define GNUNET_CONSENSUS_PROTOCOL_H
30
31 #include "platform.h"
32 #include "gnunet_util_lib.h"
33 #include "gnunet_common.h"
34 #include "gnunet_protocols.h"
35
36
37 GNUNET_NETWORK_STRUCT_BEGIN
38
39 /**
40  * Sent as context message for set reconciliation.
41  *
42  * Essentially contains all the fields
43  * from 'struct TaskKey', but in NBO.
44  */
45 struct GNUNET_CONSENSUS_RoundContextMessage
46 {
47   /**
48    * Type: #GNUNET_MESSAGE_TYPE_CONSENSUS_P2P_ROUND_CONTEXT
49    */
50   struct GNUNET_MessageHeader header;
51
52   /**
53    * A value from 'enum PhaseKind'.
54    */
55   uint16_t kind GNUNET_PACKED;
56
57   /**
58    * Number of the first peer
59    * in canonical order.
60    */
61   int16_t peer1 GNUNET_PACKED;
62
63   /**
64    * Number of the second peer in canonical order.
65    */
66   int16_t peer2 GNUNET_PACKED;
67
68   /**
69    * Repetition of the gradecast phase.
70    */
71   int16_t repetition GNUNET_PACKED;
72
73   /**
74    * Leader in the gradecast phase.
75    *
76    * Can be different from both peer1 and peer2.
77    */
78   int16_t leader GNUNET_PACKED;
79
80   /**
81    * Non-zero if this set reconciliation
82    * had elements removed because they were contested.
83    *
84    * Will be considered when grading broadcasts.
85    *
86    * Ignored for set operations that are not within gradecasts.
87    */
88   uint16_t is_contested GNUNET_PACKED;
89 };
90
91
92 enum
93 {
94   CONSENSUS_MARKER_CONTESTED = 1,
95   CONSENSUS_MARKER_SIZE = 2,
96 };
97
98
99 /**
100  * Consensus element, either marker or payload.
101  */
102 struct ConsensusElement
103 {
104   /**
105    * Payload element_type, only valid
106    * if this is not a marker element.
107    */
108   uint16_t payload_type GNUNET_PACKED;
109
110   /**
111    * Is this a marker element?
112    */
113   uint8_t marker;
114
115   /* rest: element data */
116 };
117
118
119 struct ConsensusSizeElement
120 {
121   struct ConsensusElement ce;
122
123   uint64_t size GNUNET_PACKED;
124   uint8_t sender_index;
125 };
126
127 struct ConsensusStuffedElement
128 {
129   struct ConsensusElement ce;
130   struct GNUNET_HashCode rand GNUNET_PACKED;
131 };
132
133
134 GNUNET_NETWORK_STRUCT_END
135
136 #endif