본문 바로가기
  • 인공지능
  • 블록체인
  • 정보보안
신기술분석/블록체인

블록체인 Dapp 만들기 #3

by nathan03 2021. 7. 14.
반응형

# 솔리디티 언어 이해 

1. 컨트랙 구조

  • 객체지향 언어들의 클래스와 비슷
  • 문법은 자바스크립트와 비슷
  • 타입 구분 가능 및 상속 같은 객체지향 개념 지님(컨트랙트끼리 상속 가능)
  • line 1 : solidty compiler version
  • line 2 : contract name
  • line 3 : 상태변수, 클래스의 멤버변수라고 생각하면 된다
  • line 4 : 생성자
  • line 5 : 함수 구조 (함수 이름, 매개 변수, 함수 타입, 값 리턴 타입 정의)
Pragma solidity ^0.4.23;    // 솔리디티 컴파일 버전

contract MyContract {
    uint count;  // 상태 변수

    constructor() public {  // 생성자 
        //....
    }

    function numOfStudents(address_teacher) | public view | return (uint) {  // 함수
        
    }
}
contract YourContract {
    MyContract myContract;

    function callTest() public {
        myContract.test();
    }
}

2. 접근 제어자

  • external : 외부 컨트랙트만 호출 가능, 상태 변수는 external 사용 불가
Pragma solidity ^0.4.23;

contract MyContract {
    uint external count;

    constructor() public {
        //....
    }

    function numOfStudents(address_teacher) | public view | return (uint) {
        test()
        
    }

    function test() external {
        //....
    }
}

contract YourContract {
	Mycontract mycontract;
	function callTest() public {
        test();
    }
}
  • internal : 컨트랙트 내부 호출 가능, 상속받은 컨트랙트도 호출 가능, 상태변수는 디폴트로 internal이 선언됨
Pragma solidity ^0.4.23;

contract MyContract {
    uint count;

    constructor() public {
        //....
    }

    function numOfStudents(address_teacher) | public view | return (uint) {
        test()
        
    }

    function test() internal {
        //....
    }
}

contract YourContract is Mycontract {
	function callTest() public {
        test();
    }
}
  • public : 컨트랙 내부 호출 가능, 상속받은 컨트랙 호출 가능, 외부 컨트랙도 호출 가능 (상태변수에 public접근 제어자 선언하면, 컴파일러에서 자동적으로 변수의 getter 함수를 만들어준다. )
Pragma solidity ^0.4.23;

contract MyContract {
    uint pubilc count;

    constructor() public {
        //....
    }

    function numOfStudents(address_teacher) | public view | return (uint) {
        test()
        
    }

    function test() public {
        //....
    }
}

contract YourContract is Mycontract {
	function callTest() public {
        test();
    }
}

contract HiContract {
	Mycontract myContract;
    
    function callTest() public {
    	myContract.test();
     }
}
  • private : 컨트랙 내부에서만 호출 가능
Pragma solidity ^0.4.23;

contract MyContract {
    uint count;

    constructor() public {
        //....
    }

    function numOfStudents(address_teacher) | public view | return (uint) {
        test()
        
    }

    function test() private {
        //....
    }
}

contract YourContract is Mycontract {
	function callTest() public {
        test();
    }
}

contract HiContract {
	Mycontract myContract;
    
    function callTest() public {
    	myContract.test();
     }
}

3. 함수 타입 제어자

  • view : 데이터 read-only, 데이터 비용 없음
uint numOfStudents;

function getNumOfStudents() public view returns (uint) {   // 함수 읽기 전용
    return numOfStudents;
}
  • pure : 데이터 읽지 않음, 인자값만 활용해서 반환 값 정함. 가스비용 없음
function multiply(uint x, uint y) public pure returns (uint) {
    return x * y;
}
  • constant : 0.4.17버전 이전에는 view/pure 쓰임
uint numOfStudents;

function getNumOfStudents() public constant returns (uint) {   // 함수 읽기 전용
    return numOfStudents;
}
  • payable : 함수가 이더(ETH)를 받을 수 있게 함 (가스 비용 있음)
function buy() public payable {
    require(10000 = msg.value);
    transferEther(msg.sender);
}

 

4. 값 타입

  • Boolean 형 ex) bool x = false;

  • 정수형 타입 : int/uint
    • (int == int256) (양수 음수 둘다 가능)
    • (uint == uint 256) (양수만 받을 수있음)

  • address : 20byte값으로 고정. 이더리움 계정 주소 저장. 두개의 멤버 소유 (balance,transfer)

  • byte : 1~32byte, 문자열을 저장할 할 수 있다. 이 때 문자를 hex로 변환해서 저장해야한다. 나중에 라이브러리 사용 예정 (solidity는 문자열에 최적화 x 32바이트에 최적화 되어있기 때문.) 32바이트가 넘어가면 string 써야지. string 타입은 byte 타입보다 가스 비용이 더 요구됨

  • 동적 크기의 byte 배열 : bytes/string, 값 타입 x ex) bytes[] names;

  • 열거형(enum) 사용자 정의타입 만드는 방법 중 하나.

  • right,left 선택할 수 있는 direction 선언,
  • 이걸 컨트랙 안에서 쓸 수 있게 변수로 선언
  • getDirection: diretion의 현재 설정된 값의 인덱스를 리턴
  • setDirection: direction의 right나 left를 정함

5. 참조 타입 : 데이터 위치

6. 참조 타입 : 배열 

7. 참조 타입 : 구조체 

8. 참조 타입 : 매핑 

 

반응형

댓글