Розробка системи душевидних облікових даних
Soul-bound облікові дані — перевіряємі облікові дані, реалізовані через non-transferable токени (SBT). Поєднують криптографічну верифікованість VC з on-chain постійністю та composability. Розробники протоколів можуть верифікувати облікові дані on-chain у смарт-контрактах — те, що звичайні VC безпосередньо не підтримують.
Відмінність від звичайних SBT
Звичайний SBT: NFT з метаданими. Метадані містять claims, але їх верифікація вимагає довіри до видавця та знання його ключа підписання.
Soul-bound облікові дані: SBT де on-chain доступні не тільки факт існування, але й перевіряємі claims. Смарт-контракт може перевірити що SBT виданий конкретним довіреним видавцем та містить певні атрибути.
Реалізація
contract SoulBoundCredentialSystem {
// Довірені видавці з їхніми публічними ключами
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 у закодованих даних
if (_checkClaim(cred.encodedClaims, requiredClaim, requiredValue)) {
return true;
}
}
}
return false;
}
}
ZK Soul-bound облікові дані
Публічні on-chain claims порушують приватність. ZK підхід:
Sismo Protocol: користувач генерує ZK proof на основі своїх SBTs/on-chain даних. Proof доводить факт без розкриття конкретних токенів. Zkdrop — отримай governance power або rewards на основі ZK proof.
Анонімні атестації: доведи "у мене є SBT від Trusted Issuer X з claim level >= 2" без зазначення tokenId чи інших даних.
Soul-bound облікові дані стають інфраструктурним шаром для compliant DeFi, DAO governance та web3 систем репутації. Розробка: 4-8 тижнів.







