솔리디티 이해하기 기초-1

Poo·2022년 1월 22일
0

솔리디티의 큰 특징

  1. 정적 타입 언어
  2. Ethereum Virtual Machine (EVM) 위에서 실행
  3. 문장의 끝을 반드시 세미콜론(;)으로 표현함

버전명시

pragma solidity ^0.8.0;

pragma solidity ^version 명으로 명시해줘야 컴파일이 가능하다.

컨트랙트

contract HelloWorld {
}

모든 코드의 실행은 컨트랙트 함수 안에서 실행되어야 한다.

자료형

1.unit(부호없음) -unit 은 기본적으로 256비트 자료형으로 보다 작은 32, 64등으로 선언가능하다.
2. int 정수형
3. bool 논리 자료형
4. string UTF-8 인코딩 문자열
5. bytes 바이트
6. address 이더 주소

구조체

struct 키워드로 생성 가능 컨트랙트 내부에 정의 되어야됌

struct Hello {
    	string name;
        uint dna;
    }

배열

정적 배열, 동적 배열

정적 배열 : uint[4] fixedArray 처럼 미리 사용할 배열의 크기를 지정

동적 배열 : uint[] dynamicArray 처럼 고정된 크기가 없어 계속 커질 수 있다

new 키워드를 활용한 배열 : new uint 처럼 길이 인자를 반드시 명시해줘야 한다

public 속성 배열

배열에는 public 이라는 속성을 부여가능
public 속성과 함께 배열을 선언하면 다른 컨트랙트에서도 배열을 읽을 수 있게 되지만, 쓸 수는 없다

Hello[2] public world

함수

솔리디티에서는 function 키워드를 활용해 함수를 만든다.

funtion HelloWorld(string _name, unit _dna) {
}

함수의 접근자 지정 -1 private or public

함수는 기본적으로 public 속성을 가진다.
private로 선언을 하면 컨트랙트 외부로 호출이 불가하다.
접근 지정자는 함수 바로 다음에 지정한다.

funtion HelloWorld(string _name, unit _dna) public{
}

함수의 접근자 지정 -2 internal or external

internal : private과 유사하나, 자식 컨트랙트에서는 함수를 사용할 수 있게 한다
external : external을 붙인 함수는 컨트랙트의 외부에서만 호출될 수 있다

contract Hello {
	unit private hi = 0;
    
    function bye() internal {
    hi++;
    }
 }
 
contract HelloHi is Hello {
	unit private hihi = 0;
    
    function byebye() public returns (sting) {
    hibye++;
    bye();
    }
 }
 //첫 컨트랙트 안 function bye가 internal 선언 되었기 때문에
 자식 컨트렉트에서 호출이 가능하다

함수의 반환값 지정하기

함수가 반환하는 타입(자료형)은 returns 라는 키워드를 통해 명시적으로 드러나야함

funtion HelloWorld(string _name, unit _dna) public returns(string){
	return "omg";
}

함수 제어자 지정

컨트랙트의 변수를 읽고 쓰는지 여부에 따라 제어자를 지정
제어자는 리턴 타입과 접근자 사이에 위치
view : 컨트랙트의 변수를 읽기만 할 때 (상태를 변화시키지 않을때)
pure : 컨트랙트의 변수를 읽지도, 쓰지도 않을 때

function anyread(string _str) private pure returns(string) {
}

require

require는 조건이 참이면 함수를 실행하고, 참이 아니면 함수를 실행하지 않고 에러를 출력한다

funtion HelloWorld(string _name, unit _dna) public returns(string){
	require(_name == "gun");
	return "omg";
}

값 반환

솔리디티의 함수는 값을 반환하되, 한번에 여러 값을 반환 가능하다

function multireturn () public pure returns(
	unit a,
    unit b,
    unit c
   ){
   	return(1, 2, 3)
  }
  
  unit number; //두번째 넘버 호출
  ( , number, ) = multireturn(); // number : 2

난수 생성

솔리디티는 keccak256 이라는 강력한 해시 함수를 내장한다.
keccak256 함수는 난수 충돌이 일어날 확률이 매우 희박한 "안전한 난수" 를 생성해준다

이벤트

솔리디티는 트랜잭션 내역과 계약 내용을 화면에 보여주는데 프론트엔드단으로 데이터를 넘겨주기 위해서 event를 활용한다.

이벤트는 event 키워드로 선언할 수 있으며, 이벤트는 자바의 인터페이스처럼 본문을 구현하지 않는다.

ex) sol

 event Hello(unit id, unit data);
 
 function bye(unit id, unit data) public returns(unit) {
  Hello(err, result)
  return data;
  }
  bye 함수가 실행이되면 이벤트가 호출된다.
ex) front

Contranct.Hello((err, result) => {
	console.log(res.id, res.data)
   })

솔리디티에서는 이벤트를 전달하는 상황과 이벤트(인터페이스)를 정의하고, 프론트엔드에서는 socket.io의 이벤트를 처리하는 것처럼 해당 이벤트에 대한 콜백 코드를 작성한다.

mapping

매핑(mapping) 은 "키 - 값" 구조로 데이터를 저장할 때 활용되는 타입

// key: uint 형, value: address 형
mapping(uint => address) public Hello;

// key: address 형, value: uint 형
mapping(address => uint) ownerHello;

매핑값을 읽고 쓰기 위해서는 (매핑 이름)[키] 의 형태로 접근 가능

mapping(uint => address) public hello;

// uint형 키 0에 호출한 사람의 주소(address)가 할당된 모습
hello[0] = msg.sender;

msg.sender

모든 함수에서 이용 가능한 특정 전역 변수들이 있는데요, 그 중 하나가 현재 함수를 호출한 사람 (혹은 컨트랙트)의 주소를 가리키는 msg.sender

솔리디티에서 함수는 언제나 컨트랙트 외부에서 호출된다. 컨트랙트는 누군가가 컨트랙트의 함수를 호출할 때까지 블록체인 상에서 아무 것도 하지 않고 있어, 외부에서 함수를 호출하기 위해 msg.sender가 필요하다

Storage와 Memory

Storage

contract Zoo {

	struct animal{
     	     string name;
             sting status;
           }
      animal[] animals;
      
     function aliveAnimal(unit _index)public {
    	 animal Stoage myanimal = animals[_index];
     }

animals[_index]는 전체 블록체인 상에 존재하게 된다.

memory

contract Zoo {

	struct animal{
     	     string name;
             sting status;
           }
      animal[] animals;
      
     function aliveAnimal(unit _index)public {
    	 animal memory myanimal = animals[_index];
         myanimal.status = "alive";
     }

단순히 구조체의 값을 복사하거나 임시 변수로써 활용하고 싶다면 memory 키워드를 활용

상속과 인터페이스

상속

솔리디티에서는 is 키워드를 통해 컨트랙트를 상속 가능하다.

contract Hello {
	unit private hi = 0;
    
    function bye() internal {
    hi++;
    }
 }
 
contract HelloHi is Hello {
	unit private hihi = 0;
    
    function byebye() public returns (sting) {
    hibye++;
    bye();
    }
 }

HelloHi 컨트랙트는 Hello 컨트렉트를 상속받은 상태이고 internal을 활용 할 수 있다. 상속받을 컨트랙트를 ,(콤마) 로 구분해 둘 이상의 컨트랙트를 다중 상속받는것도 가능하다.

contract Hello {
	unit private hi = 0;
    
    function bye() internal {
    hi++;
    }
 }
 
contract HelloHi is Hello, Etherium {
	unit private hihi = 0;
    
    function byebye() public returns (sting) {
    hibye++;
    bye();
    }
 }

인터페이스

인터페이스는 컨트랙트와 마찬가지로 contract 키워드를 사용해 생성할 수 있다
다만, 다른 컨트랙트와 상호작용하는 함수만을 선언할 뿐, 다른 함수나 상태 변수를 사용하지 않는다
함수를 선언하므로 본문은 구현하지 않는다

contract CountryInterface {
	function otherCountry(address _id) extenal view returns(
       bool isReady,
       unit256 Asia,
       unit256 America,
       unit256 Africa,
       );
      }
      
contract MyContract {
	address gunAddress = 0x.....;
    // 인터페이스를 사용하려면 고유의 address형 주소를 인자로 대입
    CountryInterface country = CountryInterface(gunAddress);
    
     function someFunction() public {
      // 이제 `country`가 가리키고 있는 컨트랙트에서 `otherCountry` 함수를 호출할 수 있다.
      unit myCountry = country.otherCountry(msg.sender);
     }
     
   }

출처, 참조
Chamming2님의 tistory

profile
죽을 때 까지 공부하다 죽을 인생, 로봇공학자에서 블록체인 개발자가 되기 까지

0개의 댓글