본문으로 건너뛰기

작동 방식

세션은 발견, 연결, 추론, 정산의 네 단계입니다. 어느 단계도 GenKaKu Labs가 운영하지 않습니다.

1. 발견​

워커는 다음을 가지고 WorkerRegistry에 등록합니다.

  • peer ID 다이제스트 — keccak256("genkaku.peer.v0:" + peerId), libp2p 신원을 지갑에 묶습니다,
  • policy hash — 워커가 등록 시점에 고정하는 bytes32 커밋먼트,
  • 선택적 locator — 사용자가 다이얼할 수 있는 multiaddr 힌트.

레지스트리는 공개 count()와 isActive(address)를 제공합니다. 플러그인은 공개 RPC를 통해 이를 읽으며, 신뢰해야 할 디렉터리 API는 없습니다.

locator는 선택 사항입니다. 워커는 운영자가 publishAddress를 명시적으로 켤 때만 공인 주소를 게시하며, 게시된 locator는 체인에 올라간 뒤에는 영구적입니다.

policy hash는 커밋먼트이지 모델에 대한 설명이 아닙니다. 워커가 실제로 제공하는 것은 별도로 오퍼 보드(/genkaku/offers/0)에 게시되며, 여기에 모델 이름, 가격, Ollama 기능이 나열됩니다.

2. 연결​

사용자 플러그인은 워커의 peer ID로 libp2p 연결을 엽니다. hello 교환(/genkaku/hello/0)에서 다음을 고정합니다.

  • peer ID(레지스트리 항목과 일치해야 함),
  • 워커의 지갑 주소 — 주장이 아니라 서명으로 증명,
  • 시간당 견적과 과금 방식.

두 피어가 서로 직접 도달할 수 있으면 — 같은 LAN, 공인 IPv4, 글로벌 IPv6 — 토큰은 두 피어 사이를 곧바로 오갑니다. 그럴 수 없으면 세션은 staging.genkaku.app/seed에서 접근 가능한 공개 시드 릴레이를 통해 이루어집니다.

릴레이는 암호화된 libp2p 트래픽을 전달합니다. 프롬프트나 출력을 읽을 수는 없지만, 운영자는 연결 메타데이터(피어 주소, 시각, 양)를 볼 수 있습니다. 릴레이를 거치는 세션은 내용은 비공개이지만 누가 누구와 대화하는지는 비공개가 아니라고 보아야 합니다.

이 빌드에는 NAT 홀 펀칭(DCutR)이 없습니다. 피어가 직접 다이얼 가능하거나, 릴레이가 세션을 운반하거나 둘 중 하나입니다.

3. 추론​

워커는 Ollama로 모델을 로컬에서 실행하고 같은 연결로 토큰을 스트리밍합니다. 마켓플레이스는 프롬프트를 보지 못하지만 워커 운영자는 봅니다.

가격이 0인 오퍼는 체인을 완전히 건너뛰고 무료로 제공됩니다.

4. 정산​

유료 세션은 시간당 견적 + 시작된 분 누적을 사용합니다.

  • 워커가 시간당 가격을 제시,
  • 시작된 각 분은 1분으로 계산,
  • 2분 작업은 1시간이 아니라 2분치를 지불.

유료 모델의 경우 사용자는 첫 토큰 전에 JobEscrow에 에스크로를 엽니다. 이는 체인 트랜잭션 하나입니다. 세션이 끝나면:

  1. 워커가 세션 ID, 지출, 영수증 해시에 서명하고,
  2. settle()이 그 서명을 검증하고 지출을 해제하며,
  3. **99%**는 워커에게, **1%**는 재무로,
  4. 쓰지 않은 나머지는 사용자에게 돌아갑니다.

정산은 두 번째 체인 트랜잭션이므로, 유료 세션은 사용자에게 총 두 개의 트랜잭션이 듭니다. 에스크로 개설, 그다음 정산입니다. Gas는 각 트랜잭션을 보내는 쪽이 지불합니다.

워커는 정산된 수익을 컨트랙트에 누적하고 언제든 claim()할 수 있으며, 인출금은 워커의 지갑으로 지급됩니다.

오케스트레이터를 대체하는 것​

기존 모델GenKaKu
서버가 작업을 배정사용자가 컨트랙트에서 워커를 선택
서버가 프롬프트를 저장직접 피어 연결
서버가 사용량을 계량시작된 분 누적 + 서명 영수증
서버가 지급온체인 에스크로 해제

중간에 있는 것이 줄어든 만큼 신뢰 가정도 작아집니다. 하지만 0은 아닙니다. 여전히 프롬프트는 워커를, 세션이 릴레이를 거친다면 메타데이터는 릴레이를, 그리고 실행하는 코드를 신뢰합니다.