Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
251Range* ranges = new Range[num_ranges];252for (int i = 0; i < num_ranges; i++) {253ranges[i].start = Slice(range_start_key[i], range_start_key_len[i]);254ranges[i].limit = Slice(range_limit_key[i], range_limit_key_len[i]);255}256db->rep->GetApproximateSizes(ranges, num_ranges, sizes);257delete[] ranges;258}260void leveldb_compact_range(leveldb_t* db, const char* start_key,261size_t start_key_len, const char* limit_key,262size_t limit_key_len) {263Slice a, b;264db->rep->CompactRange(265// Pass null Slice if corresponding "const char*" is null266(start_key ? (a = Slice(start_key, start_key_len), &a) : nullptr),267(limit_key ? (b = Slice(limit_key, limit_key_len), &b) : nullptr));268}270void leveldb_destroy_db(const leveldb_options_t* options, const char* name,271char** errptr) {272SaveError(errptr, DestroyDB(name, options->rep));273}275void leveldb_repair_db(const leveldb_options_t* options, const char* name,276char** errptr) {277SaveError(errptr, RepairDB(name, options->rep));278}280void leveldb_iter_destroy(leveldb_iterator_t* iter) {281delete iter->rep;282delete iter;283}285uint8_t leveldb_iter_valid(const leveldb_iterator_t* iter) {286return iter->rep->Valid();287}289void leveldb_iter_seek_to_first(leveldb_iterator_t* iter) {290iter->rep->SeekToFirst();291}293void leveldb_iter_seek_to_last(leveldb_iterator_t* iter) {294iter->rep->SeekToLast();295}297void leveldb_iter_seek(leveldb_iterator_t* iter, const char* k, size_t klen) {298iter->rep->Seek(Slice(k, klen));299}301void leveldb_iter_next(leveldb_iterator_t* iter) { iter->rep->Next(); }303void leveldb_iter_prev(leveldb_iterator_t* iter) { iter->rep->Prev(); }305const char* leveldb_iter_key(const leveldb_iterator_t* iter, size_t* klen) {306Slice s = iter->rep->key();307*klen = s.size();308return s.data();309}311const char* leveldb_iter_value(const leveldb_iterator_t* iter, size_t* vlen) {312Slice s = iter->rep->value();313*vlen = s.size();314return s.data();315}317void leveldb_iter_get_error(const leveldb_iterator_t* iter, char** errptr) {318SaveError(errptr, iter->rep->status());319}321leveldb_writebatch_t* leveldb_writebatch_create() {322return new leveldb_writebatch_t;323}325void leveldb_writebatch_destroy(leveldb_writebatch_t* b) { delete b; }327void leveldb_writebatch_clear(leveldb_writebatch_t* b) { b->rep.Clear(); }329void leveldb_writebatch_put(leveldb_writebatch_t* b, const char* key,330size_t klen, const char* val, size_t vlen) {331b->rep.Put(Slice(key, klen), Slice(val, vlen));332}334void leveldb_writebatch_delete(leveldb_writebatch_t* b, const char* key,335size_t klen) {336b->rep.Delete(Slice(key, klen));337}339void leveldb_writebatch_iterate(const leveldb_writebatch_t* b, void* state,340void (*put)(void*, const char* k, size_t klen,341const char* v, size_t vlen),342void (*deleted)(void*, const char* k,343size_t klen)) {344class H : public WriteBatch::Handler {345public:346void* state_;347void (*put_)(void*, const char* k, size_t klen, const char* v, size_t vlen);348void (*deleted_)(void*, const char* k, size_t klen);349void Put(const Slice& key, const Slice& value) override {350(*put_)(state_, key.data(), key.size(), value.data(), value.size());351}352void Delete(const Slice& key) override {353(*deleted_)(state_, key.data(), key.size());354}355};356H handler;357handler.state_ = state;358handler.put_ = put;359handler.deleted_ = deleted;360b->rep.Iterate(&handler);361}363void leveldb_writebatch_append(leveldb_writebatch_t* destination,364const leveldb_writebatch_t* source) {365destination->rep.Append(source->rep);366}368leveldb_options_t* leveldb_options_create() { return new leveldb_options_t; }370void leveldb_options_destroy(leveldb_options_t* options) { delete options; }372void leveldb_options_set_comparator(leveldb_options_t* opt,373leveldb_comparator_t* cmp) {374opt->rep.comparator = cmp;375}377void leveldb_options_set_filter_policy(leveldb_options_t* opt,378leveldb_filterpolicy_t* policy) {379opt->rep.filter_policy = policy;380}382void leveldb_options_set_create_if_missing(leveldb_options_t* opt, uint8_t v) {383opt->rep.create_if_missing = v;384}386void leveldb_options_set_error_if_exists(leveldb_options_t* opt, uint8_t v) {387opt->rep.error_if_exists = v;388}390void leveldb_options_set_paranoid_checks(leveldb_options_t* opt, uint8_t v) {391opt->rep.paranoid_checks = v;392}394void leveldb_options_set_env(leveldb_options_t* opt, leveldb_env_t* env) {395opt->rep.env = (env ? env->rep : nullptr);396}398void leveldb_options_set_info_log(leveldb_options_t* opt, leveldb_logger_t* l) {399opt->rep.info_log = (l ? l->rep : nullptr);400}402void leveldb_options_set_write_buffer_size(leveldb_options_t* opt, size_t s) {403opt->rep.write_buffer_size = s;404}406void leveldb_options_set_max_open_files(leveldb_options_t* opt, int n) {407opt->rep.max_open_files = n;408}410void leveldb_options_set_cache(leveldb_options_t* opt, leveldb_cache_t* c) {411opt->rep.block_cache = c->rep;412}414void leveldb_options_set_block_size(leveldb_options_t* opt, size_t s) {415opt->rep.block_size = s;416}418void leveldb_options_set_block_restart_interval(leveldb_options_t* opt, int n) {419opt->rep.block_restart_interval = n;420}422void leveldb_options_set_max_file_size(leveldb_options_t* opt, size_t s) {423opt->rep.max_file_size = s;424}426void leveldb_options_set_compression(leveldb_options_t* opt, int t) {427opt->rep.compression = static_cast<CompressionType>(t);428}430leveldb_comparator_t* leveldb_comparator_create(431void* state, void (*destructor)(void*),432int (*compare)(void*, const char* a, size_t alen, const char* b,433size_t blen),434const char* (*name)(void*)) {435leveldb_comparator_t* result = new leveldb_comparator_t;436result->state_ = state;437result->destructor_ = destructor;438result->compare_ = compare;439result->name_ = name;440return result;441}443void leveldb_comparator_destroy(leveldb_comparator_t* cmp) { delete cmp; }445leveldb_filterpolicy_t* leveldb_filterpolicy_create(446void* state, void (*destructor)(void*),447char* (*create_filter)(void*, const char* const* key_array,448const size_t* key_length_array, int num_keys,449size_t* filter_length),450uint8_t (*key_may_match)(void*, const char* key, size_t length,451const char* filter, size_t filter_length),452const char* (*name)(void*)) {453leveldb_filterpolicy_t* result = new leveldb_filterpolicy_t;454result->state_ = state;455result->destructor_ = destructor;456result->create_ = create_filter;457result->key_match_ = key_may_match;458result->name_ = name;459return result;460}462void leveldb_filterpolicy_destroy(leveldb_filterpolicy_t* filter) {463delete filter;464}466leveldb_filterpolicy_t* leveldb_filterpolicy_create_bloom(int bits_per_key) {467// Make a leveldb_filterpolicy_t, but override all of its methods so468// they delegate to a NewBloomFilterPolicy() instead of user469// supplied C functions.470struct Wrapper : public leveldb_filterpolicy_t {471static void DoNothing(void*) {}473~Wrapper() { delete rep_; }474const char* Name() const override { return rep_->Name(); }475void CreateFilter(const Slice* keys, int n, std::string* dst) const override {476return rep_->CreateFilter(keys, n, dst);477}478bool KeyMayMatch(const Slice& key, const Slice& filter) const override {479return rep_->KeyMayMatch(key, filter);480}482const FilterPolicy* rep_;483};484Wrapper* wrapper = new Wrapper;485wrapper->rep_ = NewBloomFilterPolicy(bits_per_key);486wrapper->state_ = nullptr;487wrapper->destructor_ = &Wrapper::DoNothing;488return wrapper;489}491leveldb_readoptions_t* leveldb_readoptions_create() {492return new leveldb_readoptions_t;493}495void leveldb_readoptions_destroy(leveldb_readoptions_t* opt) { delete opt; }497void leveldb_readoptions_set_verify_checksums(leveldb_readoptions_t* opt,498uint8_t v) {499opt->rep.verify_checksums = v;500}
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.