# 정의
1) 계약 지향 프로그래밍 언어로 다양한 블록체인 플랫폼의 스마트계약 작성 및 구현에 사용된다.
2) 정적타입의 프로그래밍 언어로 EVM상에서 작동하는 스마트계약을 개발하기 위해 설계되었다.
# Intro
* Solidity License
// SPDX-License-Identifier: GPL-3.0
* pragma
1) 버전
특정 컴파일러 기능이나 검사를 가능하게 할 수 있다.
Pragma지시문은 항상 소스 파일에 대해 로컬이므로 모든 프로젝트에서 활성화하려면 모든 파일에 pragma를 추가해야 함
호환되지 않는 변경 사항을 거부하기 위한 의미로서 pragma를 추가할 수도 있다.
Ex> pragma solidity ^0.4.0;
Pragma solidity >=0.7.0 <0.9.0;
2) Experimental pragma
- ABIEncoder
- SMTChecker
* Compiler
Compiler를 invoking할 때 path지정 필요, 가상 directory로 부터 import 가능하다.
Ex>
gihub -> local
Import "github.com/ethereum/dapp-bin/library/iterable_mapping.sol" as it_mapping
- Run the compiler
Solc github.com/ethereum/dapp-bin/=/usr/local/dapp-bin/ source.sol
* Comment
1) // Single line Comment
2) /*
Multi-line comment.
*/
3) /**
* @param w width of the rectangle
* @return s the calculated surface
*/
함수 선언 또는 명령문 바로 위에서 사용하며 형식 확인에 대한 주석
# Variable
Context에 따라 메모리 또는 파일시스템에 저장된다.
그러나 문자열, 배열, 구조체와 같은 복합 유형의 경우 이더 스토리지 또는 메모리에 추가해 재정의 할 수 있다.
- 함수 매개 변수(리턴 매개변수 포함)의 기본 위치는 메모리
- 로컬 변수의 기본 위치는 스토리지
- 상태 변수의 경우 강제로 스토리지에 저장된다.
! 스토리지 : 대부분의 변수, 함수들이 저장되며, 영속적으로 저장되기 때문에 가스 비용이 비싸다.
! 메모리 : 함수의 파라미터, 리턴값, 레퍼런스 타입이 주로 저장이 된다.
영속적이지 않고 함수내에서만 유효하기에 storage보다 가스 비용이 싸다.
! Calldata : 주로 external function의 parameter에서 사용
! Stack : EVM에서 stack data를 관리할때 쓰는 영역, 1024mb로 제한적
정적 유형의 언어, 함수 단위의 Context를 가진다.
- 상태 변수
Contract 최상위단에 선언된 변수(스토리지에 저장)
Ex>
Pragma solidity >=0.4.0 <0.6.0;
Contract SimpleStorage{
uint storedData; // State variable
// …
}
2. 로컬 변수
함수 아래에 선언된 변수(스토리지에 저장/ memory 키워드로 메모리 저장 가능)
기본적으로 스토리지 저장, 문자열 같은 경우 기본데이터 타입이 아닌 reference이므로 메모리 키워드 붙여서 저장해준다.
# Type( un.. )
- Booleans
- Int
- Address : 20byte를 담을 수 있다.
대소, 비교 연산자 사용 가능
- Balance : address잔고 조회
- Transfer : 다른 address에 Ether를 보낼수 있다.(wei단위)
- Send : low-level수준에서 transfer에 대응
- Call, callcode, delegatecall :
Ex> address x = 0x123;
Address myaddress = this;
If (x.balancd < 10 && myaddress.balance>=10) x.transfer(10)
4. 배열
일반 및 바이트 배열을 모두 지원하며, 정적 배열, 동적 배열, 다차원 배열을 지원한다.
기본적으로 배열 리터럴이 명시되어 있으면 스토리지에 저장되고, 함수 내부에서 발견되면 메모리에 저장된다.
Contract sample{
int[] myArray =[0,0];
function sample(uint index, int value){
myArray[index] = value;
int[] myArray2 = myArray;
Uint24[3] memory myArray3= [1,2,99999];
Uint8[2] myArray4 = [1,2]; // error
}
5. 문자열
문자열 길이는 항상 동적으로 할당된다.
- Bytes : raw string
- String : utf-8 문자열
Contract sample{
//Storage
String myString = "";
//memory
Bytes myrawstring;
function sample(string initstring, bytes rawstringinit){
//storage
Mystring = initstring
//pointer save
String mystring2 = mystring
//memory
String memory mystring3= "abcde";
//len, content change
Mystring3 = "xyz";
// memory = memory (o)
myrawstring = rawstringinit
Myrawstring.length++;
// storage = memory (x)
String mystring4 = "example";
String mystring5 = initstring;
}
}
6. 구조체
함수 외부에서 구조체 메소드 명시 : 스토리지 저장
함수 내부에서 구조체 메소드 명시 : 메모리 저장
Contract sample{
struct myStruct {
Bool myBool;
String mystring;
}
// memory
myStruct s1;
// storage
myStruct s2 = myStruct(true, "");
function sample(bool initBool, string initString){
//memory
s1 = myStruct(initBool, initString);
Mystuct memory s3 = myStruct(initbool, initString);
}
}
7. 열거형
8. 매핑
스토리지에만 사용할 수 있기 때문에 오직 상태 변수로만 선언된다.
Key-value 쌍으로 이루어진 해시 테이블, key는 실제로 저장 되지 않고 키의 해시 값이 검색에 사용된다.
Contract sample{
Mapping(int=> string) myMap;
Function sample(int key, string value){
mapping(int=> string) myMap;
function sample(int key, string value){
myMap[key] = value;
// reference
mapping(int=> string) myMap2 = myMap;
}
}
- Delete
기본값으로 재 설정하기 위해 사용
Contract sample{
struct Struct{
mapping(int => string) myMap;
int myNumber;
}
Int[] myArray;
Struct mystruct;
//Constructor
Function sample(int key, int value, int number, int[] array){
mystrcut = Struct(number);
mystruct.myMap[key] = value;
myArray = array
}
Function reset(){
Delete myarray;
// mynumber는 0이나 mymap은 그대로
Delete mystruct;
}
Function deletekey(int key){
Delete mystruct.mymap[key];
}
}
# Visibility
- External : external이 정의된 자기 자신 컨트랙 내에서 접근불가
- Public : 모든 곳에서 접근 가능
- Internal :
- Private : internal과 비슷하지만 상속된 컨트랙트에서 접근할 수 없다.
Contract sample1 {
Int public b = 78;
Int internal c = 90;
Function sample1(){
//external
This.a();
// compile error
a();
// internal
B = 21;
//external
This.b;
//external
This.b()
//compile error
this.b(8)
//compile error
This.c();
//internal access
C = 9;
}
Function a() external {}
}
Contract sample2 {
Int interanl d = 9;
Int private e = 90;
}
# Function
- Constructor
Contract A{
String public name;
Uint256 public age;
Constructor(string _name, uint256 _age){
Name=_name;
Age=_age;
}
1) Parameter 와 return값이 없는 경우
Function test() public{
//
}
2) Parameter는 있고 return 값이 없는 경우
Function test(uint256 value) public{
//
}
3) Parameter있고 return 값도 있는 경우
Function test(uint256 value) public returns(uint256){
//
}
4) Parameter는 없고 return 값이 있는 경우
Function test() public returns(uint256){
//
}
여러개 return 가능, returns(string memory, uint256)
5) View
Function 밖의 변수들을 읽을수 있으나 변경 불가능하다.
Uint256 public a = 1;
Function read_a() public view returns(uint256){
Return a+2;
}
6) Pure
Function 밖의 변수들을 읽지 못하고, 변경도 불가능하다.
둘다 명시 안할시 밖의 변수들을 읽어서 변경도 하는 경우이다.
'BlockChain' 카테고리의 다른 글
Solidity 취약점 카테고리화 (0) | 2022.01.11 |
---|---|
Solidity #5 (0) | 2022.01.10 |
Solidity #4 (0) | 2022.01.07 |
Solidity #3 (0) | 2022.01.06 |
Solidity #2 (0) | 2022.01.05 |