선릉역 1번 출구

solidity(1) 본문

Language/Solidity

solidity(1)

choideu 2021. 8. 10. 13:44

cryptozombie를 통해 학습을 진행한다.

 

1. 모든 솔리디티 소스 코드는 version pragma로 시작한다. (해당 코드가 이용해야 하는 솔리디티 버전을 선언하는 것으로 새로운 컴파일러 버전이 나와도 기존 코드가 깨지지 않도록 예방하는 것임)

 

2. contract 초기 version인 틀을 작성해주기

contract name{

}

 

3. 상태 변수 & 정수

상태 변수는 컨트랙트 저장소에 영구적으로 저장되는 값이다.

uint(부호가 없는 정수 자료형), uint 256, uint8, uint16처럼 비트로 선언할 수도 있음

 

4. 수학 연산은 다른 프로그래밍 언어와 같음

+, -, *, /, **

 

5. 구조체 선언

struct name {

}

 

구조체를 통해서 여러 특성을 가진, 보다 복잡한 자료형 생성이 가능

 

6. 배열

정적 배열: 고정 길이

동적 배열: 고정된 크기가 x

ex) uint[2] age;, string[4] nickname;, 

+public배열 선언이 가능

ex) Person[] public people; //Person은 구조체이름 people은 배열 변수 이름이다.

 

7. 함수 선언

function name(parameters) {

}

 

+함수 인자명을 언더스코어(_)로 시작해 전역 변수와 구별하는 것이 관례임

 

8. 구조체와 배열 활용하기

Person[] public people;에서 새로운 Person을 생성하고 people배열에 추가하는 방법 

1. 두 개의 코드로 작성하기

Person satoshi = Person(parameters); //새로운 사람을 생성하고
people.push(satoshi); //배열에 추가

2. 한 번에 작성하기

people.push(Person(parameters));

 

9. Private/Public 함수

함수의 default값은 public이지만 이것은 누구나 내 컨트랙트의 함수를 호출하고 코드를 실행할 수 있다는 의미로 컨트랙트를 공격에 취약하게 만들 수 있기 때문에 public이 항상 옳은 것은 아니다. 이럴때 기본적으로 함수를 private로 선언하고 공개할 함수만 public으로 선언하는 것이 좋다.

function name(parameters) public/private {

}

10. 함수 +

반환값

함수에서 어떤 값을 반환 받기 위해서는 public/private 옆에 returns (return받을 값의 자료형)을 작성해주어야한다.

function name(parameters) public/private returns (자료형) {

}

함수 제어자

view함수: 어떤 값을 변경하거나 무언가를 쓰지 않을 때 view함수로 선언

pure함수: 이 함수가 앱에서 어떤 데이터도 접근하지 않는다는 것을 의미

function name(parameters) public/private view/pure returns (자료형)

 

11. Keccak256 / 형 변환

keccak256을 내장 해시 함수로 가지고 있어서 사용가능

형 변환: 자료형을 쓰고 ()로 감싸기

ex) uint8 a = 5; uint b = 6; uint8 c = a + uint8(b);

 

12. event

이벤트: 내 컨트랙트가 블록체인 상에서 내 앱의 사용자 단에서 무언가 액션이 발생했을 때 의사소통하는 방법임e

event name(parameters);

function {
    name(parameters);
}

 

13. total

pragma solidity ^0.4.19;

contract ZombieFactory {

    event NewZombie(uint zombieId, string name, uint dna);

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;

    function _createZombie(string _name, uint _dna) private {
        uint id = zombies.push(Zombie(_name, _dna)) - 1;
        NewZombie(id, _name, _dna);
    }

    function _generateRandomDna(string _str) private view returns (uint) {
        uint rand = uint(keccak256(_str));
        return rand % dnaModulus;
    }

    function createRandomZombie(string _name) public {
        uint randDna = _generateRandomDna(_name);
        _createZombie(_name, randDna);
    }

}

'Language > Solidity' 카테고리의 다른 글

solidity(3)  (0) 2021.08.12
solidity(2)  (0) 2021.08.12
Comments