solidity 5

call vs delegatecall

Call - 다른 컨트랙트의 함수를 호출함 - 다른 함수를 호출하면서 컨텍스트가 호출한 함수가 있는 컨트랙트로 변경됨 Delegate Call - 다른 컨트랙트의 코드를 현재 컨트랙트 안에서 실행함(컨텍스트가 변하지 않음) - 따라서 스토리지가 변경되지 않음. B의 코드를 실행하지만, A의 스토리지를 사용함 - 컨트랙트 B의 값을 변경하는 함수를 실행하면 A의 값이 변경된다. - 따라서 delegate call을 할 때는 컨트랙트끼리 스토리지 변수 값이 순서가 꼭 맞아야 한다. Storage Layout - 컨트랙트에서 스토리지가 어떻게 저장되는지에 대한 구조 - 각각 컨트랙트의 변수들은 32바이트 단위(uint256)로 슬롯이 나뉘어서 저장됨 - delegate call을 할 때 슬롯의 순서가 일치하는..

receive, fallback 함수, CA가 ETH를 받지 못하게 하는 법

fallback 함수는 컨트랙트에 없는 함수를 호출하거나 컨트랙트에서 함수를 통해 이더를 보낼때, 콜백으로 실행되는 함수이다. receive 함수는 컨트랙트가 이더를 받을때 콜백으로 실행되는 함수이다. Receive - external과 payble 옵션이 필요 - 각 컨트랙트는 하나의 receive 함수만 선언 - 함수는 파라미터를 가질 수 없다 - virtual, overrid 가능 Fallback - external 옵션 필요 - 파라미터를 가지지 않는다. 예외로 bytes calldata 형태의 파라미터를 넣으면 컨트랙트에 보내진 모든 데이터(msa.data)를 반환하게 할 수 있다. - 위의 예외를 제외하곤 반환값이 없다. - payable 옵션 적용시, 이더를 받을 때에도 실행된다. CA가 E..

Re-entrancy attack

재진입 공격 - 이더를 전송하는 Send, Transfer 함수는 2300이라는 고정 가스비 소모 때문에 현재는 Call 함수를 권장하고 잇다. - 하지만 Call 함수는 재진입 문제가 있기때문에 컨트랙트 작성에 있어 시큐리티 코딩이 필요하다 Receive : 순수 이더만 받을때 작동하는 함수 Fallback : 함수를 실행하면서 이더를 보낼 때, 존재하지 않는 함수를 호출할 때 작동하는 함수 - 공격은 CA(공격자) 가 CA(컨트랙트) 에 가하는 것 - 공격자의CA의 Receive 함수를 통해 공격 - 따라서 입금과 출금 함수가 있는 컨트랙트에 대한 공격을 의미 - 공격자 CA는 한번 입급을 한 뒤, 출금함수를 실행하고 공격자 CA의 Receive 함수를 통해 재귀적으로 출금 함수를 계속 실행 prag..

솔리디티 기본 문법

1. 버전명시 - pragma 키워드를 이용해서 smart contract가 지원하는 solidity 버전을 명시한다. pragma solidity ^0.8.7; 2. 계약(contract) 일반적인 언어에서의 class와 같은 개념이다. 이더리움과 비트코인의 가장 큰 차이중 하나이다. 모든 코드의 실행은 contract 안에서 이루어진다. contract SimpleStorage { uint storedData; function set(uint x) public { storedData = x; } function get() public view returns (uint) { return storedData; } } - unit : 256비트의 양의정수 타입, unit 타입의 storedData 가 변수..