// 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(차익거래)
// 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;
}
} // 이 메세지를 누가 호출했는가를 보여주는 코드