나의 첫 프로젝트
이 튜토리얼을 통해 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 프로젝트를 시작하고, 계약을 작성하고, 로컬 네트워크에 배포하고, 개발할 때 업그레이드하는 방법을 알게되었습니다. 다음 자습서로 이동하여 코드에서 컨트렉트와 상호 작용하는 방법을 알아보세요.