// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.10;
contract CredentialBox {
address private issuerAddress;
uint256 private idCount;
mapping(uint8 => string) private alumniEnum;
struct Credential{
uint256 id;
address issuer;
uint8 alumniType;
string value;
}
mapping(address => Credential) private credentials;
constructor() {
issuerAddress = msg.sender;
idCount = 1;
alumniEnum[0] = "SEB";
alumniEnum[1] = "BEB";
alumniEnum[2] = "AIB";
}
function claimCredential(address _alumniAddress, uint8 _alumniType, string calldata _value) public returns(bool){
require(issuerAddress == msg.sender, "Not Issuer");
Credential storage credential = credentials[_alumniAddress];
require(credential.id == 0);
credential.id = idCount;
credential.issuer = msg.sender;
credential.alumniType = _alumniType;
credential.value = _value;
idCount += 1;
return true;
}
function getCredential(address _alumniAddress) public view returns (Credential memory){
return credentials[_alumniAddress];
}
}
위 코드에서 require(credential.id == 0); 부분이 잘 이해되지 않았다. credential.id 가 선언만 되었지 초기값 설정은 되지 않아서 undefined이기 때문에 require를 통해서 0인지 확인하는 것은 true가 나올 수 없지 않을까 싶었는데
솔리디티에서는 기본적으로 선언이 되면 초기값이 0으로 자동 설정된다는 점을 알게 되었다.
아래 링크를 통해 좀 더 디테일하게 공부해도록 하자!!
What are the initial/zero values for different data types in Solidity?

// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.10;
abstract contract OwnerHelper {
address private owner;
event OwnerTransferPropose(address indexed _from, address indexed _to);
modifier onlyOwner {
require(msg.sender == owner);
_;
}
constructor() {
owner = msg.sender;
}
function transferOwnership(address _to) onlyOwner public {
require(_to != owner);
require(_to != address(0x0));
emit OwnerTransferPropose(owner, _to);
owner = _to;
}
}
abstract contract IssuerHelper is OwnerHelper {
mapping(address => bool) public issuers;
event AddIssuer(address indexed _issuer);
event DelIssuer(address indexed _issuer);
modifier onlyIssuer {
require(isIssuer(msg.sender) == true);
_;
}
constructor() {
issuers[msg.sender] = true;
}
function isIssuer(address _addr) public view returns (bool) {
return issuers[_addr];
}
function addIssuer(address _addr) onlyOwner public returns (bool) {
require(issuers[_addr] == false);
issuers[_addr] = true;
emit AddIssuer(_addr);
return true;
}
function delIssuer(address _addr) onlyOwner public returns (bool) {
require(issuers[_addr] == true);
issuers[_addr] = false;
emit DelIssuer(_addr);
return true;
}
}
contract CredentialBox is IssuerHelper {
uint256 private idCount;
mapping(uint8 => string) private alumniEnum;
mapping(uint8 => string) private statusEnum;
struct Credential{
uint256 id;
address issuer;
uint8 alumniType;
uint8 statusType;
string value;
uint256 createDate;
}
mapping(address => Credential) private credentials;
constructor() {
idCount = 1;
alumniEnum[0] = "SEB";
alumniEnum[1] = "BEB";
alumniEnum[2] = "AIB";
}
function claimCredential(address _alumniAddress, uint8 _alumniType, string calldata _value) onlyIssuer public returns(bool){
Credential storage credential = credentials[_alumniAddress];
require(credential.id == 0);
credential.id = idCount;
credential.issuer = msg.sender;
credential.alumniType = _alumniType;
credential.statusType = 0;
credential.value = _value;
credential.createDate = block.timestamp;
idCount += 1;
return true;
}
function getCredential(address _alumniAddress) public view returns (Credential memory){
return credentials[_alumniAddress];
}
function addAlumniType(uint8 _type, string calldata _value) onlyIssuer public returns (bool) {
require(bytes(alumniEnum[_type]).length == 0);
alumniEnum[_type] = _value;
return true;
}
function getAlumniType(uint8 _type) public view returns (string memory) {
return alumniEnum[_type];
}
function addStatusType(uint8 _type, string calldata _value) onlyIssuer public returns (bool){
require(bytes(statusEnum[_type]).length == 0);
statusEnum[_type] = _value;
return true;
}
function getStatusType(uint8 _type) public view returns (string memory) {
return statusEnum[_type];
}
function changeStatus(address _alumni, uint8 _type) onlyIssuer public returns (bool) {
require(credentials[_alumni].id != 0);
require(bytes(statusEnum[_type]).length != 0);
credentials[_alumni].statusType = _type;
return true;
}
}

bytes(sth).length == 0
keccak256(a) == keccak256(b)