본문 바로가기
💠BlockChain💠

Solidity (솔리디티) 문법과 Smart Contract 생성자 함수

by 백씨네 2023. 5. 27.

목차

1. 스마트 컨트랙트의 인스턴스 생성과 생성자 함수

2. mapping

 

 

 

1. 스마트 컨트랙트의 인스턴스 생성과 생성자 함수

스마트 컨트랙트가 배포된 후에 EVM에서 해당 코드를 실행하면서 인스턴스가 생성된다.
이 때, 스마트 컨트랙트의 생성자 함수가 호출되어 초기값을 설정한다. 객체 지향 프로그래밍에서의 클래스 인스턴스화와 유사한 개념이다.

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0 ;

contract SimpleStore {
    uint256 public value;
    address public owner;

    constructor( uint256 _value){
        value = _value;
        owner = msg.sender;
    }
}

위의 solidity 코드가 배포되면서, 인스턴스가 생성될 때 생성자함수가 실행 되는데, 이 때 인자값을 전달해주어야 한다. 그래서 Migration 디렉토리 내에 마이그레이션 파일을 작성할 때 전달할 값을 넣어준다.

마이그레이션 파일에서 deploy()를 이용해서 배포할 때, 첫번 째 인자값으로 배포될 스마트컨트랙트 객체, 두번 째 인자값으로 생성자 함수 전달될 값을 넣어준다.

// 예시
deployer.deploy([contract], arg1, arg2)

simpleStore의 배포를 위한 마이그래션 파일을 작성하면 아래와 같다.

//1_deploy_simplStore.js
const SimpleStore = artifacts.require("SimpleStore")

module.exports = (deployer) => {
    deployer.deploy(SimpleStore, 15)
}

 

1-1. 스마트 컨트랙트 오너

스마트 컨트랙트를 배포한 사람을 Owner 변수에 할당하여 최초 배포자를 관리할 수 있다.

위의 솔리디티 코드에서 owner라는 변수를 생성자함수에서 msg.sender로 대입하여 주었는데,
msg.sender는 트랜잭션을 생성한 사람을 의미하고, 솔리디티 코드가 배포되었을 때 생성자 함수가 최소 한번만 싫행되기 때문에, owner은 이후에 사용하더라도 값이 변하지 않고 msg.sender로 고정되어 있기 때문에 최초의 배포자를 알 수 있고, 이를 이용해서 owner에 대한 코드를 이용해서 owner만 사용할 수 있는 메서드는 만들어서 사용할 수 있다.

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SimpleStore {
    uint256 public value;
    address public owner;

    constructor( uint256 _value){
        value = _value;
        owner = msg.sender;
    }

    function ownerOnlyFunction() public {
        require(msg.sender === owner, "You are not the owner!");
        // 오너만 사용할 수 있는 로직
    }
}

solidity에서의 require는 매개변수에 true가 되어야 다음 로직이 진행된다.
일종의 if문이다.

위으이 코드는 배포할 당시 인스턴스가 만들어지면서 생성자함수에 배포자를 owner로 지정해둔다. 그리고 ownerOnlyFunction에서 require()를 만나 msg.sender와 owner의 값이 같으면 다음 로직을 실행하는 코드를 이용해 오너만 사용하는 메서드를 만들 수 있다.




2. mapping

스마트 컨트랙트를 작성할 때 가장 많이 쓰이는 방식으로 키-값 쌍을 저장할 때 사용한다.
정확한 표현은 아니지만 Javascript의 객체와 유사하다.

배열로 데이터를 받을 때, const A = ["a", "b","c"]라고 한다면
b를 호출하고 싶을 때 A[1] 를 이용해서 b에 접근 할 수 있다.
key는 Index인 1이며, 그 값이 "b"이다. 이를 mapping을 이용해서 솔리디티로 작성하게 된다면 아래와 같이 작성할 수 있다.

mapping (uint256=>string) public  A

 

mapping은 일종의 데이터 타입으로 하나의 데이터에 여러 데이터를 관리하기 위해서 key-value로 mapping하여 관리한다.

mapping (number=>string) public A // string[] 으로 치환해서 생각하면 이해하기 쉽다.

 

 

mapping을 아래와 같이 여러번 중첩해서 사용할 수도 있다.

mapping (address => mapping(uint256 => uint256) public B) public C

// {
//     0xbDEe92a85377C1d7b3bd6e2211A40fe82A41c227 : {
//         0:1234
//     }
// }

 

 


 

댓글