Solidity Language란?
: EVM에 byte코드로 생성된다. 따라서 bytecode만 해석하면 되고, javascript, C++, JAVA 등과 비슷하다.
Solidity version 표현
(ex1) pragma solidity>= 0.4.16 <0.9.0 // 0.4.16 버전 이상, 0.9.0 버전 이하를 통해서 실행이 됨.
(ex2) pragma solidity ^0.6.0 // 최소 0.6.0 이상의 solidity로 컴파일돼야 해. (0.7.0은 안됨)
==데이터 관련==
Data type
- boolean : 참, 거짓
- integer : 정수형, 종류는 int8~int256, uint8~uint256가 있으며, 일반 int를 사용했을 경우는 int256으로 설정됨.
- fixed point : fixed, ufixed, 예로 fixed32x2 자료형을 들면, 전체가 32비트인 실수 동시에 소수점 2자리까지 표현하는 것.
- address : 20바이트의 ethereum address
- byte array(fixed) : 1-32까지 고정된 사이즈로 만들 수 있음.
- byte array(dynamic) : bytes, string
- Enum : 열거형
- Arrays : 배열
- Struct : 구조체
- Mapping : key와 value로 구성됨.
- Time units : seconds, minutes, hours, days, weeks (10minutes >> 600 sec
- Ether unis : wei, Szabo, ether
이미 선언된 변수명(global variable)
1) msg object 종류 : msg.sender(address) / msg.value(ether 값) / msg.data(data payload) / msg.sig(어떤 function을 갖고 있는지)
2) tx object 종류 : tx.gasprice(gas price) / tx.origin(transaction을 만든 address)
3) block object 종류 : block.coinbase(miner address) / block.difficulty(난이도) / block.gaslimit(maximum account)
4) address object 종류 : address.balance / address.transfer
이미 선언된 함수(global function)
1) addmod, mulmod
2) keccak256, sha256, ripemd160
3) ecrecover // 서명한 주체의 address를 얻고 싶어.
4) this // 현재 동작하고 있는 contract의 address
5) selfdestruct / 현재 동작하고 있는 contract의 address를 지우고 싶어.
** contract은 클래스와 비슷하다고 생각하면 된다.
** interface도 실제 코드가 아닌 명세가 들어간 것임.
** library : delegated call을 통해 library에 있는 걸 부를 수 있음.
==함수 관련==
Function Keyword
// 자바의 public private라고 생각하면 편할 듯?
- public : default, 다른 EOA나 외부에서도 누구나 쓸 수 있게 하겠어.
- external : 외부의 EOA는 이 funciont을 쓸 수 있지만, 내부에서는 X
- internal : 내부에서만 쓸 수 있고, 외부에서는 쓸 수 X / 파생된 contract들도 사용할 수 있음.
- private : 오직 자기 자신만 쓸 수 있음. "호출만 안 되는 것임. 코드를 볼 수는 있음"
- view : 보기만 가능
- pure : 고치는 것뿐만 아니라 상태 정보에 access 못함.
- payable : ether의 전송도 처리해줄 수 있음.
receive function
: 하나의 account에 하나의 receive만 가능함.
형식) receive() external payble{ ... }
// 설명 : 외부에서 이 contract에게 receive를 받아서 처리하는 것.
fallback function
: 매칭이 되는 함수가 없을 때 fallback에 있는 함수들을 사용함.
형식) receive() external payable { ... }
// 설명 ; 데이터와 receive function이 없을 때 fallback함수로 처리됨.
contract function
: 초기 state를 설정해준다. 필수는 아니고 option이다.
형식) contract MEContract{
constructor(){
// constructor 코드
}
}
// 설명 : contract을 만들었을 때 처음 실행되는 친구. (명시적으로 위의 형태로 만든다.)
((selfdestruct function))
: ether를 받을 대상의 address를 적어주고 지워줌.
형식) selfdestruct(address recipient);
// (심화) contract을 만들더라도 이게 생성자라는 개념보다는 각각 독립적으로 소유자라는 개념만 가지고 있다. 따라서 소유자는 특별한 권한도 가질 수 없기 때문에 코드 상에서 다음과 같은 과정을 처리해줄 수 있다.
contract Faucet{
address payable owner;
// Contract constructor : set owner
constructor() public{ // 배포되는 시점에서 sender(= 소유자, owner)를 설정함.
owner = msg.sender;
}
// Contract destructor
function destroy() public{
require(msg.sender == owner); // if문과 동일하게 생각하면 됨.
selfdestruct(owner); // 만약 동일하다면 소유자(owner)를 contract에 입력함.
}
}
((require function))
: condition을 만들어서 여러 function들에게 적용시킴.
형식) modifier onlyOnwer{
require(msg.sender == owner);
_; // modify 되는 코드들이 들어감.
}
** 그 외 smart contract 상속 등도 존재하는데 추후에 업로드 예정.
'학교 공부 > 블록체인' 카테고리의 다른 글
[Ethereum] Smart Contract 보안 취약점 (2) | 2021.06.11 |
---|---|
[Ethereum] solidity언어 문법 (0) | 2021.06.11 |
[Ethereum] Smart Contract이란? (0) | 2021.06.03 |
[Ethereum] Transaction이란? (0) | 2021.06.03 |
[Ethereum] 이더리움에서 사용하는 암호학 (0) | 2021.06.03 |
댓글