- [ethereum]Ethereum 설치 및 실행
- [ethereum]Smart Contract(Lottery 시스템) 제작
- [ethereum]ethereum과 통신해보기
- [ethereum]Smart Contract(Lottery 시스템)과 통신해보기 - basic
- [ethereum]Smart Contract(Lottery 시스템)과 통신해보기 - event & log
- [ethereum & java]web3j를 통해 ethereum과 통신해보기
- [ethereum & java]Smart Contract(Lottery 시스템)과 web3j를 통해 통신해보기 - basic
- Smart Contract(Lottery 시스템)과 web3j를 통해 통신해보기 - event & log
이번주에는 Java를 이용하여 ethereum과 통신을 해보도록 하겠습니다. ethereum은 json-rpc 2.0을 지원하고 있기 때문에 우리는 손쉽게 ethereum의 정보를 가져오거나 smart contarct를 실행하거나 할 수 있습니다. ethereum의 json-rpc 프로토콜은 아래를 클릭하시면 확인하실 수 있습니다.
그럼 이제 시작해보도록 하겠습니다.
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을 사용하여 조금 복잡해 보이기는 하지만 원리는 간단합니다.
- Input Parameter로 json 형식의 데이터
'{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' 와 결과값을 세팅할 dto를 받습니다. - Header에 json형식이라고 명시해줍니다.
- Http 형식으로 header와 inputparameter를 묶습니다.
- 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'}
혹시.... 여기까지도 너무 어려우신 분들이 있으실 거 같습니다.
원리만 설명 드리면
- ethereum은 json-rpc 프로토콜을 제공
- http의 post 방식을 통해 통신 가능(rpc 통신포트)
- 프로토콜에 맞춘 개발 진행
여기까지 Java로 ethereum서버와 간단한 통신을 구현해보았습니다. 내용이 미흡한 부분과 더 알고 싶으신 부분이 있으시다면 답글 남겨주시면 확인해보겠습니다 ^^
소스
소스는 아래를 참고하시면 됩니다. 리펙토링이 진행된 부분이 있어 강의내용과는 다릅니다.
test
result Mapper (dto)
감사합니다.
'기타 > 블록체인' 카테고리의 다른 글
[Ethereum]Ethereum의 Transaction 처리 Life Cycle 분석 (0) | 2019.08.23 |
---|---|
[ethereum] Smart Contract(Lottery 시스템)과 통신해보기 - basic (2) | 2019.08.21 |
Smart Contract(Lottery 시스템) 제작 _ 쉽게 수정 예정 (0) | 2019.08.08 |
[ethereum] Ethereum 설치(truffle / ganache-cli) 및 실행 (1) | 2019.07.25 |
솔리디티 함수(function)에 대해서_1. 가시성(visible) (0) | 2019.06.16 |
댓글