Log

  • 코인같은 걸 보낼때의 주소나 양 등 정보가 적혀있는 걸 담아있는 곳

Event

  • Log를 가져와 저장하여 사용가능하게 만들어줌
  • 출력할때는 emit을 통해 출력한다

Indexed

  • indexed는 event 객체 내에서 사용할 수 있는 키워드로 event를 검색 또는 필터링하는데 사용할 수 있게 만드는 키워드이다.

public, private, internal

  • public은 외부에서 갔다쓰거나 수정할때
  • private은 외부에서 갔다쓰거나 수정이 안됨
  • 외부에서 참조는 하고 수정이 안됨 internal

상속

  • contract 자식 is 부모 { }
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8;

contract Number {
    uint internal num = 4;

    function changeNumber(uint _num) public virtual{
        num = _num;
    }

    function getNum() public view returns(uint){
        return num;
    }
} 

contract Caller is Number{
    
    function changeNumber(uint _num) public override {
        num = _num -1;
    } 
}

인스턴스화

  • 인스턴스(instance)는 주로 하나의 컨트랙에서 다른 컨트랙을 접근할 때 쓴다.
  • 예로 A와 B 컨트랙이 있다고 가정하고 B에서 A의 함수나 변수들을 접근하여 사용하고 싶다면 A 인스턴스를 만들어 B컨트랙 안에서 사용하면된다
// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;

contract A{
    
    uint256 public a = 5;
    
    function change(uint256 _value) public {
        a = _value;
    } 

}

contract B{

}
  • 인스턴스 선언법
    • 컨트랙이름 인스턴스의 이름 = new 컨트랙이름()
// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;

contract A{
    
    uint256 public a = 5;
    
    function change(uint256 _value) public {
        a = _value;
    } 

}

contract B{
    
    A instance = new A();
    
    function get_A() public view returns(uint256) {
        return instance.a();
    }
    function change_A(uint256 _value) public  {
        instance.change(_value);
    }    

}

현재 스마트 컨트랙B에서 A의 인스턴스는 .을 붙여 접근함을 볼수 있다.
get_A 에서는 컨트랙 A의 변수를 접근해야하니 instance.a()를 써준걸 알 수가 있어요.
그리고 한가지더, **변수를 접근할때는 () 를 붙여 주셔야 리턴이 된답니다.**

다형성과 오버라이딩 차이

다형성(polymorphism)은 같은 프로그래밍 인자가 서로 다른 자료형을 갖는것.

즉 오버로딩 적용시 하나의 함수가 여러 개의 매개변수를 다룰수 있어 함수를 유연하게 사용할수 있다

1.다형성
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8;

contract Number {

    function Type(uint _num1, uint _num2) public pure returns (uint){
        return _num1 + _num2;
    }

    function Type(string memory _num1, string memory _num2) public pure returns (string memory, string memory){
        return (_num1, _num2);
    }
}

contract Caller{
    Number internal instance = new Number();
    function call_change(uint _num1, uint _num2) public view {
        instance.Type(_num1, _num2); 
        instance.Type(_num1, _num2);
    }
}

2. 오버라이드

// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;

contract Father{
    uint256 public fatherMoney = 100;
    function getFatherName() public pure returns(string memory){
        return "KimJung";
    }
    
    function getMoney() public view virtual returns(uint256){
        return fatherMoney;
    }
    
}

contract Mother{
    uint256 public motherMoney = 500;
    function getMotherName() public  pure returns(string memory){
        return "Leesol";
    }
    function getMoney() public view virtual returns(uint256){
        return motherMoney;
    }
}

contract Son is Father, Mother {

    function getMoney() public view override(Father,Mother) returns(uint256){
        return fatherMoney+motherMoney;
    }
}

다중상속

  • 상속과 같이 is 뒤에 상속할 컨트랙트의 명들을 적어주면된다.
  • 선언방식 : 컨트랙명 is 부모명, 부모명{} 이다.
// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;

contract Father{
} //부모 컨트랙

contract Mother{
} //부모 컨트랙

contract Son is Father,Mother{
} //상속받은 자식 컨트랙

추상화 컨트랙트

  • abstract는 부모개념이며 상속해줄것을 미리 모아놓은거

