毕设19 - DID 智能合约
开始写 DID 的合约!在写合约的过程中,遇到需要更新的函数就更新TA。
0 DID设计
0.1 加密算法
非对称加密
常见的非对称加密算法包括 RSA 和 ECC。
-
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的加密存储区域)
- key:
- 可信VC颁发机构的did:
- key:
VCISSUER - value: 政府的did
- key:
任务:
- 保存创建并保存政府的DID文档。
- 消息传入政府公钥,直接创建文档。更新DID文档和VCISSUER。
- 保存TEE公钥。
- 调用 TEE 外部函数接口,获取公钥。
传输的公钥格式为Base64URL 编码的 (X 坐标 + Y 坐标)。
乱记
现在政府已经可以实例化智能合约。
下面创建用户端网页,可以创建智能合约。
VC好了。
现在要写一个和区块链加密通讯的代码。
用户用区块链的公钥和自己的私钥计算共享密钥,对称加密VC(可验证凭证,内含用户生日)。
用户将对称加密的VC发送给电影院,电影院发送给区块链验证用户是否已满十八岁。
区块链获取用户的公钥,计算共享密钥,解密VC。进一步验证VC,验证年龄,返回一个结果,实现零知识证明。
问题:怎么在多个区块链节点里生成同一个对称加密的共享密钥?
其他
思考一个问题:DID文档有必要加密保存吗?
里面存的核心内容,就是 did 对应公钥。而did本身就是等价于公钥,这有什么弊端呢?没什么弊端。
链上保存的内容确实没必要加密,但是用户提供 VC 的时候可以加密 VC 。这样基于可信执行环境实现零知识证明。
DID文档不加密,还可以把验证用户签名的过程挪到链外,降低区块链负担。
结论:链上状态全部不加密,提供 VC 证明时加密。