Klaytn Additional game

wook2·2021년 4월 22일
3

Klaytn

목록 보기
1/3
post-thumbnail

Klaytn 이란?

IBFT 알고리즘을 기반으로한 퍼블릭 블록체인


Klaytn의 강점

  • 1. Scalability
    - 네트워크의 확장성을 나타내는 지표
    - scabilty를 계산할때는 TPS(transaction per second)로 초당 몇개의 거래를 처리하는지와 Block Interval로 블록 생성 간격이 고려된다.
    - 기존 비트코인과 이더리움의 TPS가 매우 오래걸리고, Block Interval도 길다
    - klaytn은 비트코인과 이더리움의 약점인 모든 노드가 참여한다는 점을 해결해서 scalability를 증가.

  • 2. Finality
    - 트랜잭션이 변경 불가라는 합리적인 보장을 받기까지 걸리는 시간
    - 비트코인과 이더리움은 대략 60분의 finality 시간
    - klaytn은 빠른 finality를 통해 기존 네트워크와 차별점을 가진다.


Klaytn의 합의 알고리즘

클레이튼은 IBFT(이스탄불 비잔티움 결합 허용)합의 알고리즘을 사용
합의를 달성하는 소수의 private노드들과 블록 생성 결과 접근 및 검증에 사용되는 노드들로 구성되어 있음.


Klaytn의 네트워크

출처 : https://ko.docs.klaytn.com/klaytn/why-klaytn

Klaytn네트워크에는 CN, PN, EN의 세가지 형태의 노드들로 구성되어 있다.

  • CN : 네트워크 전체에서 블록을 생성하고 전파하는 역할. Corecell Network에 의해서 합의 된다

  • PN : 프록시 노드는 네트워크의 인터페이스 역할. 트랜잭션 요청을 CN으로 전송하고 블록을 ENd으로 전파

  • EN : EN은 Klaytn 네트워크의 엔드포인트 역할로, RPC API 요청을 처리하고 서비스체인과 주고받는 데이터를 처리

  • 부트노드(Bootnode)
    부트노드는 Klaytn에서 운영하는 특수 유형의 노드.
    새로 참여하는 노드가 네트워크에 등록하고 연결할 다른 노드를 검색하는 것을 해결하는 역할
    CN 부트노드는 CNN 내에 있으며 대중에게 노출되지 않고, PN 및 EN 부트노드는 공개적으로 표시


Klaytn Wallet

https://wallet.klaytn.com/

Klaytn Wallet 사이트에서 계정을 생성하고 트랜잭션 내역을 확인한다.
로그인 방식에는 key json파일과 비밀번호로 로그인 하거나 개인키로 로그인 할 수 있다.

테스트 계정을 생성하고 로그인 하면, 계정 정보를 확인할 수 있다.


Klaytn IDE

스마트 컨트랙트를 작성하고 클레이튼 네트워크를 실행시켜 볼수있는 온라인 IDE이다.
deploy를 하고나면 계약에 작성했던 함수를 UI로 보여주기 때문에 쉽게 테스팅 해볼 수 있는 장점이 있다.


Bapp 개발 보일러플레이트

기초적인 프로젝트 세팅이 어려워 문제를 겪을 필요 없이 Truffle에서 사용자의 개발환경에 맞추어 boilerplate를 제공해준다.

Trffle Box

트러플박스에 들어가면 다음과 같이 자신이 필요한 환경의 boilerplate를 다운받을 수 있다.


스마트 컨트랙트 작성

solidity를 통해 스마트 컨트랙트를 작성하였다. 만들고자하는 어플리케이션은 숫자퀴즈 문제가 주어지고 문제를 맞추면 컨트랙트에서 사용자 계좌로 KLAY를 제공해주는 기능을 한다.
위와 같은 어플리케이션을 만들기 위해서는 다음과 같은 함수가 필요하다.

  • getBalance() : 현재 컨트랙트에 남아있는 KLAY가 얼마나 있는지 확인하는 함수
  • deposit() : 컨트랙트에 KLAY를 예금하기 위한 함수
  • transfer() : 사용자가 문제를 맞출시 KLAY를 제공해주는 함수
pragma solidity ^0.4.24;

contract AdditionGame {
    address public owner;

    constructor() public {
        owner = msg.sender; // 생성자를 통해 owner에 컨트랙트 소유자가 담긴다. 
    }
    
    function getBalance() public view returns (uint) {
        return address(this).balance;
    }

    function deposit() public payable {  
        require(msg.sender == owner); 
      // 오직 컨트랙트 소유자만 예금을 할 수 있다.
      // payable 키워드가 있기때문에 value값으로 얼마나 예금할지를 넣어주어야 한다.
    }   
  
    function transfer(uint _value) public returns (bool) {
        require(getBalance() >= _value);
        msg.sender.transfer(_value);
        return true;
    }
}

컨트랙트 배포

