GetEpoch gRPC Method
Parameters
epoch
string
Loading...
read_mask
object
Loading...
paths
array
Loading...
Returns
epoch
object
Loading...
epoch
string
Loading...
committee
object
Loading...
epoch
string
Loading...
members
array
Loading...
publicKey
string
Loading...
weight
string
Loading...
Request
grpcurl \ -import-path . \ -proto sui/rpc/v2beta2/ledger_service.proto \ -H "x-token: YOUR_TOKEN_VALUE" \ -d '{ "epoch": "10", "read_mask": { "paths": [ "epoch", "committee" ] } }' \ docs-demo.sui-mainnet.quiknode.pro:9000 \ sui.rpc.v2beta2.LedgerService/GetEpoch
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() { 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 epoch #10 epochNum := uint64(10) fieldMask := &fieldmaskpb.FieldMask{ Paths: []string{ "epoch", "committee", }, } req := &pb.GetEpochRequest{ Epoch: &epochNum, ReadMask: fieldMask, } ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() resp, err := client.GetEpoch(ctx, req) if err != nil { log.Fatalf("GetEpoch failed: %v", err) } // Convert protobuf response to readable JSON marshaler := protojson.MarshalOptions{ UseProtoNames: true, EmitUnpopulated: true, Indent: " ", } jsonBytes, err := marshaler.Marshal(resp) if err != nil { log.Fatalf("Failed to marshal response: %v", err) } var pretty map[string]interface{} if err := json.Unmarshal(jsonBytes, &pretty); err != nil { log.Fatalf("Failed to parse JSON: %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); // Request setup const request = { epoch: 10, // Replace with desired epoch number read_mask: { paths: ['epoch', 'committee'], // FieldMask }, }; // Recursively convert byte arrays to hex function convertBytesToHex(obj: any): any { if (Array.isArray(obj)) { return obj.map(convertBytesToHex); } else if (obj && typeof obj === 'object') { const result: any = {}; for (const key of Object.keys(obj)) { const val = obj[key]; if (Buffer.isBuffer(val) || (Array.isArray(val) && typeof val[0] === 'number')) { result[key] = Buffer.from(val).toString('hex'); } else { result[key] = convertBytesToHex(val); } } return result; } return obj; } client.GetEpoch(request, metadata, (err: grpc.ServiceError | null, response: any) => { if (err) { console.error('gRPC Error:', { code: err.code, message: err.message, details: err.details, }); } else { const decoded = convertBytesToHex(response); console.log('GetEpoch Response:'); console.log(JSON.stringify(decoded, 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_epoch(): # 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) # Specify which epoch you want to retrieve # For example, epoch 10 - replace with the actual epoch number you want epoch_number = 10 # Create a field mask to specify which fields to include in the response read_mask = FieldMask(paths=[ "epoch", "committee" ]) # Prepare the GetEpochRequest request = ledger_service_pb2.GetEpochRequest( epoch=epoch_number, read_mask=read_mask ) metadata = [("x-token", token)] return stub.GetEpoch(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_epoch() 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