1. RPC 개념
분산 네트워크를 프로그래밍으로 어떻게 쉽게할지 고민하다가 나온 개념이다.
일반적으로 통신 패턴은 서버를 켜고 클라이언트에서 서버에 요청, 서버에서 반환, 클라이언트는 반환 받는 구조로 되어있다.
예) http, socket
RPC는 원격 프로시저 호출이라는 뜻으로 별도의 원격제어를 위한 코딩없이 다른 주소공간에서
함수나 프로시저를 실행할수 있게하는 프로세스간 통신 기술이다.
원격 프로시저를 호출하면 위치가 어디있든 동일한 코드를 이용할 수 있다.
2. ganache
(1) ganache에서 curl 사용
curl은 client URL 의 줄임말이다.
클라이언트에서 소스코드를 손쉽게 웹 브라우저 처럼 활용할수 있게 해주는 기술이다.
curl은 웹개발에서 많이 사용되는 서버통신 커맨드 명령어 툴이다.
DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS 등 다양한 프로토콜을 지원한다는 장점이 있다.
curl -X POST -H "content-type:application/json" --data "{id: seok}" http://localhost:3000
-X : 요청 메소드
-H : 요청 헤더 내용
--data : 요청 바디 내용 작성
(2) RPC 요청
우분투에서 ganache 실행
npx ganache-cli
request body의 내용
{
"id" : 1215, // 체인의 아이디, 있어도되고 없어도 된다.
"jsonrpc" : "2.0", // json으로 인코딩한 프로시저 호출 (필수)
"method" : "eth_accounts", // 이더리움 클라이언트에 구성되어 있는 메소드명(필수)
"params" : [],//메소드의 인자값
}
1. 계정 가져오기
curl -X POST -H "content-type : application/json" --data '{"jsonrpc" : "2.0", "method" : "eth_accounts", "params" : []}' http://localhost:8545
2. 잔액 조회하기
잔액을 조회하는 함수이름은 eth_getBalance
eth_getBalance 함수는 params로 매개변수 [계정의주소, 몇번째 블록을 조회할지] 로 2가지를 전달한다.
3. web3
web3.js라는 라이브러리를 이용해서 이더리움 네트워크와 상호작용을 할수 있는 다양한 함수를 제공받아 사용할 수 있다.
위에서 해본 RPC요청을 쉽게 보낼수 있게 해주는 라이브러리이다.
테스트 환경을 위해 jest를 설치하고 test 해본다.
npm i -D jest
npm i web3
npm i ethereumjs-tx
(1) jest.config.js
const config = {
verbose: true,
testMatch: ["<rootDir>/**/*.test.js"],
};
module.exports = config;
(2) web3.test.js
const Web3 = require("web3");
const ethTx = require("ethereumjs-tx").Transaction;
describe("web3 test", () => {
let web3;
let accounts;
// 여기에 it() test 구현
});
1. web3 연결, eth 단위 변경
it("web3 연결", () => {
// 경로의 가나쉬에서 실행되고 있는 이더리움 클라이언트로 web3 인스턴스 생성
web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:8545"));
});
2. eth 단위 변경
it("ETH 단위 변경", () => {
console.log(web3.utils.toWei("1", "gwei")); // Gwei단위를 wei단위로 변환
console.log(web3.utils.toWei("1", "ether")); // ether단위를 wei단위로 변환
});
3. 최신 블록 높이 받아오기
it("최신 블록 높이", async () => {
const latestBlock = await web3.eth.getBlockNumber();
console.log(latestBlock);
});
4. 전체 주소 가져오기
it("전체 주소", async () => {
accounts = await web3.eth.getAccounts();
console.log(accounts);
});
5. 계정 잔액 조회
it("계정 잔액 조회", async () => {
const balance = await web3.eth.getBalance(accounts[0]);
console.log(balance); // 웨이라는 단위
});
기본 단위는 웨이이고 수수료를 지불할때에는 ether의 단위를 사용한다.
6. 트랜잭션 횟수 조회
it("트랜잭션 횟수 조회", async () => {
const txCount = await web3.eth.getTransactionCount(accounts[0]);
console.log(txCount);
});
7. 트랜잭션 실행
it("트랜잭션 실행", async () => {
// 보내는 사람의 트랜잭션 횟수
const txCount = await web3.eth.getTransactionCount(accounts[0]);
// 보내는 사람의 개인키
const privateKey = Buffer.from(
// ganache에 있는 accounts[0]에 해당하는 개인키 앞 0x를 제외한 값
"eed3e88f4dc250ecb6ab36a2162d80e1d631a3013cd57717fc15436f13e5cb8c",
"hex"
);
// 트랜잭션 애용 객체
const txObject = {
// 보내는 사람의 트랜잭션 횟수를 Hex 변환해놓고
nonce: web3.utils.toHex(txCount),
// 보내는 사람의 계정
from: accounts[0],
// 받는 사람의 계정
to: accounts[1],
// 보낼 금액인데 단위를 wei로 해준다.
// utils.toHex : Hex 단위로 변환 함수
value: web3.utils.toHex(web3.utils.toWei("1", "ether")),
// 10 ** 18 to Hex
// 트랜잭션에서 사용할 가스 최대치
gasLimit: web3.utils.toHex(100000),
// 보내는 사람이 지불할 가스 가격
gasPrice: web3.utils.toHex(web3.utils.toWei("1", "gwei")),
data: web3.utils.toHex(""), // 스마트 컨트랙트와 관련된 data
};
const tx = new ethTx(txObject);
tx.sign(privateKey); //sign이라는 함수가 tx객체에 서명 값을 추가해준다.
console.log(tx);
// serialize함수를 사용해서 내용을 정렬하고
// 객체의 데이터 스트림 생성
// 객체에 저장된 데이터를 쓰기위에 연속적인 데이터를 변환한 것
const serializedTx = tx.serialize();
// sendSignedTransaction 함수로 트랜잭션을 전송
const TxObject = await web3.eth.sendSignedTransaction(
"0x" + serializedTx.toString("hex")
);
console.log(TxObject);
});
가스는 이더리움 네트워크에서 트랜잭션을 보낼때 필요한 수수료이다.
EVM 이더리움 네트워크 머신에서 트랜잭션을 보내면 소모되는 비용이다.
단위는 gewi 단위로 사용한다.
가스비 한도는 트랜잭션을 보내는 쪽에서 트랜잭션의 최대 가스량을 의미한다.
가스비는 지불하는 가스당의 가격이다.
트랜잭션에서 과도한 연산이 들어가는 경우 소모되는 가스양이 가스비 한도를 넘어서면 트랜잭션이 중단된다.
'개발 > BlockChain' 카테고리의 다른 글
[BlockChain] geth (0) | 2022.11.28 |
---|---|
[BlockChain] React 메타마스크 연결하기 (0) | 2022.11.21 |
[BlockChain] ubuntu 환경 설정 (0) | 2022.11.21 |
[BlockChain] TypeScript로 transaction 만들기 (0) | 2022.11.15 |
[BlockChain] TypeScript로 지갑 만들기 (0) | 2022.11.11 |