--- 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() ```