스마트 컨트랙트를 작성했다면, truffle을 통해 컨트랙트를 배포해야 한다.
배포하기 전에 어떤 네트워크에 배포할 것인지, 가스비용등의 정보를 주어야 한다.
truffle.js파일을 생성하고 config를 작성하였다.

// truffle.js config for klaytn.

const PrivateKeyConnector = require("connect-privkey-to-provider");
const NETWORK_ID = "1001"; // baobab 고유의 네트워크 아이디
const GASLIMIT = "20000000"; // 가스한도 
const URL = "https://api.baobab.klaytn.net:8651"; // RPC를 할 주소 (baobab 테스트넷)
const PRIVATE_KEY =
  "0xb92f5b0618391b1ba906ed5203cb25f2ca05c0ebe130668bc0323240ac4b50d9"; 

module.exports = {
  networks: {
    klaytn: {
      provider: new PrivateKeyConnector(PRIVATE_KEY, URL),
      network_id: NETWORK_ID,
      gas: GASLIMIT,
      gasPrice: null,
    },
  },
};

작성이 끝났다면 아래의 명령어를 통해 배포해준다.

truffle deploy --network klaytn

기존에 배포했던 컨트랙트를 수정후 다시 배포하고 싶다면 명령어를 다음과 같이 바꾸면 된다.

truffle deploy --compile-all --reset --network klaytn

배포가 성공적으로 끝나면 build 디렉터리가 생성이 되는데 contracts폴더안에 artifacts들이 생성이된다.

각각의 artifacts파일은 컨트랙트의 abi파일과 추가적인 정보에 대한 내용을 담고 있다.

ABI란?
ABI는 컨트랙트 내의 함수를 호출하거나 컨트랙트로부터 데이터를 얻는 방법.
컨트랙트는 블록체인에 배포된 바이트코드다. 컨트랙트 내에 여러 개의 함수가 있을 수 있을 것이다.
ABI는 컨트랙트 내의 어떤 함수를 호출할지를 지정하는데 필요하며, 우리가 생각했던 대로 함수가 데이터를 리턴한다는 것을 보장하기 위해 반드시 필요하다.
출처: https://medium.com/pocs/ethereum-abi%EC%99%80-%EA%B4%80%EB%A0%A8%EB%90%9C-q-a-%EC%A0%95%EB%A6%AC-40e639ee1a03


계정인증 로직

먼저 keyfile을 불러온뒤, key값을 통해 validation을 확인하고 비밀번호를 받는다.
받고 나면, klaytn 네트워크에 올바른 키값과 비밀번호값인지 확인한다.

handleLogin: async function () {
    if (this.auth.accessType === "keystore") {
      try {
        const privatekey = cav.klay.accounts.decrypt(
          this.auth.keystore,
          this.auth.password
        ).privateKey;
        this.integrateWallet(privatekey);
      } catch (e) {
        $("#message").text("비밀번호가 일치하지 않습니다");
      }
    }
  },

확인이 끝나면 accounts에 추가해 지갑인스턴스를 생성하고 로그인 유지를 위해 세션에 저장한다.

integrateWallet: function (privateKey) {
    const walletInstance = cav.klay.accounts.privateKeyToAccount(privateKey);
    cav.klay.accounts.wallet.add(walletInstance); 
  // wallet에 계정 추가하면 어떤 트랜잭션 추가할때 쉽게 처리가능
    sessionStorage.setItem("walletInstance", JSON.stringify(walletInstance));
    this.changeUI(walletInstance);
  },

컨트랙트에 KLAY 예금하기

KLAY를 예금하기 전에 먼저 컨트랙트의 주인인지 확인을 한다.
확인을 마치고나면, 송금에 필요한 주소, 가스비, 예금액을 작성해준다.
작성 후, once로 결과를 받아와 출력하고 결과가 없다면 에러메시지를 출력한다.

var amount = $("#amount").val();
        if (amount) {
          agContract.methods
            .deposit()
            .send({
              from: walletInstance.address, // BAPP내에서 계정인증을 완료한 address
              gas: "250000",
              value: cav.utils.toPeb(amount, "KLAY"),
            })
            .once("transactionHash", (txhash) => {
              console.log(`txHash : ${txhash}`);
            })
            .once("receipt", (receipt) => {
              console.log(`(#${receipt.blockNumber})`, receipt);
              spinner.stop();
              alert(amount + "KLAY를 컨트랙트에 송금했습니다");
              location.reload();
            })
            .once("error", (error) => {
              alert(error.message);
            });
        } // if(amount)

게임 실행해보기

문제를 맞추면 KLAY받기 alert가 나오게 되고 확인을 누르면 트랜잭션 처리가 완료된다.


계정으로 0.1KLAY가 컨트랙트로부터 전송이 되었다.


Klaytnscope에서 트랜잭션이 잘 처리되었는지 가보면, 아래와 같이 트랜잭션에 대한 상세한 정보를 볼 수 있다.

profile
꾸준히 공부하자

0개의 댓글