develop custom_top_html:no
default debug random = 1 / type = READ / detected = READ

안녕하세요.

쌩광부입니다.

 

이더소셜 PHP API 서버 만들기 강좌를 시작하도록 하겠습니다.

이번 시간에는 실제 프로그래밍에 앞서 기본적인 구조에 대해서 설명하도록 하겠습니다. 

 

ApiStructure.png

 

프롤로그에서 얘기한대로 저희는 Apache2와 PHP를 이용할 예정이고요.

이더리움(geth), 이더소셜(gesn) 등등의 노드에 연결하여 블록정보와 계정잔액을 읽어오게 되고요.

그 자료를 계정별로 분리한 트랜젝션 히스토리를 MySQL에 저장합니다.

 

일반적으로 geth와 같은 노드 데몬에서는 자체적으로 JSON RPC API를 제공하고 있는데요.

그럼 그 API를 이용하면 되지 굳이 왜 별도의 API를 만드는지 궁굼하시죠??

geth의 경우 블록을 생성하고 검증하고 다른 노드와 동기화하는 등등의 기능을 포함하고 있고

계정별로 정보를 가지고 있는 것이 아닌 블록 단위로 저장되므로

계정별 트랜젝션 히스토리를 읽어올 때 상당히 오랜시간이 걸립니다.

또한 그렇게 잦은 호출을 하는 경우 geth에 부하가 증가되어 본연의 노드 기능에 영향을 줄 수 있습니다.

그렇기 때문에 생성되는 블록의 정보를 파악하여 계정별로 별도의 데이터를 저장합니다.

그럼 geth에서 읽을때 보다 훨씬 빠르게 읽을 수 있습니다.

 

1. 계정별 히스토리 정보 저장 방식

서버에서는 블록타임(대략 13초) 보다 짧은 주기로 geth의 JSON RPC로 최신 블록에 대한 정보를 읽어옵니다.

그리고 블록에 포함된 트랜젝션을 확인하여 계정별 인덱스가 가능하도록 MySQL 테이블에 저장합니다.

이때 MySQL 대신 MongoDB 또는 Redis를 이용하셔도 됩니다.

다만 Redis의 경우 메모리 기반의 캐시 데이터베이스이므로 매우 많은 메인 메모리가 필요할 수 있습니다.

 

2. MySQL에 저장하지 않는 정보

계정의 잔액과 트랜젝션의 수, 그리고 토큰의 잔액등은 별도로 MySQL DB에 저장하지 않습니다.

geth의 JSON RPC로 호출하여도 성능에 큰 차이가 없기 때문입니다.

 

3. ERC20 토큰 등록

저희의 API는 ERC20의 토큰에 대한 정보도 표함하고 있는데요.

계정별 히스토리 정보 저장 방식처럼 블록을 읽어와서 그중에 ERC20 토큰 컨트렉트가 생성되었는지 확인합니다.

이더리움의 경우 어떤 트랜젝션이 있을 때 받는 주소가 기록되지 않은 경우 컨트렉트가 생성되는대요.

그때 Input Data값을 확인하여 정상적인 컨트렉트인지 확인합니다.

그후 MySQL에 컨트렉트 주소를 저장해둡니다.

그리고 차후 블록이 생성될때 해당 컨트렉트 주소로 전송한 내역이 있는지 확인하고 그때 ERC20 ABI와 일치하는지 확인합니다.

만약 ERC20 ABI와 일치한다면 그 컨트렉트는 ERC20 토큰이 되는것이겠죠.

이렇게 파악된 ERC20 컨트렉트 주소를 바탕으로 계정별 토큰 히스토리 정보를 저장합니다.

 

4. 트렌젝션의 전송

우리가 만드는 API 서버는 보안을 위해 어떠한 지갑의 Private Key를 가지고 있지 않기 때문에 eth_sendTransaction을 사용할 수 없습니다. 

그렇기 때문에 geth의 eth_sendRawTransaction JSON RPC 명령을 그대로 이용합니다.

 

오늘 강의는 여기까지에요~~!!

관심 있으신 분들은 이더리움 위키의 JSON RPC를 둘러보시는 것도 좋을것 같습니다.

https://github.com/ethereum/wiki/wiki/JSON-RPC

 

다음 시간에는 서버 세팅방법에 대해서 설명하도록 하겠습니다.

좋아요!! 쾅쾅 부탁드립니다.

 

쌩광부, 이더리움, 이더소셜, PHP, API


[알림: 이 게시글은 관리자에 의해 ''에서 '개발'로 이동되었습니다]
24,194
댓글 16
default debug random = 0 / type = READ / detected = READ

