Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: expand SBT #1211

Merged
merged 3 commits into from
Oct 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions nft/SBT/Iden3/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Iden3

## 介绍
Iden3协议的核心理念是每个身份都是自我主权的,能够对另一个身份(可以是个人、组织或系统/机器)发布声明。通过这种方式,用户可以更加自主地管理和控制他们的身份信息,并在不同的平台和服务之间安全地分享这些信息。

### 主要特点
1. **自我主权身份**:
- 用户拥有对其身份的完全控制权,无需依赖第三方中心化机构。

2. **可验证声明**:
- 每个身份可以向其他身份发出可验证的声明,从而增强信任和透明度。

3. **隐私保护**:
- Iden3通过密码学技术保护用户的隐私,确保个人信息仅在必要时共享。

4. **去中心化**:
- Iden3利用区块链技术实现去中心化存储,减少单点故障风险,提高系统的安全性和可靠性。

## 使用场景
- **个人身份验证**:用户可以在各种在线服务中使用其自我主权身份进行身份验证,而无需每次都提交个人信息。
- **企业认证**:组织可以通过Iden3协议向其合作伙伴或客户发布可验证的声明,增强商业信任。
- **物联网(IoT)设备**:IoT设备可以拥有自己的身份,并对其操作和状态进行声明,实现自动化和安全的设备管理。

## 参考文献
- [Baby Jubjub](https://iden3-docs.readthedocs.io/en/latest/_downloads/33717d75ab84e11313cc0d8a090b636f/Baby-Jubjub.pdf)

## 官方网站
- [Iden3文档](https://docs.iden3.io/)

## 未来发展方向
- **与其他协议的互操作性**:
- 未来,Iden3可能会与其他身份管理协议进行集成,以实现更广泛的互操作性和用户体验。

- **应用生态系统的构建**:
- 鼓励开发者基于Iden3构建各种应用,推动生态系统的发展和创新。

- **用户教育和推广**:
- 加强对用户和开发者的教育,以提高对自我主权身份的认识和使用,促进Iden3的广泛应用。

### 总结
Iden3协议为用户提供了一种安全、私密且去中心化的身份管理方案,未来有望在各个领域广泛应用。随着技术的发展和生态系统的完善,Iden3将为用户带来更便利和安全的身份管理体验。
43 changes: 43 additions & 0 deletions nft/SBT/example/SBT.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract SoulboundToken is ERC721Enumerable, Ownable {
uint256 private _tokenIdCounter;

// Mapping to track if a token is soulbound (non-transferable)
mapping(uint256 => bool) private _soulboundTokens;

constructor() ERC721("SoulboundToken", "SBT") {}

function mint(address to) external onlyOwner {
_tokenIdCounter++;
uint256 newTokenId = _tokenIdCounter;

_mint(to, newTokenId);
_soulboundTokens[newTokenId] = true; // Mark token as soulbound
}

function isSoulbound(uint256 tokenId) external view returns (bool) {
return _soulboundTokens[tokenId];
}

// Override transfer functions to prevent transfers of soulbound tokens
function transferFrom(address from, address to, uint256 tokenId) public override(ERC721, IERC721) {
require(!_soulboundTokens[tokenId], "This token is soulbound and cannot be transferred");
super.transferFrom(from, to, tokenId);
}

function safeTransferFrom(address from, address to, uint256 tokenId) public override(ERC721, IERC721) {
require(!_soulboundTokens[tokenId], "This token is soulbound and cannot be transferred");
super.safeTransferFrom(from, to, tokenId);
}

function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public override(ERC721, IERC721) {
require(!_soulboundTokens[tokenId], "This token is soulbound and cannot be transferred");
super.safeTransferFrom(from, to, tokenId, _data);
}
}
51 changes: 51 additions & 0 deletions nft/SBT/example/compile.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import solc from 'solc';
import fs from 'fs';
import path from 'path';

const filePath = path.resolve('SBT.sol');
const source = fs.readFileSync(filePath, 'utf8');

// 定义导入回调函数
function findImports(importPath) {
try {
const resolvedPath = path.resolve('node_modules', importPath);
const content = fs.readFileSync(resolvedPath, 'utf8');
return { contents: content };
} catch (e) {
return { error: `File not found: ${importPath}` };
}
}

// solc 编译输入格式
const input = {
language: 'Solidity',
sources: {
'SBT.sol': {
content: source,
},
},
settings: {
outputSelection: {
'*': {
'*': ['abi', 'evm.bytecode.object'],
},
},
},
};

// 编译合约
const output = JSON.parse(solc.compile(JSON.stringify(input), { import: findImports }));

console.log(output);

if (output.errors) {
output.errors.forEach(err => console.error(err.formattedMessage));
} else {
// 提取 ABI 和 Bytecode
const abi = output.contracts['SBT.sol'].SoulboundToken.abi;
const bytecode = output.contracts['SBT.sol'].SoulboundToken.evm.bytecode.object;

// 保存为 JSON 文件
fs.writeFileSync('SBTCompiled.json', JSON.stringify({ abi, bytecode }, null, 2));
console.log('Compilation successful. ABI and Bytecode saved to SBTCompiled.json');
}
43 changes: 43 additions & 0 deletions nft/SBT/example/deploySBT.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import Web3 from 'web3';
import { abi, bytecode } from './SBTCompiled.json'; // 编译好的合约 ABI 和字节码

// 初始化 Web3
const web3 = new Web3("https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID");

// 部署者钱包私钥
const privateKey = 'YOUR_PRIVATE_KEY';
const account = web3.eth.accounts.privateKeyToAccount(privateKey);
web3.eth.accounts.wallet.add(account);
web3.eth.defaultAccount = account.address;

// 部署合约的函数
async function deploySBT() {
const SBTContract = new web3.eth.Contract(abi);

// 部署合约
const sbtInstance = await SBTContract.deploy({ data: bytecode })
.send({
from: account.address,
gas: 5000000,
gasPrice: web3.utils.toWei('20', 'gwei')
});

console.log("SBT contract deployed at:", sbtInstance.options.address);
return sbtInstance;
}

// 调用 mint 方法来为用户铸造 SBT
async function mintSBT(sbtInstance, to, tokenId) {
await sbtInstance.methods.mint(to, tokenId)
.send({ from: account.address, gas: 500000 });

console.log(`Minted SBT token with ID ${tokenId} for address ${to}`);
}

// 主函数,部署合约并铸造一个 SBT
(async () => {
const sbtInstance = await deploySBT();

// 假设我们要为地址 '0xRecipientAddress' 铸造一个 SBT,tokenId 为 1
await mintSBT(sbtInstance, '0xRecipientAddress', 1);
})();
25 changes: 25 additions & 0 deletions nft/SBT/example/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"name": "sbt",
"version": "1.0.0",
"description": "sbt deploy、mint example",
"main": "index.js",
"type": "module",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"compile": "node compile.js",
"deploy": "node deploySBT.js"
},
"keywords": [
"sbt",
"mint",
"deplot",
"erc721"
],
"author": "",
"license": "ISC",
"dependencies": {
"@openzeppelin/contracts": "^5.1.0",
"solc": "^0.8.28",
"web3": "^4.14.0"
}
}
12 changes: 0 additions & 12 deletions nft/SBT/iden3.md

