본문 바로가기
프로그래밍/블록체인

[ethereum]ethereum과 통신해보기

by 사바라다 2019. 8. 12.
  1. [ethereum]Ethereum 설치 및 실행
  2. [ethereum]Smart Contract(Lottery 시스템) 제작
  3. [ethereum]ethereum과 통신해보기
  4. [ethereum]Smart Contract(Lottery 시스템)과 통신해보기 - basic
  5. [ethereum]Smart Contract(Lottery 시스템)과 통신해보기 - event & log
  6. [ethereum & java]web3j를 통해 ethereum과 통신해보기
  7. [ethereum & java]Smart Contract(Lottery 시스템)과 web3j를 통해 통신해보기 - basic
  8. Smart Contract(Lottery 시스템)과 web3j를 통해 통신해보기 - event & log

이번주에는 Java를 이용하여 ethereum과 통신을 해보도록 하겠습니다. ethereum은 json-rpc 2.0을 지원하고 있기 때문에 우리는 손쉽게 ethereum의 정보를 가져오거나 smart contarct를 실행하거나 할 수 있습니다. ethereum의 json-rpc 프로토콜은 아래를 클릭하시면 확인하실 수 있습니다.

read doc

그럼 이제 시작해보도록 하겠습니다.

ganache-cli 실행

ethereum 서버를 일단 올리도록 하겠습니다.

아래와 같이 명령어를 칩니다.

ganache-cli -d -m trial
Ganache CLI v6.4.4 (ganache-core: 2.5.6)

Available Accounts
==================
(0) 0x216b71eff622a6ae682743cafcdff9d2a15cd02f (~100 ETH)
(1) 0xc1977670b149443410acb8160995d2fdb99bf37e (~100 ETH)
(2) 0xea513f8005eeff82abb1ee704ff6881a97174338 (~100 ETH)
(3) 0xfcefc5b0f0e086344c68f79acbb73330516914e3 (~100 ETH)
(4) 0xd341a27254405f80c70a82ab530e924a9a9e3663 (~100 ETH)
(5) 0x617b8df8e7a01469eb5284dcc1624bddf2f4a1d0 (~100 ETH)
(6) 0xc4bb86b002d26e7e7f67be403903dbae36ce9b54 (~100 ETH)
(7) 0xb790afe6fd805d269b0fd53dd6398d7e5cb16244 (~100 ETH)
(8) 0x3ff7a9607d65f64d4da92d3bbd151422c5a431be (~100 ETH)
(9) 0x38baeafc4bb7b0b4840da464e339861919d2c4d8 (~100 ETH)

Private Keys
==================
(0) 0x1ce3e63bfbb3474ef7aa53226413cca3a772c43e350bb1a0e693cebaac58ec02
(1) 0x0df9644fbe4a2e91796d2ab3971bfa9e99a0d37b06f0f1d5a771cb70fe853413
(2) 0xab580bb28a0f8245303e7dfb9fa2fc4f204b0f4c45e47b511e7e0c2ac81113ea
(3) 0x5093689df07d6d5423a4f09aeaad8a4fa75331520d59f00fb55b95f2bf713e5c
(4) 0xf1052678f61e3df19d6fb7b5b74c98a81924d532f449970a8c7f08fbda73502e
(5) 0xb3cc27ae7537d13c80d7fdd6b64e560caefaabab16b94d725ab1fc1da6a2c6e3
(6) 0x4229a3c764873524ee4ba9dfadaa76947ce15c8c2da223346d5127f91a358141
(7) 0x945609283736f29205f1e558ff36dbf658578a51b3099142cc3ae04ac66a30f2
(8) 0xc42fd8792ea2ac2bd3b136b2fbd6f1a86b01a6e14ab3e860507418350f1f63ef
(9) 0xd104316a57f530f2802dd694605a00797c12d417786386386ea204397bd34c4a

HD Wallet
==================
Mnemonic:      trial
Base HD Path:  m/44'/60'/0'/0/{account_index}

Gas Price
==================
20000000000

Gas Limit
==================
6721975

Listening on 127.0.0.1:8545

제일 아래의 Listening on 127.0.0.1:8545를 기억해 둡시다. 이 포트는 Json-RPC를 받아들이는 포트입니다.

프로토콜 확인

이제부터 저희에 메인인 java를 이용해 자바의 버전을 가져와 보도록 하겠습니다. 제공되어진 프로토콜은 여기를 확인하시면 됩니다. 그리고 해당 부분을 보시면 예제로써 아래와 같이 나와있습니다.

curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}'

// Result
{
  "id":67,
  "jsonrpc":"2.0",
  "result": "Mist/v0.9.3/darwin/go1.4.1"
}

실제로 동작하는지 확인해보도록 하겠습니다.
테스트에는 curl, postman등 어느것을 사용하셔도 상관없습니다. 저는 curl을 이용해 보도록 하겠습니다.

➜  ~ curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' localhost:8545
{"id":67,"jsonrpc":"2.0","result":"EthereumJS TestRPC/v2.5.6/ethereum-js"}%     ➜  ~ 

정상적으로 응답이 온 것을 확인하였습니다.

Java로 구현

우리는 이것을 Java로 구현하면 정보를 취득할 수 있다는 것을 알 수 있습니다. 저는 Spring Boot를 이용, RestTemplate으로 작성하였으나 일반 자바로도 충분히 확인해볼 수 있습니다.

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;


/**
 * 
 * @author kwanghoyeom
 * The JSON-RPC client event Service.
 */
@Service
public class HttpService {


    private static final String LOCAL = "http://127.0.0.1:8545";


    /**
     * service to communicate with ethereum
     * @param <T>
     * @param JSONInput is data, send to ethereum (json format)
     * @param classes decide result format.
     * @return json data transferred from ethereum
     */    
    public <T> T callEthFunction(String JSONInput, Class<T> classes) 
    {
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);

    HttpEntity<String> param= new HttpEntity<String>(JSONInput, headers);

    RestTemplate restTemplate = new RestTemplate();
    return (T) restTemplate.postForObject(LOCAL, param, classes);
    }
}

generic을 사용하여 조금 복잡해 보이기는 하지만 원리는 간단합니다.

  1. Input Parameter로 json 형식의 데이터
    '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' 와 결과값을 세팅할 dto를 받습니다.
  2. Header에 json형식이라고 명시해줍니다.
  3. Http 형식으로 header와 inputparameter를 묶습니다.
  4. post로 전송한 후 결과값을 확인한다.

결과값 매핑하는 dto Class는 아래와 같습니다.

public class EthResultVO {

    private String jsonrpc;
    private String id;
    private String result;

    public String getJsonrpc() {
        return jsonrpc;
    }

    public void setJsonrpc(String jsonrpc) {
        this.jsonrpc = jsonrpc;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }

    @Override
    public String toString() 
    {
        return "\nGethResultVO{" +
                "jsonrpc='" + jsonrpc + '\'' +
                ", id='" + id + '\'' +
                ", result='" + result + '\'' +
                '}';
    }
}

그럼 이제 Test를 해보도록 하겠습니다.

    @Test
    public void GetClientVersion() throws IOException
    {
        String jsonInput = "{\"jsonrpc\":\"2.0\",\"method\":\"web3_clientVersion\",\"params\":[],\"id\":67}";
        EthResultVO result = httpService.callEthFunction(jsonInput, EthResultVO.class);
        System.out.println(result);
    }

결과가 잘 나오는 것을 확인할 수 있습니다.

GethResultVO{jsonrpc='2.0', id='67', result='EthereumJS TestRPC/v2.5.6/ethereum-js'}

혹시.... 여기까지도 너무 어려우신 분들이 있으실 거 같습니다.
원리만 설명 드리면

  1. ethereum은 json-rpc 프로토콜을 제공
  2. http의 post 방식을 통해 통신 가능(rpc 통신포트)
  3. 프로토콜에 맞춘 개발 진행

여기까지 Java로 ethereum서버와 간단한 통신을 구현해보았습니다. 내용이 미흡한 부분과 더 알고 싶으신 부분이 있으시다면 답글 남겨주시면 확인해보겠습니다 ^^

소스

소스는 아래를 참고하시면 됩니다. 리펙토링이 진행된 부분이 있어 강의내용과는 다릅니다.

test

https://github.com/KoangHoYeom/Ethereum-With-Java-Ver.easy/blob/master/src/test/java/org/BlockChainService/service/EthT.java

http통신
https://github.com/KoangHoYeom/Ethereum-With-Java-Ver.easy/blob/master/src/main/java/org/BlockChainService/domain/service/HttpService.java

result Mapper (dto)

https://github.com/KoangHoYeom/Ethereum-With-Java-Ver.easy/blob/master/src/main/java/org/BlockChainService/domain/dto/EthResultVO.java

감사합니다.

댓글