[TIL] 2023-05-24

Melon Coder·2023년 5월 25일
1

TIL

목록 보기
40/50
post-thumbnail

Today I Learned


[Solidity]

오늘은 다른 컨트랙트에 접근하여 해당 컨트랙트의 상태변수를 변경시키는 방법과 주소 타입의 멤버변수(.balance, .send, .transfer, .code, .codehash)에 대해 알아보았고 작성한 컨트랙트를 테스트넷(Goerli)에 배포해서 확인하는 작업까지 하였다.


다른 컨트랙트에 접근하기

contract a {
    uint public num;

    function changeNum(uint _num) public {
        num = _num;
    }
}

contract b {
    a A;

    constructor (address _address) {
        A = a(_address);
    }

    function changeNum(uint _num) public {
        A.changeNum(_num);
    } 
}

이런식으로 b 컨트랙트에서 a 컨트랙트에 접근할 때 생성자를 통해 a의 ca를 넣어준다. 그 후 컨트랙트형 변수 A를 통해 함수에 접근할 수 있다.


members of address type

address.balance (uint256)

  • .balance는 해당 주소의 잔액을 wei로 불러온다.

address.code (bytes memory)

  • .code는 해당 주소의 바이트코드를 불러온다. (비어있을 수 있음.)

address.codehash (bytes32)

  • 해당 주소의 코드해시를 불러온다. keccak256

address payable.transfer(uint256 amount)

  • 해당 주소로 wei를 보내고 실패했을 시 에러처리를 해준다.

address payable.send(uint256 amount) returns (bool)

  • 해당 주소로 wei를 보내고 실패시에 false(bool)을 반환해준다.

send를 사용할 때 주의할 점으로 수신자의 가스비가 부족한 경우(실패), call stack depth가 1024인 경우(실패) 이기 때문에 transfer를 사용하는 것이 더욱 안전하다.


0개의 댓글