[korean] 나의 첫 프로젝트 OpenZeppelin SDK (Your first project)

나의 첫 프로젝트

이 튜토리얼을 통해 OpenZeppelin SDK 사용법을 배웁니다. 간단한 컨트랙트를 포함한 새 프로젝트를 만들고, 개발 네트워크에 한 후, 터미널을 이용해 프로젝트와 상호 작용 해 보고, 컨트랙트를 업그레이드 해 볼것입니다.

준비

OpenZeppelin SDK 는 npm package로 빌드되었습니다. 설치 및 실행을 위해node.js가 필요합니다. 설치 방법에 대한 지침은 its website를 참고 해 주세요.

node를 설치하면, OpenZeppelin SDK CLI를 설치할 수 있습니다:

npm install --global @openzeppelin/cli

NOTE: CLI 는 global 로 설치 할 것입니다. 또는, 프로젝트별로 npm install --save-dev @openzeppelin/cli 명령어를 이용하여 local 로 설치할 수 도 있습니다. 이 경우에는 매번 명령어 접두어로 npx를 붙여야 합니다. local 로 설치하는것은, 프로젝트별로 다른 버전의 openzeppelin 을 사용할 수 있지만, 새 프로젝트를 시작할때마다 재설치 해야 합니다.

프로젝트 설정

먼저 새 디렉토리에 node.js 프로젝트를 만듭니다. 터미널로 가서 다음을 실행하세요:

mkdir my-project
cd my-project
npm init -y

이제 CLI를 사용하여 OpenZeppelin SDK 프로젝트를 초기화하겠습니다:

openzeppelin init

CLI를 이용하여 프로젝트 이름과 버전을 설정하고, package.json에서 기본값을 선택한 다음, OpenZeppelin 프로젝트를 실행할 파일과 폴더를 설정하라는 메시지를 표시합니다.

NOTE: openzeppelin의 알리아스는 oz입니다. 예시) openzeppelin init 대신 oz init로 입력해도 결과는 동일합니다.

이제 코딩할 준비가 완료되었습니다.

NOTE: 튜토리얼간 길을잃을경우, Github repo에서 모든 소스코드를 참고할 수 있습니다.

나의 첫 컨트랙트

이더리움 스마트 컨트랙트에 가장 널리 사용되는 언어인 Solidity 로 간단한 컨트랙트를 작성해 보겠습니다. 프로젝트에 새로운 파일 contracts/Counter.sol을 생성 후 다음 내용을 작성 해 주세요:

pragma solidity ^0.5.0;

contract Counter {
  uint256 public value;
  
  function increase() public {
    value++;
  }
}

이 컨트렉트는 단순한 숫자인 value를 가지며, increase() 함수로 트랜잭션을 보낼때마다 값을 1 증가 시킵니다.

터미널에서 명령어 openzeppelin compile을 실행하여 컨트랙트를 컴파일 하고 에러가 나오는지 확인해 보세요. 성공적으로 컴파일 된 후 컨트랙트를 배포할 수 있게 됩니다.

NOTE: 컨트랙트 컴파일을 잊었다고 해서 걱정할 필요 없습니다. CLI는 명령을 실행할 때 계약이 변경되었는지 자동으로 확인하고, 필요한 경우 컴파일합니다.

개발 네트워크에 배포

development network 로써 ganache 를 이용하여 컨트랙트를 배포해 보겠습니다. 가나슈가 설치되어 있지 않은 경우, 바로 npm install -g ganache-cli를 실행하여 설치 해 주세요.

개발 네트워크는 컴퓨터에서만 실행되는 미니 블록 체인으로 실제 이더리움 네트워크보다 훨씬 빠릅니다. 코딩 및 테스트용으로 사용할 것 입니다.

새로운 터미널을 열고, 가나슈 프로세스를 시작 해 주세요:

ganache-cli --deterministic

임의의 계정 대신, 결정적인 계정 세트를 사용하여 새로운 개발 네트워크를 시작합니다. 이제 openzeppelin create를 실행하여 Counter 컨트랙트를 개발 네트워크에 배포하도록 선택할 수 있습니다.

$ openzeppelin create
✓ Compiled contracts with solc 0.5.9 (commit.e560f70d)
? Pick a contract to instantiate: Counter
? Pick a network: development
✓ Added contract Counter
✓ Contract Counter deployed
? Call a function to initialize the instance after creating it?: No
✓ Setting everything up to create contract instances
✓ Instance created at 0xCfEB869F69431e42cdB54A4F4f105C19C080A601

NOTE: 컨트랙트가 생성될때 보이는 어드레스들이나 트랜잭션 식별자 들은, 여기 있는 값 과 다를 수 있습니다.

카운터 컨트랙트는 로컬 개발 네트워크에 배포되었으며 실행할 준비가 되었습니다! 터미널에서 상호 작용하여 테스트 할 수 있습니다. openzeppelin send-tx를 실행하여 increase 함수를 호출하는 트랜잭션을 보내, 값을 증가시켜 보세요.

$ openzeppelin send-tx
? Pick a network: development
? Pick an instance: Counter at 0xCfEB869F69431e42cdB54A4F4f105C19C080A601
? Select which function: increase()
✓ Transaction successful. Transaction hash: 0x20bef6583ea32cc57fe179e34dd57a5494db3c403e441624e56a886898cb52bd

컨트랙트의 퍼블릭값인 value를 확인하기 위해 openzeppelin call을 실행 후, 값이 0 에서 1 로 증가한 것을 확인 해 주세요.

$ openzeppelin call
? Pick a network: development
? Pick an instance: Counter at 0xCfEB869F69431e42cdB54A4F4f105C19C080A601
? Select which function: value()
✓ Method 'value()' returned: 1

컨트랙트 업그레이드

우리는 이제 Counter 컨트랙트의 increase 함수를 조금 더 흥미롭게 바꿔보려 합니다. 값을 1 증가 하는것 대신에, 요청자가 원하는만큼의 값을 증가 할 수 있도록 하려고 합니다. contracts/Counter.sol를 다음과 같이 변경 해 주세요:

pragma solidity ^0.5.0;

contract Counter {
  uint256 public value;
  
  function increase(uint256 amount) public {
    value += amount;
  }
}

이제 이전에 만든 인스턴스를이 새 버전으로 업그레이드 할 수 있습니다:

$ openzeppelin upgrade
? Pick a network: development
✓ Compiled contracts with solc 0.5.9 (commit.e560f70d)
✓ Contract Counter deployed
? Which proxies would you like to upgrade?: All proxies
Instance upgraded at 0xCfEB869F69431e42cdB54A4F4f105C19C080A601.

끝! 카운터 인스턴스가 최신 버전으로 업그레이드되었으며 주소 나 상태가 변경되지 않았습니다. 값을 10 늘려서 확인해 봅시다. 이미 1 늘렸기 때문에 11 이 나옵니다:

$ openzeppelin send-tx
? Pick a network: development
? Pick an instance: Counter at 0xCfEB869F69431e42cdB54A4F4f105C19C080A601
? Select which function: increase(amount: uint256)
? amount (uint256): 10
Transaction successful: 0x9c84faf32a87a33f517b424518712f1dc5ba0bdac4eae3a67ca80a393c555ece

$ openzeppelin call
? Pick a network: development
? Pick an instance: Counter at 0xCfEB869F69431e42cdB54A4F4f105C19C080A601
? Select which function: value()
Returned "11"

NOTE: 스마트컨트랙트가 변경 불가함에도 불구하고, OpenZeppelin SDK 이 어떻게 이러한 업적을 달성했는지 궁금하다면, upgrades pattern guide를 확인 해 주세요. 업그레이드를 지원하지 않는 변경사항이 있습니다. 예를 들어, 계약 상태 변수의 유형을 제거하거나 변경 할 수 없습니다. 그럼에도 불구하고, 원하는 모든 함수를 변경, 추가 또는 제거 할 수 있습니다.

그게 다에요! 이제 간단한 OpenZeppelin 프로젝트를 시작하고, 계약을 작성하고, 로컬 네트워크에 배포하고, 개발할 때 업그레이드하는 방법을 알게되었습니다. 다음 자습서로 이동하여 코드에서 컨트렉트와 상호 작용하는 방법을 알아보세요.

1 Like

Welcome to the community @Blue

Thank you for translating OpenZeppelin SDK "Your first project" into Korean.

The post is a wiki, so anyone can edit. (I changed the formatting from ASCII doc to Markdown).

Google Translate:

커뮤니티 @Blue 에 오신 것을 환영합니다

OpenZeppelin SDK "Your first project"를 한국어로 번역 해 주셔서 감사합니다.

게시물은 위키이므로 누구나 편집 할 수 있습니다. (포맷을 ASCII doc에서 Markdown으로 변경했습니다).