diff --git a/README.md b/README.md index d3d2975..4bcd81b 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..438782e 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 *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 ae34f3c..93dc65d 100644 --- a/src/transaction.c +++ b/src/transaction.c @@ -208,30 +208,45 @@ 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) { +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; - 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->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)); 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)); }