인터페이스 컨트랙트

  • 추상화 개념이며 제약이많다

payable

  • payable은 말 그대로 지불이 가능한 함수를 선언할 수 있습니다. payable이 붙은 함수는 이더리움을 전송받을 수 있습니다. 원하는 이더리움의 value가 전송되었는지 require문을 통해 확인할 수 있습니다.

truffle 공부 해야겠지..

'솔리디티' 카테고리의 다른 글

솔리디티 2일차  (0) 2023.05.23
솔리디티 1일차  (1) 2023.05.23

1. 블랙박스, 화이트박스

블랙박스 테스트(Black Box Test)

소프트웨어의 내부 구조나 작동 원리를 모르는 상태에서 소프트웨어의 동작을 검사하는 방법.

검사 진행에 있어 해당 소프트웨어의 코드나 내부 구조에 대한 정보는 필요하지 않으며, 특징, 요구 사항 검사를 위해 공개된 설계도 등의 대외적으로 공개된 사항들을 통해 검사를 진행하며,****

data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

이 소프트웨어는 무슨 역할이 수행되어야 하는가?

와 같이 소프트웨어의 특징이나 요구 사항 등에 초점을 맞춰 검사가 이뤄진다.

즉, 정리하자면 개발자입장이 아닌 사용자 입장에서 소프트웨어 혹은 제품에 대한 요구사항과 결과물이 일치하는지 확인하기위한 테스트 기법이다.

