Skip to content

Commit 62f3dbe

Browse files
authoredNov 18, 2020
Merge pull request #6 from onflow/14-json-arguments
Support string arguments longer than 40 bytes
2 parents edb2b25 + fb7733e commit 62f3dbe

File tree

7 files changed

+131
-111
lines changed

7 files changed

+131
-111
lines changed
 

‎app/src/parser.c

+48-24
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,16 @@ void __assert_fail(const char * assertion, const char * file, unsigned int line,
3535
#define FLOW_WEIGHT_SIZE 2 // 16 bits for weight (uint16)
3636
#define RLP_PREFIX 1
3737

38-
#define FLOW_ACCOUNT_KEY_SIZE (2 * ( \
38+
#define ARGUMENT_BUFFER_SIZE_ACCOUNT_KEY (2 * ( \
3939
(RLP_PREFIX * 2) + \
4040
((RLP_PREFIX * 2) + FLOW_PUBLIC_KEY_SIZE) + \
4141
(RLP_PREFIX + FLOW_SIG_ALGO_SIZE) + \
4242
(RLP_PREFIX + FLOW_HASH_ALGO_SIZE) + \
4343
(RLP_PREFIX + FLOW_WEIGHT_SIZE) \
4444
) + 2)
4545

46+
#define ARGUMENT_BUFFER_SIZE_STRING 256
47+
4648
parser_error_t parser_parse(parser_context_t *ctx, const uint8_t *data, size_t dataLen) {
4749
CHECK_PARSER_ERR(parser_init(ctx, data, dataLen))
4850
return _read(ctx, &parser_tx_obj);
@@ -170,7 +172,7 @@ parser_error_t parser_printChainID(const flow_payer_t *v,
170172
return parser_invalid_address;
171173
}
172174

173-
__Z_INLINE parser_error_t parser_printArgument(const flow_argument_list_t *v,
175+
parser_error_t parser_printArgument(const flow_argument_list_t *v,
174176
uint8_t argIndex, char *expectedType, jsmntype_t jsonType,
175177
char *outVal, uint16_t outValLen,
176178
uint8_t pageIdx, uint8_t *pageCount) {
@@ -191,6 +193,26 @@ __Z_INLINE parser_error_t parser_printArgument(const flow_argument_list_t *v,
191193
return parser_ok;
192194
}
193195

196+
parser_error_t parser_printArgumentString(const parser_context_t *argumentCtx,
197+
char *outVal, uint16_t outValLen,
198+
uint8_t pageIdx, uint8_t *pageCount) {
199+
MEMZERO(outVal, outValLen);
200+
201+
parsed_json_t parsedJson = {false};
202+
CHECK_PARSER_ERR(json_parse(&parsedJson, (char *) argumentCtx->buffer, argumentCtx->bufferLen));
203+
204+
char bufferUI[ARGUMENT_BUFFER_SIZE_STRING];
205+
CHECK_PARSER_ERR(json_extractString(bufferUI, sizeof(bufferUI), &parsedJson, 0))
206+
pageString(outVal, outValLen, bufferUI, pageIdx, pageCount);
207+
208+
// Check requested page is in range
209+
if (pageIdx > *pageCount) {
210+
return parser_display_page_out_of_range;
211+
}
212+
213+
return parser_ok;
214+
}
215+
194216
parser_error_t parser_printArgumentPublicKey(const parser_context_t *argumentCtx,
195217
char *outVal, uint16_t outValLen,
196218
uint8_t pageIdx, uint8_t *pageCount) {
@@ -199,8 +221,8 @@ parser_error_t parser_printArgumentPublicKey(const parser_context_t *argumentCtx
199221
parsed_json_t parsedJson = {false};
200222
CHECK_PARSER_ERR(json_parse(&parsedJson, (char *) argumentCtx->buffer, argumentCtx->bufferLen));
201223

202-
char bufferUI[FLOW_ACCOUNT_KEY_SIZE];
203-
CHECK_PARSER_ERR(json_extractPubKey(bufferUI, sizeof(bufferUI), &parsedJson, 0))
224+
char bufferUI[ARGUMENT_BUFFER_SIZE_ACCOUNT_KEY];
225+
CHECK_PARSER_ERR(json_extractString(bufferUI, sizeof(bufferUI), &parsedJson, 0))
204226
pageString(outVal, outValLen, bufferUI, pageIdx, pageCount);
205227

206228
// Check requested page is in range
@@ -231,9 +253,9 @@ parser_error_t parser_printArgumentPublicKeys(const parser_context_t *argumentCt
231253
zemu_log_stack("PublicKeys");
232254

233255
uint16_t arrayElementToken;
234-
char bufferUI[FLOW_ACCOUNT_KEY_SIZE];
256+
char bufferUI[ARGUMENT_BUFFER_SIZE_ACCOUNT_KEY];
235257
CHECK_PARSER_ERR(array_get_nth_element(&parsedJson, internalTokenElementIdx, argumentIndex, &arrayElementToken))
236-
CHECK_PARSER_ERR(json_extractPubKey(bufferUI, sizeof(bufferUI), &parsedJson, arrayElementToken))
258+
CHECK_PARSER_ERR(json_extractString(bufferUI, sizeof(bufferUI), &parsedJson, arrayElementToken))
237259
pageString(outVal, outValLen, bufferUI, pageIdx, pageCount);
238260

239261
// Check requested page is in range
@@ -663,30 +685,34 @@ parser_error_t parser_getItemRegisterNode(const parser_context_t *ctx,
663685
return parser_printChainID(&parser_tx_obj.payer,
664686
outVal, outValLen, pageIdx, pageCount);
665687
case 2:
688+
CHECK_PARSER_ERR(
689+
parser_printArgumentString(&parser_tx_obj.arguments.argCtx[0],
690+
outVal, outValLen, pageIdx, pageCount));
666691
snprintf(outKey, outKeyLen, "Node ID");
667-
return parser_printArgument(&parser_tx_obj.arguments, 0,
668-
"String", JSMN_STRING,
669-
outVal, outValLen, pageIdx, pageCount);
692+
return parser_ok;
670693
case 3:
671694
snprintf(outKey, outKeyLen, "Node Role");
672695
return parser_printArgument(&parser_tx_obj.arguments, 1,
673696
"UInt8", JSMN_STRING,
674697
outVal, outValLen, pageIdx, pageCount);
675698
case 4:
699+
CHECK_PARSER_ERR(
700+
parser_printArgumentString(&parser_tx_obj.arguments.argCtx[2],
701+
outVal, outValLen, pageIdx, pageCount));
676702
snprintf(outKey, outKeyLen, "Networking Address");
677-
return parser_printArgument(&parser_tx_obj.arguments, 2,
678-
"String", JSMN_STRING,
679-
outVal, outValLen, pageIdx, pageCount);
703+
return parser_ok;
680704
case 5:
705+
CHECK_PARSER_ERR(
706+
parser_printArgumentString(&parser_tx_obj.arguments.argCtx[3],
707+
outVal, outValLen, pageIdx, pageCount));
681708
snprintf(outKey, outKeyLen, "Networking Key");
682-
return parser_printArgument(&parser_tx_obj.arguments, 3,
683-
"String", JSMN_STRING,
684-
outVal, outValLen, pageIdx, pageCount);
709+
return parser_ok;
685710
case 6:
711+
CHECK_PARSER_ERR(
712+
parser_printArgumentString(&parser_tx_obj.arguments.argCtx[4],
713+
outVal, outValLen, pageIdx, pageCount));
686714
snprintf(outKey, outKeyLen, "Staking Key");
687-
return parser_printArgument(&parser_tx_obj.arguments, 4,
688-
"String", JSMN_STRING,
689-
outVal, outValLen, pageIdx, pageCount);
715+
return parser_ok;
690716
case 7:
691717
snprintf(outKey, outKeyLen, "Amount");
692718
return parser_printArgument(&parser_tx_obj.arguments, 5,
@@ -1113,9 +1139,8 @@ parser_error_t parser_getItemRegisterOperatorNode(const parser_context_t *ctx,
11131139
outVal, outValLen, pageIdx, pageCount);
11141140
case 3:
11151141
snprintf(outKey, outKeyLen, "Node ID");
1116-
return parser_printArgument(&parser_tx_obj.arguments, 1,
1117-
"String", JSMN_STRING,
1118-
outVal, outValLen, pageIdx, pageCount);
1142+
return parser_printArgumentString(&parser_tx_obj.arguments.argCtx[1],
1143+
outVal, outValLen, pageIdx, pageCount);
11191144
case 4:
11201145
snprintf(outKey, outKeyLen, "Amount");
11211146
return parser_printArgument(&parser_tx_obj.arguments, 2,
@@ -1171,9 +1196,8 @@ parser_error_t parser_getItemRegisterDelegator(const parser_context_t *ctx,
11711196
outVal, outValLen, pageIdx, pageCount);
11721197
case 2:
11731198
snprintf(outKey, outKeyLen, "Node ID");
1174-
return parser_printArgument(&parser_tx_obj.arguments, 0,
1175-
"String", JSMN_STRING,
1176-
outVal, outValLen, pageIdx, pageCount);
1199+
return parser_printArgumentString(&parser_tx_obj.arguments.argCtx[0],
1200+
outVal, outValLen, pageIdx, pageCount);
11771201
case 3:
11781202
snprintf(outKey, outKeyLen, "Amount");
11791203
return parser_printArgument(&parser_tx_obj.arguments, 1,

‎app/src/parser_impl.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ parser_error_t formatStrUInt8AsHex(const char *decStr, char *hexStr) {
228228
return parser_ok;
229229
}
230230

231-
parser_error_t json_extractPubKey(char *outVal, uint16_t outValLen, parsed_json_t *parsedJson, uint16_t tokenIdx) {
231+
parser_error_t json_extractString(char *outVal, uint16_t outValLen, parsed_json_t *parsedJson, uint16_t tokenIdx) {
232232
MEMZERO(outVal, outValLen);
233233

234234
uint16_t internalTokenElemIdx;

‎app/src/parser_impl.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ parser_error_t json_matchKeyValue(parsed_json_t *parsedJson,
5050

5151
parser_error_t formatStrUInt8AsHex(const char *decStr, char *hexStr);
5252

53-
parser_error_t json_extractPubKey(char *outVal, uint16_t outValLen, parsed_json_t *parsedJson, uint16_t tokenIdx);
53+
parser_error_t json_extractString(char *outVal, uint16_t outValLen, parsed_json_t *parsedJson, uint16_t tokenIdx);
5454

5555
#ifdef __cplusplus
5656
}

‎tests/generate-transaction-tests/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ const sampleArgumentValue = (type, network) => {
239239
case "UInt8":
240240
return "3";
241241
case "String":
242-
return "foo";
242+
return "f0874204ab2f2ff1c112421c49be9608ccfc48f5e890f89a8fe50e8f5cb36d9d";
243243
case "Address":
244244
return `0x${ADDRESSES[network]}`;
245245
};

0 commit comments

Comments
 (0)