빠른 시작
아무것도 없는 상태에서 실제 네트워크에 대한 암호학적으로 검증된 호출까지. 가입 불필요, API 키 불필요, 의존성 불필요.
네 단계. 첫 단계는 curl만 있으면 되고, 나머지는 Node.js 또는 Python만 있으면 됩니다. 설치할 패키지는 없습니다. 이 페이지의 모든 코드는 공개 전에 실제 네트워크에서 실행했으며, 표시된 출력은 실제 결과입니다.
가입 단계가 없습니다. LibertyNet의 디스커버리는 공개되어 있습니다. 키를 기다리는 것이 아니라 애초에 키가 없습니다. 네트워크를 읽기 위해 키를 신청하라는 페이지가 있다면 그 페이지가 틀린 것입니다.
1. 네트워크가 살아 있는지 확인
curl -s https://registry.libertynet.ai/healthimport json, urllib.request
with urllib.request.urlopen("https://registry.libertynet.ai/health") as r:
print(json.load(r)){ "status": "ok", "service": "libertynet-registry-standalone", "count": 27 }count는 레지스트리가 현재 알고 있는 노드 수입니다. 이 응답을 받았다면 실제 네트워크와 대화하고 있는 것입니다. 구현됨
2. 네트워크에 누가 있는지 보기
curl -s https://registry.libertynet.ai/nodes | head -c 400{
"did": "did:svrp:df9d4b9f390bc49b2210eca81ca3c54c4d63b37b739442a21e28f2ed5b8aa02d",
"public_key": "df9d4b9f390bc49b2210eca81ca3c54c4d63b37b739442a21e28f2ed5b8aa02d",
"endpoint": "172.20.10.5:55785",
"capabilities": ["inference", "health:ready"],
"region": "asia-southeast",
"status": "active",
"last_seen": "2026-07-31T16:33:08Z"
}status: "active"는 온라인을 뜻하지 않습니다.
지난주에 전원을 뽑은 노드도 이 필드는 영원히 "active"입니다. 이를 되돌리는 장치가 없습니다. 낡아지는 필드는 last_seen 하나뿐이며, 신선도는 직접 계산해야 합니다. 3단계에서 제대로 처리합니다.
이 네트워크에서 가장 흔한 첫 실수입니다.
3. 신원을 직접 검증하기
LibertyNet이 다른 점이 바로 여기이고, 2분을 쓸 값어치가 있습니다.
LibertyNet의 DID는 자체 증명형입니다. 식별자가 공개키에서 파생되므로, SHA-256 하나만 있으면 디렉터리 조회 없이, 인증 기관에 묻지 않고, 방금 받은 응답을 믿지 않고도 그 주장을 직접 확인할 수 있습니다.
verify.py로 저장하고 실행하세요. 설치할 것이 없습니다.
import hashlib, json, re, urllib.request
B58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
def b58decode(s):
n = 0
for c in s:
i = B58.find(c)
if i < 0:
return None
n = n * 58 + i
raw = n.to_bytes((n.bit_length() + 7) // 8, "big")
# base58은 선행 0바이트를 버리므로 선행 '1' 하나당 1바이트 복원
return b"\0" * (len(s) - len(s.lstrip("1"))) + raw
# 레지스트리는 /nodes에서는 hex, /peers에서는 base58로 키를 제공. 같은 키.
def key_bytes(pk):
if re.fullmatch(r"[0-9a-f]{64}", pk):
return bytes.fromhex(pk)
return b58decode(pk)
def verify_id_binding(did: str, public_key: str) -> bool:
"""이 DID가 정말 이 공개키에서 파생되었는가?"""
key = key_bytes(public_key)
if not key or len(key) != 32:
return False
digest = hashlib.sha256(key).hexdigest()
body = re.sub(r"^did:svrp:(?:[a-z]:)?", "", did)
if len(body) == 64:
return body == key.hex() # 전체 hex 형식
if len(body) == 8:
return body == digest[:8] # 축약 형식
if len(body) == 10:
return body == digest[:10] # 충돌 대비 형식
return False
with urllib.request.urlopen("https://registry.libertynet.ai/nodes", timeout=10) as r:
nodes = json.load(r)["nodes"]
verified = sum(verify_id_binding(n["did"], n["public_key"]) for n in nodes)
print(f"{verified}/{len(nodes)}개 신원 검증 완료")27/27개 신원 검증 완료누구의 허락도 구하지 않고 이 네트워크의 모든 신원을 암호학적으로 확인했습니다. 그것이 이 설계의 핵심입니다.
DID 표기가 왜 두 가지인가. 같은 키가 축약형 did:svrp:n:<8자리hex>(공개키 SHA-256의 앞부분)과 전체형 did:svrp:<64자리hex>(공개키 자체)로 나타납니다. 바인딩에는 축약형이 저장되고, 실행 중인 데몬은 전체형을 알립니다. 같은 노드입니다. 여기서 문자열 비교를 하면 노드 하나가 둘로 쪼개집니다.
4. SDK로는 한 줄
위에서 한 일이 SDK가 대신 해주는 일이며, 검증은 끌 수 없습니다.
from libertynet import LibertyNet
ln = LibertyNet() # 검증 기본 활성화, 비활성화 불가
nodes = ln.discovery.online() # 검증되고 최근에 확인된 노드만
for n in nodes:
print(n.did, n.region, ",".join(n.capabilities))online()은 신원 검증에 실패한 레코드를 거부하고 오래 응답이 없는 노드를 제외합니다. 이 검사를 끄는 플래그는 없습니다 — 검증되지 않은 신원을 신뢰하는 클라이언트는 출시할 생각이 없기 때문입니다.