작동 방식
세션은 발견, 연결, 추론, 정산의 네 단계입니다. 어느 단계도 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에 에스크로를 엽니다. 이는 체인 트랜잭션
하나입니다. 세션이 끝나면:
- 워커가 세션 ID, 지출, 영수증 해시에 서명하고,
settle()이 그 서명을 검증하고 지출을 해제하며,- **99%**는 워커에게, **1%**는 재무로,
- 쓰지 않은 나머지는 사용자에게 돌아갑니다.
정산은 두 번째 체인 트랜잭션이므로, 유료 세션은 사용자에게 총 두 개의 트랜잭션이 듭니다. 에스크로 개설, 그다음 정산입니다. Gas는 각 트랜잭션을 보내는 쪽이 지불합니다.
워커는 정산된 수익을 컨트랙트에 누적하고 언제든 claim()할 수 있으며, 인출금은 워커의
지갑으로 지급됩니다.
오케스트레이터를 대체하는 것
| 기존 모델 | GenKaKu |
|---|---|
| 서버가 작업을 배정 | 사용자가 컨트랙트에서 워커를 선택 |
| 서버가 프롬프트를 저장 | 직접 피어 연결 |
| 서버가 사용량을 계량 | 시작된 분 누적 + 서명 영수증 |
| 서버가 지급 | 온체인 에스크로 해제 |
중간에 있는 것이 줄어든 만큼 신뢰 가정도 작아집니다. 하지만 0은 아닙니다. 여전히 프롬프트는 워커를, 세션이 릴레이를 거친다면 메타데이터는 릴레이를, 그리고 실행하는 코드를 신뢰합니다.