ΠΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° libmdbx 0.11.3 (MDBX) ΡΠ΅ ΡΡΡΡΠΎΡ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° Π²ΠΈΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½Π° Π²Π³ΡΠ°Π΄Π΅Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ ΠΊΠ»Π°Ρ ΠΊΠ»ΡΡ-ΡΡΠΎΠΉΠ½ΠΎΡΡ. ΠΠΎΠ΄ΡΡ Π½Π° libmdbx ΡΠ΅ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½ΡΠ²Π° ΠΏΠΎΠ΄ Π»ΠΈΡΠ΅Π½Π·ΠΈΡ OpenLDAP Public License. ΠΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ Π°ΠΊΡΡΠ°Π»Π½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΡΡΡΠΊΠΈΡΡ ΠΠ»Π±ΡΡΡ 2000. ΠΡΠΌ ΠΊΡΠ°Ρ Π½Π° 2021 Π³ΠΎΠ΄ΠΈΠ½Π° libmdbx ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°ΡΠΎ Π±Π΅ΠΊΠ΅Π½Π΄ Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π² Π΄Π²Π° ΠΎΡ Π½Π°ΠΉ-Π±ΡΡΠ·ΠΈΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ Π½Π° Ethereum β Erigon ΠΈ Π½ΠΎΠ²Π°ΡΠ° βΠΠΊΡΠ»Π°β, ΠΊΠΎΡΡΠΎ ΡΠΏΠΎΡΠ΅Π΄ Π½Π°Π»ΠΈΡΠ½Π°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π΅ Π½Π°ΠΉ-Π²ΠΈΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΈΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π° Ethereum.
ΠΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈ libmdbx Π΅ Π΄ΡΠ»Π±ΠΎΠΊΠ° ΠΏΡΠ΅ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π‘Π£ΠΠ LMDB ΠΈ Ρ Π½Π°Π΄ΠΌΠΈΠ½Π°Π²Π° ΠΏΠΎ Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΎΡΡ, Π½Π°Π±ΠΎΡ ΠΎΡ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ. Π ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ LMDB, Π² libmdbx Π΅ ΠΎΠ±ΡΡΠ½Π°ΡΠΎ Π³ΠΎΠ»ΡΠΌΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΊΠΎΠ΄Π°, ΡΡΠ°Π±ΠΈΠ»Π½Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ° Π½Π° API, ΡΠ΅ΡΡΠ²Π°Π½Π΅ΡΠΎ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΈΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ. ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠ΅Π»ΠΎΡΡΡΠ° Π½Π° ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° ΠΠ Ρ Π½ΡΠΊΠΎΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅.
Π’Π΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ½ΠΎ libmdbx ΠΏΡΠ΅Π΄Π»Π°Π³Π° ACID, ΡΡΡΠΎΠ³Π° ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΠΈ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΠ°ΡΠΎ ΡΠ΅ΡΠ΅Π½Π΅ Ρ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅ ΠΏΠΎ ΡΠ΄ΡΠ° Π½Π° CPU. ΠΠΎΠ΄Π΄ΡΡΠΆΠ° ΡΠ΅ Π°Π²ΡΠΎ-ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° ΠΠ, ΠΎΡΠ΅Π½ΠΊΠ° Π½Π° ΠΎΠ±Π΅ΠΌΠ° Π½Π° Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ ΠΏΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΈ (range query estimation). ΠΡ 2016 Π³. ΠΏΡΠΎΠ΅ΠΊΡΡΡ ΡΠ΅ ΡΠΈΠ½Π°Π½ΡΠΈΡΠ° ΠΎΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ° Positive Technologies ΠΈ ΠΎΡ 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.
- ΠΡΡΡΡΠ°Π½Π΅Π½ΠΈ ΡΠ° Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΠΏΡΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ Ρ Π²ΡΠΈΡΠΊΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠΈ Π² ΡΠ΅ΠΆΠΈΠΌΠΈΡΠ΅ C++ 11/14/17/20. ΠΡΠΈΠ³ΡΡΠ΅Π½Π° Π΅ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ Ρ ΠΎΡΡΠ°ΡΠ΅Π»ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠΈ: clang ΠΎΡ Π²Π΅ΡΡΠΈΡ 3.9, gcc ΠΎΡ Π²Π΅ΡΡΠΈΡ 4.8, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΡΡΠ΅Π· sdevtoolset-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
