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)
```
近期下载者:
相关文件:
收藏者: