From 2aedae4379d5020a3e738771ea4a96c56daca955 Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Fri, 26 Aug 2016 10:57:29 +1000 Subject: [PATCH] Style and safecmp changes to segwit commits. --- src/bitcoin.c | 16 ++++++++------ src/stratifier.c | 55 +++++++++++++++++++++++++----------------------- 2 files changed, 38 insertions(+), 33 deletions(-) diff --git a/src/bitcoin.c b/src/bitcoin.c index 66593400..487f0aa5 100644 --- a/src/bitcoin.c +++ b/src/bitcoin.c @@ -16,13 +16,14 @@ #include "bitcoin.h" static const char *b58chars = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; - static char* understood_rules[] = {"segwit"}; + static bool check_required_rule(const char* rule) { unsigned int i; - for(i = 0; i < sizeof(understood_rules) / sizeof(understood_rules[0]); i++) { - if(strcmp(understood_rules[i], rule) == 0) + + for (i = 0; i < sizeof(understood_rules) / sizeof(understood_rules[0]); i++) { + if (safecmp(understood_rules[i], rule) == 0) return true; } return false; @@ -99,13 +100,13 @@ bool gen_gbtbase(connsock_t *cs, gbtbase_t *gbt) { json_t *txn_array, *rules_array, *coinbase_aux, *res_val, *val; const char *previousblockhash; + const char *witnessdata_check; char hash_swap[32], tmp[32]; uint64_t coinbasevalue; const char *target; const char *flags; const char *bits; const char *rule; - const char *witnessdata_check; int version; int curtime; int height; @@ -124,11 +125,12 @@ bool gen_gbtbase(connsock_t *cs, gbtbase_t *gbt) } rules_array = json_object_get(res_val, "rules"); - if(rules_array) { + if (rules_array) { int rule_count = json_array_size(rules_array); - for(i = 0; i < rule_count; i++) { + + for (i = 0; i < rule_count; i++) { rule = json_string_value(json_array_get(rules_array, i)); - if(rule && *rule++ == '!' && !check_required_rule(rule)) { + if (rule && *rule++ == '!' && !check_required_rule(rule)) { LOGERR("Required rule not understood: %s", rule); goto out; } diff --git a/src/stratifier.c b/src/stratifier.c index 37f36f85..a584f5ac 100644 --- a/src/stratifier.c +++ b/src/stratifier.c @@ -111,7 +111,7 @@ struct workbase { int txns; char *txn_data; char *txn_hashes; - char witnessdata[73]; //null-terminated ascii + char witnessdata[80]; //null-terminated ascii bool insert_witness; int merkles; char merklehash[16][68]; @@ -574,6 +574,8 @@ static void info_msg_entries(char_entry_t **entries) } } +static const int witnessdata_size = 36; // commitment header + hash + static void generate_coinbase(const ckpool_t *ckp, workbase_t *wb) { uint64_t *u64, g64, d64 = 0; @@ -663,12 +665,10 @@ static void generate_coinbase(const ckpool_t *ckp, workbase_t *wb) memcpy(wb->coinb2bin + wb->coinb2len, sdata->pubkeytxnbin, sdata->pubkeytxnlen); wb->coinb2len += sdata->pubkeytxnlen; - if(wb->insert_witness) { + if (wb->insert_witness) { // 0 value wb->coinb2len += 8; - static const int witnessdata_size = 36; // commitment header + hash - wb->coinb2bin[wb->coinb2len++] = witnessdata_size + 2; // total scriptPubKey size wb->coinb2bin[wb->coinb2len++] = 0x6a; // OP_RETURN wb->coinb2bin[wb->coinb2len++] = witnessdata_size; @@ -1239,19 +1239,18 @@ static void wb_merkle_bins(ckpool_t *ckp, sdata_t *sdata, workbase_t *wb, json_t memset(wb->txn_hashes, 0x20, wb->txns * 65); // Spaces for (i = 0; i < wb->txns; i++) { + const char *txid, *hash; char binswap[32]; - const char *txid; - const char *hash; arr_val = json_array_get(txn_array, i); // Post-segwit, txid returns the tx hash without witness data txid = json_string_value(json_object_get(arr_val, "txid")); hash = json_string_value(json_object_get(arr_val, "hash")); - if(!txid) + if (!txid) txid = hash; - if (!txid) { - LOGERR("missing txid for transaction"); + if (unlikely(!txid)) { + LOGERR("Missing txid for transaction in wb_merkle_bins"); return; } txn = json_string_value(json_object_get(arr_val, "data")); @@ -1327,24 +1326,26 @@ static void wb_merkle_bins(ckpool_t *ckp, sdata_t *sdata, workbase_t *wb, json_t } static const unsigned char witness_nonce[32] = {0}; +static const int witness_nonce_size = sizeof(witness_nonce); static const unsigned char witness_header[] = {0xaa, 0x21, 0xa9, 0xed}; + static void gbt_witness_data(workbase_t *wb, json_t *txn_array) { - int i, binlen, txncount; + int i, binlen, txncount = json_array_size(txn_array); + const char* hash; json_t *arr_val; uchar *hashbin; - const char* hash; - txncount = json_array_size(txn_array); binlen = txncount * 32 + 32; hashbin = alloca(binlen + 32); memset(hashbin, 0, 32); for (i = 0; i < txncount; i++) { char binswap[32]; + arr_val = json_array_get(txn_array, i); hash = json_string_value(json_object_get(arr_val, "hash")); - if(!hash) { + if (unlikely(!hash)) { LOGERR("Hash missing for transaction"); return; } @@ -1357,7 +1358,7 @@ static void gbt_witness_data(workbase_t *wb, json_t *txn_array) // Build merkle root (copied from libblkmaker) for (txncount++ ; txncount > 1 ; txncount /= 2) { - if (txncount % 2 == 1) { + if (txncount % 2) { // Odd number, duplicate the last memcpy(hashbin + 32 * txncount, hashbin + 32 * (txncount - 1), 32); txncount++; @@ -1368,10 +1369,10 @@ static void gbt_witness_data(workbase_t *wb, json_t *txn_array) } } - memcpy(hashbin + 32, &witness_nonce, sizeof(witness_nonce)); - gen_hash(hashbin, hashbin + sizeof(witness_header), 32 + sizeof(witness_nonce)); - memcpy(hashbin, witness_header, sizeof(witness_header)); - __bin2hex(wb->witnessdata, hashbin, 32 + sizeof(witness_header)); + memcpy(hashbin + 32, &witness_nonce, witness_nonce_size); + gen_hash(hashbin, hashbin + witness_nonce_size, 32 + witness_nonce_size); + memcpy(hashbin, witness_header, witness_nonce_size); + __bin2hex(wb->witnessdata, hashbin, 32 + witness_nonce_size); wb->insert_witness = true; } @@ -1381,16 +1382,16 @@ static void gbt_witness_data(workbase_t *wb, json_t *txn_array) static void *do_update(void *arg) { struct update_req *ur = (struct update_req *)arg; + json_t *val, *txn_array, *rules_array; + const char* witnessdata_check, *rule; int i, prio = ur->prio, retries = 0; ckpool_t *ckp = ur->ckp; sdata_t *sdata = ckp->sdata; - json_t *val, *txn_array, *rules_array; bool new_block = false; bool ret = false; workbase_t *wb; time_t now_t; char *buf; - const char* witnessdata_check, *rule; pthread_detach(pthread_self()); rename_proc("updater"); @@ -1444,19 +1445,21 @@ retry: wb->insert_witness = false; memset(wb->witnessdata, 0, sizeof(wb->witnessdata)); rules_array = json_object_get(val, "rules"); - if(rules_array) { + + if (rules_array) { int rule_count = json_array_size(rules_array); - for(i = 0; i < rule_count; i++) { + + for (i = 0; i < rule_count; i++) { rule = json_string_value(json_array_get(rules_array, i)); - if(!rule) + if (!rule) continue; - if(*rule == '!') + if (*rule == '!') rule++; - if(strcmp(rule, "segwit")) { + if (safecmp(rule, "segwit")) { witnessdata_check = json_string_value(json_object_get(val, "default_witness_commitment")); gbt_witness_data(wb, txn_array); // Verify against the pre-calculated value if it exists. Skip the size/OP_RETURN bytes. - if (wb->insert_witness && witnessdata_check[0] && strcmp(witnessdata_check + 4, wb->witnessdata) != 0) + if (wb->insert_witness && witnessdata_check[0] && safecmp(witnessdata_check + 4, wb->witnessdata) != 0) LOGERR("Witness from btcd: %s. Calculated Witness: %s", witnessdata_check + 4, wb->witnessdata); break; }