From bbd9b7977005fdfe26bb28f53bbaf8c9ea14136e Mon Sep 17 00:00:00 2001 From: maker999 <32385469+maker999@users.noreply.github.com> Date: Sat, 21 Dec 2019 17:40:31 +0100 Subject: [PATCH 1/3] new prepare functions --- README.md | 18 ++++++++++++----- inc/transaction.h | 3 ++- src/transaction.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index d3d2975..3a17e45 100644 --- a/README.md +++ b/README.md @@ -46,13 +46,21 @@ built, signed, fulfilled and serialized. Now, the transaction can be submitted to the BigchainDB nodes. ``` - /* inputs: operation, asset, metadata, base_pubkey(public key in base58) + /* prepare for 'CREATE' operation + * (The keys on the JSON must be in alphabetical order) + * inputs: operation, asset, metadata, base_pubkey(public key in base58) * output: tx - * 'operation' can be either 'C' or 'T' for CREATE and TRANSFER respectively. - * when 'operation' is CREATE then 'asset' can be arbitrary. (The keys on the JSON must be in alphabetical order) - * but when 'operation' is TRANSFER then 'asset' must be the transaction id of the asset which is to be tranfered. */ - prepare_tx(BIGCHAIN_TX *tx, const char operation, char *asset, char *metadata , char *base_pubkey); + void prepare_CREATE(BIGCHAIN_TX *tx, ,char *asset, char *metadata, char *base_pubkey); + + /* prepare for 'TRANSFER' operation + * (The keys on the JSON must be in alphabetical order) + * asset = transaction id of the asset to be transferred + * fulfills = transaction id of the latest TRANSFER, which is the same as asset if this is the first time it is being transferred. + * inputs: operation, fulfills, asset, metadata, base_pubkey(public key in base58) + * output: tx + */ + void prepare_TRANSFER(BIGCHAIN_TX *tx, char *fulfills, char *asset, char *metadata, char *base_pubkey); /* inputs: tx, tx_id(same as 'asset' above, only needed for TRANSFER) , priv_key, pub_key(public key in hexadecimal base) , maxlen(maximum length of string) * output: json diff --git a/inc/transaction.h b/inc/transaction.h index 2c3e31d..248b0d1 100644 --- a/inc/transaction.h +++ b/inc/transaction.h @@ -42,7 +42,8 @@ void bigchain_sign_transaction(uint8_t *json_tx, uint16_t len, uint8_t *priv_key char *bigchain_build_json_inputs(BIGCHAIN_INPUT *inputs, uint8_t num_inputs, char *json_obj); char *bigchain_build_json_outputs(BIGCHAIN_OUTPUT *outputs, uint8_t num_outputs, char *json_obj); void bigchain_build_json_tx(BIGCHAIN_TX *tx, char *json_tx); -void prepare_tx(BIGCHAIN_TX *tx, const char operation, char *asset, char *metadata, char *base_pubkey); +void prepare_CREATE(BIGCHAIN_TX *tx, ,char *asset, char *metadata, char *base_pubkey); +void prepare_TRANSFER(BIGCHAIN_TX *tx, char *fullfils, char *asset, char *metadata, char *base_pubkey); void fulfill_tx(BIGCHAIN_TX *tx, char *tx_id, uint8_t *priv_key, uint8_t *pub_key, uint8_t *json, uint16_t maxlen); #endif // _BIGCHAIN_TX_H_ diff --git a/src/transaction.c b/src/transaction.c index ae34f3c..81f280a 100644 --- a/src/transaction.c +++ b/src/transaction.c @@ -244,6 +244,57 @@ void prepare_tx(BIGCHAIN_TX *tx, const char operation, char *asset, char *metada tx->num_outputs = 1; } +void prepare_CREATE(BIGCHAIN_TX *tx, ,char *asset, char *metadata, char *base_pubkey) +{ + // Fill input struct + memset(tx->inputs, 0, sizeof(BIGCHAIN_INPUT)); + memcpy(tx->inputs[0].owners_before[0], base_pubkey, strlen(base_pubkey)); + tx->inputs[0].num_owners = 1; + tx->num_inputs = 1; + + memcpy(tx->operation, "CREATE", strlen("CREATE")); + memcpy(tx->asset, asset, strlen(asset)); + + memcpy(tx->metadata, metadata, strlen(metadata)); + memcpy(tx->version, BDB_VERSION, strlen(BDB_VERSION)); + + // Fill output struct + memset(tx->outputs, 0, sizeof(BIGCHAIN_OUTPUT)); + tx->outputs[0].amount[0] = '1'; + memcpy(tx->outputs[0].details_public_key, base_pubkey, strlen(base_pubkey)); + memcpy(tx->outputs[0].public_keys[0], base_pubkey, strlen(base_pubkey)); + tx->outputs[0].num_public_keys = 1; + tx->num_outputs = 1; +} + +void prepare_TRANSFER(BIGCHAIN_TX *tx, char *fulfills, char *asset, char *metadata, char *base_pubkey) +{ + // Fill input struct + memset(tx->inputs, 0, sizeof(BIGCHAIN_INPUT)); + memcpy(tx->inputs[0].owners_before[0], base_pubkey, strlen(base_pubkey)); + tx->inputs[0].num_owners = 1; + tx->num_inputs = 1; + + memcpy(tx->operation, "TRANSFER", strlen("TRANSFER")); + memcpy(tx->inputs[0].fulfills, FULFILL_PREFIX, FULFILL_PREFIX_LENGTH ); + memcpy(tx->inputs[0].fulfills + FULFILL_PREFIX_LENGTH, fulfills, TX_ID_LENGTH ); + memcpy(tx->inputs[0].fulfills + FULFILL_PREFIX_LENGTH + TX_ID_LENGTH, "\"\0", 2); + memcpy(tx->asset, ASSET_ID, ASSET_ID_LENGTH); + memcpy(tx->asset + ASSET_ID_LENGTH, asset, TX_ID_LENGTH ); + memcpy(tx->asset + ASSET_ID_LENGTH + TX_ID_LENGTH, "\"\0", 2); + + memcpy(tx->metadata, metadata, strlen(metadata)); + memcpy(tx->version, BDB_VERSION, strlen(BDB_VERSION)); + + // Fill output struct + memset(tx->outputs, 0, sizeof(BIGCHAIN_OUTPUT)); + tx->outputs[0].amount[0] = '1'; + memcpy(tx->outputs[0].details_public_key, base_pubkey, strlen(base_pubkey)); + memcpy(tx->outputs[0].public_keys[0], base_pubkey, strlen(base_pubkey)); + tx->outputs[0].num_public_keys = 1; + tx->num_outputs = 1; +} + void fulfill_tx(BIGCHAIN_TX *tx, char *tx_id, uint8_t *priv_key, uint8_t *pub_key, uint8_t *json, uint16_t maxlen) { uint8_t sig[140] = {0}; bigchain_build_json_tx(tx, json); From f617858bfb10b17b36cfdd674db9561f4d0905f8 Mon Sep 17 00:00:00 2001 From: maker999 <32385469+maker999@users.noreply.github.com> Date: Sat, 21 Dec 2019 18:03:15 +0100 Subject: [PATCH 2/3] new prepare functions corrected syntax --- README.md | 2 +- inc/transaction.h | 4 ++-- src/transaction.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3a17e45..4bcd81b 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ Now, the transaction can be submitted to the BigchainDB nodes. * inputs: operation, asset, metadata, base_pubkey(public key in base58) * output: tx */ - void prepare_CREATE(BIGCHAIN_TX *tx, ,char *asset, char *metadata, char *base_pubkey); + void prepare_CREATE(BIGCHAIN_TX *tx, char *asset, char *metadata, char *base_pubkey); /* prepare for 'TRANSFER' operation * (The keys on the JSON must be in alphabetical order) diff --git a/inc/transaction.h b/inc/transaction.h index 248b0d1..438782e 100644 --- a/inc/transaction.h +++ b/inc/transaction.h @@ -42,8 +42,8 @@ void bigchain_sign_transaction(uint8_t *json_tx, uint16_t len, uint8_t *priv_key char *bigchain_build_json_inputs(BIGCHAIN_INPUT *inputs, uint8_t num_inputs, char *json_obj); char *bigchain_build_json_outputs(BIGCHAIN_OUTPUT *outputs, uint8_t num_outputs, char *json_obj); void bigchain_build_json_tx(BIGCHAIN_TX *tx, char *json_tx); -void prepare_CREATE(BIGCHAIN_TX *tx, ,char *asset, char *metadata, char *base_pubkey); -void prepare_TRANSFER(BIGCHAIN_TX *tx, char *fullfils, char *asset, char *metadata, char *base_pubkey); +void prepare_CREATE(BIGCHAIN_TX *tx, char *asset, char *metadata, char *base_pubkey); +void prepare_TRANSFER(BIGCHAIN_TX *tx, char *fulfills, char *asset, char *metadata, char *base_pubkey); void fulfill_tx(BIGCHAIN_TX *tx, char *tx_id, uint8_t *priv_key, uint8_t *pub_key, uint8_t *json, uint16_t maxlen); #endif // _BIGCHAIN_TX_H_ diff --git a/src/transaction.c b/src/transaction.c index 81f280a..ab5881f 100644 --- a/src/transaction.c +++ b/src/transaction.c @@ -244,7 +244,7 @@ void prepare_tx(BIGCHAIN_TX *tx, const char operation, char *asset, char *metada tx->num_outputs = 1; } -void prepare_CREATE(BIGCHAIN_TX *tx, ,char *asset, char *metadata, char *base_pubkey) +void prepare_CREATE(BIGCHAIN_TX *tx, char *asset, char *metadata, char *base_pubkey) { // Fill input struct memset(tx->inputs, 0, sizeof(BIGCHAIN_INPUT)); From 5af0bf744af987d89ba381a62b14050523cde56d Mon Sep 17 00:00:00 2001 From: maker999 Date: Sun, 22 Dec 2019 14:16:39 +0100 Subject: [PATCH 3/3] adjusted test_sig to new prepare functions and removed prepare_tx --- src/transaction.c | 36 ------------------------------------ tests/test_sig.c | 4 ++-- 2 files changed, 2 insertions(+), 38 deletions(-) diff --git a/src/transaction.c b/src/transaction.c index ab5881f..93dc65d 100644 --- a/src/transaction.c +++ b/src/transaction.c @@ -208,42 +208,6 @@ void bigchain_build_json_tx(BIGCHAIN_TX *tx, char *json_tx) { p = json_end(p); } -/* 'operation'can be either 'C' or 'T' for CREATE and TRANSFER respectively. - * when 'operation' is CREATE then 'asset' can be arbitrary. (The keys on the JSON must be in alphabetical order) - * but when 'operation' is TRANSFER then 'asset' must be the transaction id of the asset which is to be tranfered. - */ -void prepare_tx(BIGCHAIN_TX *tx, const char operation, char *asset, char *metadata, char *base_pubkey) { - // Fill input struct - memset(tx->inputs, 0, sizeof(BIGCHAIN_INPUT)); - memcpy(tx->inputs[0].owners_before[0], base_pubkey, strlen(base_pubkey)); - tx->inputs[0].num_owners = 1; - tx->num_inputs = 1; - - if (operation == 'C') { - memcpy(tx->operation, "CREATE", strlen("CREATE")); - memcpy(tx->asset, asset, strlen(asset)); - } else if (operation == 'T') { - memcpy(tx->operation, "TRANSFER", strlen("TRANSFER")); - memcpy(tx->inputs[0].fulfills, FULFILL_PREFIX, FULFILL_PREFIX_LENGTH ); - memcpy(tx->inputs[0].fulfills + FULFILL_PREFIX_LENGTH, asset, TX_ID_LENGTH ); - memcpy(tx->inputs[0].fulfills + FULFILL_PREFIX_LENGTH + TX_ID_LENGTH, "\"\0", 2); - memcpy(tx->asset, ASSET_ID, ASSET_ID_LENGTH); - memcpy(tx->asset + ASSET_ID_LENGTH, asset, TX_ID_LENGTH ); - memcpy(tx->asset + ASSET_ID_LENGTH + TX_ID_LENGTH, "\"\0", 2); - } - - memcpy(tx->metadata, metadata, strlen(metadata)); - memcpy(tx->version, BDB_VERSION, strlen(BDB_VERSION)); - - // Fill output struct - memset(tx->outputs, 0, sizeof(BIGCHAIN_OUTPUT)); - tx->outputs[0].amount[0] = '1'; - memcpy(tx->outputs[0].details_public_key, base_pubkey, strlen(base_pubkey)); - memcpy(tx->outputs[0].public_keys[0], base_pubkey, strlen(base_pubkey)); - tx->outputs[0].num_public_keys = 1; - tx->num_outputs = 1; -} - void prepare_CREATE(BIGCHAIN_TX *tx, char *asset, char *metadata, char *base_pubkey) { // Fill input struct diff --git a/tests/test_sig.c b/tests/test_sig.c index 07baa41..a905d7d 100644 --- a/tests/test_sig.c +++ b/tests/test_sig.c @@ -103,7 +103,7 @@ void test_bigchain_create_tx() { BIGCHAIN_TX tx; char json[3000] = {0}; memset(&tx, 0, sizeof(BIGCHAIN_TX)); - prepare_tx(&tx, TEST_OPERATION_CREATE, TEST_CREATE_ASSET, TEST_METADATA, base58_pubkey ); + prepare_CREATE(&tx, TEST_CREATE_ASSET, TEST_METADATA, base58_pubkey ); fulfill_tx(&tx, 0, privkey, pubkey, json, 3000 ); TEST_ASSERT_EQUAL_STRING_LEN(C_tx_json, json, sizeof(C_tx_json)); } @@ -112,7 +112,7 @@ void test_bigchain_transfer_tx() { BIGCHAIN_TX tx; char json[2000] = {0}; memset(&tx, 0, sizeof(BIGCHAIN_TX)); - prepare_tx(&tx, TEST_OPERATION_TRANSFER, TEST_TRANSFER_ASSET, TEST_METADATA, base58_pubkey ) ; + prepare_TRANSFER(&tx, TEST_TRANSFER_ASSET, TEST_TRANSFER_ASSET, TEST_METADATA, base58_pubkey ) ; fulfill_tx(&tx, TEST_TRANSFER_ASSET, privkey, pubkey, json, 2000 ); TEST_ASSERT_EQUAL_STRING_LEN(T_tx_json, json, sizeof(T_tx_json)); }