Я думаю, что внешний вид интерфейса будет выглядеть следующим образом:
hashedData = web3.utils.sha3(JSON.stringify(certificate));
contracts.mycontract.deployed().then(function(result) {
return result.createCertificate(public_addresskey,hashedData,{ from: account }); //get logged in public key from metamask
}).then(function(result) {
//send post request to backend to create db entry
}).catch(function(err) {
console.error(err);
// show error to the user.
});
Контракт может выглядеть примерно так, как показано на рисунке ниже.
Существует структура, которая содержит все, кроме идентификатора. Отображение из hash => Cert для произвольного доступа (с использованием хэша в качестве идентификатора) и certList для перечисления сертификатов в случае, если хеш не известен. Этого не должно быть, потому что он генерирует события для каждого важного изменения состояния. Возможно, вы захотите защитить функцию newCert()
с помощью onlyOwner, whiteList или контроля доступа на основе ролей.
Чтобы «подтвердить» сертификат, получатель подтверждает его подписанием транзакции. Существование истины в этом поле показывает, что упомянутый пользователь действительно подписал, потому что другого пути для этого не существует.
pragma solidity 0.5.1;
contract Certificates {
struct Cert {
address recipient;
bool confirmed;
}
mapping(bytes32 => Cert) public certs;
bytes32[] public certList;
event LogNewCert(address sender, bytes32 cert, address recipient);
event LogConfirmed(address sender, bytes32 cert);
function isCert(bytes32 cert) public view returns(bool isIndeed) {
if(cert == 0) return false;
return certs[cert].recipient != address(0);
}
function createCert(bytes32 cert, address recipient) public {
require(recipient != address(0));
require(!isCert(cert));
Cert storage c = certs[cert];
c.recipient = recipient;
certList.push(cert);
emit LogNewCert(msg.sender, cert, recipient);
}
function confirmCert(bytes32 cert) public {
require(certs[cert].recipient == msg.sender);
require(certs[cert].confirmed == false);
certs[cert].confirmed = true;
emit LogConfirmed(msg.sender, cert);
}
function isUserCert(bytes32 cert, address user) public view returns(bool) {
if(!isCert(cert)) return false;
if(certs[cert].recipient != user) return false;
return certs[cert].confirmed;
}
}