Runtime Permission

|

Permission

안드로이드에서 App이 단말의 특정 기능을 이용하려면 권한을 가져야 합니다. 특정 기능은 예로 들어 다음과 같은 기능들이 있습니다.

  • 파일 읽고 쓰기
  • 네트워크 사용, 인터넷 접속
  • 카메라 사용
  • 문자 메세지, 주소록 읽기 등

기존에는 AndroidManifest.xml 파일에 개발자가 사용하려는 권한을 등록하게 되어 있었고, Google Play 등의 마켓에서 해당 App을 설치할 때 사용자가 권한 확인을 하도록 했습니다. 그리고 사용자가 원하지 않는 권한이 있을 경우, 그 App을 아예 이용할 수 없도록 했었습니다.

하지만, 6.0 M(마시멜로우) 버전부터는 권한 획득 방법이 바뀌었습니다. App이 실행할 때 사용자에게 권한을 요청하도록 되었으며, 사용자가 특정 권한을 원하지 않을 경우 해당 기능만 빼고 동작할 수 있도록 되었습니다. (물론, App 개발자가 사용자가 권한을 허가하지 않았을 때의 동작도 구현해놓아야 합니다.)


예제

다음 예제는 외부 저장소에 파일을 쓸 수 있는 권한을 요청하는 예제입니다.

  static final int PERMISSION_REQUEST_CODE = 100;

  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      if (checkSelfPermission(permission.WRITE_EXTERNAL_STORAGE)
          != PackageManager.PERMISSION_GRANTED) {
        String[] permissions = new String[]{permission.WRITE_EXTERNAL_STORAGE};
        requestPermissions(permissions, PERMISSION_REQUEST_CODE);
      }
  }

  @Override
  public void onRequestPermissionsResult(int requestCode, String permissions[],
      int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    switch (requestCode) {
      case PERMISSION_REQUEST_CODE:
        if (grantResults.length > 0
            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
          Toast.makeText(getApplicationContext(), "Permission 완료", Toast.LENGTH_SHORT).show();
        } else {
          Toast.makeText(getApplicationContext(), "Permission 실패", Toast.LENGTH_SHORT).show();
        }
        break;
    }
  }

작업 관련 명령어들

|

최근에 []구글 클라우드 플랫폼(GCP, Google Cloud Platform)](https://console.cloud.google.com/)을 이용해서 폴로닉스(Poloniex) 비트코인 랜딩봇을 돌려보고 있습니다. 그런데, 구글 클라우드 플랫폼에 SSH 터미널로 접속해서 랜딩봇을 실행한 후 터미널을 빠져나오면 해당 프로그램이 항상 종료가 되어서 다음 명령어들을 찾아보고 공부해보게 되었습니다.


프로그램 실행

터미널에서 랜딩봇을 실행하는 명령어는 다음과 같습니다. (다음 번에 터미널에서 복사해서 붙여넣기 편하게 하기 위해서 적어봅니다.)

python lendingbot.py


또는 데몬형태의 백그라운드로 돌릴 수도 있습니다.

python lendingbot.py &


그리고 해당 프로세스가 잘 돌아가는지 확인하는 것은 다음 명령어를 이용해서 확인할 수 있습니다.

ps -efc | grep python


또한 실행중인 프로그램을 잠깐 멈추는 방법은 Ctrl + Z 키를 누르면 됩니다. 프로그램은 ‘Stopped’ 상태가 됩니다.

Job control commands in Linux

  • jobs : 작업 리스트를 출력합니다.
  • bg [job id] : 해당 id의 작업을 백그라운드로 보냅니다. '&'를 이용해서 프로그램을 실행한 거랑 동일한 효과입니다. 백그라운드로 보내면서 프로그램은 'Running' 상태가 됩니다.
  • fg [job id] : 해당 id의 작업을 포어그라운드로 가져옵니다.
  • kill [job id] : 해당 id의 작업을 정리합니다.
  • disown [job id] : 해당 id의 작업의 소유권을 지워버립니다. 원래는 해당 작업의 소유권을 터미널이 갖게 되는데 이 명령어를 이용하면 해당 소유권이 지워지고 터미널을 로그아웃해도 프로그램은 계속 동작하게 됩니다. disown 뒤 작업 id가 오류를 내기도 하는데, 그런 경우는 disown 만 단독으로 사용할 수도 있습니다.
  • nohup [명령어] : 터미널에서 종료를 해도 명령어 부분이 계속 실행되도록 하는 명령어 ex) nohup python lendingbot.py &

