차밍이

[Solidity] 기본 문법 (1) - event, super, mapping 예시 본문

블록체인/Solidity

[Solidity] 기본 문법 (1) - event, super, mapping 예시

2022. 1. 24. 22:16
반응형

event

솔리디티는 print가 없음

대신 event를 사용해서 확인할 수 있음

contract testContract {
    event info(string name, uint256 money);

    function sendMoney() public {
        // 블록에 작성하면 언제든 꺼내서 확인할 수 있음
        emit info("BakChan", 10000); 
    }
}

indexced

특정 index의 event 만 가져오기 위해서는 index가 필요함

그럴 땐 indexed를 사용해 주어야 함

contract testContract{
    event numberTracker(uint256 num, string str);
    event numberTracker2(uint indexced num, string str);

    uint256 num=0;
    function PushEvent(string memory _str) public {
        emit numberTracker(num, _str);
        emit numberTracker2(nu,m, _str);
        num ++;
    }
}

super

super는 함수를 override 할 때 사용함

contract Father {
    event FatherName(string name);
    function who() public virtual {
        emit FatherName("ChanBak");
        emit FatherAge(16);
        ...
    }
}

contract Mother {
    event MotherName(string name);
    function who() public virtual {
        emit MotherName("EryKim")
    }
}

contract Son is Father, Mother {  
// 다중 상속의 경우 가장 마지막(최신에) 상속한 Mother Cotract 의 who를 상속함
    event sonName(string name);
    function who() public override {
        super.who();
        emit sonName("ColdBak")
    }
}

mapping

값을 연결해줌

contract testContract {
    mapping(uint256=>uint256) private ageList;
    // mapping(Key => Value) 접근제한자 맵핑의 이름

    function setAgeList(uint256 _index, uint256 _age) public {
        ageList[_index] = _age;
    }

    function getAge(uint _index) public view return (uint256) {
        return ageList[_index];
    }
}

Array

array는 순환을 할 수 있음

array 순환은 디도스 공격에 취약할 수 있으므로 mapping을 더 선호한다고 함

array는 50자로 제한이 있음

contract testContract {
    uint256[] public ageArray;
    uint256[10] public ageFixedSizeArray; // Array 크기가 정해짐
    string[] pulibc nameArray = ['kal' ,'bob', 'jay'];
    function AgeLength() public view return(uint256) {
        return ageArray.length;
    }

    // index 값이 하나 씩 증가하면서 값이 추가되는 형태
    function AgePush(uint _age) public {
        ageArray.push(_age);
    }

    function AgeGet(uint256 _index) public view return(uint256) {
        return ageArray[_index];
    }

    function AgePop() public {
        ageArray.pop();
    }

    function AgeDelte(uint256 _index) public {
        delete ageArray[_index];
    }

    function AgeChange(uint256 _index, uint256 _age) public {
        ageArray[_index] = _age;
    }


}

struct

contract testContract {
    struct Character {
        uint256 age;
        string name;
        string job;
    }
    // mapping 혹은 array를 사용해서 넣을 수 있음
    mapping(uint256=>Character) public CharacterMapping;
    Character[] public CharacterArray;

    function createCharacter(uint256 _age, string memory _name, string memory _job) pure public return (Character memory) {
        return Character(_age, _name, _job);
    }

        mapping(uint256=>Character) public CharacterMapping;
    Character[] public CharacterArray;

    function createCharacter(uint256 _age,string memory _name,string memory _job) pure public returns(Character memory) {
        return Character(_age,_name,_job);
    }

    function createChracterMapping(uint256 _key, uint256 _age,string memory _name,string memory _job )  public {
       CharacterMapping[_key] = Character(_age,_name,_job);
    }

    function getChracterMapping(uint256 _key)  public view returns(Character memory){
       return CharacterMapping[_key];
    }

    function createChracterArray(uint256 _age,string memory _name,string memory _job ) public {
       CharacterArray.push(Character(_age,_name,_job));
    }

    function getChracterArray(uint256 _index)  public view returns(Character memory){
       return CharacterArray[_index];
    }
}

if else

여타 언어와 동일

if () {
    ...
}
else if () {
    ...
}

else {
    ...
}

for

contract testContract {
    event CountryIndexName(uint256 indexed _index, string _name);
    string[] private countryList = ["Korea", "Japan", "US", "China"];

    function forLoopEvents() public {
        for(uint256 i=0; i<countryList.length; i++) {
            emit CountryIndexName(i, countryList[i]);
        }
    }
}

while

contract testContract {
    event CountryIndexName(uint256 indexed _index, string _name);
    string[] private countryList = ["Korea", "Japan", "US", "China"];

    function whileLoopEvents() public {
        uint256 i = 0;
        while(i<countryList.length) {
            emit CountryIndexName(i, countryList[i]);
            i++;
        }
    }
}

do while

첫 번째는 먼저 do it!

그리고 그다음부터 while 조건을 보면서 반복을 돎

contract testContract {
    event CountryIndexName(uint256 indexed _index, string _name);
    string[] private countryList = ["Korea", "Japan", "US", "China"];

    function whileLoopEvents() public {
        uint256 i = 0;
        do {
            emit CountryIndexName(i, countryList[i]);
            i++;
        }
        while(i<countryList.length);
    }
}

continue, break

파이썬과 유사

linear search

solidity 내에서 string 값을 파이썬처럼 비교할 수 없음(e.g. "aaa" == "aaa")

해쉬화해서 비교해줘야 함

contract lec24{

    event CountryIndexName(uint256 indexed _index, string _name);
    string[] private countryList = ["South Korea","North Korea","USA","China","Japan"]; 

    function linearSearch(string memory _search) public view returns(uint256,string memory){

        for(uint256 i=0; i<countryList.length; i++){
            /// solidity 내에서 string 비교 불가
            /// 해쉬화를 해줘야함
            if(keccak256(bytes(countryList[i])) == keccak256(bytes(_search))){
                return (i,countryList[i]);
            }
        }

        return(0,"Nothing");

    } 

}

 

Reference

인프런 강의 보면서 공부한 내용을 정리함

https://www.inflearn.com/course/%EC%86%94%EB%A6%AC%EB%94%94%ED%8B%B0-%EC%8A%A4%EB%A7%88%ED%8A%B8-%EC%BB%A8%ED%8A%B8%EB%9E%99/dashboard

 

반응형

관련된 글 보기

Comments