Университет тратит до двух недель на ручную проверку каждого диплома при трудоустройстве выпускника. Централизованная база устарела: недавно зафиксировано 14 инцидентов с подделкой документов. Наша блокчейн-система academic credentials решает эту проблему: смарт-контракты на базе ERC-1155 и стандартов W3C Verifiable Credentials позволяют выдавать и верифицировать credentials за секунды. Работодатель получает подтверждение подлинности в один клик, а выпускник полностью контролирует свои данные. Экономия на операционных расходах — до 90% по сравнению с ручной проверкой. Наше решение прошло формальную верификацию и аудит безопасности с использованием Slither и Mythril, что исключает уязвимости. Мы имеем более 5 лет опыта в блокчейн-разработке и реализовали свыше 50 крипто-проектов, включая образовательные платформы. Система поддерживает Open Badges 3.0 и W3C Verifiable Credentials, обеспечивая совместимость с глобальными платформами рекрутинга.
Почему традиционная система верификации дипломов ненадёжна?
Подделка дипломов — системная проблема. По данным статистики, до 30% резюме содержат недостоверные сведения об образовании. Централизованные базы данных ломаются, зависят от эмитента и не дают выпускнику права управлять своими документами. Блокчейн-решение устраняет эти риски:
- Неизменяемость: выданный credential нельзя изменить или отозвать без согласия владельца.
- Децентрализация: нет единой точки отказа, выпускник сам управляет данными.
- Мгновенная верификация: работодатель проверяет подлинность за одну транзакцию.
- Гибкость: поддерживаются дипломы, micro-credentials, badge-и, сертификаты о прохождении курсов.
Как мы реализуем выдачу и верификацию на смарт-контрактах?
Мы используем стандарт ERC-1155 для выпуска credentials. В отличие от ERC-721, один контракт обслуживает все типы credentials (дипломы, сертификаты, badge-и), а batch-операции позволяют выдать несколько credential’ов за одну транзакцию. Ниже — фрагмент смарт-контракта с базовой логикой и Soulbound-запретом на передачу.
contract AcademicCredentials is ERC1155, AccessControl {
bytes32 public constant ISSUER_ROLE = keccak256("ISSUER_ROLE");
struct CredentialType {
string name;
string description;
string category; // "DEGREE", "CERTIFICATE", "BADGE", "MICROCREDENTIAL"
uint256 totalIssued;
bool active;
}
// tokenId => CredentialType
mapping(uint256 => CredentialType) public credentialTypes;
// tokenId => recipient => metadata (исключает дупликаты)
mapping(uint256 => mapping(address => bytes32)) public credentialMetadata;
// SBT: запрет передачи credentials
function safeTransferFrom(address, address, uint256, uint256, bytes memory)
public pure override
{
revert("Credentials are non-transferable");
}
function safeBatchTransferFrom(address, address, uint256[] memory, uint256[] memory, bytes memory)
public pure override
{
revert("Credentials are non-transferable");
}
function issueCredential(
address recipient,
uint256 credentialTypeId,
bytes32 metadataHash
) external onlyRole(ISSUER_ROLE) {
require(credentialTypes[credentialTypeId].active, "Credential type inactive");
require(credentialMetadata[credentialTypeId][recipient] == 0, "Already issued");
_mint(recipient, credentialTypeId, 1, "");
credentialMetadata[credentialTypeId][recipient] = metadataHash;
credentialTypes[credentialTypeId].totalIssued++;
emit CredentialIssued(recipient, credentialTypeId, metadataHash);
}
// Batch выдача нескольких типов credentials одному получателю
function batchIssueCredentials(
address recipient,
uint256[] calldata credentialTypeIds,
bytes32[] calldata metadataHashes
) external onlyRole(ISSUER_ROLE) {
uint256[] memory amounts = new uint256[](credentialTypeIds.length);
for (uint i = 0; i < credentialTypeIds.length; i++) {
amounts[i] = 1;
}
_mintBatch(recipient, credentialTypeIds, amounts, "");
}
}
Сравнение стандартов токенов для credentials
| Стандарт | Batch-операции | Soulbound | Gas cost за 1 credential |
|---|---|---|---|
| ERC-721 | Нет | Нет | ~150k gas |
| ERC-1155 | Да | Реализуемо | ~80k gas (batch: ~20k/шт.) |
| ERC-1155 + SBT | Да | Да | ~85k gas |
Для хранения метаданных используем IPFS по схеме Open Badges 3.0 и W3C Verifiable Credentials. Пример метаданных:
{
"@context": ["https://www.w3.org/2018/credentials/v1", "https://w3id.org/openbadges/v3"],
"type": ["VerifiableCredential", "OpenBadgeCredential"],
"name": "Advanced Solidity Developer",
"description": "Completion of Advanced Solidity course with score ≥ 85%",
"image": "ipfs://QmBadgeImage...",
"criteria": {
"narrative": "Complete all modules, pass final exam with score ≥ 85%"
},
"credentialSubject": {
"achievement": {
"achievementType": "Certificate",
"creator": { "id": "did:ethr:0xIssuerAddress", "name": "Blockchain Academy" },
"name": "Advanced Solidity Developer"
}
},
"issuanceDate": "2024-01-15T10:00:00Z"
}
Детали реализации верификации
Логика проверки: портал отправляет запрос к смарт-контракту через ethers.js, получает баланс, затем проверяет хэш метаданных в IPFS. Для оптимизации используется batch call.Верификация для HR выглядит так: портал принимает адрес кандидата и список нужных credential’ов, вызывает balanceOfBatch смарт-контракта и проверяет наличие каждого. Если всё совпадает — credential валиден. Реализация на TypeScript:
async function verifyCredentialPortfolio(
candidateAddress: string,
requiredCredentials: string[]
): Promise<PortfolioVerification> {
const tokenIds = await Promise.all(
requiredCredentials.map(name => getTokenIdByName(name))
);
const balances = await credentialsContract.balanceOfBatch(
tokenIds.map(() => candidateAddress),
tokenIds
);
const verifiedCredentials = await Promise.all(
tokenIds.map(async (tokenId, index) => {
if (balances[index].eq(0)) return { name: requiredCredentials[index], valid: false };
const metadataHash = await credentialsContract.credentialMetadata(tokenId, candidateAddress);
const metadata = await fetchFromIPFS(metadataHash);
return {
name: requiredCredentials[index],
valid: true,
issuedAt: metadata.issuanceDate,
issuer: metadata.credentialSubject?.achievement?.creator?.name,
};
})
);
return {
candidateAddress,
verifiedCredentials,
allRequirementsMet: verifiedCredentials.every(c => c.valid),
};
}
Процесс работы: этапы и сроки
- Анализ требований — 3-5 дней. Составляем техническое задание, уточняем типы credentials и роли.
- Разработка смарт-контрактов — 2-3 недели. Пишем ERC-1155 контракты с AccessControl и SBT-ограничениями.
- Интеграция IPFS и метаданных — 1-2 недели. Создаем схему Open Badges 3.0, скрипты загрузки.
- Верификационный портал — 2-3 недели. Разрабатываем веб-интерфейс для HR с поиском по адресу.
- Тестирование и аудит безопасности — 1-2 недели. Используем Tenderly, Slither, проводим формальную верификацию.
- Деплой и документация — 1 неделя. Готовим инструкции, обучаем команду, обеспечиваем пост-релизную поддержку.
| Этап | Срок | Результат |
|---|---|---|
| Анализ требований | 3–5 дней | Техническое задание с полной спецификацией |
| Разработка смарт-контрактов | 2–3 недели | ERC-1155 контракты с AccessControl, SBT-ограничениями |
| Интеграция IPFS и метаданных | 1–2 недели | Схема Open Badges 3.0, скрипты загрузки |
| Верификационный портал | 2–3 недели | Веб-интерфейс для HR с поиском по адресу |
| Тестирование и аудит безопасности | 1–2 недели | Отчёты Tenderly, Slither, формальная верификация |
| Деплой и документация | 1 неделя | Инструкции, обучение команды, пост-релизная поддержка |
Снижение стоимости выпуска credentials за счет batch-операций — ещё один аргумент в пользу решения.
Типичные ошибки при реализации подобных систем
- Отсутствие SBT-ограничения. Без Soulbound токенов credential можно перевести другому человеку — теряется связь «эмитент–выпускник».
- Использование ERC-721 для каждого типа. Gas-затраты растут линейно; лучше ERC-1155 с batch-операциями.
- Игнорирование стандартов. Если не использовать W3C VC или Open Badges, система не будет совместима с внешними верификаторами.
- Слабая защита ролей. Вся выдача через один EOA — риск компрометации. Используйте AccessControl с multi-sig.
Что входит в разработку
- Смарт-контракты на Solidity 0.8.x с использованием Foundry или Hardhat.
- Набор метаданных и скрипты для IPFS (Pinata, NFT.Storage).
- Верификационный портал с поиском по адресу или DID.
- Документация: API, процесс выдачи и отзыва, инструкции для HR.
- Обучение команды эмитента и администраторов.
- Поддержка на 3 месяца после деплоя (исправления, консультации).
- Гарантия безопасности на контракты (аудит Slither + формальная верификация).
Мы — команда Web3-инженеров с опытом более 50 крипто-проектов (DeFi, NFT, DAO). Запускали решения для вузов, HR-платформ и EdTech-проектов. Используем доказанные стандарты и проводим формальную верификацию контрактов. Свяжитесь с нами, чтобы обсудить ваш проект. Закажите разработку системы academic credentials — оценим задачу за 1 день. Получите консультацию специалиста уже сегодня.







