Π‘ΠΎΡΡΠΎΡΠ»ΡΡ Π²ΡΠΏΡΡΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ libmdbx 0.11.3 (MDBX) Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ Π²ΡΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΎΠΉ Π²ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΠΎΠΉ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ ΠΊΠ»Π°ΡΡΠ° ΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΠΎΠ΄ libmdbx ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ΅ΡΡΡ ΠΏΠΎΠ΄ Π»ΠΈΡΠ΅Π½Π·ΠΈΠ΅ΠΉ OpenLDAP Public License. ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ Π²ΡΠ΅ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΡΡΠΈΠΉΡΠΊΠΈΠΉ ΠΠ»ΡΠ±ΡΡΡ 2000. ΠΠ° ΠΊΠΎΠ½Π΅Ρ ΡΡ ΠΎΠ΄ΡΡΠ΅Π³ΠΎ 2021 Π³ΠΎΠ΄Π° libmdbx ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ Π±ΡΠΊΠ΅Π½Π΄ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π² Π΄Π²ΡΡ ΡΠ°ΠΌΡΡ Π±ΡΡΡΡΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°Ρ Ethereum — Erigon ΠΈ Π½ΠΎΠ²ΠΎΠΉ «ΠΠΊΡΠ»Π΅», ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΠΌΡΠΌ Π²ΡΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ Ethereum.
ΠΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈ libmdbx ΡΠ²Π»ΡΠ΅ΡΡΡ Π³Π»ΡΠ±ΠΎΠΊΠΎΠΉ ΠΏΠ΅ΡΠ΅ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ Π‘Π£ΠΠ LMDB ΠΈ ΠΏΡΠ΅Π²ΠΎΡΡ ΠΎΠ΄ΠΈΡ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΏΡΠ°ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΏΠΎ Π½Π°Π΄ΡΠΆΠ½ΠΎΡΡΠΈ, Π½Π°Π±ΠΎΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ. Π ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΈ Ρ LMDB, Π² libmdbx Π±ΠΎΠ»ΡΡΠΎΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ ΠΊΠ°ΡΠ΅ΡΡΠ²Ρ ΠΊΠΎΠ΄Π°, ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΠ΅ API, ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΠΌ. ΠΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΡΡΠΈΠ»ΠΈΡΠ° ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΠΈ ΡΡΡΡΠΊΡΡΡΡ ΠΠ Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌΠΈ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ.
Π’Π΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ libmdbx ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ACID, ΡΡΡΠΎΠ³ΡΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ΅Π΅ ΡΡΠ΅Π½ΠΈΠ΅ Ρ Π»ΠΈΠ½Π΅ΠΉΠ½ΡΠΌ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡΠ΄ΡΠ°ΠΌ Π¦ΠΠ£. ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ Π°Π²ΡΠΎΠΊΠΎΠΌΠΏΠ°ΠΊΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ ΠΠ, ΠΎΡΠ΅Π½ΠΊΠ° ΠΎΠ±ΡΡΠΌΠ° Π²ΡΠ±ΠΎΡΠΎΠΊ ΠΏΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°ΠΌ (range query estimation). Π‘ 2016 Π³ΠΎΠ΄Π° ΠΏΡΠΎΠ΅ΠΊΡ ΡΠΈΠ½Π°Π½ΡΠΈΡΡΠ΅ΡΡΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ Positive Technologies ΠΈ c 2017 Π³ΠΎΠ΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² Π΅Ρ ΠΏΡΠΎΠ΄ΡΠΊΡΠ°Ρ .
ΠΠ»Ρ libmdbx ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΡΡΡ C++ API, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΡΠ½ΡΡΠ·ΠΈΠ°ΡΡΠ°ΠΌΠΈ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ ΠΊ ΡΠ·ΡΠΊΠ°ΠΌ Rust, Haskell, Python, NodeJS, Ruby, Go, Nim.
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ Π½ΠΎΠ²ΡΠ΅ΡΡΠ²Π°, Π΄ΠΎΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ Π½ΠΎΠ²ΠΎΡΡΠΈ ΠΎΡ 11 ΠΎΠΊΡΡΠ±ΡΡ:
- C++ API ΡΡΠΈΡΠ°Π΅ΡΡΡ Π³ΠΎΡΠΎΠ²ΡΠΌ ΠΊ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ.
- Π‘ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΡΡΠΊΠΎΡΠ΅Π½Π½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ GC ΠΏΡΠΈ ΡΠΈΠΊΡΠ°ΡΠΈΠΈ ΠΎΠ³ΡΠΎΠΌΠ½ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ, ΡΡΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π°ΠΊΡΡΠ°Π»ΡΠ½ΠΎ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ libmdbx Π² ΡΠΊΠΎΡΠΈΡΡΠ΅ΠΌΠ΅ Ethereum.
- ΠΠ·ΠΌΠ΅Π½Π΅Π½Π° Π²Π½ΡΡΡΠ΅Π½Π½ΡΡ ΡΠΈΠ³Π½Π°ΡΡΡΠ° ΡΠΎΡΠΌΠ°ΡΠ° ΠΠ Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎ Π΄Π»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΊΠ»ΡΡΠΈΡΡ Π»ΠΎΠΆΠ½ΠΎ-ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎ ΠΏΠΎΠ²ΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΈ ΠΠ, ΠΊΠΎΠ³Π΄Π° ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠΌΠΈ Π²Π΅ΡΡΠΈΡΠΌΠΈ.
- ΠΠΎΠ±Π°Π²Π»Π΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ mdbx_env_get_syncbytes(), mdbx_env_get_syncperiod() ΠΈ mdbx_env_get_syncbytes(). ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ MDBX_SET_UPPERBOUND.
- Π£ΡΡΡΠ°Π½Π΅Π½Ρ Π²ΡΠ΅ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΠΏΡΠΈ ΡΠ±ΠΎΡΠΊΠ΅ Π²ΡΠ΅ΠΌΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠΌΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°ΠΌΠΈ Π² ΡΠ΅ΠΆΠΈΠΌΠ°Ρ Π‘++ 11/14/17/20. ΠΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½Π° ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ Ρ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠΌΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°ΠΌΠΈ: clang Π½Π°ΡΠΈΠ½Π°Ρ Ρ 3.9, gcc Π½Π°ΡΠΈΠ½Π°Ρ Ρ 4.8, Π²ΠΊΠ»ΡΡΠ°Ρ ΡΠ±ΠΎΡΠΊΡ ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ Ρdevtoolset-9 Π΄Π»Ρ CentOS/RHEL 7.
- Π£ΡΡΡΠ°Π½Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ° ΠΌΠ΅ΡΠ°-ΡΡΡΠ°Π½ΠΈΡ ΠΏΠΎΡΠ»Π΅ ΡΡΡΠ½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΠΌΠ΅ΡΠ°-ΡΡΡΠ°Π½ΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΈΠ»ΠΈΡΡ mdbx_chk.
- ΠΡΠΏΡΠ°Π²Π»Π΅Π½ Π²ΠΎΠ·Π²ΡΠ°Ρ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΈ MDBX_PROBLEM ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΠΈ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΡ ΠΌΠ΅ΡΠ°-ΡΡΡΠ°Π½ΠΈΡ.
- ΠΡΠΏΡΠ°Π²Π»Π΅Π½ Π²ΠΎΠ·Π²ΡΠ°Ρ MDBX_NOTFOUND Π² ΡΠ»ΡΡΠ°Π΅ Π½Π΅ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΡ ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ Π·Π°ΠΏΡΠΎΡΠ° MDBX_GET_BOTH.
- Π£ΡΡΡΠ°Π½Π΅Π½Π° ΠΎΡΠΈΠ±ΠΊΠ° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ Π½Π° Linux ΠΏΡΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡΠΌΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² Ρ ΡΠ΄ΡΠΎΠΌ.
- ΠΡΠΏΡΠ°Π²Π»Π΅Π½Π° ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΌ ΡΠ»Π°Π³ΠΎΠΌ MDBX_SHRINK_ALLOWED ΠΈ ΠΎΠΏΡΠΈΠ΅ΠΉ MDBX_ACCEDE.
- Π£ΡΡΡΠ°Π½Π΅Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΠ·Π»ΠΈΡΠ½ΠΈΡ assert-ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ.
- ΠΡΠΏΡΠ°Π²Π»Π΅Π½Π° Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΠΉ Π²ΠΎΠ·Π²ΡΠ°Ρ MDBX_RESULT_TRUE ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ mdbx_env_set_option().
- Π‘ΡΠΌΠΌΠ°ΡΠ½ΠΎ Π²Π½Π΅ΡΠ΅Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ 90 ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² 25 ΡΠ°ΠΉΠ»ΠΎΠ², Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ~1300 ΡΡΡΠΎΠΊ, ΡΠ΄Π°Π»Π΅Π½ΠΎ ~600.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: opennet.ru