mirror of
https://codeberg.org/lilingyi0619/did-method-alice.git
synced 2026-10-13 07:41:33 +08:00
No description
- Python 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| didalicenode | ||
| .gitignore | ||
| config.py | ||
| KNOWN-NODES.md | ||
| LICENSE | ||
| nodealiced.py | ||
| README.md | ||
| requirements-client.txt | ||
| requirements.txt | ||
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。