List of Articles
번호 분류 제목 추천 수 조회 수 글쓴이 날짜
공지 [조기마감] 디센트 지문인식 하드웨어 월렛 (2/18 ~ 2/24, 선착순 100개 한정) 51 updatefile 17 989
공구관리자
2021.02.17
1485 질문 라이트닝네트워크 노드 도대체 무슨말인지???       도데체 무슨말인지 문과 출신 사람들도 이해할수 있도록 알기쉽게 설명 좀 부탁드립니다.^^        출처 : 코인투데이         라이트닝을 이용한 비트코인 노드의 놀라운 발전속도 지난 몇 개월 동안 암호화폐... 9 file 0 798
rhdwjd
2018.12.13
1484 [강좌] 이더소셜 PHP API 서버 만들기 #2. 서버 환경 설정 안녕하세요. 쌩광부입니다.   이더소셜 PHP API 서버 만들기 2번째 강좌입니다. 이번 시간에는 코딩에 앞서 서버 환경 설정방법에 대하여 설명하도록 하겠습니다.   윈도우에서는 APM Setup을 이용하면 Apache2, PHP,... 7 18 1766
쌩광부
2018.12.12
1483 개발 블록체인 강의 05 - 암호화(2) 국내 대기업 L* 에서 교육한 블록체인 교육 실강입니다.   https://www.youtube.com/watch?v=naSwBOFA_DU&feature=youtu.be                     ------------------------------------- 꼬리말 * 게시글 내용 삭... 5 10 1033
쌍둥아빠
2018.12.12
1482 개발 블록체인 개발자가 되기 위하여 안녕하세요? 금마입니다.  (https://www.ddengle.com/@63285)   2016년 5월 28일 개발을 처음 시작하는 일반인을 대상으로 글을 올린 적이 있습니다.  * 개발공부가 처음이라고요?(https://www.ddengle.com/develop/1... 31 25 5434
금마
2018.12.11
1481 개발 라이트닝 네트워크 노드 돌리기       안녕하세요.    비트코인 확장성 솔루션 중 하나인 라이트닝 네트워크 노드를 돌려보려 합니다.   제가 워낙 프로그래밍에 무지해서 무슨 말인지 잘 모르겠습니다.   관심있으신 분은 아래글을 읽고 조금 더 쉽... 13 file 5 1824
rhdwjd
2018.12.11
1480 비트코인을 현금처럼 쓸수있는 기술 라이트닝 네트워크 _ 블록체인 쿠키     비트코인은 10분에 한 번씩 거래내역들을 받아서 처리합니다. 초당 7건 정도의 거래를 처리할수 있다고 합니다.그러니 초당 거래 수가 7건을 넘어가면 필연적으로 거래가 밀리게 됩니다. 게다가 거래가 밀리지 않... 31 24 2242
도원Dowon
2018.12.11
1479 질문 업비트 매도 주문 에러 문의 업비트 API를 쓰고있는데요   똑같은코드로 매수 매도 가격(body 값만변경)만 변경하여 주문함수가 동작중입니다.   그런데 매수는 이상없이 되는데 매도는 'Jwt의 query를 검증하는데 실패'하였다고 뜨네요   아무리... 2 0 1651
마지막시드
2018.12.10
1478 개발 블록체인 강의 04 - 암호화(1) *** 답변 댓글이 있을 때 글 내용 삭제시 경고 없이 계정이 정지됩니다. *** *** 개인정보가 포함된 경우 혹은 불법적인 요소의 수정은 가능합니다.*** -----------------------------------------------------------... 16 14 1175
쌍둥아빠
2018.12.10
1477 질문 외부 커뮤니티 홍보를 하려면 어디에 하면 좋을지.. 제가 작은 블록체인 개발자 커뮤니티를 만들어서 이 게시판에 홍보를 했다가 경고를 먹고 삭제가 되었는데요.. 홍보를 하고 싶은데 딱히 어디에다가 하면 좋을지 잘 모르겠네요.. 네이버 검색에도 광고를 올리긴 했는... 6 0 538
블록체인나라
2018.12.10
1476 질문 현재 이더리움 메인넷의 코어 크기(사이즈)가 몇기가 정도 되나요?   지금 서버를 임대해서 이더리움을 설치하고 geth 명령으로 이더리움서버를 실행했습니다.   2대를 실행해놨는데 한대는 체인데이타가 360기가가 넘었고 다른 한대(fast모드)는 150기가 정도됩니다...   그런데 360... 1 2 1291
로텔
2018.12.10
1475 ProgPOW는 확실한 Anti-ASIC이 될 수 있을까요? ProgPOW에 대한 의문점 몇 가지.  ProgPOW는 확실한 Anti-ASIC이 될 수 있을까요?   https://eips.ethereum.org/EIPS/eip-1057 ProgPOW에 대하여 오늘 이 페이지를 정독해봤습니다. 아래 내용은 영어 번역이 미흡하여... 29 21 2124
쌩광부
2018.12.09
1474 개발 웹디자이너분 계신가요? 안녕하세요..... 저 혼자 하나 만들었는데 디자인 센스가 없어서 사이트가 허름하네요 ㅠㅠ 웹디자인 도와주실분 없나요???   사이트는 www.weshareluck.io 입니다.   한번 둘러보시고 도와주실분 메일이나 카톡 주세... 4 0 636
친절한냥이
2018.12.09
1473 [강좌] 쌩광부의 모바일 지갑 만들기 #7. 지갑 불러오기 안녕하세요. 쌩광부입니다.   저의 강좌는 오랜시간의 노력과 열정의 결과물입니다. 내용이 길고 지루하더라도, 강좌 내용에 관심없으셔도 "좋아요" 한방 눌러주시면 좋겠습니다. 그럼 더 열심히 강좌를 쓸 수 있겠죠... 9 file 19 1429
쌩광부
2018.12.09
1472 질문 Truffle 관련 질문 (이더리움 Dapp 개발) 거래소 api 공부하다가 최근 이더리움 Dapp 개발에 관심을 두게 되었고 Truffle을 사용하며 공부하고 있습니다.     oraclize 테스트 코드(https://docs.oraclize.it/#ethereum-quick-start)를 써서 공부하고 있는데 ... 3 0 528
빗코매앤
2018.12.08
1471 개발 업비트 호가창 멈춤 (api) api로 트레이딩하는 사람입니다. 오늘 새벽 4시 30분 경에 업비트 호가창이 멈췄는데요. 호가창이 멈췄는데 그 가격을 보고 주문하면 또 체결은 정상적으로 되어 버려서 손해를 봤네요 ㅠ 이번에 저는 이더리움이랑 ... 5 0 911
비락식
2018.12.08
1470 질문 알트제작중 지갑오류 문제 질문...     안녕하세요...   litecoin 8.7.4 버전을 포킹하여 수정제작을 해보고있사옵니다..   월렛 gui 까지 모두 코딩이 완료되었으나..   월렛을 실행을 하게되면 out of sync로 나타나며,, 연동이안되는거같은데요   이... 7 file 0 514
shinpok
2018.12.05
1469 질문 이더리움 코인이안보내집니다 ㅜ           안녕하세요 이더리움 연구중입니다. 테스트넷 패리티로 블록쌓고 동기화까지잘되었습니다. 코인전송받기 테스트중인데 코인받는건 테스트넷 수도꼭지로 잘받아집니다. 받은코인을 메타마스크로 보내려고하... 5 0 480
피로
2018.12.05
1468 질문 소규모 사무실에서 코인 개발하고 인계하고 개발자가 연락이 안됩니다 그나마 코인러인 저에거 문의를 하길래 아는게 트레이딩 인데;;   일단 ,   비트코인 소스로 코인 개발하고, cpu마이닝 까지는 한다고 합니다. GPU마이닝 환경은 안만들어 주고요..   그래서, 탐색기 explorer 있는지... 7 0 1065
쿠키맨
2018.12.05
1467 개발 해킹 불가능한 거래소 idea   로그인 자체가 없고 거래소는 그냥 TV처럼 거래기록만 방송하는 겁니다 거래소 서버는 항상 off-line 으로 동작하니까 해킹 자체가 불가능! 단 문자메시지로 매도,매수주문받고 시간상0.1초라도 최초 제일 빨리 도... 18 0 988
내가총대멘다
2018.12.04
[강좌] 이더소셜 PHP API 서버 만들기 #1. 기본 설계 안녕하세요. 쌩광부입니다.   이더소셜 PHP API 서버 만들기 강좌를 시작하도록 하겠습니다. 이번 시간에는 실제 프로그래밍에 앞서 기본적인 구조에 대해서 설명하도록 하겠습니다.      프롤로그에서 얘기한대로 저... 16 file 23 2738
쌩광부
2018.12.03
Board Pagination Prev 1 ... 10 11 12 13 14 15 16 17 18 19 ... 89 Next
/ 89
default debug random = 0 / type = READ / detected = READ