Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Transfer #7

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 13 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion inc/transaction.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_
49 changes: 32 additions & 17 deletions src/transaction.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));

Expand Down
4 changes: 2 additions & 2 deletions tests/test_sig.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}
Expand All @@ -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));
}
Expand Down