블록체인 학습
0 XP

address.balance

이더리움의 모든 주소(address)에는 자신이 보유한 Ether 잔액이 있습니다. 이 값은 주소의 .balance 속성으로 읽을 수 있으며, 단위는 Wei, 타입은 uint256 입니다. 사람의 지갑 주소든 컨트랙트 주소든 똑같이 적용됩니다. .balance 는 "이 주소가 지금 이 순간 들고 있는 돈이 얼마인가"를 알려 주는 읽기 전용 속성입니다.

내 잔액과 남의 잔액 읽기

컨트랙트가 자기 자신의 잔액을 알고 싶을 때는 address(this) 로 자신의 주소를 얻은 뒤 .balance 를 붙입니다. 임의의 다른 주소의 잔액도 같은 방식으로 읽을 수 있습니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract BalanceReader {
    // 이 컨트랙트 자신의 잔액을 반환합니다.
    function getMyBalance() public view returns (uint256) {
        return address(this).balance;
    }
 
    // 임의의 주소의 잔액을 반환합니다.
    function getBalanceOf(address account) public view returns (uint256) {
        return account.balance;
    }
}

address(this) 는 현재 실행 중인 컨트랙트 자신의 주소입니다. 따라서 address(this).balance 는 그 컨트랙트가 보유한 총 Ether 잔액입니다.

자동으로 갱신되는 잔액

컨트랙트의 .balance 는 자동으로 관리됩니다. payable 함수로 Ether 가 들어오면 잔액이 늘고, transfer 나 call 로 Ether 를 내보내면 줄어듭니다. 컨트랙트가 실제로 보유한 총액은 .balance 하나만 읽으면 됩니다.

다만 .balance 는 "누가 얼마를 넣었는지"까지 알려 주지 않습니다. 사용자별 입금액을 기억하려면 mapping(address => uint256) 같은 자료구조를 직접 관리해야 합니다. 또 selfdestruct 등으로 강제 입금이 들어올 수 있으므로, 직접 관리하는 장부의 합계와 .balance 가 항상 같다고 가정해서는 안 됩니다.

Code Editor
에디터를 불러오는 중...
실행 결과

Run 버튼을 눌러 코드를 실행하세요.