Solidity - Address, payable (feat. Eth, Bridge, wETH 관련사이트)

심재원·2023년 12월 28일
0
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;

contract ADDRESS {
    address a;

    function setAddress(address _a) public {
        a = _a;
    }

    function getAddress() public view returns(address) {
        return a;
    }
}

돈을 넣고 빼고를 가능하게 해주는 게 Payable!
Payable이 붙어야 돈을 주고 받을 수 있음.
그냥 지갑끼리 돈 보내는 건 가능하지만
payable 안 붙으면 스마트 컨트랙트로 보낼 수가 없음.

ex)

전역 변수 : 이더리움 체인 단위(이더의 밸런스는 전역변수)
지역 변수 : 함수 단위
상태 변수 : 컨트랙트 단위(특정 ERC-20의 잔고는 상태변수)
1. 내 지갑에서 돈이 나가는 경우
- 체인에서 왔다갔다
- function에 payable 붙을 때

2. 스마트컨트랙트에서 돈이 나가는 경우
- EVM 상에서 이뤄지지만 정보는 체인으로 내려줌
- send & transfer

function이 돈을 받는 건 컨트랙트가 돈을 받는 것

거래소

거래소 지갑주소 입출금 거래만 체인에 등록
거래소 내 거래는 유동성 기반으로 central DB에서 숫자만 왔다갔다 하는 것(체인과 무관, 사이트 닫아버리면 다 끝나는 것)

거래

비트코인

: UTXO 기반으로 locking-unlocking. 여기엔 스마트 컨트랙트가 존재하지 않음.

비트코인은 EVM이 없으니까 코어레벨에서 돈 보내는 것 밖에 안 됨

이더리움

: ACCOUNT 기반으로 메타마스크 지갑끼리 돈을 보내면 이더리움 코어레벨에서 이뤄지는 거고 체인에 기록됨. bitcoin이 이동하는 것과 원리가 같음. ERC-20은 전부 다 스마트컨트랙트. ERC-20은 토큰 -> 토큰 거래는 컨트랙트 function 이용(Solidity로 짜는 것)

이더리움은 EVM으로 복잡한 거래 기능 구현 가능
ex)
EVM Level - solidity
Core Level - PoS, tx, Block

이더리움 관련사이트
https://ethresear.ch/
https://ethereum.org/en/learn/
https://github.com/ethereum/research
https://vitalik.eth.limo/
https://blog.ethereum.org/


브릿지, wETH
: https://arxiv.org/ftp/arxiv/papers/2109/2109.06847.pdf
Arbitrage(차익거래)

Address Code

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.2 <0.9.0;

contract ADDRESS {
    address a;

    function setAddress(address _a) public {
        a = _a;
    }

    function getAddress() public view returns(address) {
        return a;
    }
}

contract ADDRESS_Payable {
    address a;
    address payable b;

    function setA() public {
        a = msg.sender;
    }

    function setB() public {
        b = payable(msg.sender);
    } // 쓰기 (돈이 듦, 아래 코드처럼 읽기는 돈이 안 듦)

    function deposit() public payable returns(uint) {
        return msg.value;
    } // 누른 사람이 돈을 받는 것

    function sendToB() public {
        b.transfer(0.1 ether);
    }

    function getAB() public view returns(address, address payable) {
        return(a, b);
    } // address 뒤에 payable 붙여도 되고 안 붙여도 되는데 return은 상태를 읽기만 하는 거라 payable 넣어도 안 넣어도 상관없는 것.
}

contract ADDRESS_This_Balance {
    address a;

    function deposit() public payable {}

    function setA() public {
        a = msg.sender;
    }

    function getBalance() public view returns(uint) {
        return a.balance; // a의 지갑 잔고
    }

    function getBalance2() public view returns(uint) {
        return address(this).balance; // address(this) = smart contract 잔고
    }

    function getAddress() public view returns(address) {
        return address(this); // smart contract 잔고를 자기가 체크할 수 없으니 address this를 통해 제어
    }
}

contract ADDRESS_CONSTRUCTOR {
    address payable owner;

    constructor() {
        owner = payable(msg.sender);
    } // 이렇게 owner 설정하면 이 이후로는 안 바뀜. 자주 쓰이는 문법

    function getOwner() public view returns(address) {
        return owner;
    }

    function deposit() public payable {}

    function withdraw_1() public {
        owner.transfer(1 ether);
    }

     function withdraw_all() public {
        owner.transfer(address(this).balance);
    }
    // 위 컨트랙트는 owner에게만 돈을 보낼 수 있음.
}

contract MSG {
    function getMSG() public view returns(address) {
        return msg.sender;
    }
} // 이 메세지를 누가 호출했는가를 보여주는 코드

0개의 댓글