# Реалізація вузла BitCoin на базі Rust

Я обслуговую декілька мертвих проєктів, які базуються на форку ядра (core) BitCoin. Кожного разу, коли відкриваю код C++ в мене починається дисонанс стосовно того, чи дійсно я готовий (і фізично можу) продовжувати супровід їх кілометрового, давно застарілого і дірявого спадку. Дірявого - тому що за останнє десятиріччя, на оригінальний апстрім BitCoin було натягнуто чимало корекцій для виявлених вразливостей; також здійснено оновлення для різного роду залежностей типу libboost, що містить ті само security updates. У той час як форки - лишились зі старими проблемами і до того ж мають не сумісну з апстрімом реалізацію консенсусу, щоб просто взяти і потягнути звідти оновлення.

У свій час, я перейшов на Rust, де є комфортна екосистема cargo, rustfmt, clippy та rust-analyzer, що допомагає мені швидко зорієнтуватись та безпечно виправити у власній програмі допущені косяки. Але біда у тому, що bitcoin-core, на якому базуються 99% форків написаний мовою C++ а на Rust - поточна реалізація оригінального ядра не покрита:

=> https://github.com/rust-bitcoin/rust-bitcoin?tab=readme-ov-file#known-limitations Known limitations

> Consensus
>
> This library must not be used for consensus code (i.e. fully validating blockchain data). It technically supports doing this, but doing so is very ill-advised because there are many deviations, known and unknown, between this library and the Bitcoin Core reference implementation. In a consensus based cryptocurrency, such as Bitcoin, it is critical that all parties are using the same rules to validate data, and this library is simply unable to implement the same rules as Core.
>
> Given the complexity of both C++ and Rust, it is unlikely that this will ever be fixed, and there are no plans to do so. Of course, patches to fix specific consensus incompatibilities are welcome.

## Біндінг rust-bitcoinconsensus

Приділивши трохи часу, я віднайшов рішення в біндінгу, зокрема - в проєкті rust-bitcoinconsensus:

=> https://github.com/rust-bitcoin/rust-bitcoinconsensus

Біндінг (або Байндинг, англ. Binding) - це обгортка API, як правило для мінімального набору оригінального коду, який вона покриває.

Таким чином, є можливість писати програми зручною мовою без прив'язки до синтаксису певної бібліотеки, у цьому випадку - частини bitcoin-core. Майже всі програми в Linux написані з використанням біндінгів: наприклад, gtk-rs і навіть https://github.com/scorninpc/php-gtk3

Отже, якщо я працюю з форком BitCoin - мені достатньо лише створити варіацію rust-bitcoinconsensus, вказавши в ньому необхідні зміни для генерації валідного для певної мережі genesis block.

## Floresta

Щоб перевірити свій форк rust-bitcoinconsensus в рамках звичного API BitCoin, можна зкористатись прикладом інтеграції Floresta:

=> https://github.com/vinteumorg/Floresta

Для цього, в потрібних компонентах, вказується форк rust-bitcoinconsensus, наприклад локальний проєкт:

``` crates/floresta-chain/Cargo.toml
[patch.crates-io]
bitcoinconsensus = { path = "/path/to/rust-bitcoinconsensus" }
```
* звісно, тут все не так тривіально, але суть приблизно така.