블록체인과 사이드체인

|

블록체인 또는 비트코인을 공부하다보면 컬러드 코인(Coloredcoin), 메타코인(Metacoin), 멀티시그(Multi-Sig) 등의 용어들이 등장합니다. 그러면서 사이드체인(Sidechain)이라는 용어도 등장하게 될텐데, 사이드체인이란 무엇을 말하는 것인지 포스팅해보도록 하겠습니다.

image -fullwidth


사이드체인이란

사이드체인이란 서로 다른 블록체인들 위에 존재하는 자산들(Assets, 쉽게 말해서 코인들)을 쉽게 거래할 수 있도록 하는 기술입니다. 예를 들면 비트코인의 자산과 이더리움의 자산을 서로 거래할 수 있다는 말입니다. 현재 수많은 블록체인 기반의 암호화폐들이 등장하고 있는데, 상당수의 화폐들은 사이드체인 기반으로 구현되어 있습니다. 왜 사이드체인을 이용할까요?

쉽게 생각해보면 비트코인이나 이더리움이나 각각의 화폐들은 장단점이 있고, 누군가 자기 입맛에 맞도록 수정하는게 어렵습니다. 그렇다고 새로운 화폐를 만들려고 하니, 아무래도 제일 문제가 되는 건 해당 화폐의 블록체인을 돌리고 있는 노드수입니다. 새로운 화폐이다보니 노드 수가 얼마 안되고 이는 ‘51퍼센트 공격’이나 다양한 공격에 쉽게 노출이 되는 문제가 발생하게 됩니다. 그래서 신규 화폐들은 사이드체인을 이용해서 기존에 많이 퍼져있는 비트코인이나 이더리움의 리소스를 활용하고 그 위에 자신의 입맛에 맞는 화폐를 구축하는 방법을 많이 사용합니다.


비트코인의 단점들

가장 대표적인 블록체인기반 가상 화폐는 비트코인입니다. 가장 먼저 나와서 많은 점유율을 갖고 있지만, 그만큼 가장 오래된 기술로 구현되어 있습니다. 대표적인 비트코인의 단점들은 다음과 같습니다.


성능

비트코인은 느립니다. 마이닝 속도가 약 10분 정도라서 느린 것도 있지만, 블럭 사이즈 한계(현재 1MB로 맞춰져 있습니다.)도 있고 다양한 문제점들이 있어서 속도 문제가 많이 발생합니다. 심한 경우 송금을 했을 때 몇 주씩 걸리는 경우도 있을 정도입니다.

비트코인만 거래 가능

당연하겠지만 비트코인 블록체인 상에서는 비트코인 거래만 가능합니다. 각 업체들의 입맛에 맞는 다른 코인들의 거래는 불가능합니다. 예를 들어 익명성이 보장된 코인을 만들거나 하는 것도 불가능합니다.

다양한 서비스로의 확장 불가능(스마트 컨트랙트 미지원)

비트코인은 화폐 거래에만 목적으로 만들어졌기 때문에, 블록체인 기반의 다른 서비스로의 확장은 많이 어렵습니다. 블록체인 기반의 대표적인 서비스인 ‘스마트 컨트랙트(Smart Contract)’나 탈중앙화 어플리케이션(DApp, Decentralized Application)은 비트코인 위에서는 거의 불가능합니다.


사이드체인의 원리

그러면 과연 어떤 방식으로 다른 블록체인에서 비트코인을 거래할 수 있다는 것일까요?

담보물을 맡기고 돈을 빌리는 것을 생각하면 됩니다. 비트코인 소유자가 다른 블록체인 위에서 거래를 하고자 할 때, 기존 비트코인을 ‘동결(Freeze)’시킵니다. 그리고 이 비트코인에 해당하는 ‘대체물(Counterpart)’을 만들어 교환하게 됩니다. 이렇게 만들어진 대체물은 사이드체인 위에서 얼마든지 입맛에 맞게 사용되어질 수 있고, 나중에 비트코인으로 다시 교환해갈 수 있습니다.


사이드체인의 시사점

