이미지를 다 받으셨으면 docker images 명령을 통해서 이미지 리스트를 확인합니다.
1
docker images
baseimage의 경우 Tab를 latest로 태깅을 해야 합니다. 향후 블록체인의 운영모드에서 체인코드 디플로이를 할 경우 baseimage를 통해 체인코드 구동을 위한 Docker 이미지를 만드는데 hyplerledger/fabric-baseimage:latest 를 사용합니다.
1 2
docker tag hyperledger/fabric-baseimage:x86_64-0.2.2 hyperledger/fabric-baseimgae:latest docker images
mkdir -p $GOPATH/src/github.com/hyperledger cd $GOPATH/src/github.com/hyperledger git clone https://github.com/hyperledger/fabric.git cd fabric git checkout v0.6.1-preview
우선 예제 코드를 빌드하여 블록체인 네트워크 상에서 동작을 확인해 봅시다.
MacOS
1 2
cd $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 go build
Windows
1 2
cd %GOPATH%\src\github.com\hyperledger\fabric\examples\chaincode\go\chaincode_example02 > go build
위의 과정을 문제없이 완료하였으면 chaincode_example02 디렉토리 하위에 chaincode_example02 라는 이름으로 실행파일이 생성되었을 겁니다.(Windows는 chaincode_example02.exe ) 개발모드에서는 이 실행파일을 몇 개의 환경변수와 함께 실행하기만 하면 블록체인 런타임에서 트랜잭션 테스트가 가능한 상태가 됩니다.
스마트 컨트랙의 배포
체인 코드를 validating peer 컨테이너에 복사해 넣고 rest api로 deploy만 호출하면 블록체인 네트워크 전체에 코드가 적용됩니다.
다음은 운영모드에서 어떻게 체인크도그 반영되는지를 보여줍니다.
체인코드의 디플로이 프로세스
운영모드에서 체인코드 디플로이가 요청되면 요청을 받은 Peer는 블록체인 네트워크상에 연결되어 있느 모든 피어에게 동일한 체인코드를 전송합니다.
체인 코드를 받은 각 validating peer는 체인코드르 빌드하여 체인 구동을 위한 docker-image를 만들고, 실행하게 됩니다.
validating peer는 docker remote api서비스에 체인코드를 위한 docker-image 생성 및 실행을 요청하고 docker-engine은 hyper ledger/fabric-baseimage를 이용하여 체인코드 docker이미지를 생성하고 실행합니다.
Validating Peer의 수정
docker machine은 VM 환경을 만들 때 기본적으로 https 통신을 하도록 docker 엔진을 구동하고, validating peer 가 docker engine api 에 요청하기 위해서는 블록체인의 ssl certificate를 가지고 있어야합니다.
이렇게 validating peer 가 ssl certificate를 가지기 위해 다음과 같은 절차를 거칩니다.
실행중인 validating peer 컨테이너에 certificate들을 복사합니다.
실행중인 Validating Peer 컨테이너에 터미널로 접속해서 설정파일을 수정합니다.
Validating Peer에서 빠져나와서 실행중인 Validating Peer 컨테이너를 새로운 이미지 명으로 commit 합니다.
새로 생성된 이미지로 Validating Peer를 다시 구동합니다.
컨테이너에 ssl 인증서 복사
1 2 3 4 5
컨테이너에서 로컬로 복사 docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
로컬에서 컨테이너로 복사 docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
인증서 위치
1 2 3
$ cd $HOME/.docker/machine/machines/blockchain $ mkdir key $ cp {cert,ca,key}.pem key
도커 컨테이너 아이디 확인
1
docker ps
컨테이너에서 Peer의 설정파일에 인증서 위치를 명시
1 2 3 4
docker exec -it 컨테이너ID bash
위 그럼을 기준으로 명령 예는 다음과 같습니다. docker exec -it 4409df7072c4 bash
Rest API 란 WWW 과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식으로 자원을 정의하고 자원에 대한 주소를 지정하는 방법 전반에 대한 패턴이다.
좀 더 쉽게 말하자면, REST API 란 인터넷이라는 정보의 바다에서 정보를 주고받는 활동을 인터넷에 있는 자원과 자원의 위치를 명시 하는 일종의 방법론이자 아키텍처이다. API 설계의 핵심은 자원을 사용하는 것이고 HTTP method 를 통해 자원을 처리하는 양식을 일컷는다.
Characteristics of REST API
Uniform Interface URI로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행합니다. 이는 REST API 의 핵심이며, 자원과 자원에 대한 행위(HTTP method) 를 명확히 구분하고 준수합니다.
Stateless REST 는 상태를 가지지 않습니다. 즉, 작업을 위한 상태 정보를 저장하고 관리하지 않기에 서버는 들어오는 요청만 단순히 처리하면 됩니다. 이를 통해 구현이 간편해 집니다.
Cacheable HTTP라는 기존 웹표준을 그대로 사용하기 때문에, Http가 가진 캐싱 기능을 사용할 수 있습니다.
Self descriptiveness REST API uri 만 보고도 이를 쉽게 이해할 수 있는 자체 표현구조로 되어있습니다.
Client-Server 구조 자원을 제공자인 Server 와 사용자인 Client 가 명확히 구분되기에 의존성이 없습니다.
계층형 구조 REST 서버는 다중 계층으로 구성될 수 있으며 보안, 로드 밸런싱, 암호화 계층을 추가해 구조상의 유연성을 둘 수 있고 PROXY, 게이트웨이 같은 네트워크 기반의 중간매체를 사용할 수 있게 합니다.
객체지향 프로그래밍 이란 그 이전의 프로그래밍이 컴퓨터가 하는 동작 즉, 명령 단위의 프로그래밍을 벗어나 인간이 사고하는 방식 그대로를 표현할 수 있는 방식으로 프로그래밍을 하는 프로그래밍 패러다임을 의미한다.
객체지향 프로그래밍 에서는 실제 생활의 행동과 사물 그대로를 프로그램 상에서 표현하며 모든 프로그래밍은 이러한 ‘객체’ 를 기반으로 움직이게 된다. 여기서 객체라 하면 속성(attributes) 과 행위(method)를 가지는 일종의 데이터이다.
이러한 객체지향 프로그래밍에서는 코드 재사용성과 확장성을 위해 상속(inheritance) 이라는 개념이 존재하는데, 이는 class 와 prototype 의 형태로 나타난다.
먼저 class based language 에서는 object 보다 항상 class 가 먼저 정의되어야 하며, object 는 이러한 class 를 통해 생성된다. Class 를 통해 instantiate 된 객체를 instance 라고 하며, 이렇게 생성된 instance 는 class 의 속성에 따라 일관된 방식으로 통제될 수 있다. 이러한 class based language 에서는 특정 class 를 inherit 하여 코드 재사용성과 확장성을 늘릴 수 있는데, 이렇게 상위 class 를 inherit 받아 새로운 class 가 생성되면, 상위 class 를 super class 상속받은 클래스를 subclass 라고 부른다.
prototype-based language 에서는 class 라는 개념이 없으며, prototype 이라는 개념을 통해 object 자체를 복사하고 확장한다. 가령 javascript 와 같은 언어들이 이러한 갈래에 속하지만 시간이 지남에 따라 javascript 에서도 class 를 지원하면서 그 성격이 변화하고 있다.
이러한 객체지향 프로그래밍의 장점은 재사용성이 매우 높다는 것이다, 특정 객체가 수행하는 역할과 특성을 명확하게 규정해 놓으면 다른 개발자들은 해당 객체를 간편하게 가져다 쓸 수 있다. 이는 프로그램의 기능인 도메인 단위로 객체들이 잘 나뉘어 있기 때문이며, 가령 함수의 이름이나 클래스의 이름만으로도 해당 객체의 특성을 손쉽게 유추하고 사용할 수 있는 특성이 있다.
하지만, 이러한 OOP 에도 단점이 존재하는데, 아는 procedural program 에 비해 코드라인이 길고 특정 기능을 수행하기 위해 많은 명령어가 수행되기 때문에 상대적으로 성능이 좋지 않은 부분이 있다.
또한, 각 개체가 저마다의 상태를 가지기 때문에, 예상치 못한 상태의 불일치로 예측할 수 없는 상태를 가지게 되는 경우가 있어 어플리케이션 내부에서 버그를 가지는 경우가 있다. 이를 해결하기 위한 방안으로 functional programming 이 대두되고 있는데, 그 핵심은 바로 모든 기능을 수학적 함수로 계산하는 것으로 취급하여 최대한 상태변화 혹은 mutable data 를 변경하지 않는 것을 원칙으로 한다. 가령, 함수형 프로그래밍 에서는 pure function 이란 개념을 매우 중요하게 여기는 데 이는 같은 입력값을 주면 항상 같은 결과가 나오는 함수로 전역 변수나 혹은 특정 시스템의 상태에 좌우되지 않는 pure 한 함수를 의미하고 이러한 pure function 은 시스템의 안정성을 높여주는 핵심적인 역할을 한다.
yarn add nuxt-property-decorator && # property decorator installation yarn add tsconfig-paths-webpack-plugin &&# webpack 에서 typescript 를 사용하기 위한 세팅 yarn add ts-loader && # typescript 사용을 위한 ts-loader 설치 yarn add vuex-class && # Vuex 를 class 타입으로 사용하기 위해 설치 yarn add nuxt-sass-resources-loader && # For using sass yarn add sass-loader # for using sass
타입스크립트를 트랜스파일링 하기 위해 webpack configuration을 바꾸어 주어야 한다.
이는 nuxt.config.js 에서 webpack configuration 을 overriding 함으로써 구현한다.
기본적으로 plugin 을 등록하면 오직 context 혹은 vue instance 내에서만 사용 가능하다. 하지만 store 혹은 여러 곳에서 이 함수 혹은 인스턴스에 접근하고자 한다면 inject 함수를 이용하여 전역에서 사용가능하게 등록시켜 주어야 한다.
아래처럼 'sample' 과 같이 $ 기호를 생략하고 등록해 주면 $sample 과 같이 변형되어 바인딩 된다.
1 2 3 4 5 6 7 8 9 10 11 12
exportdefault (context, inject) => { let sample = a => { console.log(a); }; let sample2 = { b: x => { console.log(x); } }; inject('sample', sample); inject('sample2', sample2); };
이를 통해 context, Vue 인스턴스 내에서의 this 등 어디에서는 이곳에 접근할 수 있게 된다.
Reverse proxy
클라이언트가 서버를 호출하는 경우 cors(cross origin resource sharing 문제로 브라우저 내에 렌더링 된 페이지를 준 호스트가 아닌 다른 곳으로의 요청은 기본적으로 막혀있다.
사실 이는 nuxt.js 뿐만이 아니라 대부분의 웹 어플리케이션 배포 과정에서 나타나는 문제인데, nuxt.js 에서는 그 해결과정이 조금 다르기 때문에 작성한다.
다른 어플리케이션 배포과정의 경우 일반적으로 nginx 와 같은 web server 를 사용하여 reverse proxy 를 통해 클라이언트 내의 서버 요청 url 을 같은 호스트로 설정하고, 같은 호스트로 오는 요청의 url 을 분석하여 같은 호스트 내의 다른 포트로 리다이렉팅 시켜주는 등의 해결법을 제시하지만, nuxt.js 의 경우 server rendering 프레임워크로 독자적으로 hosing 을 하는 만큼, 자체적으로 reverse proxy 를 제공하며, nuxt.config.js 파일에 다음과 같이 reverse proxy 설정을 주어 해결할 수 있다.