gRPC 사용하기
이 가이드는 gRPC를 사용해 Sui network를 질의하는 실용적인 예시를 제공한다. 핵심 개념은 corresponding concepts page를 참조한다.
- Prerequisites
시작하기 전에 gRPC가 활성화된 Sui full node에 접근할 수 있는지 확인한다. full node에서 gRPC를 지원하는 list of RPC and data providers를 확인하고, access를 요청하려면 provider에 직접 연락한다.
provider가 아직 gRPC를 지원하지 않는다면 다음과 같이 할 수 있다:
-
이를 활성화해 달라고 요청한다.
-
도움을 받기 위해 Discord 또는 Telegram의 Sui Foundation team에 연락한다.
필드 마스크
protocol buffer의 FieldMask는 message 안의 field 부분집합을 읽거나, 업데이트하거나, 반환하도록 지정하는 메커니즘이다.
전체 object를 가져오는 대신 client는 field path 목록을 제공해 필요한 field만 요청할 수 있다.
이렇게 하면 성능이 향상되고 불필요한 데이터 전송이 줄어든다.
Sui gRPC API에서 FieldMask는 GetTransaction, GetObject 같은 request에 사용되어 응답에 어떤 부분을 포함할지 제어한다(transaction의 effects와 events 같은 부분).
Field mask는 google.protobuf.FieldMask를 사용해 정의되며, 보통 request message 안의 read_mask로 나타난다.
모든 field를 요청하려면 *를 명시적으로 전달할 수 있다.
read_mask를 생략하면 특별히 다르게 문서화되지 않은 한 기본값은 *(모든 field)이다.
-
mask의 각 field path는 응답 proto message의 field 구조와 일치해야 한다. nested field는 dot 표기법으로 지원된다.
-
batch API에서는 최상위
read_mask만 존중된다. API는 sub-request 안의 mask는 무시한다. -
어떤 경우에는 standard
FieldMask동작으로는 전형적이지 않더라도, non-terminal repeated field가 mask에서 지원될 수 있다.
필드 존재 여부
Sui와 함께 gRPC를 사용할 때는 특히 proto3 syntax를 다룰 때 field presence가 어떻게 동작하는지 이해하는 것이 중요하다.
proto3에서는 숫자, Boolean, string 같은 primitive field가 message에 없으면 항상 기본값으로 초기화된다.
즉 값이 명시적으로 설정된 것인지 아니면 단순히 생략된 것인지를 구분할 수 없다.
이 구분을 제공하기 위해 Sui는 API에서 required하더라도 모든 field를 optional로 표시한다.
API 사용자 입장에서는 이것이 field 값이 실제로 제공된 것인지 아니면 단순히 기본값인지 감지할 수 있게 해 주며, 명시적으로 빈 입력과 누락된 입력을 구분하는 의도를 시뮬레이션하거나 partial update를 수행하는 client를 작성할 수 있게 해 준다.
proto에서 field가 optional로 표시되어 있더라도 request가 유효하려면 여전히 required일 수 있다.
이것은 protobuf의 특성이며 실제 business logic을 나타내는 것은 아니다.
인코딩
Sui gRPC API에서 standard human-readable format을 가지는 identifier는 proto schema에서 string으로 표현된다:
-
Address와ObjectId: 앞에0x가 붙은 64개의 hexadecimal 문자로 표현된다. -
Digest: Base58로 표현된다. -
TypeTag와StructTag: canonical string format으로 표현된다(예:0x0000000000000000000000000000000000000000000000000000000000000002::coin::Coin<0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI>)