bool CBBlockChainStorageDeleteTransactionRef(void * validator, uint8_t * txHash){ CBFullValidator * validatorObj = validator; CBDatabase * database = (CBDatabase *)validatorObj->storage; // Place transaction hash into the key memcpy(CB_TRANSACTION_INDEX_KEY + 2, txHash, 32); // Read the instance count if (NOT CBDatabaseReadValue(database, CB_TRANSACTION_INDEX_KEY, CB_DATA_ARRAY, 22, 0)) { CBLogError("Could not read a transaction reference from storage."); return false; } uint32_t txInstanceNum = CB_DATA_ARRAY[CB_TRANSACTION_REF_INSTANCE_COUNT] - 1; if (txInstanceNum) { // There are still more instances of this transaction. Do not remove the transaction, only make the unspent output number equal to zero and decrement the instance count. CB_DATA_ARRAY[CB_TRANSACTION_REF_NUM_UNSPENT_OUTPUTS] = 0; CB_DATA_ARRAY[CB_TRANSACTION_REF_INSTANCE_COUNT] = txInstanceNum; // Write to storage. if (NOT CBDatabaseWriteValue(database, CB_TRANSACTION_INDEX_KEY, CB_DATA_ARRAY, 22)) { CBLogError("Could not update a transaction reference for deleting an instance."); return false; } }else{ // This was the last instance. // Remove from storage if (NOT CBDatabaseRemoveValue(database, CB_TRANSACTION_INDEX_KEY)) { CBLogError("Could not remove a transaction reference from storage."); return false; } } return true; }
bool CBBlockChainStorageDeleteBlock(void * validator, uint8_t branch, uint32_t blockIndex){ CBFullValidator * validatorObj = validator; CBDatabase * database = (CBDatabase *)validatorObj->storage; // Delete from storage CB_BLOCK_KEY[2] = branch; CBInt32ToArray(CB_BLOCK_KEY, 3, blockIndex); // Get hash if (NOT CBDatabaseReadValue(database, CB_BLOCK_KEY, CB_DATA_ARRAY, 20, CB_BLOCK_HASH)) { CBLogError("Could not obtain a block hash from the block chain database."); return false; } // Remove data if (NOT CBDatabaseRemoveValue(database, CB_BLOCK_KEY)){ CBLogError("Could not remove block value from database."); return false; } // Remove hash index reference memcpy(CB_BLOCK_HASH_INDEX_KEY + 2, CB_DATA_ARRAY, 20); if (NOT CBDatabaseRemoveValue(database, CB_BLOCK_HASH_INDEX_KEY)){ CBLogError("Could not remove block hash index reference from database."); return false; } return true; }
bool CBBlockChainStorageDeleteUnspentOutput(void * validator, uint8_t * txHash, uint32_t outputIndex, bool decrement){ CBFullValidator * validatorObj = validator; CBDatabase * database = (CBDatabase *)validatorObj->storage; // Place transaction hash into the key memcpy(CB_UNSPENT_OUTPUT_KEY + 2, txHash, 32); // Place output index into the key CBInt32ToArray(CB_UNSPENT_OUTPUT_KEY, 34, outputIndex); // Remove from storage if (NOT CBDatabaseRemoveValue(database, CB_UNSPENT_OUTPUT_KEY)) { CBLogError("Could not remove an unspent output reference from storage."); return false; } if (decrement // For the transaction, decrement the number of unspent outputs && NOT CBBlockChainStorageChangeUnspentOutputsNum(database, txHash, -1)) { CBLogError("Could not decrement the number of unspent outputs for a transaction."); return false; } return true; }
bool CBAddressStorageDeleteAddress(uint64_t iself, void * address){ CBAddressStore * self = (CBAddressStore *)iself; CBNetworkAddress * addrObj = address; memcpy(CB_ADDRESS_KEY + 1, CBByteArrayGetData(addrObj->ip), 16); CBInt16ToArray(CB_ADDRESS_KEY, 17, addrObj->port); // Remove address if (NOT CBDatabaseRemoveValue(CBGetDatabase(self), CB_ADDRESS_KEY)) { CBLogError("Could not remove an address from storage."); return false; } // Decrease number of addresses CBInt32ToArray(CB_DATA_ARRAY, 0, --self->numAddresses); if (NOT CBDatabaseWriteValue(CBGetDatabase(self), CB_ADDR_NUM_KEY, CB_DATA_ARRAY, 4)) { CBLogError("Could not write the new number of addresses to storage."); return false; } // Commit changes if (NOT CBDatabaseCommit(CBGetDatabase(self))) { CBLogError("Could not commit the removal of a network address."); return false; } return true; }