솔리디티

솔라디티 3일차

diary owner 2023. 5. 24. 22:10

Log

  • 코인같은 걸 보낼때의 주소나 양 등 정보가 적혀있는 걸 담아있는 곳

Event

  • Log를 가져와 저장하여 사용가능하게 만들어줌
  • 출력할때는 emit을 통해 출력한다

Indexed

  • indexed는 event 객체 내에서 사용할 수 있는 키워드로 event를 검색 또는 필터링하는데 사용할 수 있게 만드는 키워드이다.

public, private, internal

  • public은 외부에서 갔다쓰거나 수정할때
  • private은 외부에서 갔다쓰거나 수정이 안됨
  • 외부에서 참조는 하고 수정이 안됨 internal

상속

  • contract 자식 is 부모 { }
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8;

contract Number {
    uint internal num = 4;

    function changeNumber(uint _num) public virtual{
        num = _num;
    }

    function getNum() public view returns(uint){
        return num;
    }
} 

contract Caller is Number{
    
    function changeNumber(uint _num) public override {
        num = _num -1;
    } 
}

인스턴스화

  • 인스턴스(instance)는 주로 하나의 컨트랙에서 다른 컨트랙을 접근할 때 쓴다.
  • 예로 A와 B 컨트랙이 있다고 가정하고 B에서 A의 함수나 변수들을 접근하여 사용하고 싶다면 A 인스턴스를 만들어 B컨트랙 안에서 사용하면된다
// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;

contract A{
    
    uint256 public a = 5;
    
    function change(uint256 _value) public {
        a = _value;
    } 

}

contract B{

}
  • 인스턴스 선언법
    • 컨트랙이름 인스턴스의 이름 = new 컨트랙이름()
// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;

contract A{
    
    uint256 public a = 5;
    
    function change(uint256 _value) public {
        a = _value;
    } 

}

contract B{
    
    A instance = new A();
    
    function get_A() public view returns(uint256) {
        return instance.a();
    }
    function change_A(uint256 _value) public  {
        instance.change(_value);
    }    

}

현재 스마트 컨트랙B에서 A의 인스턴스는 .을 붙여 접근함을 볼수 있다.
get_A 에서는 컨트랙 A의 변수를 접근해야하니 instance.a()를 써준걸 알 수가 있어요.
그리고 한가지더, **변수를 접근할때는 () 를 붙여 주셔야 리턴이 된답니다.**

다형성과 오버라이딩 차이

다형성(polymorphism)은 같은 프로그래밍 인자가 서로 다른 자료형을 갖는것.

즉 오버로딩 적용시 하나의 함수가 여러 개의 매개변수를 다룰수 있어 함수를 유연하게 사용할수 있다

1.다형성
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8;

contract Number {

    function Type(uint _num1, uint _num2) public pure returns (uint){
        return _num1 + _num2;
    }

    function Type(string memory _num1, string memory _num2) public pure returns (string memory, string memory){
        return (_num1, _num2);
    }
}

contract Caller{
    Number internal instance = new Number();
    function call_change(uint _num1, uint _num2) public view {
        instance.Type(_num1, _num2); 
        instance.Type(_num1, _num2);
    }
}

2. 오버라이드

// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;

contract Father{
    uint256 public fatherMoney = 100;
    function getFatherName() public pure returns(string memory){
        return "KimJung";
    }
    
    function getMoney() public view virtual returns(uint256){
        return fatherMoney;
    }
    
}

contract Mother{
    uint256 public motherMoney = 500;
    function getMotherName() 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;
    }
}

다중상속

  • 상속과 같이 is 뒤에 상속할 컨트랙트의 명들을 적어주면된다.
  • 선언방식 : 컨트랙명 is 부모명, 부모명{} 이다.
// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;

contract Father{
} //부모 컨트랙

contract Mother{
} //부모 컨트랙

contract Son is Father,Mother{
} //상속받은 자식 컨트랙

추상화 컨트랙트

  • abstract는 부모개념이며 상속해줄것을 미리 모아놓은거

인터페이스 컨트랙트

  • 추상화 개념이며 제약이많다

payable

  • payable은 말 그대로 지불이 가능한 함수를 선언할 수 있습니다. payable이 붙은 함수는 이더리움을 전송받을 수 있습니다. 원하는 이더리움의 value가 전송되었는지 require문을 통해 확인할 수 있습니다.

truffle 공부 해야겠지..