사이드체인을 이용하여 서로 다른 블록체인간 거래를 할 수 있다는 점은 시사점이 큽니다. 다양한 장단점이 있는 수많은 블록체인들이 서로 긴밀하게 거래가 되고, 한 군데서 관리까지 가능한 형태가 될 수 있습니다.

비트코인이 갖고 있는 약점인 속도나 확장성, 익명성(장점이자 약점인) 등은 사이드체인을 통해 또 다른 블록체인 위에서 극복이 가능합니다.

또한, 새로 만들어지는 블록체인은 사이드체인을 이용해서 비트코인의 해시파워 기반의 보안성이나 무결성을 획득할 수 있습니다.

블록체인, 51퍼센트 해킹은 어떻게 일어나는가?

|

image -fullwidth


블록체인은 해킹이나 데이터 위변조에 아주 강력하다고 알려져 있습니다. 하지만, 항상 따라붙는 말은 ‘완벽한 보안 솔루션은 없다, 블록체인의 경우 리소스의 과반수 이상을 독점하면 해킹이 가능하다.’ 라는 말입니다.

사실 블록체인 중에서도 비트코인에 해당하는 말이긴 하지만, 과반수, 즉 51% 이상의 리소스를 독점할 경우 어떤 식으로 해킹이 일어날 수 있을까요?


블록체인 분기

비트코인에서는 종종 다음 블록이 동시에 발견되는 경우가 발생합니다. 아무래도 전 세계에 뿌려져있는 노드들이 많다 보니 그 중에서는 다음 블록의 해시값을 동시에 찾는 노드들도 분명히 생길 수 있습니다. 물론 그 빈도가 낮은 편에 속하지만, 2015년 기준으로 1주일에 1~2번 발생할 수 있다는 글을 본 적이 있습니다. (지금은 노드 수가 훨씬 더 많아졌으니 더 자주 발생하겠죠.)

다음 블록 해시값을 찾은 노드들은 재빠르게 이웃 노드들에게 그 값을 전파시키는데, 만약 해시값을 찾은 노드들이 여러 개 있을 경우 그 사이에 있는 노드들은 양쪽에서 그 값을 전달받게 됩니다. 이 때 시간차가 발생하게 되면 각 노드들은 먼저 전달받은 노드의 정보를 우선시하고 나중에 전달받은 정보는 무시하게 됩니다.

image -fullwidth

결국 위 그림과 비슷한 형태로 2개 이상의 체인이 발생하는 현상이 발생하게 되고, 이 경우 각자 자기가 알고 있는 진짜 블록을 기반으로 그 다음 블록의 해시값을 계산하게 됩니다. 그리고 그 다음 해시값을 찾게 된 경우 계속해서 블록을 쌓게 됩니다.

그러다보면, 나누어진 체인들마다 블록의 길이가 다르게 될 것이며, 블록체인 알고리즘에서는 이 중 가장 긴 블록을 채택합니다. 즉, 가장 많은 작업 증명(PoW, Proof of Work)이 이루어진 블록을 신뢰한다는 원칙을 갖고 있습니다.


51퍼센트 공격

자, 그러면 51퍼센트 공격은 어떤 방식으로 이루어질 수 있는지 알아보겠습니다.

해시 파워의 절반 이상을 독점하는 노드가 있다면, 해킹이 가능해집니다. 블록체인 특성상 지나간 노드들을 해킹하는 건 거의 불가능에 가깝지만, 앞으로 쌓을 블록을 해킹하는 건 충분히 가능성이 높습니다.

51퍼센트 공격을 하는 구체적인 방법은 다음과 같습니다.

해시 파워의 절반 이상을 가진 노드가 마이닝을 통해 해시값을 찾더라도 이웃 노드들에게 전파를 하지 않습니다. 그리고 그 다음 블록을 계속해서 만들어갑니다. 과반수 이상의 해시 파워를 갖고 있기 때문에 다른 마이너들보다 긴 블록체인을 만들 수 있는 가능성이 높습니다.

즉, 비트코인에서 가장 긴 블록체인이 올바른 블록체인이며 짧은 블록체인을 파기하는 특성을 이용한 공격입니다.

