Разработка системы soul-bound credentials
Soul-bound credentials — это verifiable credentials реализованные через non-transferable токены (SBT). Сочетают криптографическую верифицируемость VC с on-chain перманентностью и composability. Разработчики протоколов могут проверять credentials on-chain в смарт-контрактах — то что обычные VC не поддерживают напрямую.
Отличие от обычных SBT
Обычный SBT: NFT с metadata. Metadata содержит claims, но их верификация требует trust к issuer и знания их signing key.
Soul-bound credential: SBT где on-chain доступно не только факт наличия, но и верифицируемые claims. Смарт-контракт может проверить что SBT выдан конкретным trusted issuer и содержит определённые атрибуты.
Реализация
contract SoulBoundCredentialSystem {
// Trusted issuers с их публичными ключами
mapping(address => bool) public trustedIssuers;
struct Credential {
address issuer;
uint256 issuedAt;
uint256 expiresAt;
bytes32 credentialType;
bytes encodedClaims; // ABI-encoded claims
bool revoked;
}
mapping(uint256 => Credential) public credentials;
mapping(address => uint256[]) public holderCredentials;
uint256 private _tokenIdCounter;
function issueCredential(
address recipient,
bytes32 credentialType,
bytes calldata claims,
uint256 validityPeriod
) external onlyTrustedIssuer returns (uint256) {
uint256 tokenId = ++_tokenIdCounter;
credentials[tokenId] = Credential({
issuer: msg.sender,
issuedAt: block.timestamp,
expiresAt: block.timestamp + validityPeriod,
credentialType: credentialType,
encodedClaims: claims,
revoked: false
});
holderCredentials[recipient].push(tokenId);
// mint SBT (non-transferable)
_mintSoulBound(recipient, tokenId);
return tokenId;
}
// Другие смарт-контракты вызывают это для on-chain проверки
function verifyCredential(
address holder,
bytes32 credentialType,
bytes32 requiredClaim,
bytes32 requiredValue
) external view returns (bool) {
uint256[] memory tokenIds = holderCredentials[holder];
for (uint i = 0; i < tokenIds.length; i++) {
Credential memory cred = credentials[tokenIds[i]];
if (cred.credentialType == credentialType &&
!cred.revoked &&
block.timestamp < cred.expiresAt &&
trustedIssuers[cred.issuer]) {
// Проверить конкретный claim в encoded данных
if (_checkClaim(cred.encodedClaims, requiredClaim, requiredValue)) {
return true;
}
}
}
return false;
}
}
ZK Soul-bound Credentials
Публичные on-chain claims нарушают приватность. ZK подход:
Sismo Protocol: пользователь генерирует ZK proof на основе своих SBT/on-chain данных. Proof доказывает факт без раскрытия конкретных токенов. Zkdrop — claim governance power или rewards на основе ZK proof.
Анонимные attestations: доказать «у меня есть SBT от Trusted Issuer X с claim level >= 2» без указания tokenId или других данных.
Soul-bound credentials становятся инфраструктурным слоем для compliant DeFi, DAO governance и web3 репутационных систем. Разработка: 4-8 недель.







