-
Notifications
You must be signed in to change notification settings - Fork 16
/
txHashBuilder.h
324 lines (291 loc) · 10.5 KB
/
txHashBuilder.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
#ifndef H_CARDANO_APP_TX_HASH_BUILDER
#define H_CARDANO_APP_TX_HASH_BUILDER
#include "cardano.h"
#include "hash.h"
enum {
TX_BODY_KEY_INPUTS = 0,
TX_BODY_KEY_OUTPUTS = 1,
TX_BODY_KEY_FEE = 2,
TX_BODY_KEY_TTL = 3,
TX_BODY_KEY_CERTIFICATES = 4,
TX_BODY_KEY_WITHDRAWALS = 5,
// TX_BODY_KEY_UPDATE = 6, // not used
TX_BODY_KEY_AUX_DATA = 7,
TX_BODY_KEY_VALIDITY_INTERVAL_START = 8,
TX_BODY_KEY_MINT = 9,
TX_BODY_KEY_SCRIPT_HASH_DATA = 11,
TX_BODY_KEY_COLLATERALS = 13,
TX_BODY_KEY_REQUIRED_SIGNERS = 14,
TX_BODY_KEY_NETWORK_ID = 15,
TX_BODY_KEY_COLLATERAL_RETURN = 16, //CollRet
TX_BODY_KEY_TOTAL_COLLATERAL = 17, //TxColl
TX_BODY_KEY_REFERENCE_INPUTS = 18, //refInputs
};
enum {
TX_OUTPUT_KEY_ADDRESS = 1,
TX_OUTPUT_KEY_VALUE = 2,
TX_OUTPUT_KEY_DATUM_OPTION = 3,
TX_OUTPUT_KEY_SCRIPT_REF = 4,
};
/* The state machine of the tx hash builder is driven by user calls.
* E.g., when the user calls txHashBuilder_addInput(), the input is only
* added and the state is not advanced to outputs even if all inputs have been added
* --- only after calling txHashBuilder_enterOutputs()
* is the state advanced to TX_HASH_BUILDER_IN_OUTPUTS.
*
* Pool registration certificates have an inner state loop which is implemented
* in a similar fashion with the exception that when all pool certificate data
* have been entered, the state is changed to TX_HASH_BUILDER_IN_CERTIFICATES.
*/
typedef enum {
TX_HASH_BUILDER_INIT = 100,
TX_HASH_BUILDER_IN_INPUTS = 200,
TX_HASH_BUILDER_IN_OUTPUTS = 300,
TX_HASH_BUILDER_IN_OUTPUTS_TOP_LEVEL_DATA = 310,
TX_HASH_BUILDER_IN_OUTPUTS_ASSET_GROUP = 311,
TX_HASH_BUILDER_IN_OUTPUTS_TOKEN = 312,
TX_HASH_BUILDER_IN_OUTPUTS_DATUM_HASH = 313,
TX_HASH_BUILDER_IN_OUTPUTS_DATUM_OPTION = 314,
TX_HASH_BUILDER_IN_OUTPUTS_DATUM_OPTION_CHUNKS = 315,
TX_HASH_BUILDER_IN_OUTPUTS_SCRIPT_REFERENCE = 316,
TX_HASH_BUILDER_IN_OUTPUTS_SCRIPT_REFERENCE_CHUNKS = 317,
TX_HASH_BUILDER_IN_FEE = 400,
TX_HASH_BUILDER_IN_TTL = 500,
TX_HASH_BUILDER_IN_CERTIFICATES = 600,
TX_HASH_BUILDER_IN_CERTIFICATES_POOL_INIT = 610,
TX_HASH_BUILDER_IN_CERTIFICATES_POOL_KEY_HASH = 611,
TX_HASH_BUILDER_IN_CERTIFICATES_POOL_VRF = 612,
TX_HASH_BUILDER_IN_CERTIFICATES_POOL_FINANCIALS = 613,
TX_HASH_BUILDER_IN_CERTIFICATES_POOL_REWARD_ACCOUNT = 614,
TX_HASH_BUILDER_IN_CERTIFICATES_POOL_OWNERS = 615,
TX_HASH_BUILDER_IN_CERTIFICATES_POOL_RELAYS = 616,
TX_HASH_BUILDER_IN_CERTIFICATES_POOL_METADATA = 617,
TX_HASH_BUILDER_IN_WITHDRAWALS = 700,
TX_HASH_BUILDER_IN_AUX_DATA = 800,
TX_HASH_BUILDER_IN_VALIDITY_INTERVAL_START = 900,
TX_HASH_BUILDER_IN_MINT = 1000,
TX_HASH_BUILDER_IN_MINT_TOP_LEVEL_DATA = 1010,
TX_HASH_BUILDER_IN_MINT_ASSET_GROUP = 1011,
TX_HASH_BUILDER_IN_MINT_TOKEN = 1012,
TX_HASH_BUILDER_IN_SCRIPT_DATA_HASH = 1100,
TX_HASH_BUILDER_IN_COLLATERALS = 1200,
TX_HASH_BUILDER_IN_REQUIRED_SIGNERS = 1300,
TX_HASH_BUILDER_IN_NETWORK_ID = 1400,
TX_HASH_BUILDER_IN_COLLATERAL_RETURN = 1500,
TX_HASH_BUILDER_IN_TOTAL_COLLATERAL = 1600,
TX_HASH_BUILDER_IN_REFERENCE_INPUTS = 1700,
TX_HASH_BUILDER_FINISHED = 1800,
} tx_hash_builder_state_t;
typedef struct {
uint16_t remainingInputs;
uint16_t remainingOutputs;
uint16_t remainingWithdrawals;
uint16_t remainingCertificates;
uint16_t remainingCollaterals;
uint16_t remainingRequiredSigners;
uint16_t remainingReferenceInputs;
uint16_t totalDatumSize;
uint16_t currentDatumSize;
uint16_t totalReferenceScriptSize;
uint16_t currentReferenceScriptSize;
bool includeTtl;
bool includeAuxData;
bool includeValidityIntervalStart;
bool includeMint;
bool includeScriptDataHash;
bool includeNetworkId;
bool includeCollateralReturn;
bool includeTotalCollateral;
union {
struct {
uint16_t remainingOwners;
uint16_t remainingRelays;
} poolCertificateData;
struct {
uint16_t remainingAssetGroups;
uint16_t remainingTokens;
} multiassetData;
};
tx_hash_builder_state_t state;
blake2b_256_context_t txHash;
} tx_hash_builder_t;
typedef enum {
LEGACY = 0,
POST_ALONZO = 1
} tx_hash_builder_txOutput_format;
typedef struct {
tx_hash_builder_txOutput_format format;
size_t addressSize;
const uint8_t *addressBuffer;
uint64_t amount;
uint16_t numAssetGroups;
bool includeDatumOption;
bool includeScriptRef;
} tx_hash_builder_output;
void txHashBuilder_init(
tx_hash_builder_t* builder,
uint16_t numInputs,
uint16_t numOutputs,
bool includeTtl,
uint16_t numCertificates,
uint16_t numWithdrawals,
bool includeAuxData,
bool includeValidityIntervalStart,
bool includeMint,
bool includeScriptDataHash,
uint16_t numCollaterals,
uint16_t numRequiredSigners,
bool includeNetworkId,
bool includeCollateralReturn,
bool includeTotalCollateral,
uint16_t numReferenceInputs
);
void txHashBuilder_enterInputs(tx_hash_builder_t* builder);
void txHashBuilder_addInput(
tx_hash_builder_t* builder,
const uint8_t* utxoHashBuffer, size_t utxoHashSize,
uint32_t utxoIndex
);
void txHashBuilder_enterOutputs(tx_hash_builder_t* builder);
void txHashBuilder_addOutput_topLevelData(
tx_hash_builder_t* builder,
tx_hash_builder_output const *output
);
void txHashBuilder_addOutput_tokenGroup(
tx_hash_builder_t* builder,
const uint8_t* policyIdBuffer, size_t policyIdSize,
uint16_t numTokens
);
void txHashBuilder_addOutput_token(
tx_hash_builder_t* builder,
const uint8_t* assetNameBuffer, size_t assetNameSize,
uint64_t amount,
bool includeDatumHash
);
void txHashBuilder_addOutput_datumHash(
tx_hash_builder_t* builder,
const uint8_t* datumHashBuffer, size_t datumHashSize
);
void txHashBuilder_addOutput_datumOption(tx_hash_builder_t *builder, datum_option_type_t datumOption, const uint8_t *buffer,
size_t bufferSize);
void txHashBuilder_addOutput_referenceScript(tx_hash_builder_t *builder, size_t bufferSize);
void txHashBuilder_addFee(tx_hash_builder_t* builder, uint64_t fee);
void txHashBuilder_addTtl(tx_hash_builder_t* builder, uint64_t ttl);
void txHashBuilder_enterCertificates(tx_hash_builder_t* builder);
void txHashBuilder_addCertificate_stakingHash(
tx_hash_builder_t* builder,
const certificate_type_t certificateType,
const stake_credential_type_t stakeCredentialType,
const uint8_t* stakingHash, size_t stakingHashSize
);
void txHashBuilder_addCertificate_delegation(
tx_hash_builder_t* builder,
const stake_credential_type_t stakeCredentialType,
const uint8_t* stakingKeyHash, size_t stakingKeyHashSize,
const uint8_t* poolKeyHash, size_t poolKeyHashSize
);
void txHashBuilder_addCertificate_poolRetirement(
tx_hash_builder_t* builder,
uint8_t* poolKeyHash, size_t poolKeyHashSize,
uint64_t epoch
);
void txHashBuilder_poolRegistrationCertificate_enter(
tx_hash_builder_t* builder,
uint16_t numOwners, uint16_t numRelays
);
void txHashBuilder_poolRegistrationCertificate_poolKeyHash(
tx_hash_builder_t* builder,
uint8_t* poolKeyHash, size_t poolKeyHashSize
);
void txHashBuilder_poolRegistrationCertificate_vrfKeyHash(
tx_hash_builder_t* builder,
uint8_t* vrfKeyHash, size_t vrfKeyHashSize
);
void txHashBuilder_poolRegistrationCertificate_financials(
tx_hash_builder_t* builder,
uint64_t pledge, uint64_t cost,
uint64_t marginNumerator, uint64_t marginDenominator
);
void txHashBuilder_poolRegistrationCertificate_rewardAccount(
tx_hash_builder_t* builder,
uint8_t* rewardAccount, size_t rewardAccountSize
);
void txHashBuilder_addPoolRegistrationCertificate_enterOwners(tx_hash_builder_t* builder);
void txHashBuilder_addPoolRegistrationCertificate_addOwner(
tx_hash_builder_t* builder,
const uint8_t* stakingKeyHash, size_t stakingKeyHashSize
);
void txHashBuilder_addPoolRegistrationCertificate_enterRelays(tx_hash_builder_t* builder);
void txHashBuilder_addPoolRegistrationCertificate_addRelay(
tx_hash_builder_t* builder,
pool_relay_t* relay
);
void txHashBuilder_addPoolRegistrationCertificate_addPoolMetadata(
tx_hash_builder_t* builder,
const uint8_t* url, size_t urlSize,
const uint8_t* metadataHash, size_t metadataHashSize
);
void txHashBuilder_addPoolRegistrationCertificate_addPoolMetadata_null(
tx_hash_builder_t* builder
);
void txHashBuilder_enterWithdrawals(tx_hash_builder_t* builder);
void txHashBuilder_addWithdrawal(
tx_hash_builder_t* builder,
const uint8_t* rewardAddressBuffer, size_t rewardAddressSize,
uint64_t amount
);
void txHashBuilder_addAuxData(
tx_hash_builder_t* builder,
const uint8_t* auxDataHashBuffer, size_t auxDataHashSize
);
void txHashBuilder_addValidityIntervalStart(
tx_hash_builder_t* builder,
uint64_t validityIntervalStart
);
void txHashBuilder_enterMint(tx_hash_builder_t* builder);
void txHashBuilder_addMint_topLevelData(
tx_hash_builder_t* builder, uint16_t numAssetGroups
);
void txHashBuilder_addMint_tokenGroup(
tx_hash_builder_t* builder,
const uint8_t* policyIdBuffer, size_t policyIdSize,
uint16_t numTokens
);
void txHashBuilder_addMint_token(
tx_hash_builder_t* builder,
const uint8_t* assetNameBuffer, size_t assetNameSize,
int64_t amount
);
void txHashBuilder_addScriptDataHash(
tx_hash_builder_t* builder,
const uint8_t* scriptHashData, size_t scriptHashDataSize
);
void txHashBuilder_enterCollaterals(tx_hash_builder_t* builder);
void txHashBuilder_addCollateral(
tx_hash_builder_t* builder,
const uint8_t* utxoHashBuffer, size_t utxoHashSize,
uint32_t utxoIndex
);
void txHashBuilder_enterRequiredSigners(tx_hash_builder_t* builder);
void txHashBuilder_addRequiredSigner(
tx_hash_builder_t* builder,
const uint8_t* vkeyBuffer, size_t vkeySize
);
void txHashBuilder_addNetworkId(tx_hash_builder_t* builder, uint8_t networkId);
void txHashBuilder_addCollateralReturn(tx_hash_builder_t *builder,
tx_hash_builder_output const *output);
void txHashBuilder_addTotalCollateral(tx_hash_builder_t* builder, uint64_t txColl);
void txHashBuilder_enterReferenceInputs(tx_hash_builder_t* builder);
void txHashBuilder_addReferenceInput(
tx_hash_builder_t* builder,
const uint8_t* utxoHashBuffer, size_t utxoHashSize,
uint32_t utxoIndex
);
void txHashBuilder_finalize(
tx_hash_builder_t* builder,
uint8_t* outBuffer, size_t outSize
);
#ifdef DEVEL
void run_txHashBuilder_test();
#endif // DEVEL
#endif // H_CARDANO_APP_TX_HASH_BUILDER