毕设19 - DID 智能合约

| 笔记 | 1829 | 5分钟 | 毕设智能合约Rust

开始写 DID 的合约!在写合约的过程中,遇到需要更新的函数就更新TA。

0 DID设计

0.1 加密算法

非对称加密

常见的非对称加密算法包括 RSAECC

  • RSA 支持 公钥加密、私钥解密,但加密数据长度有限(约 200 字节),且计算效率较低。

  • ECC 不直接支持公钥加密、私钥解密,但可用于计算共享密钥(如 ECDH),常用于安全通信。

对称加密

常见的对称加密算法包括 AES

  • 加密和解密使用相同的密钥,可高效处理大规模数据。

  • 常见应用方式:先使用 非对称加密传输对称密钥,再用 对称加密 保护数据传输。

0.2 创建DID文档

def create_did():
    # 生成 NIST P-256 (secp256r1) 私钥
    private_key = ec.generate_private_key(ec.SECP256R1())

    # 获取未压缩公钥(65 字节,0x04 前缀 + X + Y)
    public_key = private_key.public_key().public_bytes(
        encoding=serialization.Encoding.X962,
        format=serialization.PublicFormat.UncompressedPoint
    )

    # 生成 bech32 格式的 DID
    did = bech32.bech32_encode("did:swt:", bech32.convertbits(public_key, 8, 5))

    # 将公钥转换为 Base64URL 编码
    public_key_multibase = base64.urlsafe_b64encode(public_key).decode().rstrip("=")

    # 创建 DID 文档
    did_document = {
        "@context": "https://www.w3.org/ns/did/v1",
        "id": did,
        "verificationMethod": [
            {
                "id": f"{did}#keys-1",
                "type": "EcdsaSecp256r1VerificationKey2019",
                "controller": did,
                "publicKeyMultibase": public_key_multibase
            }
        ],
        "authentication": [f"{did}#keys-1"]
    }
    return did, private_key.private_numbers().private_value.to_bytes(32, 'big').hex(), did_document

用户在本地创建Curve25519密钥对,把公钥发送给智能合约,让智能合约创建文档并保存。

did由公钥生成。

DID合约

DID合约链上状态有:

  • DID文档:
    • key:did
    • value:json格式的字符串
  • 区块链公钥:
    • key:TEE_SECP256R1_PUBLIC_KEY
    • value:公钥的值(私钥在TEE的加密存储区域)
  • 可信VC颁发机构的did:
    • key: VCISSUER
    • value: 政府的did

任务:

  • 保存创建并保存政府的DID文档。
    • 消息传入政府公钥,直接创建文档。更新DID文档和VCISSUER。
  • 保存TEE公钥。
    • 调用 TEE 外部函数接口,获取公钥。

传输的公钥格式为Base64URL 编码的 (X 坐标 + Y 坐标)。

乱记

现在政府已经可以实例化智能合约。

下面创建用户端网页,可以创建智能合约。

VC好了。

现在要写一个和区块链加密通讯的代码。

用户用区块链的公钥和自己的私钥计算共享密钥,对称加密VC(可验证凭证,内含用户生日)。

用户将对称加密的VC发送给电影院,电影院发送给区块链验证用户是否已满十八岁。

区块链获取用户的公钥,计算共享密钥,解密VC。进一步验证VC,验证年龄,返回一个结果,实现零知识证明。

问题:怎么在多个区块链节点里生成同一个对称加密的共享密钥?

其他

思考一个问题:DID文档有必要加密保存吗?

里面存的核心内容,就是 did 对应公钥。而did本身就是等价于公钥,这有什么弊端呢?没什么弊端。

链上保存的内容确实没必要加密,但是用户提供 VC 的时候可以加密 VC 。这样基于可信执行环境实现零知识证明。

DID文档不加密,还可以把验证用户签名的过程挪到链外,降低区块链负担。

结论:链上状态全部不加密,提供 VC 证明时加密。