On the client side, the library provides a procedure to initialize the client using a configuration file, which contains the public keys and IP addresses of the replicas. The library also provides a procedure, invoke, that is called to cause an operation to be executed. This procedure carries out the client side of the protocol and returns the result when enough replicas have responded.
On the server side, we provide an initialization procedure that takes as arguments a configuration file with the public keys and IP addresses of replicas and clients, the region of memory where the application state is stored, and a procedure to execute requests. When our system needs to execute an operation, it makes an upcall to the execute procedure. This procedure carries out the operation as specified for the application, using the application state. As the application performs the operation, each time it is about to modify the application state, it calls the modify procedure to inform us of the locations about to be modified. This call allows us to maintain checkpoints and compute digests efficiently as described in Section 4.6.2.
Miguel Castro and Barbara Liskov, "Proactive Recovery in a Byzantine-Fault-Tolerant System", in Proceedings of the Fourth Symposium on Operating Systems Design and Implementation, San Diego, USA, October 2000.