solidity 란?

이재영·2023년 10월 4일
0

BlockChain

목록 보기
9/13
post-thumbnail

solidity란?

  • 이더리움(Ethereum) 블록체인 플랫폼을 위한 스마트 계약(Smart Contract) 개발을 위한 프로그래밍 언어

solidity 코드 작성 방법

//⭐ 스마트 계약의 라이센스를 지정하는 주석, MIT 라이센스를 사용하고 있음.
// SPDX-License-Identifier: MIT

//⭐ 컴파일러 버전을 지정, ^ 기호는 지정된 버정 이상의 컴파일러를 사용할 수 있음을 뜻함.
pragma solidity ^0.8.13;

//⭐ 외부 파일의 코드를 가져올 수 있음, export 하지않아도 된다.
import "./Counter.sol";

//⭐ contract : 스마트 컨트렉트를 정의하는 부분
contract Counter2 {
    uint256 value;
  //⭐ Counter 컨트랙트의 구조를 가지고있는 counter 상태변수
    Counter counter; 

    constructor() {
        // Counter 인스턴스를 하나 생성
        counter = new Counter();
    }

    function setValue(uint256 _value) public {
        value = _value;
        counter.setValue(_value);
    }

    function getValue() public view returns(uint256){
        return value;
    }

    function getValue2() public view returns(uint256){
        return counter.getValue();
    }
}

데이터 타입