기법

  • 동등 분할 기법(Equivalence Partitioning)
  • 경계값 분석 기법(Boundary Value Analy
  • 오류 예측 기법(Error Guessing)

4. 원인 결과 그래프 기법(Cause Effect Graph)

5. 의사결정 테이블 테스팅

6. 상태전이 테스팅

화이트박스 테스트(White Box Test)

소프트웨어 혹은 제품의 내부 구조, 동작을 세밀하게 검사하는 테스트 방식으로, 외부에서 요구사항에 따른 예상 결과값을 테스트 하는 것과는 다르게 내부 소스 코드를 테스트하는 기법으로 사용자가 들여다 볼 수 없는 구간의 코드 단위를 테스트 한다.

즉, 정리하면 개발자가 소프트웨어 또는 컴포넌트 등의 로직에 대한 테스트를 수행하기 위해 설계 단계에서 요구된 사항을 확인하는 개발자 관점의 단위테스팅 기법이다.

기법

  • 문장 검증
  • 분기 검증
  • 경로 검증
  • 조건 검증

예외처리

2. 상속

솔리디티에서는 is 키워드를 통해 컨트랙트를 상속받을 수 있습니다.

contract Doge {
  function catchphrase() public returns (string) {
    return "So Wow CryptoDoge";
  }
}

contract BabyDoge is Doge {
  function anotherCatchphrase() public returns (string) {
    return "Such Moon BabyDoge";
  }
}

BabyDoge 컨트랙트는 Doge 컨트랙트를 상속받은 상태이며, 상속한 부모 컨트랙트의 internal 함수를 활용할 수 있습니다.

또한 상속받을 컨트랙트를 ,(콤마) 로 구분해 둘 이상의 컨트랙트를 다중 상속받는것도 가능합니다.

contract Doge {
  function catchphrase() public returns (string) {
    return "So Wow CryptoDoge";
  }
}

contract BabyDoge is Doge, Etherium {
  function anotherCatchphrase() public returns (string) {
    return "Such Moon BabyDoge";
  }
}

3. 구조체

구조체(struct)는 서로 다른 유형의 항목을 포함하는 집합으로, 사용자 정의 형식입니다. 구조체를 통해 여러 특성을 가진 복잡한 자료형을 만들 수 있습니다.

또한 구조체는 참조형 변수(Reference type)라고도 합니다. 참조형 변수는 배열과 같이 데이터를 저장하는 영역에 연속되어 저장되어 있는 값의 첫 번째 메모리 주소를 값으로 가지는 변수 타입입니다. 이를 '참조한다'라고 표현합니다.

구조체 예시

struct Car {
   uint year;
   uint power;
   string name;
}

4. super()

  • super 명령어는 상속 관계에서 상속의 대상인 부모 클래스를 호출하는 함수
  1. 상속된 상태변수의 섀도잉(shadowing)
  • 상속에서 섀도잉(shadowing) 개념이 있습니다.
  • 변수 섀도잉은, 특정 범위 내에서 선언된 변수가 외부 범위에서 선언된 변수와 같은 이름을 가질 때 발생합니다.
  • 일반적으로 상속에서 섀도잉을 사용하면, 자식 클래스에서 사용된 재정의 요소가 원래 요소를 숨기게 되는 효과가 발생합니다.
  1. 부모 컨트랙트 호출 및 super키워드
  • 부모 컨트랙트를 직접적으로 호출하기 위해서는 super 키워드를 사용할 수 있음
  • super 키워드를 사용하면, 상위 부모 컨트랙트를 동일하게 사용할 수 있음
  1. 메서드 오버라이드, 오버라이딩
  • 부모 클래스의 method를 재정의(override)
  • 하위 클래스(자식 클래스) 의 인스턴스로 호출시, 재정의된 메서드가 호출됨
  • 아래코드 출처 및 설명
    • 메서드 오버라이딩(Method Overriding)이란, 여러 클래스에 걸쳐서 같은 이름의 메서드를 만드는 것이다. 예를 들어 부모 클래스, 전사 캐릭터 클래스, 마법사 캐릭터 클래스에 공통으로 attack이라는 메서드가 있지만, 각각 하는 일이 다를 때는 다음처럼 같은 이름의 메서드를 클래스별로 구현하면 된다. 이렇게 되면 부모 클래스에서 만든 메서드 정의를 자식 클래스에서는 변경해서 사용한다.

'솔리디티' 카테고리의 다른 글

솔라디티 3일차  (2) 2023.05.24
솔리디티 1일차  (1) 2023.05.23

솔리디티 1일차

  • 계약 지향 프로그래밍 언어로, 다양한 블록체인 플랫폼의 스마트 계약 로직을 작성할 때 사용됩니다.
  • 기본적으로 이더(ETH)를 보내고 받는 데 필요한 데이터 타입, 함수 등을 제공하며 다음과 같은 특징을 갖는다.

솔리디티 git 사이트 : https://github.com/ethereum/solidity

솔리디티 개발 환경

  • remix, IntelliJ IDEA Plugin, VSCode Extension, Etheratom 등
  • • 코드를 컴파일, 배포, 테스트, 디버깅해 주는 Truffle이나 Hardhat, 그리고 로컬 환경에 블록체인 테스트넷을 사용할 수 있게 해 주는 Ganache를 함께 사용해야 함. 별도의 서버 없이 컴파일러와 런타임 환경을 제공하는 브라우저 기반의 IDE인 Remix가 편리함

리믹스 Local 사용하는 방법

  • 노드를 설치한다(https://nodejs.org/ko)
  • 터미널에서 다운을 받는다 명령어 : npm install -g @remix-project/remixd
  • 다운이 잘 되었는지 확인을 한다. 명령어 : remixd -v
  • 폴더 생성한다. 명령어 : window ⇒ md 파일명, Mac ⇒ mkdir 파일명
  • 터미널에서 폴더위치로 이동한다. 명령어 : cd 파일명
  • 그리고 그 위치로 이동한다. 명령어 : remixd
  • 위에를 다하면 로컬에 접속이 가능

변수 선언법

  • 솔리디티 자료형: 값 타입(value type) / 참조 타입(Reference type)
    • 값타입: 값이할당되거나함수의인자로활용이되면해당값자체가복사됨
    • 참조 타입: 현재 해당하는 값의 주소만 복사됨. ⇒ 배열(array), 매핑(mapping), 구조체(Struct)로 구성되어 있음.
  • 변수 정의 방법

  • 가시성 지정자

변수의 종류

  • 상태 변수(State Variable) : 값이 계약 저장소에 영구적으로 저장되는 변수
pragma solidity ^0.8.7; // 솔리디티 버전을 0.8.7이상을 쓰겠다고 정의해 놓음 
contract MyStorage { 
	uint storageData; //State Variable 
}
  • 지역변수(Local Variables) : 함수가 실행될 때까지 값이 존 재하는 변수.
pragma solidity ^0.8.7; // 솔리디티 버전을 0.8.7이상을 쓰겠다고 정의해 놓음

contract MyStorage {    
	    
			function getResult() public pure returns(uint){
				
				// Defining function to show the declaration and 
				// scope of local variables
				uint local_var1 = 1;
				uint local_var2 = 2;
				uint result = local_var1 + local_var2;

				// Access the local variables
				return result;
	}
}
  • 전역변수(Global Variables) : 블록체인에대한정보를얻는데사 용되는전역특수변수
pragma solidity ^0.8.7; // 솔리디티 버전을 0.8.7이상을 쓰겠다고 정의해 놓음

contract MyStorage {    
	    
			function getResult() public pure returns(uint){
				
				// Defining function to show the declaration and 
				// scope of local variables
				uint local_var1 = 1;
				uint local_var2 = 2;
				uint result = local_var1 + local_var2;

				// Access the local variables
				return result;
	}
}

연산자

함수의 기본형태

공부할 때 참고하면 좋은 사이트 : https://github.com/wikibook/solidity

오늘은 예제2번 살펴보기(기초)

  1. 예제 2-1
pragma solidity ^0.8.7; // 솔리디티 버전을 0.8.7이상을 쓰겠다고 정의해 놓음

contract Ex2_1 {    
    //행 단위 주석
    /*
        블록 단위 주석
    */
}
  1. 예제 2-2
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 < 0.9.0;

contract Ex2_2 {
    string a = 'Hello';
    uint b = 5;
    uint c = 5;
    uint d = 5;
    uint e = 5;
    uint f = 5;

    function assignment() public returns(string memory, uint, uint, uint, uint, uint) {
        
        a = 'Hello Solidity'; 
        b += 2; // b = b + 2
        c -= 2; // c = c - 2
        d *= 2; // d = d * 2
        e /= 2; // e = e / 2
        f %= 2; // f = f % 2    
        return(a, b, c, d, e, f);
    
    }
}

결과값 : 
	"0": "string: Hello Solidity",
	"1": "uint256: 9",
	"2": "uint256: 1",
	"3": "uint256: 20",
	"4": "uint256: 1",
	"5": "uint256: 1"
  1. 예제 2-3
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 < 0.9.0;

contract Ex2_3 {
    int a;
    uint b;
    bool c;
    bytes d;
    string e;
    address f;
    
    function assignment() public view returns(int, uint, bool, bytes memory, string memory, address) {
        return(a, b, c, d, e, f);
    }
}

결과값 : 솔리디티의 초기값은 0이다 그러므로 전부 0과 관련값이 반환된다.
  1. 예제 2-4
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 < 0.9.0;

contract Ex2_4 {

    uint a = 5+2;
    uint b = 5-2;
    uint c = 5*2;
    uint d = 5/5;
    uint e = 5%2;
    uint f = 5**2;

    function arithmetic() public view returns(uint, uint, uint, uint, uint, uint) {
	    return(a, b, c, d, e, f);
    }
}

결과 값 : 
0:uint256: 7
1:uint256: 3
2:uint256: 10
3:uint256: 1
4:uint256: 1
5:uint256: 25

매핑과 배열

  • 매핑은 배열 및 구조체로서의 참조 유형입니다. 다음은 매핑 유형을 선언하는 구문입니다.
mapping(_KeyType => _ValueType)

_KeyType : 내장 유형과 바이트 및 문자열이 될 수 있습니다. 
					 참조 유형 또는 복합 개체는 허용되지 않습니다.

_ValueType : 모든 유형이 될 수 있습니다.

고려 사항

  • 매핑은 저장 유형만 가질 수 있으며 일반적으로 상태 변수에 사용됩니다.
  • 매핑을 공개로 표시할 수 있습니다. Solidity는 자동으로 getter를 생성합니다.

맵핑(Mapping) 기본 사용법

  • 매핑은 일반적인 프로그래밍 언어에서는 해시테이블이나 사전과 유사합니다.
  • 키(Key) - 값(value) 형태로 쌍으로 저장되고 제공된 키(Key)를 가지고 값(value)을 얻어낼 수 있습니다.
예제)
pragma solidity ^0.8.0;

contract MyContract{

	mapping(uint => string) public names;

	constructor() public{
		names[1] = "Kim";
		names[2] = "Park";
		names[3] = "Lee";
	}
}

위 코드에서는, unit 자료형이 키(Key)이며, string 자료형이 값을 저장하는데 사용됩니다. 
names는 매핑의 식별자로 사용되었습니다.

배열

  • 배열은 데이터를 저장하는 장소와 같다 표현방식 : '배열명[주소값] = 데이터' 이다.
    • 배열명은 변수명처럼 단순히 이름이고
    • 주소값은 0부터 시작한다.
  • length(길이) 있음
  • 배열의 삭제
    • [1] Pop를 사용하여 가장 마지막의 index값을 제거 (공간도 제거됨)
    • [2] Delete를 사용하면 공간은 남게 되며 자료값만 삭제됨
pragma solidity ^0.8.0;

contract MyContract{

	mapping(uint => string) public names;

	constructor() public{
		names[0] = "Han"
		names[1] = "Kim";
		names[2] = "Park";
		names[3] = "Lee";
	}
}

설명 : 배열명 names는 주소값 0~3까지가지고 있다.
			names = ["Han", "Kim", "Park", "Lee"]의 값이다.

Stack : 맨마지막에 들어간 자료가 맨 처음으로 나온다. ⇒ 재밌게 말하자면 먹고 토하는것과 같다.

Queue: 맨 처음으로 들어온 것이 맨 처음으로 나온다. ⇒ 먹고 싸는것과 같다.

구조체

  • 말그대로 저희만의 구조 즉 타입을 만드는 것
  • 선언 방식
    struct 구조체명 {
        타입 변수명,
        타입 변수명,
         .....
    }
    
    예제)
    pragma solidity ^0.8.0;
    
    contract MyContract{
    
    	mapping(uint => string) public names;
    	mapping(uint => string) public books;
    
    	struct Book{
    		string title;
    		string Author;
    	}
    
    	constructor() public{
    		names[0] = "Han"
    		names[1] = "Kim";
    		names[2] = "Park";
    		names[3] = "Lee";
    	}
    
    	function addBook(uint _id, string memory _title, string memory _author) public {
    		books[_id] = Book(_title, _author);
    	}
    }
    
  • 예제 : Book이라는 구조체를 만들고 addBook이라는 함수를 추가합니다.

