---
# System prepended metadata

title: utari_verification
tags: [FinTech, ICT演習]

---

---
title: utari_verification
---
###### tags: `FinTech` `ICT演習`
## utari_verification

## フォルダ構成
【client】新しいユーザアカウントが生成された際の処理
- client.go

【db】DB関連のモジュール
- 【sql/mysql-conf.d】
- dao.go：sqlとの接続
- db_test.go
- insert.go：mysqlを操作するモジュール
- docker-compose.yml：mysqlの設定
- lastdata.json：ドキュメントにて本当はDBで管理したいって言ってたやつ
- dbcounter.txt


【handler】protoとcontrollerを結びつける
- handler.go

【controller】sigverのモジュールを実行し、その値を返すモジュール
- controller.go

【sigver】検証関連のモジュール、ここからdbのモジュールを読んでいる（sigver=signature verification=著名検証）
- block_test.go
- block.go：ブロックの生成を行うモジュール
- keys.go：公共鍵と秘密鍵の生成を行うモジュール
- merkle.go：マークルツリーを実現するモジュール
- transaction.go：Txの生成＆Txプールとのやりとりを行うモジュール
- rpc.go：rpcを実現するモジュール
- verify_test.go
- verify.go：TxIDの確認、アドレスやIDの生成

【proto】utari_apiとのRPC
- utari.pb.go：フロントエンド側が必要な機能を提供するAPI
- utari.proto：Node、履歴、FUNneyの型を宣言
- utari_blockchain.pb.go：Blockchainの状態を確認するためのAPI？
- utari_blockchain.proto：Blockの型を宣言
- utari_common.pb.go：Tx情報を取得するためのAPI
- utari_common.proto：Txの型を宣言（これはutariでもutari_blockchainでも使っている）

## Txの生成手順
1. gRPCの接続
2. 秘密鍵の生成 sigver.GetPrivateKey()
3. 公開鍵の取得 sigver.GetPublicKey(privateKey)
4. 公開鍵をX形式に変換 outaddr := sigver.GenerateAddress(publicKey)
5. sigver.GenerateTxによってTxを作成(引数が謎)

### 4. 公開鍵をX形式に変換
4-1. convertKeyToBytes(publicKey)
　　```return x509.MarshalPKCS1PublicKey(publicKey)```
　　 RSA 公開鍵を PKCS#1 の ASN.1 DER 形式に変換
　　 一般に "RSA PUBLIC KEY" タイプの PEM ブロックにエンコードされる　
  
4-2. getHash160(convertedPublicKey)
　　```rip := ripemd160.New()```
　　```io.WriteString(rip, string(str))```
　　```return rip.Sum(nil)```
  
4-3. base58.CheckEncode(hashedKey, 0)



----
- Dockerfile：RPCサーバを立ち上げるためのコマンド
- Gopkg.lock	
- Gopkg.toml
- LICENSE
- Makefile
- README.md
- docker-compose.yml：mySQLとそれに依存したRPCサーバの設定
- protobuf.sh
- utari.go：ここのコードのてっぺん。デバッグやAeroSpike、gRPCの準備



## Makefile

```shell
.PHONY: [タスク名]
[タスク名]: [実行するタスク]
```

Terminalでの実行
```Terminal
make [タスク名]
```

makeのみで引数を指定しなかった場合、一番上に記述したタスクが実行される

-qオプション image IDのみ表示
```
docker images -q
```

## protocol buffer

1. .protoファイルにmessage formatを定義
2. protocol buffer compilerでコンパイル
3. .pb.goファイルが生成される

コメントアウトは``//``or``/* */``

### Message

```
message Person {
  string name = 1;
  int32 id = 2;  // Unique ID number for this person.
  string email = 3;
}
``` 

#### Repeated
配列

```
message Persons {
  Person person = 1
}
```

#### tag
"=1","=2"はタグ (1 - 15までが望ましい 1byte)
- min: 1
- max: 2^29 = - 1, or 536,870,911
- 19000~19999は使えない 

#### reserved
フィールド(string name=1的な)を削除する際reservedで使えないようにするのが推奨？

```
message Foo {
  reserved 2, 15, 9 to 11;
  reserved "foo", "bar";
}
```

#### Enumration

predefiend list

```
enum Corpus {
    UNIVERSAL = 0;
    WEB = 1;
    IMAGES = 2;
    LOCAL = 3;
    NEWS = 4;
    PRODUCTS = 5;
    VIDEO = 6;
  }
```

#### Map

```
map<key_type, value_type> map_field = N;
```

### Services

```
service SearchService {
  rpc Search (SearchRequest) returns (SearchResponse);
}
```

### Writing Mesasge
```
out, err := proto.Marshal()
```

