Skip to content

Instantly share code, notes, and snippets.

@hanpama
Last active June 3, 2019 18:33
Show Gist options
  • Save hanpama/15ff80a639ca2ccdf5fe4e3768058573 to your computer and use it in GitHub Desktop.
Save hanpama/15ff80a639ca2ccdf5fe4e3768058573 to your computer and use it in GitHub Desktop.
브라우저에서 블록체인 구현하기 (암호화폐)

브라우저에서 블록체인 구현하기 (암호화폐)

  • Nimiq (니믹)
  • JavaScript (browser / nodejs)
  • WebRTC, Websocket 기반 통신
  • 소스코드 살펴보기 https://github.com/nimiq-network/core/
    • 패키징이나 모듈화 방식은 표준적이지는 않음.
      • 브라우저 - 노드 네이티브 환경에서 모두 작동하도록 만드는 것이 주요 목적으로 보임
    • 코드 품질 상당히 좋음
    • 브라우저 위에서 돌리기 위해서인지 코드는 바닥부터 새로 작성됨
  • 트랜잭션이 굉장히 빠름 (아직 네트워크 부하가 적어서 그런지 모르겠지만)
  • Universal client 만들기 (데이터 저장, 암호화 함수)
    • 블록체인이 브라우저 위에서 작동하기 위해서는 크게 두 부분을 유니버설하게 작성해야 함
    • 데이터 저장: IndexedDB(브라우저) 또는 LevelDB/lmDB(NodeJS) 에 저장
    • 암호화 함수: Argon2를 웹어셈블리(브라우저) 또는 네이티브 바이너리(NodeJS)로 다르게 컴파일해서 사용하고 있음
  • IndexedDB의 크기 제한으로 인해 모든 노드를 브라우저로만 구성하기는 어려움
    • 결과적으로 디스크 크기에 제한이 없는(또는 거의 없는) NodeJS 노드가 있어야만 하고 이것을 backbone node 라 이름붙임
    • backbone node 꼭 NodeJS일 필요는 없지만 여기에서는 자바스크립트로 된 코드를 공유할 수 있으므로(!) NodeJS를 사용하는 것이 유리
    • Nimiq 에서는 consensus의 종류를 구분하여 전체 블록을 저장하거나 또는 블록 바디를 생략하는 방식으로 블록체인을 싱크하는 데 필요한 저장공간을 다르게 구성

해싱 알고리즘(Argon2)

Argon2 는 CPU 기반의 암호화(hashing) 알고리즘이며 GPU에 최적화되어 있지 않음. (Password Hashing Competition 우승: https://password-hashing.net/)

Argon2 is a 'memory-hard' hashing algorithm

암호 공격자들이 FPGA, 멀티코어 GPU, 또는 전용 ASIC 모듈을 사용해 반복적인 해싱 작업의 비용을 크게 낮추었다.  이러한 새로운 환경들은 메모리를 거의 사용하지 않는 해싱 알고리즘에서는 우수하지만 대용량 메모리를 요구하는 경우에는  어려움을 겪는다. 방어자 측은 많은 양의 메모리를 계산해야 하는 memory-hard 한 함수를 설계, 사용된 메모리가 적으면  연산량에서 불리함을 부과하는 것으로 대응하였다. 암호 해싱 함수인 scrypt 가 이러한 함수의 예이다.

core/src/

main/ # 블록체인 구현
  generic/ # 플랫폼에 상관없이 공유하는 코드. 아래 다섯 개 디렉토리로 구분되어 있다.
    consensus/ # 컨센서스는 full, light, nano로 나뉘고 base는 각 컨센서스 모드가 공유
      base/
        account/
        block/
        blockchain/
        mempool/
        primitive/
        subscription/
        transaction/
      full/ # full consensus
      light/ # light consensus
      nano/ # light consensus
      BaseConsensus.js # FullConsensus, LightConsensus, NanoConsensus 가 상속하는 기본 Consensus 클래스
      BaseConsensusAgent.js # 역시 각 ConsensusAgent 들이 상속하는 기본 ConsensusAgent
      Consensus.js # 각 모드의 consensus의 static 생성함수를 제공하는 shortcut 역할의 클래스
      ConsensusDB.js # consensus 데이터베이스(JungleDB 인스턴스)의 생성과 생성시 옵션(db 이름 등)
      GenesisConfig.js # 네트워크 종류(test, main)으로 구분된 최초 블록 데이터
      GenesisConfigOffline.js
      InvRequestManager.js
      Policy.js # 사토시-코인 비율, 블록 번호-보상 코인수, 블록 타임, 전체 발행량 등 암호화폐 정책에 관련된 함수와 상수 모음
    miner/ # 채굴(mining) 관련 모듈
    network/ # WebRTC, Websocket 기반의 네트워크 구현 
    utils/ # 유틸리티. merkle tree 등 다양함
    wallet/ # 지갑 구현
  platform/ # browser와 nodejs 각각의 플랫폼에서 실행되는 코드
native/ # 암호화 함수(clang)
test/ # 테스트

기타

  • Webdollar 라는 비슷한 컨셉(Argon2, 브라우저에서 작동)의 암호화폐 있음
    • Webdollar는 코드 품질이 좋지 않고, 빌드용 스크립트나 코드 안의 변수명 같은 것이 너무 이상함
    • 블록체인의 브라우저 구현에서는 Nimiq을 참고하는 것이 더 나을 것 같으므로 자세하게 볼 필요 없음.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment