확장된 제공자: 재광고 없이 IPNI 업데이트
IPNI에 관련된 네 번째 게시글이다. 첫 번째 게시글은 IPNI의 개념을 설명했고 두 번째 게시글은 수십억 개의 주소지정 가능한 콘텐츠에 대해 콘텐츠 제공자 검색을 활성화하기 위해 내부적으로 작동하는 방식에 대해 더 자세히 알아보았고 세 번째는 인덱스 제공자가 되는 방법에 대해 설명했다.
이전 게시글에 더해 이번엔 IPNI에 최근 추가된 새로운 기능인 확젱된 제공자(Extended Providers)에 대해 알아본다.
IPNI에 데이터가 들어가는 원리
IPNI는 광고를 처리함으로써 인덱스를 구축한다. 광고 구조는 스토리지 제공자가 IPNI에 그들의 CID를 제공하도록 하며 이러한 CID는 광고가 처리될 때 빠른 검색을 활성화한다. CID 외에도 광고는 제공자의 사용자 id, 다중 주소 및 데이터를 가져올 수 있는 프로토콜 또한 포함한다. IPNI에서 CID를 검색하려 한다면 연결을 구축하고 데이터를 다운로드하는 데에 필요한 사항을 즉시 확인할 수 있다.
광고는 IPLD 객체이며 체인에 연결되어 있다. IPNI가 광고를 발견하면 체인의 마지막으로 알려진 항목으로 되돌아가고 거기서부터 시작하는 모든 새로운 데이터를 인덱싱할 수 있다.
이 워크플로우는 밑 다이어그램에서 설명한다.
웹3.스토리지 혹은 nft.스토리지와 같은 대규모 스토리지 제공자에 대해 완전한 인덱서를 구축하는 것은 어렵다. 많은 시간과 컴퓨팅 리소스를 소개한다. 예를 들어 이 게시글을 작성했던 시점에 몇 안 되는 IPNI 배포 중 하나인 cid.contact에 1조 3,000억 개의 CID가 인덱싱되었다. 이러한 인덱스를 처음부터 다시 구축하는 것은 몇 주가 걸리며 대규모 서버를 24/7 실행해야 한다.
스토리지 프로바이더가 수평적으로 스케일아웃하려고 한다면 어떻게 될까? 새로운 libp2p ID를 가진 새로운 노드를 추가하고 다른 전송 프로토콜을 사용하여 동일한 데이터를 제공하기 시작하는 것이 일반적인 방법이다. 하지만 IPNI가 제공자 'A'의 모든 데이터가 동시에 제공자 'B'에서도 가능하다는 것을 어떻게 알까? 새로운 ID에 대해 모든 CID를 재광고하는 것은 정말 비효율적이다. 답은 확장된 제공자다.
확장된 제공자
확장된 제공자 기능은 스토리지 제공자가 특정 컨텍스트ID를 사용하여 모든 과거 및 미래 광고 혹은 단일 광고에 정보를 추가한다. 더욱 중요하게 이는 전체 광고 체인을 다시 게시하는 일 없이 단순히 단일 광고를 전송함으로써 달성될 수 있다.
사용사례
- 모두 동일한 데이터 집합을 제공하는 자체 libp2p ID를 가진 새 노드를 추가하여 데이터 검색을 확장한다. 이는 파일코인에 대한 대규모 데이터 온보딩 플랫폼인 에스츄어리(Estuary)에 의해 구동되었으며, 이 플랫폼은 데이터 검색 기능을 향상시키기 위해 확장된 제공자를 사용한다.
- 동일한 데이터 집합을 제공하는 새로운 데이터 전송 프로토콜을 새로운 복수 주소에 제공한다. 이 사용 사례는 부스트(Boost)이며 로터스(lotus)의 go-fil-markets 패키지 대체물이다.
작동하는 방식
확장된 제공자(EP)는 광고 프로토콜의 하위 호환 확장자다. 광고에 선택적으로 추가될 수 있는 새로운 ExtendedProvider 필드로 정의될 수 있다.
type Advertisement struct {
...
ExtendedProvider optional ExtendedProvider
...
}
type ExtendedProvider struct {
Providers [Provider]
Override bool
}
type Provider struct {
ID String
Addresses [String]
Metadata optional Bytes
Signature Bytes
}
확장된 제공자는 체인 수준 혹은 맥락과 관련될 수 있다. 체인 수준 확장된 제공자는 제공자의 모든 과거 및 미래 광고에 적용되며 맥락과 관련된 확장된 제공자는 특정 컨텍스트ID를 가진 단일 광고에만 적용된다.
발견될 경우 IPNI는 다음과 같이 확장된 제공자를 해석한다.
- 광고가 컨텍스트ID를 가지고 있지 않다면 해당 제공자는 체인 수준으로 간주된다. 아닐 경우 맥락과 관련된 것으로 간주되며 해당 컨텍스트ID에 대해서만 반환된다. 몇 가지 부가적인 규칙은:
- 컨텍스트ID가 있는 광고의 ExtendedProvider 항목에 Override가 설정된 경우, 명시된 체인 수준 제공자 집합이 해당 컨텍스트ID에 대해 반환되지 않아야 함을 나타낸다. 제공자가 대신 반환된다.
- Override가 만약 컨텍스트ID가 있는 광고의 항목에 설정되지 않는다면 체인 수준 ExtendedProvider(주소, 메타데이터)와 조합으로써 결합된다.
전체 규칙 집합에 대해 사양을 참조하십시오.
예를 들어 제공자 맥스(Max)가 빗스왑(Bitswap) 프로토콜을 통해 새로운 사용자id 12D3KooWB1b3qZxWJanuhtseF3DmPggHCtG36KZ9ixkqHtdKasdfh에서 데이터 제공을 시작하려는 경우 다음과 같은 광고를 게시할 수 있다.
{
Provider: "12D3KooWHHzSeKaY8xuZVzkLbKFfvNgPPeKhFBGrMbNzbfwwkpqu", // Max's original peer id
Addresses: ["/ip4/224.96.85.246/tcp/1481", "/ip4/23.49.80.75/tcp/3339"], // Max's original multiaddresses
ContextID: "", // Empty ContextID so that Extended Providers are chain-level
ExtendedProvider: {
Providers: [
{
ID: "12D3KooWB1b3qZxWJanuhtseF3DmPggHCtG36KZ9ixkqHtdKasdfh", // Max's new peer id that he wants to use for Bitswap transfers
Addresses: ["/ip4/224.96.85.246/tcp/1481"], // Max's new addresses that he wants to serve Bitswap over
Metadata: "gBI=" // Metadata that tells that this is a Bitswap protocol
}
]
}
}
광고가 처리될 때 맥스의 새로운 제공자 정보는 그의 CID에 대한 모든 검색에 추가로 반환된다. API 관점에서 확장된 제공자 결과는 일반 제공자 기록과 구별할 수 없다.
확장된 제공자를 통한 광고도 사양에 정의된 특별한 방식으로 서명되어야 한다.
Go SDK 예시
확장된 제공자에 대한 지원은 인덱스 제공자 라이브러리의 최신 버전에 추가되었다. 이러한 광고는 xproviders.AdBuilder를 사용하여 만들 수 있으며 Engine 인터페이스를 사용하여 게시할 수 있다.
adv, err := xproviders.NewAdBuilder(providerID, priv, addrs).
WithContextID(contextID).
WithMetadata(metadata).
WithOverride(override).
WithExtendedProviders(extendedProviders).
WithLastAdID(lastAdId).
BuildAndSign()
if err != nil {
//...
}
engine.Publish(ctx, *adv)
리소스
IPNI 참여에 관심이 있거나 더 자세히 알아보고 싶다면 다음 리소스를 참조하십시오.
- cid.contact(세심히 관리되는 IPNI 배포 중 하나)
- storetheindex(파일코인 슬랙 채널)
- IPNI 구현
- IPNI 사양
보다 다양한 정보 및 방송 관련 소식은
공식 SNS 채널을 통해 확인할 수 있습니다.