2021년 8월경에 제가 블록체인에 대해 공부한 내용들을 정리했습니다.
강의 : Klaytn 클레이튼 스마트계약과 탈중앙앱 강의(한양대학교)
참고자료 : VRF(Verifiable Random Function)와 블록체인
클레이튼이 BFT를 선택한 이유 : PoW는 합의 자체에도 많은 비용이 들고, 합의 과정이 너무 느리기 때문.
한 줄 요약 : 매 블록마다, 전체 네트워크 중 일부 노드들을 뽑아서 BFT를 진행한다.
이는 빠른 합의를 위한 방법이다.
Baobab 테스트넷 = 테스트 및 개발 용도의 네트워크.
const Caver = require('caver-js');
const caver = new Caver('https://api.baobab.klaytn.net:8651/');
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
= account를 잠깐 담아두기 위한 container.
// 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]);
gasPrice
는 고정값이므로 TX에 쓰지 않는다.gas
는 명령어를 몇 개까지 실행할 지 정의한 값.// 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);
on
: Event를 listening하는 함수.transactionHash
: 노드가 TX를 잘 받았음을 알려주는 이벤트.receipt
: TX가 체결되어서 블록에 들어간 경우 발생하는 이벤트.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'); });
})();
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);
});
contract.methods.set
: contract에 있는 함수들 중 set이란 함수를 실행함.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) {...});
contract.methods.get
: contract에 있는 함수들 중 get이란 함수를 실행함.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);
}
});