GetCheckpoint gRPC Method
Parameters
sequence_number
string
Loading...
read_mask
object
Loading...
paths
array
Loading...
Returns
checkpoint
object
Loading...
sequenceNumber
string
Loading...
digest
string
Loading...
Request
grpcurl \
-import-path . \
-proto sui/rpc/v2beta2/ledger_service.proto \
-H "x-token: YOUR_TOKEN_VALUE" \
-d '{
"sequence_number": "1000",
"read_mask": {
"paths": [
"sequence_number",
"digest"
]
}
}' \
docs-demo.sui-mainnet.quiknode.pro:9000 \
sui.rpc.v2beta2.LedgerService/GetCheckpoint
package main
import (
"context"
"crypto/tls"
"encoding/json"
"fmt"
"log"
"time"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/protobuf/encoding/protojson"
"google.golang.org/protobuf/types/known/fieldmaskpb"
pb "sui-grpc/sui/rpc/v2beta2" // Your Generated .pb.go files path
)
// QuickNode endpoints consist of two crucial components: the endpoint name and the corresponding token
// For eg: QN Endpoint: https://docs-demo.sui-mainnet.quiknode.pro/abcde123456789
// endpoint will be: docs-demo.sui-mainnet.quiknode.pro:9000 {9000 is the port number for Sui gRPC}
// token will be : abcde123456789
var (
token = "YOUR_TOKEN_NUMBER"
endpoint = "YOUR_QN_ENDPOINT:9000"
)
// Auth structure for x-token
type auth struct {
token string
}
func (a *auth) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) {
return map[string]string{
"x-token": a.token,
}, nil
}
func (a *auth) RequireTransportSecurity() bool {
return true
}
func main() {
// TLS credentials
creds := credentials.NewTLS(&tls.Config{})
opts := []grpc.DialOption{
grpc.WithTransportCredentials(creds),
grpc.WithPerRPCCredentials(&auth{token}),
}
conn, err := grpc.Dial(endpoint, opts...)
if err != nil {
log.Fatalf("Failed to connect: %v", err)
}
defer conn.Close()
client := pb.NewLedgerServiceClient(conn)
// Request for checkpoint with sequence_number = 1000
seq := uint64(1000)
req := &pb.GetCheckpointRequest{
CheckpointId: &pb.GetCheckpointRequest_SequenceNumber{
SequenceNumber: seq,
},
ReadMask: &fieldmaskpb.FieldMask{
Paths: []string{"sequence_number", "digest"},
},
}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
resp, err := client.GetCheckpoint(ctx, req)
if err != nil {
log.Fatalf("GetCheckpoint failed: %v", err)
}
marshaler := protojson.MarshalOptions{
UseProtoNames: true,
EmitUnpopulated: true,
Indent: " ",
}
jsonBytes, err := marshaler.Marshal(resp)
if err != nil {
log.Fatalf("Failed to marshal: %v", err)
}
var pretty map[string]interface{}
if err := json.Unmarshal(jsonBytes, &pretty); err != nil {
log.Fatalf("Failed to unmarshal: %v", err)
}
formatted, _ := json.MarshalIndent(pretty, "", " ")
fmt.Println(string(formatted))
}
import * as grpc from '@grpc/grpc-js';
import * as protoLoader from '@grpc/proto-loader';
import * as path from 'path';
const PROTO_PATH = path.join(__dirname, 'protos/proto/sui/rpc/v2beta2/ledger_service.proto');
// QuickNode endpoints consist of two crucial components: the endpoint name and the corresponding token
// For eg: QN Endpoint: https://docs-demo.sui-mainnet.quiknode.pro/abcde123456789
// endpoint will be: docs-demo.sui-mainnet.quiknode.pro:9000 {9000 is the port number for Sui gRPC}
// token will be : abcde123456789
const endpoint = 'docs-demo.sui-mainnet.quiknode.pro:9000';
const token = 'abcde123456789';
// Load protobuf definitions
const packageDefinition = protoLoader.loadSync(PROTO_PATH, {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true,
includeDirs: [path.join(__dirname, 'protos/proto')],
});
const proto = grpc.loadPackageDefinition(packageDefinition) as any;
const LedgerService = proto.sui.rpc.v2beta2.LedgerService;
// Create secure client
const client = new LedgerService(endpoint, grpc.credentials.createSsl());
// Metadata for authentication
const metadata = new grpc.Metadata();
metadata.add('x-token', token);
const request = {
sequence_number: 1000, // Replace as needed
read_mask: {
paths: ['sequence_number', 'digest'],
},
};
client.GetCheckpoint(request, metadata, (err: grpc.ServiceError | null, response: any) => {
if (err) {
console.error('gRPC Error:', {
code: err.code,
message: err.message,
details: err.details,
});
} else {
console.log('Checkpoint Response:');
console.log(JSON.stringify(response, null, 2));
}
});
import grpc
import json
from google.protobuf.field_mask_pb2 import FieldMask
from google.protobuf.json_format import MessageToDict
from sui.rpc.v2beta2 import ledger_service_pb2, ledger_service_pb2_grpc
def get_checkpoint():
# QuickNode endpoints consist of two crucial components: the endpoint name and the corresponding token
# For eg: QN Endpoint: https://docs-demo.sui-mainnet.quiknode.pro/abcde123456789
# endpoint will be: docs-demo.sui-mainnet.quiknode.pro:9000 {9000 is the port number for Sui gRPC}
# token will be: abcde123456789
endpoint = 'docs-demo.sui-mainnet.quiknode.pro:9000';
token = 'abcde123456789';
channel = grpc.secure_channel(endpoint, grpc.ssl_channel_credentials())
stub = ledger_service_pb2_grpc.LedgerServiceStub(channel)
# You can specify a checkpoint by sequence_number or digest
# Using sequence_number here as an example
sequence_number = 1000 # Replace with the actual checkpoint sequence number you want to retrieve
# Create a field mask to specify which fields to include in the response
read_mask = FieldMask(paths=[
"sequence_number",
"digest"
])
# Prepare the GetCheckpointRequest
request = ledger_service_pb2.GetCheckpointRequest(
sequence_number=sequence_number,
read_mask=read_mask
)
metadata = [("x-token", token)]
return stub.GetCheckpoint(request, metadata=metadata)
def parse_response_to_json(response):
return json.dumps(
MessageToDict(response, preserving_proto_field_name=True),
indent=2
)
def main():
try:
response = get_checkpoint()
print(parse_response_to_json(response))
except grpc.RpcError as e:
print(f"{e.code().name}: {e.details()}")
if __name__ == "__main__":
main()
Don't have an account yet?
Create your QuickNode endpoint in seconds and start building
Get started for free