This file was deleted.

88 changes: 46 additions & 42 deletions nft/SBT/readme.md
Original file line number Diff line number Diff line change
@@ -1,59 +1,63 @@
# SBT

## DID
DID(去中心化身份)本质上是一种URI(统一资源标识符),用于唯一识别一个资源。DIDs允许用户使用开放的标准生成自己的ID,并将相关身份信息存储在区块链等可信存储平台上,而不是某个互联网巨头的服务器上。DIDs能够唯一标记信息资源,提供了一种关于身份的良好载体。然而,DID的实现仍严重依赖于现有中心化机构来颁发各种身份凭证。

## DID
本质上是一种URI(统一资源标识符):唯一识别一个资源;
## SBT
SBT(Soulbound Token,灵魂绑定通证)顾名思义,是绑定于用户账户或钱包的Token,一旦生成则不可交易。SBT可以用来代表承诺、资格、从属关系等,其作用类似于履历表,由用户对应的相关方账户进行发行,作为相应社会关系的证明。

DIDs 允许用户使用开放的标准生成自己的 ID,并将相关身份信息存储到区块链这样的可信存储平台上而不是某个互联网巨头的服务器里。DIDs 可以去唯一标记一个信息资源,提供了一种关于身份的良好载体
问题: 严重依赖现有中心化机构去颁发各种身份凭证
一个账户(地址)可以理解为一个灵魂,而一个灵魂可以拥有多个SBT。SBT对应着一系列的关系、成员资格和证书等。个人或组织都可以向其他灵魂发行SBT,从而形成“灵魂网络”。

- **声誉系统**
- **Web3信用贷**
- **SBT社区恢复**
- **灵魂空投**
- **灵魂治理**

