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.
251leveldb_iter_seek_to_first(iter);252CheckCondition(leveldb_iter_valid(iter));253CheckIter(iter, "box", "c");254leveldb_iter_next(iter);255CheckIter(iter, "foo", "hello");256leveldb_iter_prev(iter);257CheckIter(iter, "box", "c");258leveldb_iter_prev(iter);259CheckCondition(!leveldb_iter_valid(iter));260leveldb_iter_seek_to_last(iter);261CheckIter(iter, "foo", "hello");262leveldb_iter_seek(iter, "b", 1);263CheckIter(iter, "box", "c");264leveldb_iter_get_error(iter, &err);265CheckNoError(err);266leveldb_iter_destroy(iter);267}269StartPhase("approximate_sizes");270{271int i;272int n = 20000;273char keybuf[100];274char valbuf[100];275uint64_t sizes[2];276const char* start[2] = { "a", "k00000000000000010000" };277size_t start_len[2] = { 1, 21 };278const char* limit[2] = { "k00000000000000010000", "z" };279size_t limit_len[2] = { 21, 1 };280leveldb_writeoptions_set_sync(woptions, 0);281for (i = 0; i < n; i++) {282snprintf(keybuf, sizeof(keybuf), "k%020d", i);283snprintf(valbuf, sizeof(valbuf), "v%020d", i);284leveldb_put(db, woptions, keybuf, strlen(keybuf), valbuf, strlen(valbuf),285&err);286CheckNoError(err);287}288leveldb_approximate_sizes(db, 2, start, start_len, limit, limit_len, sizes);289CheckCondition(sizes[0] > 0);290CheckCondition(sizes[1] > 0);291}293StartPhase("property");294{295char* prop = leveldb_property_value(db, "nosuchprop");296CheckCondition(prop == NULL);297prop = leveldb_property_value(db, "leveldb.stats");298CheckCondition(prop != NULL);299Free(&prop);300}302StartPhase("snapshot");303{304const leveldb_snapshot_t* snap;305snap = leveldb_create_snapshot(db);306leveldb_delete(db, woptions, "foo", 3, &err);307CheckNoError(err);308leveldb_readoptions_set_snapshot(roptions, snap);309CheckGet(db, roptions, "foo", "hello");310leveldb_readoptions_set_snapshot(roptions, NULL);311CheckGet(db, roptions, "foo", NULL);312leveldb_release_snapshot(db, snap);313}315StartPhase("repair");316{317leveldb_close(db);318leveldb_options_set_create_if_missing(options, 0);319leveldb_options_set_error_if_exists(options, 0);320leveldb_repair_db(options, dbname, &err);321CheckNoError(err);322db = leveldb_open(options, dbname, &err);323CheckNoError(err);324CheckGet(db, roptions, "foo", NULL);325CheckGet(db, roptions, "bar", NULL);326CheckGet(db, roptions, "box", "c");327leveldb_options_set_create_if_missing(options, 1);328leveldb_options_set_error_if_exists(options, 1);329}331StartPhase("filter");332for (run = 0; run < 2; run++) {333// First run uses custom filter, second run uses bloom filter334CheckNoError(err);335leveldb_filterpolicy_t* policy;336if (run == 0) {337policy = leveldb_filterpolicy_create(338NULL, FilterDestroy, FilterCreate, FilterKeyMatch, FilterName);339} else {340policy = leveldb_filterpolicy_create_bloom(10);341}343// Create new database344leveldb_close(db);345leveldb_destroy_db(options, dbname, &err);346leveldb_options_set_filter_policy(options, policy);347db = leveldb_open(options, dbname, &err);348CheckNoError(err);349leveldb_put(db, woptions, "foo", 3, "foovalue", 8, &err);350CheckNoError(err);351leveldb_put(db, woptions, "bar", 3, "barvalue", 8, &err);352CheckNoError(err);353leveldb_compact_range(db, NULL, 0, NULL, 0);355fake_filter_result = 1;356CheckGet(db, roptions, "foo", "foovalue");357CheckGet(db, roptions, "bar", "barvalue");358if (phase == 0) {359// Must not find value when custom filter returns false360fake_filter_result = 0;361CheckGet(db, roptions, "foo", NULL);362CheckGet(db, roptions, "bar", NULL);363fake_filter_result = 1;365CheckGet(db, roptions, "foo", "foovalue");366CheckGet(db, roptions, "bar", "barvalue");367}368leveldb_options_set_filter_policy(options, NULL);369leveldb_filterpolicy_destroy(policy);370}372StartPhase("cleanup");373leveldb_close(db);374leveldb_options_destroy(options);375leveldb_readoptions_destroy(roptions);376leveldb_writeoptions_destroy(woptions);377leveldb_free(dbname);378leveldb_cache_destroy(cache);379leveldb_comparator_destroy(cmp);380leveldb_env_destroy(env);382fprintf(stderr, "PASS\n");383return 0;384}
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.