In order to maintain a unified user experience and equivalent functionalities between the different programming languages, we implement all functionalities in Rust (stable) and bridge each one to every language-specific SDK trough FFI (foreign function interface).


To achieve interoperability between different programming languages, we use an architecture that has the following elements:
  • Bloock Libs: Contain specific utilities used accross different features. Such as: hashing algorithms, digital signature algorithms, encrytption algorigthms, HTTP communication, ...
  • Bloock Core: Contains all the bussiness logic for every feature.
  • Bloock Bridge: Implements the GRPC-like endpoints and connects them with the features implemented in the Core.
  • Language-specific libraries: Contains all the interfaces for the consumer and connects with the bridge using the different endpoints available.


The communication between different languages is done by using a language-specific interoperability layer and a generic transport layer.


Most languages have some type of ability to communicate with another language, this is called FFI (Foreign Function Interface) and usually is done by using C as a base language. One of the exceptions is Javascript because browsers don't support that functionality and it's only possible to do so by using WebAssembly.
To support this two cases, we chose Rust as a Core programming language because is able to compile to C and WebAssembly.
Finally, to give full support, we generate C builds for different OS and architectures. See OS support.


In order to minimize the effort dedicated to interact with the FFI layer which, specially in C, is time consuming we use Protocol Buffers and a modified GRPC protocol in such a way that we define in-memory endpoints that are called by the language-specific SDKs (client) and served by the Rust Bridge (server)