오늘은 다른 컨트랙트에 접근하여 해당 컨트랙트의 상태변수를 변경시키는 방법과 주소 타입의 멤버변수(.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를 통해 함수에 접근할 수 있다.
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를 사용하는 것이 더욱 안전하다.