> For the complete documentation index, see [llms.txt](https://boohyung.gitbook.io/tech/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://boohyung.gitbook.io/tech/development/fabcar.md).

# Writing Your First Application(fabcar)

Source: https\://hyperledger-fabric.readthedocs.io/en/latest/write\_first\_app.html

## Notice

2020-02-11: Fabric v1.4 -> Farbic v2.0 기준으로 업데이트

##

> Working Path: fabric-samples/fabcar

fabcar 어플리케이션을 실행하기 전에 네트워크를 세팅한다.

{% code title="Set the HLF network" %}

```bash
$ ./startFabric.sh
```

{% endcode %}

명령어를 실행하면 아래와 같은 화면이 출력된다. 컨테이너 생성 및 실행 -> 채널 생성 (mychannel로 설정되어 있음) -> 피어 참여 순으로 HLF 네트워크가 구성된다.

![startFabric.sh (1)](https://2837883091-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LL3wrd9YkzoOQE1asZU%2F-LZlYH8YMBO3kimrxqyh%2F-LZlj826mQ2jv8ExJ_dE%2Fimage.png?alt=media\&token=8b33ecd5-db77-422c-9754-c4ca08360001)

![startFabric.sh (2)](https://2837883091-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LL3wrd9YkzoOQE1asZU%2F-LZlYH8YMBO3kimrxqyh%2F-LZljGc-mkQKb-jl9yAW%2Fimage.png?alt=media\&token=ef349282-593b-4c2c-a9bb-ef992b2aee18)

![startFabric.sh (3)](https://2837883091-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LL3wrd9YkzoOQE1asZU%2F-LZlYH8YMBO3kimrxqyh%2F-LZljQGzzit_VY3yR4p5%2Fimage.png?alt=media\&token=7165af71-defb-4930-9bd1-ac7566336880)

startFabric.sh 실행 중 마지막 화면에 Fabcar 어플리케이션을 설치하고 실행하기 위한 인스트럭션이 출력된다. 위 화면은 JavaScript용 인스트럭션이며 Java와 Typescript도 지원한다.

JavaScript 인스트럭션에 따라 Fabcar 어플리케이션을 설치 및 실행해보자. 실행 후 /javascript에 생성되는 파일 및 디렉토리는 아래와 같다.

{% code title="Install the fabcar Dapp" %}

```bash
$ cd javascript
$ npm install
```

{% endcode %}

* enrollAdmin.js: Admin 등록
* invoke.js: 원장 업데이트
* /node\_modules: npm에 의해 설치된 모듈 및 패키지
* package.json: fabcar 어플리케이션 정보
* query.js: 원장 쿼리
* registerUser.js: User 등록
* wallet: admin과 user의 Credentials

HLF 네트워크에 Admin과 User를 등록한다. 명령어 실행 후 /wallet에 admin과 user1의 개인키, 공개키, 인증서가 저장된다.

{% code title="Register admin and user1" %}

```bash
$ node enrollAdmin.js
$ node registerUser.js
```

{% endcode %}

&#x20;mychannel의 fabcar 컨트랙트에 접근하여 원장에 등록된 차량의 정보를 모두 출력한다. (queryAllCars 함수를 호출)&#x20;

{% code title="Query all of the car information" %}

```bash
$ node query.js
```

{% endcode %}

원장을 업데이트하기 위해서 invoke.js 파일을 일부 수정한다. 수정 위치는 44라인의 contract.submitTransaction()의 파라미터이다. 첫 번째 파라미터는 그대로 유지하고, 두 번째부터 차량 식별자, 제조사, 차종, 차 색상, 소유자 순으로 수정한다.

> submitTransaction(): 특정한 트랜잭션을 제출하는 함수
>
> createCar 트랜잭션은 5개의 파라미터를 필요로 함\
> ex: ('createCar', 'CAR12', 'Honda', 'Accord', 'Black', 'Tom')

{% code title="Add car information " %}

```javascript
$ vi invoke.js

//invoke.js
44 await contract.submitTransaction('createCar', 'CAR10', 'Hyundai', 'Genesis', 'Black', 'Boohyung');
```

{% endcode %}

invoke.js를 저장 후 위에서 수정한 내용의 트랜잭션을 보내 공유 원장을 업데이트한다. 업데이트한 결과는 query.js를 실행시켜 아래와 같이 확인할 수 있다.

{% code title="Update and query" %}

```bash
$ node invoke.js
$ node query.js
```

{% endcode %}

![Update result](https://2837883091-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LL3wrd9YkzoOQE1asZU%2F-LZlly61Wso1Wa2zuHGk%2F-LZltNDJGVpNNZJ7ZNKX%2Fimage.png?alt=media\&token=baee866b-1afe-40f1-a305-562b7364181a)

fabcar 어플리케이션 실행 이후에는 docker 명령어로 실행 중인 네트워크를 삭제한다.&#x20;

{% code title="Remove running containers" %}

```bash
$ docker rm -f $(docker ps -aq)
```

{% endcode %}
