Requirements
Implement the Rosetta API Interface
Blockchain teams that do not wish to modify their node's interface may alternatively choose to write a middleware server that communicates with the node to provide clients access to the Rosetta API Interface.
Using the OpenAPI 3.0 Rosetta API Spec to auto-generate code is a good place to start. Take a look at rosetta-sdk-go for an example of what a codegen toolchain looks like.
Return All Balance-Changing Operations
A Rosetta Interface Server implementation must return all balance-changing operations in a block. To be considered a correct implementation, the balance computed from all of an AccountIdentifier's operations must equal the balance returned for an AccountIdentifier by the /account/balance endpoint at the end of each block. If these balances do not match (reconcile) for any account, some clients will not be able to integrate with your blockchain.
Retrievable AccountIdentifiers
Any AccountIdentifier returned in a block must be retrievable from the /account/balance endpoint. If an AccountIdentifier active in a block is not retrievable, it will not be possible to compare the balance of the account with the node itself.
Populated NetworkStatus.Options
The /network/status endpoint returns an Options object that specifies all possible Operation.Type, Operation.Status, and transaction submission statuses. This returned Options object is used by clients to validate responses from your Rosetta Server and will stop processing if any block contains an Operation.Type or Operation.Status that is not present here.
Validate Correctness
Run the rosetta-cli against your server implementation. If the validator doesn't halt with an error (error cases are documented here), it is considered to be correct. Clients depend on the assertions in the rosetta-cli and will likely not be able to integrate with your implementation if it errors.