요즘은 단독으로 마이닝을 하지 않고, 연합을 형성하여 마이닝 풀(Mining Pool)을 형성해서 작업하는 경우가 많기 때문에 51퍼센트 공격의 가능성이 과거에 비해서 많이 높아진 상태입니다. 이더리움(Ethereum)같은 경우는 이러한 문제점들을 해소하기 위해서 계산 능력에 대한 독점을 하기 쉬운 ASIC에 대한 내성이 있는 Ethash라는 프로토콜과 약소 마이너들도 불리한 상황을 극복하고 보상을 받을 수 있는 GHOST 프로토콜을 준비하기도 했습니다.

51퍼센트 공격은 비트코인이 처음 나올 때부터 나오던 약점이며, 실제로는 그런 일이 발생할 가능성은 현저하게 낮다라는게 그에 대한 반박이었습니다. 하지만, 전 세계 비트코인의 해시 파워 절반 이상을 중국이 가져가게 되고 거대 마이닝 풀들이 생겨남에 따라 살짝 걱정은 되는 수준까지는 도달한 거 같습니다. 그래도 개인적인 생각으로는 비트코인의 경우는 너무나 거대하고 많은 노드들이 있기 때문에 51퍼센트 공격은 현실적으로는 아직 불가능에 가까울 것 같긴 합니다.

Hyperledger 소개

|

Hyperledger Project

image -fullwidth

하이퍼레저는 Linux Foundation으로 진행되고 있는 블록체인 오픈소스 중 하나입니다. 하이퍼레저 프로젝트의 창립 멤버였던 IBM이 44,000 라인의 블록체인 소스를 Hyperledger Fabric에 기부하면서 본격적인 프로젝트화가 진행되었습니다.

하이퍼레저는 다음과 같은 기능들을 제공합니다.

  • 체인코드(Chaincode)를 통한 스마트 컨트랙트(Smart Contract)
  • 디지털 자산(Digital Assets)
  • 저장 시스템 & 기록 보관소
  • 분산 합의 네트워크
  • 플러그인 형태의 합의(Consensus) 알고리즘


하이퍼레저 구조

하이퍼레저는 다음과 같은 구조로 되어 있습니다.

image -fullwidth

크게 Membership, Blockchain, Chaincode로 이루어져 있다고 생각할 수 있습니다. Membership을 통해 가입이나 참여자의 신원 확인 등을 할 수 있고, Blockchain은 HTTP/2 기반의 P2P 분산 장부 프로토콜이 구현되어 있습니다. Chaincode 부분은 일반적인 스마트 컨트랙트 부분이라고 생각하시면 되고 여기에서 다양한 서비스들이 응용되어질 수 있습니다.


Hyperledger White Paper

Hyperledger Whitepaper

하이퍼레저 백서는 20페이지 가량으로 간단하게 소개를 하고 있어 읽어볼만한 문서입니다.


하이퍼레저 프로젝트들

하이퍼레저는 크게 다음과 같은 프로젝트들로 이루어져 있습니다.

  • Blockchain Explorer
  • Fabric
  • Iroha
  • Sawtooth Lake

Blockchain Explorer는 블록체인 런타임의 다양한 정보를 모니터링하기 위한 웹기반 어플리케이션을 개발하는 프로젝트입니다.

Fabric는 블록체인 엔진을 다루고 있는 프로젝트이며, 가장 중심이 되는 프로젝트라고 볼 수 있습니다. 최근에 0.6에서 1.0으로 버전업이 되었습니다.

Iroha는 기존 시스템에 블록체인의 분산 원장을 쉽게 도입시키려는 목적을 가진 프로젝트입니다. 대표적으로 다음과 같은 특징을 갖고 있습니다.

  • 기존 시스템에 쉽게 연동
  • 최신 도메인 지향 C++ 디자인
  • Mobile Application 지원 강화
  • 비잔틴 장애 허용 알고리즘(Sumeragi) 채택

Sawtooth Lake는 인텔(Intel)의 모듈라 방식의 블록체인 제품군으로 기존 산업에 블록체인을 활용할 수 있도록 하기위한 프로젝트입니다.


Hyperledger Fabric

위 프로젝트들 중에서 Fabric는 하이퍼레저의 핵심 프로젝트로 블록체인 엔진을 다루고 있습니다. 문서화도 상당히 잘되어 있으며, 최근에 1.0 버전으로 업데이트 했습니다.

1.0 버전이 되면서 개인 인증 부분에 아주 큰 변화가 있었고, 사용자별로 인증할 수 있는 기능이 추가되었습니다.

image -fullwidth