nft-sso

所属分类:NFT
开发工具:JavaScript
文件大小:299KB
下载次数:0
上传日期:2022-10-26 02:41:02
上 传 者sh-1993
说明:  基于智能合约非同质化代币的去中心化匿名身份认证方案
(Decentralized Anonymous Identity Authentication Scheme Based on Smart Contract Non Homogeneous Tokens)

文件列表:
DAMC (0, 2022-10-26)
DAMC\.vscode (0, 2022-10-26)
DAMC\.vscode\settings.json (71, 2022-10-26)
DAMC\contracts (0, 2022-10-26)
DAMC\contracts\DAMC.sol (1499, 2022-10-26)
DAMC\contracts\Migrations.sol (371, 2022-10-26)
DAMC\cryp.js (501, 2022-10-26)
DAMC\migrations (0, 2022-10-26)
DAMC\migrations\1_initial_migration.js (125, 2022-10-26)
DAMC\migrations\2_deploy_damc.js (111, 2022-10-26)
DAMC\package.json (140, 2022-10-26)
DAMC\pnpm-lock.yaml (545685, 2022-10-26)
DAMC\test (0, 2022-10-26)
DAMC\test\damc_Test.js (728, 2022-10-26)
DAMC\test\estimateGas.js (4993, 2022-10-26)
DAMC\test\result.txt (7848, 2022-10-26)
DAMC\truffle-config.js (1349, 2022-10-26)
DAMC\utils.js (4272, 2022-10-26)
DAMC\wallet.js (845, 2022-10-26)
IPC (0, 2022-10-26)
IPC\.vscode (0, 2022-10-26)
IPC\.vscode\settings.json (71, 2022-10-26)
IPC\client (0, 2022-10-26)
IPC\client\IPC.js (2675, 2022-10-26)
IPC\client\environment.yaml (503, 2022-10-26)
IPC\contracts (0, 2022-10-26)
IPC\contracts\BN128.sol (6086, 2022-10-26)
IPC\contracts\IPC.sol (3721, 2022-10-26)
IPC\contracts\IPC_Secp.sol (3775, 2022-10-26)
IPC\contracts\Migrations.sol (371, 2022-10-26)
IPC\contracts\Secp256K1.sol (14421, 2022-10-26)
IPC\curves (0, 2022-10-26)
IPC\curves\bn128.js (693, 2022-10-26)
IPC\curves\secp256k1.js (2215, 2022-10-26)
IPC\migrations (0, 2022-10-26)
IPC\migrations\1_initial_migration.js (125, 2022-10-26)
IPC\migrations\2_deploy_ipc.js (211, 2022-10-26)
... ...

# DSSO 去中心化单点登录 ## 创建身份NFT ```sequence 用户-->SP: 请求创建 DA Note over SP: 生成 PUID SP-->用户: PUID,PPK Note over 用户: 生成 DA 标识串 DAID 用户->DAMC: PUID,PPK,DAID Note over DAMC: 创建 NFT \n tokenId = DAID \n tokenUri = encode(PPK,PUID) DAMC->用户: 创建成功 ``` ```javascript function createDANFT(DAID, UPK, puid, ppk) { return { tokenId: DAID, owner: UPK, puid, ppk, } } ``` ## 获取凭证 用户 ```javascript let usk, UPK = user.keyPair() let M = ExpireTimestamp let c,e = Schnorr(M, usk) let h, ekey = IPC.Issue(c, e, M, UPK) ``` IPC ```solidity // 验证来自客户端的签名 require(verifySchnorr(c, e, M, UPK)); // 请求随机数 uint256 r = 6; // 计算 rkey = Hash(UPK || r) uint256 rkey = uint256(keccak256(abi.encodePacked(UPK[0], r))); // ECDH 计算 rkey 对应的公钥 Rkey = rkey * G Rkey = eccPub(rkey); // 计算对称加密的密钥 key = rkey * UPK uint256 key = (eccMul(UPK, rkey))[0]; // 编码 encode(UPK,key,M) = C 用户凭据信息 // 用 Hash(UPK || key) 加密 C = EC bytes memory EC = encrypt( encode(UPK, key, M), uint256(keccak256(abi.encodePacked(UPK[0], key))) ); // 添加进 logins[hash(EC)] = EC h = uint256(keccak256(EC)); logins[h] = EC; ``` 流程图如下 ```sequence Note over 用户: 构造配置 M = ExpireTimestamp \n Schnorr(M, usk) => c, e 用户->IPC: M, c, e Note over IPC: 验证 c, e, M, UPK IPC->预言机: 请求随机数 Note over 预言机: 随机数 r 预言机->IPC: r Note over IPC: H(UPK || r) -> rkey \n 计算密钥 key = rkey * UPK Note over IPC: encode(UPK, key, M) => C \n encrypt(C, Hash(UPK || key)) => EC Note over IPC: h = Hash(EC) \n loginMapping[h] = EC Note over IPC: 使用 ECDH 交换密钥 key \n rkey*G -> Rkey IPC->用户: h,Rkey Note over 用户: 私钥 usk * Rkey -> key \n 计算 k = Hash(UPK || key) Note over 用户: 保留 key 和凭证 h, k ``` 验证凭证 ```sequence Note over 用户: 选择 DAID Note over 用户: 用key加密DAID -> EDAID 用户-->SP: h, k, EDAID SP->IPC: h, k, EDAID, PPK Note over IPC: 根据索引 h 找到 EC \n 用 k 解密并解码 EC \n 得到凭证信息 C Note over IPC: 检查 EC 是否过期 \n 未过期 \n 用 key 解密 EDAID -> DAID IPC->DAMC: DAID Note over DAMC: 检索 DA 的 tokenUri \n 解析 owner,PPK,SUID DAMC->IPC: owner, PPK Note over IPC: 验证 owner == address(UPK) \n 验证 PPK == PPK IPC->SP: SUID Note over SP: 生成SUID账户的token SP-->用户: token Note over 用户: 保存该 token ``` ## 实验报告 ### 创建 DA create ```json { "uint256[2] UPK": [ "127038750227013234194431537***43810342587175372612708973788***86253451865066948", "69576544117994796556923303631386145038479***53184151273227083891889793***59249" ], "uint256 DAID": "4517848005506344512556***109525908178682349476028995848866267***15256***13979065", "uint256 SPPK": "18759004803995162512755791731821489***677377***859433***453712055141486810896046", "uint256 SPUID": "7232425" } transaction cost 400312 gas { "0": "string: uri 24168888162730***469939480911672520281197611914328060812856829257137382133***26127038750227013234194431537***43810342587175372612708973788***86253451859711597" } ``` safemint ```json { "uint256 DAID": "4517848005506344512556***109525908178682349476028995848866267***15256***13979065" } transaction cost 69397 gas ``` toString ```json { "uint256[2] UPK": [ "127038750227013234194431537***43810342587175372612708973788***86253451865066948", "69576544117994796556923303631386145038479***53184151273227083891889793***59249" ], "uint256 SPPK": "18759004803995162512755791731821489***677377***859433***453712055141486810896046", "uint256 SPUID": "7232425" } execution cost 218390 gas { "0": "string: 24168888162730***469939480911672520281197611914328060812856829257137382133***26127038750227013234194431537***43810342587175372612708973788***86253451859711597" } ``` setTokenUri 跟字符串长短有关 ``` execution cost 161394 gas ``` ``` 65459 ECCMul (290ms) ******0 ECCAdd (265ms) 33626 ECCMul (212ms) 29565 ECCAdd (225ms) ```

近期下载者

相关文件


收藏者