contract Counter {
    // 기본 true
    // [타입] [변수명]
    // 참과 거짓의 값을 저장하는 변수
    bool _bool;

    // uint 부호가 없는 정수형 -가 안붙는 정수, 음수가 될 수 없다.❌
    // 정수형 타입 uint는 uint 자료형 뒤에 숫자를 붙이면 메모리 영역의 크기를 지정할 수 있다.
    uint256 _uint;

    // 부호가 있는 정수형, -가 붙을수 있다, 음수가 될 수 있다.
    // 정수형 타입 int는 int자료형 뒤에 숫자를 붙이면 메모리 영역 크기 지정.
    int256 _int;

    // enum 타입 -> 개발자가 가독성을 높이기 위해서 사용하는 자료형
    // 상수를 사용하면서 가독성을 높이기 위해서 사용
    enum Status {
        Pending, // 0
        Accepted, // 1
        Rejected, // 2
    }

    // ⭐ status 를 선언하는데 Status 타입으로 선언한다는 뜻.
    Status public status;
    // status.Pending === 0
    // status.Accepted === 1
    // status.Rejected === 2

    //⭐ require(status == Status.Pending) => require(status == Status(0)) 이렇게 쓸 수 있음.

    // enum의 상태를 조회
    function get() public view returns (Status){
        return status
    }

    // enum의 상태를 변경
    function set(Status _status) public {
        status = _status;
    }

    //string 문자열 자료형
    string Str = "hello sol";
    
    // address 주소형
    // 우리가 지갑을 만들때 봤던 주소
    // 주소의 크기는 20바이트 크기의 자료형 컨트랙트 주소를 저장할 때 사용하는 변수 / 0x 의 뒤 숫자가 40자리
    // 16진수 4bit * 40자리 = 160bit = 20btye
    address sender = 0x0000000000000000000000000000000000000000;
     
    // sender.balance : 해당 주소의 이더 잔액을 조회할 수 있다.
    // sender.transfer(10 ether); -> 전송 실패시 예외를 발생시켜 오류 처리가 필요
    // sender.send(5 ether); - > 성공, 실패에 대한 bool 값을 반환

    // 배열의 타입
    // 배열의 크기가 실행중에 변경 가능
    string[] strArr = ["1","2","3"];

    // 배열의 크기 지정
    // 배열의 크기가 선언시 지정이 된다.
    string[2] strArr2 = ["1","2"];

    // 구조체 struct
    struct Struct {
        string name;
        uint number;
    }
    // 구조를 정의
    
    // 매핑 key-value 키와 값을 저장할 때 사용하는 데이터 타입
    mapping (address => uint256) tokens;
    tokens {
        address : 10000
    }
    // address가 key
    // uint256가 value

    mapping(string =>mapping(address => uint256)) token2;
    // string이 key
    // mapping mapping(address =>uint256)이 value
    // address가 key
    // uint256 value
    tokens2 {
        string :{
            address : 10000
            address2 : 10000
        }
        string2 :{
            address : 10000
            address2 : 10000
        }
    }
    
    // 글로벌 변수
    // address payable 선언식(타입)
    // 매개변수 이름 : _to
    function a(address payable _to) public payable {
        // payable : 이더리움을 보낼건지, 결제를 할건지 결제 처리를 한다는 처리문(이더 상호작용 가능)
      	
        // 이더리움 블록체인 정보
        // block
        block.coinbase; // 현재 블록을 채굴한 account의 주소 
        block.difficulty; // 블록의 난이도
        block.gaslimit; // 현재 블록이 사용 가능한 최대 gas 값
        block.number; // 블록의 높이
        block.timestamp ; // 블록 생성 시간
        
        // msg 컨트렉트에서 message call 했을 때 컨트렉트에 전달된 메시지 정보를 가지고 있는 객체
        msg.sender; // 컨트랙트를 호출한 account의 주소
        msg.value; // 메시지로 전달받은 이더리움의 단위가 wei단위로 담겨있음
        msg.data; // 컨트랙트 call로 실행할 때 보낸 데이터의 내용
        msg.sig; // 전달받은 데이터의 첫 4바이트 === 어떤 메서드를 실행시켰는지 확인

        // address
        _to.balance;
        uint amount = 10**18;
        _to.transfer(amount);
        _to.send(amount);
    }

    // 함수의 구조
    // name : 함수명
    // uint a : 타입과 매개변수 이름
    // public : 함수의 접근자
      
    // 접근자의 타입
    // 1. public : 외부에서 호출이 가능 외부 컨트렉트나 계정에서 호출 가능 EOA나 CA에서 호출이 가능하다는 얘기
    // 2. private : 현재 컨트렉트에서만 호출이 가능.
    // 3. Internal : 내부 함수는 컨트렉트에서 접근을 할 수 있고, 외부 x 다른 컨트렉트에서 상속 받아서는 호출이 가능하다.
    // 4. External : public 같은 타입

    // 접근 지정자
    // view부분 : 상태변수 변경 선언 솔리디티 언어의 특징
    // view : 상태변수 읽기전용 , 변경은 불가능하다.
    // pure : 상태변수 읽기도 안되고, 변경도 안된다. -> 말그대로 순수하게 전달받은 매개변수로만 함수의 동작을 하고 싶은 경우에만 사용.
    // payable : 결제를 처리할 수 있다는 선언, 이더를 전송하는데 선언을 하지 않으면 거부된다(reject)
    function name(uint a) public view returns (uint){

    }

    // 조건문 작성
    // require : 주어진 조건을 검사해서 만족이 되면 구문 통과, 안되면 reject 발생 이전상태로 되돌림
    // gas 반환 o
    // if 문 같이 조건처리를 할 때 사용
    require(조건문);
    조건문이 잘 통과되면 동작해야할 구문

    ⭐
    // 컨트랙트 배포자가
    // 계약 파기 하고 싶을 때 : selfdestruct()
    // sender 배포자의 주소를 받을 변수 이더를 전송 받을 수 있다. payable가 있기 때문에
    address payable sender;
    require(msg.sender == sender);
    selfdesturct(sender);
    // selfdestruct(지갑 주소): 현재 계약을 파기하고, 전달받은 매개변수 주소로 CA의 잔액을 전송한다.
    // selfdestruct(CA 주소) : 계약을 파기하고 전달된 CA에 잔액을 전송할 수 있다.}
profile
한걸음씩

0개의 댓글