BlockChain

Solidity #1

부산대보금자리 2022. 1. 4. 17:15

# 정의

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 가진다.

  1. 상태 변수

Contract 최상위단에 선언된 변수(스토리지에 저장)

Ex>

Pragma solidity >=0.4.0 <0.6.0;

 

Contract SimpleStorage{
    uint storedData; // State variable

    // …

}

 

2. 로컬 변수

함수 아래에 선언된 변수(스토리지에 저장/ memory 키워드로 메모리 저장 가능)

기본적으로 스토리지 저장, 문자열 같은 경우 기본데이터 타입이 아닌 reference이므로 메모리 키워드 붙여서 저장해준다.

 

# Type( un.. )

  1. Booleans
  2. Int
  3. Address : 20byte 담을 있다.

대소, 비교 연산자 사용 가능

  1. Balance : address잔고 조회
  2. Transfer : 다른 address에 Ether 보낼수 있다.(wei단)
  3. Send : low-level수준에서 transfer 대응
  4. 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. 문자열

문자열 길이는 항상 동적으로 할당된다.

  1. Bytes : raw string
  2. 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

  1. External : external 정의된 자기 자신 컨트랙 내에서 접근불가
  2. Public  : 모든 곳에서 접근 가능
  3. Internal :
  4. 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