해쉬코드와 해쉬테이블이란?

해쉬코드

  • 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수
  • 원하는 데이터를 빠르게 찾기 위해서 사용됨

해쉬테이블

  • 해시 테이블은 (Key, Value)식으로 데이터를 저장하는 자료구조 중 하나로 key를 통해 평균 O(1)에 value를 검색할 수 있는 자료구조이다.
  • 해시 테이블은 Key 값을 해시함수(Hash Function)를 사용하여 변환한 값을 색인(index)으로 삼는다.
  • 해시 함수(Hash Function)를 사용해 Key 값을 색인(index)으로 변환하는 과정을 해싱(Hashing)이라고 한다

해쉬테이블을 쓰면 장단점은?

장점

  • 검색 속도가 매우 빠르다
    • 배열을 예시로 들자면 인덱스 값으로 데이터를 찾아내는 방식이다.

단점

  • 해시 충돌 : 해시 함수를 통해 나온 해시 코드가 중복되는 경우
    • 해시코드는 정수개로 한정이라서 중복을 가질 수 밖에 없다.
  • 하나의 인덱스에 모든 키값이 저장되어 시간복잡도가 늘어나는 경우

Storage, Memory란?

Storage

  • storage는 블록체인에 영구적인 상태를 저장하는 영역

Memory

  • 함수가 실행되는 동안에만 사용할 수 있는 가상 메모리 영역
  • 함수 실행이 완료되면 자동으로 이 공간은 삭제(임시공간이라서)

'솔리디티' 카테고리의 다른 글

솔라디티 3일차  (2) 2023.05.24
솔리디티 2일차  (0) 2023.05.23

+ Recent posts