4. JSON-RPC
JSON is lightweight data-interchange format.
JSON-RPC is a stateless, light-weight remote procedure call protocol.
This specification defines several data structures and the rules around their process,
over sockets, over HTTP, or in many various message passing environments.
It uses JSON (RFC 4627) as data format.
즉, JSON-RPC는 무상태 프로토콜이다.
독립적인 트랜잭션이 가능하고 다양한 프로세스를 통해 메시지를 전달할 수 있는 것.
자세한 내용은 https://github.com/ethereum/wiki/wiki/JSON-RPC 이곳 참조.
5. JSON-RPC
왜 JSON-RPC를 사용할까?
그 해답은 앞서 geth를 통해서 이더리움을 전송하고 계정을 만들었다.
그런데 매번 console에 들어가서 명령어를 치는 것이 아니라, JSON-RPC를 통해 HTTP 통신을
할 수 있다는 것!
JSON-RPC를 통해서 계정을 생성하고 트랜잭션까지 시작해보자.
6. JSON-RPC connect
시작하기 전, 터미널(CMD)가 2개 필요하다.
첫 번째 터미널에서 다음 명령어를 입력한다.
get --networkid 4649 --nodiscover --maxpeers 0 - -datadir /PATH_TO/test_data --mine
--minerthread 1 --rpc --rpcaddr "0.0.0.0" --rpcport 8545 --rpccorsdomain"*" --rpcapi
"admin,db,eth,debug,miner,net,shh,txpool,personal,web3" 2>> /PATH_TO/test_data/geth.log
7. JSON-RPC connect
시작하기 전, 터미널(CMD)가 2개 필요하다.
두 번째 터미널에서 본격적으로 JSON-RPC를 통해 새로운 account를 만들어본다.
curl -X POST -H "Content-Type: application/json"
--data '{ "jsonrpc":"2.0", "method":"personal_newAccount", "param":["pw3"], "id":10}'
localhost:8545
8. JSON-RPC connect
첫 번째 터미널에서 입력한 명령어를 분석하면,
get --networkid 4649 --nodiscover --maxpeers 0 - -datadir /PATH_TO/test_data --mine
--minerthread 1 --rpc --rpcaddr "0.0.0.0" --rpcport 8545 --rpccorsdomain"*" --rpcapi
"admin,db,eth,debug,miner,net,shh,txpool,personal,web3" 2>> /PATH_TO/test_data/geth.log
* mine
- 채굴 활성화한다.
* minerthread 1
- 채굴에 사용할 CPU thread 1개만 적용. (기본값 1)
9. JSON-RPC connect
첫 번째 터미널에서 입력한 명령어를 분석하면,
get --networkid 4649 --nodiscover --maxpeers 0 - -datadir /PATH_TO/test_data --mine
--minerthread 1 --rpc --rpcaddr "0.0.0.0" --rpcport 8545 --rpccorsdomain "*" --rpcapi
"admin,db,eth,debug,miner,net,shh,txpool,personal,web3" 2>> /PATH_TO/test_data/geth.log
* rpc
- HTTP-RPC 서버를 활성화 한다.
* rpcaddr "0.0.0.0"
- HTTP-RPC 서버의 수신 IP. 기본값은 "localhost".
- "0.0.0.0"을 지정하면 어떤 인터페이스에 대해 접근해도 수신한다.
10. JSON-RPC connect
첫 번째 터미널에서 입력한 명령어를 분석하면,
get --networkid 4649 --nodiscover --maxpeers 0 - -datadir /PATH_TO/test_data --mine
--minerthread 1 --rpc --rpcaddr "0.0.0.0" --rpcport 8545 --rpccorsdomain "*" --rpcapi
"admin,db,eth,debug,miner,net,shh,txpool,personal,web3" 2>> /PATH_TO/test_data/geth.log
* rpcport 8545
- HTTP-RPC 서버가 요청을 받기 위해 사용하는 포트 (기본값 8545)
* rpccorsdomain "*"
- 자신의 노드에 RPC로 접속할 IP 주소
- 쉼표로 여러 개를 지정 가능. "*"는 모든 IP 접속을 허용
11. JSON-RPC connect
첫 번째 터미널에서 입력한 명령어를 분석하면,
get --networkid 4649 --nodiscover --maxpeers 0 - -datadir /PATH_TO/test_data --mine
--minerthread 1 --rpc --rpcaddr "0.0.0.0" --rpcport 8545 --rpccorsdomain "*" --rpcapi
"admin,db,eth,debug,miner,net,shh,txpool,personal,web3" 2>> /PATH_TO/test_data/geth.log
* rpcapi "admin,db,eth,debug,miner,net,shh,txpool,personal,web3"
- RPC를 허가할 명령어 지정.
- 기본값은 "eth,net,web3"
12. JSON-RPC connect
시작하기 전, 터미널(CMD)가 2개 필요하다.
두 번째 터미널에서 입력한 curl 명령어를 알아보면,
curl -X POST -H "Content-Type: application/json"
--data '{ "jsonrpc":"2.0", "method":"personal_newAccount", "param":["pw3"], "id":10}'
localhost:8545
method에서 JSON-RPC 서버에서 이뤄질 행위를 정하고, 필요한 파라미터를 param에 담는다.
마지막에 id 부분은 임의의 숫자를 지정하면 된다. 보통 응답과 연결할 때 사용하는 것으로
요청하는 쪽에서 결정한다.
13. JSON-RPC connect
시작하기 전, 터미널(CMD)가 2개 필요하다.
두 번째 터미널에서 입력한 curl 명령어를 알아보면,
curl -X POST -H "Content-Type: application/json"
--data '{ "jsonrpc":"2.0", "method":"personal_newAccount", "param":["pw3"], "id":10}'
localhost:8545
해당 curl 을 입력하고 나온 결과값을 보면,
{"jsonrpc":"2.0", "id":10, "result":"0zxcwetw0gtvgd342rxc0xz"}
으로 결과값이 나온다.
14. JSON-RPC connect
조금 더 다양한 메소드를 실행시켜 보자.
method param result
personal_listAccounts [] 계정 리스트
eth_mining [] 채굴 활성화
eth_hashrate [] 채굴 속도
eth_blockNumber [] 블록 number
eth_getBalance ["계정 값"] 계정 벨런스
personal_unlockAccount ["계정값","PW",300] 계정 잠금 해제
eth_sendTransaction {from:"" , to:"", value:""} 트랜잭션
16. Smart-Contract
스마트 계약은 블록체인에서 동작하는 application 이라고 보면 된다.
스마트 계약을 하기 위해서는 다음 조건이 있다.
1) 튜링 완전성(Turing-Completness)
- 튜링 머신 에뮬레이터에 저장하는 것.(추상적인 수학 개념상의 기계)
- 그냥 무한한 저장공간이라고 이해.
- 이를 통해 세상의 모든 문제를 풀 수 있는 기계 == 튜링기계
* 튜링완전언어
- 모든 수학문제를 풀 수 있는 일반적인 알고리즘을 만들어 낼 수 있는 컴퓨터
=> 튜링완전언어 + 무한 저장공간 == 모든 계산 가능 기계 == 튜링기계(인간의 뇌)
17. Turing-Completness
튜링완전언어는,
1) 프로세스를 충분히 분할할 수 있는 만큼 작은 단위를 사용할 수 있어야한다.
2) 조건 설정과 반복 명령어가 있어야한다.
- if (조건문) + for/while (루프문) = 무한루프(반복)가 가능
= 문제를 풀 때까지 영원히 멈추지 않는 알고리즘 설계가능
그렇다면 왜 명령어의 분할도나 무한루프로 해야할까?
18. Turing-Completness
쉽게 이해하기 위해, 예를 들어보겠다.
"저 피자를 먹어라."
이 명령문으로는 피자를 먹는 것 외에 달리 할 수 있는게 없다.
하지만 튜링의 시점에서 보면, 조금 더 작은 단위로 쪼개볼 수 있다.
+ =
19. Turing-Completness
조금 더 자세히 쪼개면,
배가 고픔을 느낀다 > 눈으로 피자를 확인한다. > 뇌에서 명령을 내리기 위한 전기 스파크 발생
> 전기자극이 뉴런과 시냅스를 거쳐 뻗어나간다. > 근육과 힘줄은 해당 명령을 수신한다.
> 목표물체를 향해 손을 뻗는다. > 손을 뻗어 피자를 잡고 입 근처로 끌어온다. > 피자를 향해 입
을 벌린다. > 이빨로 피자를 끊어서 씹는다. > 씹은 피자를 삼킨다.
20. Turing-Completness
이런식으로 잘게 쪼개게 되면,
1) 각 과정의 중간단계에서 '반복’이 가능해진다. 씹는 과정을 반복할 수 있고, 손을 뻗는 동작만
반복할 수 있다.
2) 응용성이 높아져, 피자 뿐만 아니라 치킨도 집을 수 있고 먹을 수 있다.