## 技术实现
- **EIP-4973**: Account-bound Tokens
- **EIP-5114**: [EIP-5114](https://eips.ethereum.org/EIPS/eip-5114)
- **ERC721S**
- **EIP-3525**: 一种理想的半均质化通证,具有ERC-20的数量能力和ERC-721的描述能力。具体解决方案是在保留ERC-721的_tokenID基础上,引入基于ERC-20的_value数量操作,同时增加全新参数slot以表达分类概念,以及相应的Slot Metadata以帮助实现其业务层面的类别逻辑。[了解更多](https://mirror.xyz/0x07599B7E947A4F6240F826F41768F76149F490D5/VemGGAWbWtxW_G-89Pblgidi5Nx9pPvDySKnfnX83zs)

### ZK-SBT
参考项目: [ZK-SBT GitHub](https://github.com/enricobottazzi/ZK-SBT)

## SBT
SBT,Soulbond Token(灵魂绑定通证),顾名思义,就是绑定于用户账户或钱包的 Token,一旦生成则不可交易。SBT 可以用来代表承诺、资格、从属关系等,其作用类似于履历表,由用户对应的相关方账户进行发行,作为相应社会关系的一种证明。


一个账户(地址)可以理解为一个灵魂,一个灵魂可以拥有多个SBT。
SBT对应着一系列的关系,成员资格和证书等等。
个人或者阻止都可以向其他灵魂发行SBT。进而形成“灵魂网络”。

- 声誉系统
- web3信用贷
- SBT社区恢复
- 灵魂空投
- 灵魂治理



## 技术实现
- EIP-4973 Account-bound Tokens
- EIP-5114(https://eips.ethereum.org/EIPS/eip-5114.)
- ERC721S
- EIP-3525
一种理想的半匀质化通证,同时具有 ERC-20 的数量能力和 ERC-721 的描述能力。
具体解决方案是在保留 ERC-721 的_tokenID 基础上引入基于 ERC-20 的_value 的数量操作,同时增加一个全新的参数 slot 来表达分类概念,以及一个对应的 Slot Metadata 来帮助实现其业务层面的类别逻辑。
https://mirror.xyz/0x07599B7E947A4F6240F826F41768F76149F490D5/VemGGAWbWtxW_G-89Pblgidi5Nx9pPvDySKnfnX83zs

- EIP-5114

### 账户抽象
- **EIP-4377**: [EIP-4377](https://web3caff.com/zh/archives/26165)
- **EIP-2938**: [EIP-2938](https://medium.com/infinitism/erc-4337-account-abstraction-without-ethereum-protocol-changes-d75c9d94dc4a)

## 更多资料
### 研究论文与技术文档
- **Soulbound Tokens: A Comprehensive Overview**: 深入探讨SBT的概念、设计和应用场景,提供详细的技术架构和实现方案。
- **Decentralized Identity: Principles and Practices**: 探讨去中心化身份的基本原则、最佳实践及技术实现。
- **ZK-SBT: Using Zero-Knowledge Proofs in Soulbound Tokens**: 介绍零知识证明技术在SBT中的应用,提升用户隐私保护和身份验证的安全性。

### ZK-SBT
参考项目: https://github.com/enricobottazzi/ZK-SBT
### 开源项目
- **SBT Protocol Implementations**: GitHub上与SBT相关的开源项目,探索不同团队如何实现SBT,包括合约、应用和工具库。
- **DID Libraries and Frameworks**: 流行的去中心化身份库(如DIDKit、Identity.com),提供实现DID的API和工具。

### 在线课程与讲座
- **Web3 & Decentralized Identity Courses**: 在线教育平台(如Coursera、edX)提供的Web3和去中心化身份课程,帮助开发者和企业理解和应用这些新技术。
- **YouTube讲座**: 有关SBT和DID的讲座和研讨会,邀请行业专家分享经验和见解。

### 账户抽象
EIP4377
https://web3caff.com/zh/archives/26165
### 社区与论坛
- **Web3社群**: 加入Discord或Telegram的Web3社区,参与讨论,获取实时更新和新想法。
- **Stack Exchange & Reddit**: 提问和分享与SBT和DID相关的经验和见解,是获取帮助和知识的好地方。

EIP-2938
https://medium.com/infinitism/erc-4337-account-abstraction-without-ethereum-protocol-changes-d75c9d94dc4a
## 应用实例
- **去中心化金融(DeFi)**: 在DeFi平台中,SBT可以用作信用评级的基础,提升借贷的透明度和安全性。
- **社交网络**: 用户可以通过SBT证明自己的社交身份和历史,在去中心化社交平台上建立信任。
- **身份认证**: 利用DID和SBT的结合,企业可以验证用户身份,并为他们颁发具有法律效力的数字证书。

## 未来发展
- **标准化**: SBT和DID的发展仍处于早期阶段,未来可能会有更多标准化的工作,以促进不同平台和协议之间的互操作性。
- **法律与合规**: 随着SBT和DID的普及,相关法律法规的制定将成为重点,确保用户隐私和数据安全。
- **技术创新**: 随着区块链和加密技术的进步,新的解决方案将不断涌现,以增强SBT和DID的功能和应用场景。

## 参考链接
- [vitalik文章](https://vitalik.eth.limo/general/2022/01/26/soulbound.html)
- [ Decentralized Society: Finding Web3's Soul ](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4105763)
- [Vitalik文章](https://vitalik.eth.limo/general/2022/01/26/soulbound.html)
- [Decentralized Society: Finding Web3's Soul](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4105763)
- [SBT综述](https://mirror.xyz/0x07599B7E947A4F6240F826F41768F76149F490D5/fbYA4BbpB8zxbFqO2FpyLEFprXMqhSfQQQIo_lU8LGE)
- [DID总结文章1]https://docs.qq.com/doc/DVGJFUWN6RGRZdWJo
- [DID总结文章2]https://docs.qq.com/doc/DVEFDQ2FISWVRa0RX
- [DID总结文章1](https://docs.qq.com/doc/DVGJFUWN6RGRZdWJo)
- [DID总结文章2](https://docs.qq.com/doc/DVEFDQ2FISWVRa0RX)