클레이튼(Klaytn), 핵심만 정리했습니다

sumong·2023년 1월 8일
0

블록체인

목록 보기
4/6
post-thumbnail

2021년 8월경에 제가 블록체인에 대해 공부한 내용들을 정리했습니다.

강의 : Klaytn 클레이튼 스마트계약과 탈중앙앱 강의(한양대학교)

참고자료 : VRF(Verifiable Random Function)와 블록체인


합의 구조 : BFT

클레이튼이 BFT를 선택한 이유 : PoW는 합의 자체에도 많은 비용이 들고, 합의 과정이 너무 느리기 때문.

Klaytn BFT (확장 가능한 BFT)

한 줄 요약 : 매 블록마다, 전체 네트워크 중 일부 노드들을 뽑아서 BFT를 진행한다.
이는 빠른 합의를 위한 방법이다.

  1. N개의 노드 가운데 S개의 부분노드 집합을 확률적으로, 무작위로 선택
    (이 때 S는 BFT를 돌리기에 충분히 작은 크기의 숫자이다.)
  2. 전체집합을 거버넌스 카운실(Governance Council)로 정의
  3. 부분집합을 커미티(Committee)로 정의
  4. 커미티 선택은 VRF*로 구해진 무작위값에 기반
    (VRF : 1에서 쓰인 랜덤값이 올바르고, 검증 가능한 랜덤값임을 증명하는 함수. 전자서명과 비슷한 방식.)
  5. 매 블록마다 새 커미티를 뽑아 BFT를 실행
  6. 빠르게 블록을 생성하고, 합의된 결과를 나머지 네트워크에 전파함.

Klaytn SDK

  • caver-js는 Node.js로 Klaytn BApp을 만들 때 필요한 라이브러리를 제공.

Baobab 테스트넷

Baobab 테스트넷 = 테스트 및 개발 용도의 네트워크.

  • 클레이튼 네트워크 : (아스펜-사라진듯?), Baobab, Cypress(Main Net)
  • 하루에 최대 5클레이씩 지급됨. 이를 가지고 개발 및 테스트 진행.
const Caver = require('caver-js');
const caver = new Caver('https://api.baobab.klaytn.net:8651/');

klay.getBlockNumber()

klay.getBlockNumber() = 가장 최근의 block number를 받아옴.

  • 테스트넷에 접속이 잘 되었는지 확인하는 방법.
const Caver = require('caver-js');
const caver = new Caver('https://api.baobab.klaytn.net:8651/');

// klay.getBlockNumber()를 실행하는 방법 1
caver.klay.getBlockNumber(function(err, blockNumber) {
	console.log(blockNumber);
});

// klay.getBlockNumber()를 실행하는 방법 2
caver.klay.getBlockNumber().then(console.log);

klay.accounts.wallet

klay.accounts.wallet = account를 잠깐 담아두기 위한 container.

  • account 정보를 사용하기 위해선 account key-pair에 대한 이해가 필요한데, 이를 SDK에서 편하게 쓸 수 있도록 지원하기 위해 등장한 개념.
  • account를 wallet에 넣어두기만 하면 account key-pair에 대한 이해가 없어도 account를 편하게 쓸 수 있다.
// account key-pair(비밀키-공개키)가 생성됨.
const account = caver.klay.accounts.create();

// in-memory wallet
const wallet = caver.klay.accounts.wallet;
// wallet에 위에서 만든 account 추가
wallet.add(account);
// wallet에 저장된 account 갯수
console.log(wallet.length);
// 특정 주소를 가지는 account를 불러옴, 없을 경우 undefined
console.log(wallet[account.address]);
// 저장된 첫 번째 account를 불러옴, 없을 경우 undefined
console.log(wallet[0]);

토큰전송 TX 생성 & 서명

  • gasPrice는 고정값이므로 TX에 쓰지 않는다.
  • gas는 명령어를 몇 개까지 실행할 지 정의한 값.
  • 아래 코드 실행 시, 서명된 TX의 값이 나온다.
// in-memory wallet 초기화 & 어카운트 2개 생성
wallet.clear();
wallet.create(2);

// 트랜잭션
const tx = {
	type: "VALUE_TRANSFER",
	from: wallet[0].address,
	to: wallet[1].address,
	value: caver.utils.toPeb('1', 'KLAY'), // 1KLAY 전송
	gas: 300000 // TX가 사용할 수 있는 가스 총량
};

// 방금 만든 tx를 첫 번째 account의 비밀키로 서명
caver.klay.accounts.signTransaction(tx, wallet[0].privateKey).then(console.log);

서명된 TX 전송

  • TX는 서명이 있어야 전송이 가능하다.
  • on : Event를 listening하는 함수.
  • transactionHash : 노드가 TX를 잘 받았음을 알려주는 이벤트.
    (TX를 해쉬해서 리턴함.)
  • receipt : TX가 체결되어서 블록에 들어간 경우 발생하는 이벤트.
    (receipt를 리턴함)
  • error : 오류가 발생한 경우 발생하는 이벤트.
const tx = {...};
(async () => {
	const signedTransaction = await caver.klay.accounts.signTransaction(tx, sender.privateKey);
	await caver.klay.sendSignedTransaction(signedTransaction.rawTransaction)
		.on('transactionHash', function(txhash) { console.log('hash first', txhash); })
		.on('receipt', function(receipt) { console.log('receipt later', receipt); })
		.on('error', function(err) { console.error('something went wrong'); });
})();

토큰전송 TX + sendTransaction

sendTransaction : 서명과 전송을 한 번에 처리하는 함수. 파라미터로 TX를 넣는다.

const tx = {...};
caver.klay.sendTransaction(tx)
	.on('transactionHash', function(txhash) {
		console.log('hash first', txhash);
	})
	.on('receipt', function(receipt) {
		console.log('receipt later', receipt);
	})
	.on('error', function(err) {
		console.error('something went wrong');
	});

스마트 컨트랙트 배포

스마트 컨트랙트 배포 = solidity 코드를 컴파일해서 나온 abi+바이트코드를 블록체인에 저장하는 것.

  • 다만, 스마트 컨트랙트를 배포할 때는, 트러플이라는 배포 전용 툴을 쓰는 게 훨씬 편하다. (아래 방식은 거의 쓰지 않음)
const abi = [...];
const contract = new caver.klay.Contract(abi);
contract.deploy({ data: '~~~~~~~~' })
	.send({from: wallet[1].address,
				 gas: 3000000,
				 value: 0})
	.on('receipt', function(receipt) {
		console.log('contract deployed at', receipt.contractAddress);
	});

스마트 컨트랙트 함수 실행 (mutation, 상태 변경)

  • contract.methods.set : contract에 있는 함수들 중 set이란 함수를 실행함.
  • mutation 함수의 경우, send를 통해 실행됨.
const contract = new caver.klay.Contract(abi, 'Contract 주소');
contract.methods.set(100)
	.send({
		from: wallet[1].address,
		gas: 300000
	})
	.on('transactionHash', function(hash) {...})
	.on('receipt', function(receipt) {...})
	.on('error', function(err) {...});

스마트 컨트랙트 함수 실행 (constant, 상태 변경 X)

  • contract.methods.get : contract에 있는 함수들 중 get이란 함수를 실행함.
  • constant 함수의 경우, call을 통해 실행됨.
const contract = new caver.klay.Contract(abi, 'Contract 주소');
contract.methods.get()
	.call(null, function(err, result) {
		if(err == null) {
			console.log(result);
		} else {
			console.error(err);
		}
	});
profile
Flutter 메인의 풀스택 개발자 / 한양대 컴퓨터소프트웨어학과, HUHS의 화석

0개의 댓글