Block-Chain/Solidity
상속 & 이벤트
WebDevLee
2023. 1. 5. 13:26
Solidity의 상속과 이벤트에 대해 정리하였습니다.
< 상속의 정의 >
A컨트랙의 변수 및 함수를 B컨트랙이 접근 및 사용하기 위해 상속이 사용됩니다.
- is 키워드를 이용해 상속
contract 컨트랙트1 is 컨트랙트2 {
}
Ex) contract son_contract_name is father_contract_name {} 양식를 이용해 상속
contract Father {
string public familyName = "Kim";
string public givenName = "Jung";
uint256 public money = 100;
constructor(string memory _givenName) {
givenName = _givenName;
}
function getFamilyName() view public returns(string memory) {
return familyName;
}
function getGivenName() view public returns(string memory) {
return givenName;
}
function getMoney() view public returns(uint256) {
return money;
}
}
contract Son is Father("James") {
}
// 해당 방법도 가능
contract Son is Father {
constructor() Father("James") {
}
}
< Overriding >
Overriding이란 변수나 함수를 상속받을 때 해당 값을 덮어씌워 자식만의 특별한 값으로 만드는 것으로 말합니다.
- 덮어씌울 변수(함수) : 부모 컨트랙트에 vitrual, 자식 컨트랙트에 override 키워드를 작성하여야 함.
Ex)
contract Father {
uint256 money = 100;
function getMoney() view public virtual returns(uint256) {
return money;
}
}
contract Son is Father {
uint256 public earning = 0;
function work() public {
earning += 100;
}
function getMoney() view public override returns(uint256) {
return money + earning;
}
}
< 두 개 이상 상속하기 >
Ex)
contract Father {
uint256 public fatherMoney = 100;
function getFatherName() public pure virtual returns(string memory) {
return "KimJung";
}
function getMoney() public view returns(uint256) {
return fatherMoney;
}
}
contract Mother {
uint256 public motherMoney = 100;
function getFatherName() public pure returns(string memory) {
return "Leesol";
}
function getMoney() public view virtual returns(uint256) {
return motherMoney;
}
}
contract Son is Father, Mother {
function getMoney() public view override(Father, Mother) returns(uint256) {
return fatherMoney + motherMoney;
}
}
< event 정의 >
event라는 것은 블록체인 네트워크의 블록에 특정값을 기록하는 것을 말합니다.
이벤트 예시 : 송금하기라는 함수가 있다고 가정했을 때, 송금하기 버튼을 누르면 누른 사람의 계좌와 금액이 이벤트로 출력되어 블록체인 네트워크 안에 기록이 됨.
- event 정의 방법
event 이벤트이름(타입 이름);
- event 호출 방법
emit 이벤트이름(타입 이름);
Ex)
contract Bank {
event info(string name, uint256 money);
function sendMoney() public {
emit info("KimDaeJin", 1000);
}
}
< event 정의 >
블록들에 출력된(기록된) 이벤트들중 필터링하여 원하는 이벤트만 가지고 오기 위해 indexed를 사용합니다.
- event 정의 시 indexed 키워드 사용
event 이벤트이름(타입 indexed 이름);
Ex)
contract Lec14 {
event numberTracker(uint256 num, string str);
event numberTracker2(uint256 indexed num, string str);
uint256 num =0;
function PushEvent(string memory _str) public {
emit numberTracker(num,_str);
emit numberTracker2(num,_str);
num ++;
}
}
< super >
부모 컨트랙트의 이벤트를 그대로 가져오기 위해 super 키워드를 사용합니다.
Ex) super의 미사용/사용 : super.who()는 부모 컨트랙트의 who() 함수 내용을 가져옴.
contract Father {
event FatherName(string name);
function who() public virtual{
emit FatherName("KimDaeho");
}
}
contract Son is Father{
event sonName(string name);
function who() public override{
emit FatherName("KimDaeho");
emit sonName("KimJin");
}
}
contract Father {
event FatherName(string name);
function who() public virtual{
emit FatherName("KimDaeho");
}
}
contract Son is Father{
event sonName(string name);
function who() public override{
super.who();
emit sonName("KimJin");
}
}
< 상속의 순서 >
같은 함수(변수)를 상속받을 때, 최근에 상속받은 컨트랙트의 함수(변수)를 상속받습니다.
Ex) super.who() 는 엄마의 who() 함수내용을 상속받습니다.
contract Father {
event FatherName(string name);
function who() public virtual {
emit FatherName("James")
}
}
contract Mother {
event MotherName(string name);
function who() public virtual {
emit MotherName("Leesol")
}
}
contract Son is Father, Mother {
functin who() public override(Father, Mother) {
super.who();
}
}