Skip to main content

NitroliteRPC

The NitroliteRPC provides a secure, reliable real-time communication protocol for state channel applications. It enables off-chain message exchange, state updates, and channel management. This system is built around the NitroliteRPC class, which provides the foundational methods for message construction, signing, parsing, and verification.

Core Logic: The NitroliteRPC Class​

The NitroliteRPC class is central to the RPC system. It offers a suite of static methods to handle the low-level details of the NitroliteRPC protocol.

Message Creation​

createRequest

Constructs a standard RPC request object, forming the base structure for any request sent via the NitroliteRPC protocol.

Parameters

  • requestId:RequestID
  • method:string
  • params:T (unknown[])
  • timestamp:Timestamp

Returns:NitroliteRPCRequest<T>

Example

const request = NitroliteRPC.createRequest(1, "get_config", [], Date.now());
createAppRequest

Constructs an RPC request object specifically scoped to an application, including application ID and optional intent.

Parameters

  • requestId:RequestID
  • method:string
  • params:T (unknown[])
  • timestamp:Timestamp
  • appId:AccountID
  • intent:Intent

Returns:NitroliteRPCRequest<T>

Example

const appRequest = NitroliteRPC.createAppRequest(1, "app_update", [{data: "0x123"}], Date.now(), "app_0xabc", Intent.UPDATE_STATE);
createResponse

Constructs a successful RPC response object, used to reply to a received request.

Parameters

  • requestId:RequestID
  • method:string
  • data:D (unknown)
  • timestamp:Timestamp
  • appId:AccountID
  • intent:Intent

Returns:NitroliteRPCResponse<D>

Example

const response = NitroliteRPC.createResponse(1, "get_config", { version: "1.0" }, Date.now());
createErrorResponse

Constructs an RPC error response object, used to indicate a failure in processing a request.

Parameters

  • requestId:RequestID
  • method:string
  • error:RPCError
  • timestamp:Timestamp
  • appId:AccountID

Returns:NitroliteRPCResponse<null>

Example

const errorResponse = NitroliteRPC.createErrorResponse(1, "get_config", { code: -32601, message: "Method not found" }, Date.now());

Message Signing​

signRequestMessage

Signs an RPC request message using the provided signer function, adding a signature to the request object.

Parameters

  • request:NitroliteRPCRequest<T>
  • signer:MessageSigner

Returns:Promise<SignedNitroliteRPCRequest<T>>

Example

// Assuming 'request' is a NitroliteRPCRequest and 'signer' is a MessageSigner
const signedRequest = await NitroliteRPC.signRequestMessage(request, signer);
signResponseMessage

Signs an RPC response message. This is used in specific scenarios where responses also require authentication.

Parameters

  • response:NitroliteRPCResponse<D>
  • signer:MessageSigner

Returns:Promise<SignedNitroliteRPCResponse<D>>

Example

// Assuming 'response' is a NitroliteRPCResponse and 'signer' is a MessageSigner
const signedResponse = await NitroliteRPC.signResponseMessage(response, signer);

Message Parsing & Validation​

parseResponse

Parses and validates an incoming RPC response string or object, ensuring it conforms to the NitroliteRPC structure.

Parameters

  • message:string | object

Returns:ParsedResponse<D, E>

Example

try {
const parsed = NitroliteRPC.parseResponse(incomingMessageString);
if (parsed.success) {
// process parsed.result
} else {
// process parsed.error
}
} catch (e) {
// handle malformed message
}

These methods ensure that all communication adheres to the defined RPC structure and security requirements.

Generic Message Structure​

The NitroliteRPC class operates on messages adhering to the following general structures. For precise details on each field and for specific message types, please refer to the RPC Type Definitions.

// Generic Request message structure
{
"req": [requestId, method, params, timestamp], // Core request tuple
"int"?: Intent, // Optional intent for state changes
"acc"?: AccountID, // Optional account scope (channel/app ID)
"sig": [signature] // Array of signatures
}

// Generic Response message structure
{
"res": [requestId, method, dataPayload, timestamp], // Core response tuple
"acc"?: AccountID, // Optional account scope
"int"?: Intent, // Optional intent
"sig"?: [signature] // Optional signatures for certain response types
}

Next Steps​

Dive deeper into the specifics of the RPC system: