인프런의 강좌와 같이 실제 계정을 생성해보았습니다. Keystore 파일과 password, 그로인하여 생긴 private key 를 모두 보관하여, 추후 저장된 Keystore 파일과 password 조합, 또는 private key 를 이용하여 baobab klaytn wallet 에서 account 를 아래와 같이 확인할 수 있습니다.
위와 같이 account info 에서는 address 와 private key, klaytn wallet key 를 확인할 수 있습니다. Address 는 추후에 설명할 address 의 여러 종류 중 EOA (Externally Owned Account) 의 지갑 주소이고, private key 는 transaction signing 을 할 때 쓰이는 매우 중요한 key 이며, Klaytn Wallet Key 는 private key + type + address 로 이루어진, 계정에 로그인 할 때만 쓰이는 키이다. 참고로 type 에는 항상 0x00 이 들어가야 한다고 되어있다. Klaytn Wallet Key 의 format이 잘 이해가 되지 않을 것 같아 다음과 같이 그려보았다.
Klaytn Wallet 은 다음과 같이 구성이 되어있다. EOA (Externally Owned Account) / SCA (Smart Contract Account) EOA 는 실제 사람들이 가진 계정이라고 생각하면 되고, type(0x1)과 nonce(transaction 생성 개수), balance(잔액), humanReadable(사람이 읽기 쉬운 address), key(트랜잭션 서명 확인용) 으로 구성되어 있다. SCA 는 smart contract 가 배포되었을 때, 해당 contract 의 address 이고, type(0x2) 및 EOA 와 같은 요소들로 구성이 되어있고, 또한 codeHash(smart contract 의 code 를 hash 한 것), storageRoot(계정의 변수 값들을 보관하는 Merkle Patricia Trie의 root hash), codeFormat(code형식) 이 추가되어 있다.
Klaytn 의 Smart Contract 는 solidity 로 작성이 된다고 하였고, Klaytn IDE 가 Solidity 를 지원하며 Klaytn 에 배포를 지원해주기 때문에 기존 solidity ide 중 가장 유명한 Remix (Ethereum IDE) 와 구성을 비교해보았다.
이전 버전의 Remix 와 거의 같은 UI 로 이루어졌음을 알 수 있다. 기존의 Remix 를 쓰던 사람들이 쓰기에 편하고, 또한 버튼 등의 간격 이 Remix 보다 떨어져 있어 사용하기 좋았다는 생각이다. Klaytn 는 Klay 와 Peb 이라는 화폐단위로 이루어져 있고, 또한 아래의 사이트를 참고하니 계산이 쉬웠다.
Baobab 에 Visual Studio Code 를 이용하여 Smart Contract를 배포하기 위해서는 다음과 같은 환경을 설치해야 한다.
- Node.js 설치
- 트러플 프레임워크 설치
- 비쥬얼 스튜디오 설치 나머지는 어려운 것이 없었지만, 트러플 프레임 워크에서 이슈가 있어 이부분에 관련해서만 언급하려고 한다. Power shell 에서 npm 을 이용하여 truffle 을 설치하고, 버전을 확인하기 위해 실행해보면 다음과 같은 오류가 떴었다.
해당 오류에 대해서 한참 찾아보다가 power shell 의 보안 정책에 의해 신뢰하는 스크립트로 지정된 것 이외의 스크립트는 실행을 방지해 놓은 것이다. 따라서 다음과 같이 “set-executionpolicy unrestricted“ 명령어를 통하여 해결할 수 있었다.
Smart Contract 프론트엔드를 같이 만들어서 배포하고 싶다면, 가장 편리한 방법은 trufflebox (https://www.trufflesuite.com/boxes) 에서 template을 다운 받으면 된다. Web pack 기준을 이용하여 프로젝트의 폴더의 구성 보면 다음과 같다.
“build” 폴더는 contract 배포를 하게 되면 자동으로 생성되는 폴더이고, 각 contract 에 대한 정보가 담긴다. “contracts” 폴더에는 배포하고자 하는 smart contract 코드를 담으면 된다. “migrations” 폴더에는 배포 시 원하는 동작에 대해 정의를 내린 코드를 js 형태로 담을 수 있다. “src” 폴더에는 실제 프론트엔드 코드가 들어가게 된다. 기타 package.json 은 node 의 동작과 관련된 코드가, truffle.js 에는 truffle 명령어가 수행할 동작을 정의한다고 보면 된다. 다음과 같은 방식으로 배포를 할 수 있다.
- Smart contract 및 프론트엔드 작성
- Deploy 방식 및 truffle.js 설정
- “node install” 명령어로 필요한 패키지 설치
- “truffle deploy –network [truffle.js 에서 정의한 네트워크 이름]” 명령어로 배포
Smart Contract 코드 짠 것으로 서로의 코드를 비교해보았다. 대표적인 것으로 투표와 홀짝 게임이 있었다. 투표 코드는 스마트계약 소유자가 열고 닫을 수 있으며 modifier를 잘 활용하여 투표 시작 시점과 끝 시점의 기간 설정과 중복 투표를 잘 방지하였고, 언제든지 투표현황을 볼 수 있게 하였다.
홀짝 게임은 홀짝을 맞추면 넣은 금액의 2배의 클레이를 보상해 주는 코드였다. block number가 짝수면 false, 홀수면 true를 넣어야 맞추는 게임이었고 user 가 한 번에 수많은 트랜잭션을 발생시켜 돈을 왕창 따가는 것을 막고 tx.origin을 사용하여 proxy 스마트 계약을 통해 트랜잭션을 보내서 block number를 알아내 무조건 당첨되게 하는 코드를 막기 위한 방지책을 세웠다.