No description
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-08-17 11:28:08 +02:00
didalicenode first commit 2026-08-03 15:14:30 +08:00
.gitignore first commit 2026-08-03 15:14:30 +08:00
config.py first commit 2026-08-03 15:14:30 +08:00
KNOWN-NODES.md Publish public nodes 2026-08-17 11:25:42 +02:00
LICENSE first commit 2026-08-03 15:14:30 +08:00
nodealiced.py first commit 2026-08-03 15:14:30 +08:00
README.md 更新README.md 2026-08-17 11:28:08 +02:00
requirements-client.txt first commit 2026-08-03 15:14:30 +08:00
requirements.txt first commit 2026-08-03 15:14:30 +08:00

DID Method Alice

一种基于自认证更新链和Gossip P2P的DID方法。

数据模型

class DIDServices(pd.BaseModel):
    type: str
    endpoint: str

class DIDUpdate(pd.BaseModel):
    prev: typing.Optional[str] # SHA256 Base64
    aka: list[str]
    signkey: str # Multikey
    authkeys: dict[str, str] # Multikey
    services: dict[str, DIDServices]
    sign: str # Base64

def encode_json(event: DIDUpdate, for_sign: bool = False):
    data = {
        "prev": event.prev,
        "aka": event.aka,
        "signkey": event.signkey,
        "authkeys": event.authkeys,
        "services": {k: dict(v) for k, v in event.services.items()},
        "sign": event.sign,
    }
    if for_sign:
        data["sign"] = None
    return data

def get_update_digest(did: DIDUpdate):
    return base64.urlsafe_b64encode(hashlib.sha256(dag_cbor.encode(encode_json(did))).digest()).decode('ascii').replace('=', '')

def signature(event: DIDUpdate, sign_primitive: typing.Callable[[bytes], bytes]):
    target = dag_cbor.encode(encode_json(event, for_sign=True))
    sign = sign_primitive(target)
    event.sign = base64.urlsafe_b64encode(sign).decode('ascii').replace('=', '')
    return event

def compute_did(creation_digest: bytes):
    return "did:alice:" + base64.b32encode(creation_digest).decode('ascii')[:24].lower()

节点API

节点域名请见KNOWN-NODES.md。具体使用哪个节点没有关系,因为节点之间是互通的,如果你发现某两个节点之间存在数据不互通的情况,请使用请求订阅更新API构建连接(具体用法见源码)。

提交更新事件

POST /xrpc/com.vsinger.xiaoice.did.commitTx

请求体:更新事件(JSON格式)。

响应体:见参考源码。

查询更新事件

GET /xrpc/com.vsinger.xiaoice.did.resolveLedger?did=<DID>

响应体:{"result": [<Event>, <Event>, ...]}

获取DID Document

GET /xrpc/com.vsinger.xiaoice.did.resolveW3C?did=<DID>

响应体:W3C DID Document

请求订阅更新

GET /xrpc/com.vsinger.xiaoice.did.requestPeer?domain=<域名>

订阅更新流

WS /xrpc/com.vsinger.xiaoice.did.subscribeLedger?cursor=<序列号>&use_json=[true/false]

响应体(DAG-CBOR 或 JSON):{"seq": <序列号>, "event": <Event>}

如果是第一次从该节点订阅更新流,序列号传0。

若携带audience_host参数(传入域名),则视为同时请求了 请求订阅更新 API。