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: