본문 바로가기

블록체인

[Ethereum/이더리움] Web3

 

이번 글에서는 이더리움 클라이언트에게 요청을 보낼 때 이용할 수 있는 라이브러리인 Web3에 대해서 알아볼 것이다.

 

Web3 라이브러리를 공부하기에 앞서 블록체인 네트워크 상에서 노드 간에 통신을 할 때 사용하는 RPC에 대해 먼저 알아보도록 하자.

 

 

목차

  • RPC
  • Web3 라이브러리
  • 간단한 작업을 통한 Web3 기본 메소드 사용

 

 

1. RPC

 

RPC란 원격 프로시저 호출 ( Remote procedure call ) 이라고 부르며 별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 함수나 프로시저를 실행할 수 있게하는 프로세스 간 통신 기술이다.

 

일반적으로 프로세서는 자신의 로컬  위치에서만 존재하는 함수만 호출하여 실행이 가능하지만 RPC를 사용할 경우 자신의 로컬뿐만 아니라 다른 주소 공간에서도 프로세스의 함수를 실행할 수 있다는 장점을 가지고 있다. 다시 말해, 원격 프로시저 호출을 이용하면 프로그래머는 함수가 실행 프로그램에서 로컬 위치에 있든 원격 위치에 있든 동일한 코드를 이용할 수 있다.

 

즉 RPC 의 장점은 고유 프로세스 개발에 집중할 수 있도록 해주고, 프로세스간 통신 기능을 비교적 쉽게 구현하고 정교한 제어를 할 수 있도록 도와준다.

 

 

RPC 구조

 

 

이더리움 네트워크에서는 이더리움 블록체인 네트워크를 구성하고 있는 노드들을 이더리움 클라이언트라고 부른다. 그리고 우리가 저번 블로그에서 다루었던 이더리움이 제공하는 Geth에서는 RPC를 통해 상호작용 할 수 있는 api를 제공하고 있다. 

 

따라서 이론적으로 배운 RPC를 어떤식으로 요청과 응답이 이루어지는지 알아보는 시간을 가져보자. 저번에 설치했던 가나쉬를 이용해 로컬 이더리움 네트워크를 생성하고 로컬 이더리움 네트워크한테 RPC 요청 curl 형태로 보내도록 해보자.

 

 

 

curl을 사용하는 방법에 대해 간략하게 알아보도록 하자.

 

아래의 코드처럼 curl 명령어와 함께 작성하면 된다.

curl -X POST -H "content-type:application/json" --data '{name:"Jang"}' http://localhost:3000

 

-X : 요청 메소드 작성

 

-H : 요청 헤더 내용 작성

 

--data / -d : 요청 바디 내용 작성

 

 

 

이제 가나쉬에서 생성한 이더리움 클라이언트에 RPC 요청을 보내도록 해보자.

이더리움 클라이언트에 요청을 보낼 때는 다음과 같은 형식으로 요청을 보내야 한다.

 

  • request method : POST
  • request header option : "Content-type:application/json"
  • request body

 

request body에 들어갈 내용은 아래와 같다.

{
    "id": 1337, // 체인 아이디, 선택
    "jsonrpc": "2.0", // 필수
    "method": "eth_accounts", // 필수
    "params": [] // 메소드의 인자값
}

 

  • id : 체인 아이디   ex) 가나쉬게 제공하는 네트워크 체인 아이디 : 1337
  • jsonrpc : JSON으로 인코딩된 원격 프로시저 호출
  • method : 이더리움 클라이언트에서 구현되어 있는 메소드명
  • params : 메소드의 인자값

 

 

이더리움 클라이언트에서 계정 가져오는 법

$ curl -X POST \
    -H "Content-type: application/json" \
    --data '{ "jsonrpc": "2.0", "method": "eth_accounts", "params": [] }' \
    http://localhost:8545

 

 

 

 

2. Web3 라이브러리

 

우리가 위에서 했던 작업들은 curl을 이용해서 RPC 요청을 보내는 방법이었다. 직접 해보면 알겠지만 하나하나 다 적어서 요청을 보는 것이 쉽지않다. 그래서 우리는 curl를 사용하는 대신에 Web3라는 라이브러리를 이용할 것이다.

 

Web3 라이브러리는 이더리움 재단에서 제공해주는 javascript 라이브러리이다. Web3를 이용하면 이더리움 네트워크와 상호작용할 수 있는 다양한 메소드를 제공해주고 좀 더 쉽게 RPC 요청을 주고받을 수 있게 해주는 라이브러리이다.

 

우리는 jest 테스트 코드를 이용해서 Web3 라이브러리에 대한 사용법을 알아볼 것이다.

 

 

우선 Web3를 터미널에서 설치하도록 하자.

$ npm init -y
$ npm install -D jest
$ npm install web3

 

 

Web3 연결 테스트

 

먼저 가나쉬를 통해 실행되고 있는 이더리움 클라이언트는 http에서 동작하는 노드라고 볼 수 있다. 따라서 HttpProvider( ) 메소드를 이용해서 web3 인스턴스를 생성해주었다.

describe('web3 테스트코드', () => {
    let web3
    
    it('web3 연결테스트', () => {
        web3 = new Web3(new Web3.providers.HttpProvider('http://127.0.0.1:8545'))
        console.log(web3)
    })
})

 

 

 

최신 블록 높이 가져오기

 

web3.eth.getBlockNumber( ) 메소드를 사용해서 최신 블록의 높이를 가져올 수 있다.

it('latest Block 높이 가져오기', async () => {
        const latestBlock = await web3.eth.getBlockNumber()
        console.log(latestBlock)
    })
    
// console.log
//    0

 

 

 

전체 accounts 가져오기

 

web3.eth.getAccounts( ) 메소드를 이용해서 해당 노드에 존재하는 계정을을 가져올 수있다. 이후 트랜잭션을 이용할 때 필요한 sender 변수를 첫번 째 계정에 담아두고, received 변수에 두번 째 계정을 담아두도록 하자.

it('전체 accounts 가져오기', async () => {
        accounts = await web3.eth.getAccounts()
        sender = accounts[0]
        received = accounts[1]
        console.log(accounts)
    })
    
console.log
[
      '0x31DA97590b33D62f12253fa07A05940B76D82606',
      '0x17fAe5b4Bb38D67312997038e5d793F79F2ee5f7',
      '0xd5DB124A99E30adD73acF2d28930a4cb1f706e28',
      '0xeEaD5a290662A06677CF2Fef92DCa8343C908e35',
      '0x66d570c0163e7E8A90a77d920b495594b2768dCc',
      '0x1CEB79c02B56De4E40f2Bf9Ee219C460a536d494',
      '0x99e8d53a4F5F22A5a6dAECb0a25cd8a2e86A244B',
      '0xDf450a215FdFB3174B423CC8c43F15E2A06cB0e2',
      '0x8556022fEDBdC753c87447B4e6DBaB241c9102Ea',
      '0x6BCe92A56E430D968e167db0384dCd0D85d1c9dC'
]

 

 

그 외에 web3의 다양한 메소드가 있으니 찾아봐서 더 활용해보는걸로...