본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Solidity
이더리움의 스마트 계약을 작성하는 정적 타입 프로그래밍 언어
  • 자바스크립트와 C++ 의 문법을 닮았다. 파일 확장자는 `.sol` 이다.
  • 작성한 소스는 컴파일되어 이더리움 가상머신(EVM) 바이트코드가 되고, 그 바이트코드가
 블록체인에 배포된다.
  • 배포된 계약은 원칙적으로 고칠 수 없다. 그래서 배포 전 검증과 감사가 중요하고,
 고쳐야 할 여지를 두려면 프록시 패턴 같은 구조를 미리 넣어야 한다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Counter {
    uint256 public count;          // 상태 변수. 블록체인에 저장된다
    function increment() public {  // 상태를 바꾸므로 가스가 든다
        count += 1;
    }
    function get() public view returns (uint256) {  // 읽기만 하므로 가스가 들지 않는다
        return count;
    }
}
  • `pragma` 로 컴파일러 버전을 고정한다.
  • `contract` 가 클래스에 해당한다. 상속을 지원한다.
  • 상태 변수는 블록체인에 남고, 지역 변수는 실행 중에만 있다.
  • `view`·`pure` 로 표시한 함수는 상태를 바꾸지 않아 호출에 가스가 들지 않는다.
  • `uint256`, `int256` — 정수. 256비트가 EVM 의 기본 워드 크기다
  • `address` — 계정 주소
  • `mapping(키 => 값)` — 해시 테이블. 순회할 수 없다
  • `struct`, `enum`, 배열

알려진 취약점

편집 원본 편집
  • 재진입(Reentrancy) — 외부 계약을 호출하는 동안 다시 호출당해 잔액이 여러 번 빠져나간다.
 The DAO 해킹 사건의 원인이다. 상태를 먼저 바꾸고 나중에 송금하는 순서로 막는다
  • 정수 오버플로 — 0.8.0 부터 기본으로 검사한다
  • 접근 제어 누락 — 권한 검사 없이 중요한 함수를 공개하는 실수