国産仮想通貨KOTOの作業メモ


Ubuntu, CLIでkotoの基本的な使い方のメモです。 GUIは飾りなので使いません。 
[こちら](http://askmona.org/7853?n=1000)のスレッドの内容を追いかけつつ、手を動かしてみたメモです。  


## koto ウォレットのインストール
基本的にこちらに書いてあるとおり。  
https://github.com/koto-dev/koto/wiki/%E8%A7%A3%E8%AA%AC

```
$ sudo apt-get install build-essential pkg-config libc6-dev m4 g++- multilib autoconf libtool ncurses-dev unzip git python python-zmq zlib1g-dev wget bsdmainutils automake curl
$ git clone https://github.com/koto-dev/koto.git
$ cd koto
$ ./zcutil/fetch-params.sh
$ ./zcutil/build.sh --disable-rust -j$(nproc)
```

Windows Subsystem for Linuxを使用する場合は、build.shの実行前にパスを通しておく必要がある。

```
$ export PATH=$HOME/bin:$HOME/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
```

## 設定ファイル作成
設定ファイルをホームディレクトリに作成する。  
ユーザー名とパスワードを決めて設定する。

```
$ mkdir -p ~/.koto
$ echo "rpcuser=username" >>~/.koto/koto.conf
$ echo "rpcpassword=password" >>~/.koto/koto.conf
```

## 使い方
無事インストールができると、koto/src 以下に kotod, koto-cli の2つが生成される。

### kotod 
kotodのほうがデーモンで、使うときには立ち上げておく。
tmuxやscreen、別のターミナルなどで別途立ち上げておくと良い。 

```
$ ./src/koto-cli kotod
``` 

するとこんな画面が現れる。  
<img width="1280" alt="SS 2017-12-18 2.44.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/50474/df203fac-76c4-b98d-ca79-fe93a99fa34e.png">  
  
この状態では、マイニングはされてない。もう少し設定をしてこの画面を立ち上げればマイニングできる。方法は後述する。  

### koto-cli   
koto-cliはウォレットの状況を見たり、送金、取引状況確認など色々できる。kotodを立ち上げておかないと使えない。  
  
## kotodを用いたソロマイニング方法  
kotodを別に立ち上げた状態で、まず新しくアドレスを発行します。  

```
$ ./src/koto-cli getnewaddress
```

すると、このようなkから始まるアドレスが発行される。
k1FfeBWP9WtaUvuQKWt8DrNyRAeAgW3bnso
  
このアドレスは自分のウォレットで管理されるアドレスになる。

次にマイニングをするための設定をする。  
以下を実行  

```
$ echo "gen=1" >>~/.koto/koto.conf
```  

もしくはこちらを実行

```
$ ./src/koto-cli setgenerate true
```

どちらでもよいようです。

これでマイニングのための設定は終わり。  
採掘したkotoをこのアドレスに入れるようにオプションを加えて、kotodを実行する。  

```
$ src/kotod -mineraddress=k1FfeBWP9WtaUvuQKWt8DrNyRAeAgW3bnso -genproclimit=4
```

kから始まるアドレスは、自分のアドレスに変更してください。  
アドレスを指定しない場合、採掘に成功するたびに新しくアドレスが発行されてしまい、後で移し替える必要が出てきます。
genproclimitでは、スレッド数を指定します。お持ちのCPUに応じて変更してください。
  
正常に実行されると、以下のような画面になります。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/50474/0b224901-dc37-e918-6056-c93c01f22727.png)

先程の採掘していない時と比べると、少し情報が多くなっています。  

Local solution rateが0.0000 Sol/sとなっていますが、正常に表示できていないだけで採掘はできているそうです。  

もう少し時間を置いて、採掘に成功すると、このような画面になります。  
<img width="1280" alt="SS 2017-12-17 17.46.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/50474/0a795faa-c6ca-6939-5073-01f9a3e02a9a.png">

You have mines n blocks　という部分が、あなたが採掘に成功したブロック数、
Orphaned: n blocks が無効になってしまったブロック数、
Immature :n KOTO がまだ未承認のKOTO数です。
Mature: n KOTO　　が承認済みとなりあなたのものになったKOTOです。
ブロックチェーン通貨では、採掘に成功したあと、他のマイナーに一定数承認されるまで使えないので注意してください。  
  
## ウォレットの確認
採掘に成功したら、自分のウォレットの状況を見てみましょう。  
もし採掘できていない場合、動作確認のため、Fauset(蛇口)でkotoを少し分けてもらいましょう。  
https://koto-faucet.torifuku-kaiou.tokyo/koto/
にアクセス、先程入手した自分のアドレスを入力して、kotoをもらいます。  
  
それでは、サイフの状況を確認します。
kotodの画面はそのままで、別のターミナルで以下を実行します。  
  
```
$ ./src/koto-cli getwalletinfo
{
  "walletversion": 60000,
  "balance": 81.31085682,
  "unconfirmed_balance": 0.00000000,
  "immature_balance": 0.00000000,
  "txcount": 7,
  "keypoololdest": 1513424256,
  "keypoolsize": 104,
  "paytxfee": 0.00000000
}
```

こんな感じで、ウォレットの状況が見られます。  
  
採掘に成功していれば、以下のコマンドで採掘したブロックが入っているアドレスを表示させることができます。  

```
$ ./src/koto-cli listaddressgroupings
[
  [
    [
      "k1FfeBWP9WtaUvuQKWt8DrNyRAeAgW3bnso",
      81.31085682,
      ""
    ]
  ]
]
```

さらに詳しい採掘状況、取引状況を確認したいときは、以下のコマンドでこのように詳細が表示されます。

```
$ ./src/koto-cli listtransactions
[
  {
    "account": "",
    "address": "k1FfeBWP9WtaUvuQKWt8DrNyRAeAgW3bnso",
    "category": "receive",
    "amount": 0.01000000,
    "vout": 1,
    "confirmations": 1400,
    "blockhash": "6b263ada50eb2365c35ebc6882acbca6b9e92118e72c580c79287122cacb5d35",
    "blockindex": 2,
    "blocktime": 1513450914,
    "txid": "2d6d88bbb453b597d7db1c53c27b4667da334734e459d1e9a1da68ce55d43c4e",
    "walletconflicts": [
    ],
    "time": 1513450893,
    "timereceived": 1513450893,
    "vjoinsplit": [
    ],
    "size": 225
  },
  {
    "account": "",
    "address": "k1FfeBWP9WtaUvuQKWt8DrNyRAeAgW3bnso",
    "category": "generate",
    "amount": 12.49534438,
    "vout": 0,
    "confirmations": 1141,
    "generated": true,
    "blockhash": "6b7d55d5e33a90b169c0ea547dcb35043851813daad9da3c7dba950a660df913",
    "blockindex": 0,
    "blocktime": 1513466647,
    "txid": "1bafd885ba815e4c1766feff03510a665205ed1c5554383bec0bb23d0e5882f9",
    "walletconflicts": [
    ],
    "time": 1513466647,
    "timereceived": 1513466647,
    "vjoinsplit": [
    ],
    "size": 90
...
...
```

## その他使えるkoto-cliコマンド

* ```$ ./src/koto-cli help```でコマンド一覧と使い方が見られます。
* ```listaddressgroupings``` もってるアドレスと残高確認
* ```getnewaddress``` 新アドレス取得
* ```listtransactions``` 取引のリスト
* ```getaddressesbyaccount ""``` 持ってるアドレス一覧


## zから始まるアドレス　プライベートアドレス
kやｊから始まるアドレスと、zから始まるアドレスがある。  
zから始まるものは、プライベートアドレスというもので、取引内容が他の人から見えない匿名性のあるアドレス。  
  
kから始まるアドレスを使った場合、トランザクションを追えば、k12345の人がどんな取引を今までに行ったのかが誰にでも分かる。しかし、匿名アドレスを使うとそれができなくなる。  

zcashの取引で説明すると、([参考](https://bitcoin.stackexchange.com/questions/49115/whats-the-difference-between-z-addr-and-t-addr-type-addresses))
[この取引](https://explorer.zcha.in/transactions/10475a6a60bee70c8e95d24dbfce9626cf1633c7377c9111e1b275140e2cfb5d)では、input側は見えるが、output側は見えない。これは受け手が匿名アドレスを使ったためである。
逆に[こちら](https://explorer.zcha.in/transactions/cdcd80c366dde857ec4423e6f6879739d937fa7349f51bad7abe06b13208f620)の取引では、inputが見えない。

一度個人とアドレスが紐付いてしまうと、すべての取引履歴が追えてしまうのはプライバシー的によくないことがある。これを回避するために作られたのが匿名仮想通貨。  

## プライベートアカウントへの移行
プライベートアドレスを使うためには、アドレスを発行して残高を移す必要があるみたい。  

* ```./src/koto-cli z_getnewaddress```でプライベートアドレス取得
* ```./src/koto-cli z_shieldcoinbase "*" [z_getnewaddressで作成したアドレス]```で採掘したkotoをプライベートに移す
* ```./src/koto-cli z_gettotalbalance``` で残高確認 

やってみる。

```
$ ./src/koto-cli z_getnewaddress
zkQhUbGP9Fh1xJwwme4Ms2y1ZpBhNdEkhKiYNGdtBA7sG7Anwg1xBLLXdoKUXcPAwWCuMTWAt3nbm8EnuGU9K2JSVk3V1X5
```

発行できたみたい。

```
$ ./src/koto-cli z_shieldcoinbase "*" zkQhUbGP9Fh1xJwwme4Ms2y1ZpBhNdEkhKiYNGdtBA7sG7Anwg1xBLLXdoKUXcPAwWCuMTWAt3nbm8EnuGU9K2JSVk3V1X5
{
  "remainingUTXOs": 0,
  "remainingValue": 0.00000000,
  "shieldingUTXOs": 6,
  "shieldingValue": 81.30085682,
  "opid": "opid-879048b1-7519-4651-a7cb-2c4fafc7acc9"
}
```

プライベートに移動されたみたい。
元のアドレスの残高を確認してみる。

```
$ ./src/koto-cli listaddressgroupings
[
  [
    [
      "k1FfeBWP9WtaUvuQKWt8DrNyRAeAgW3bnso",
      0.01000000,
      ""
    ]
  ]
]
```

Faucetで貰った0.01を除いて、自分で採掘した分のkotoはなくなってた。
プライベートの残高を確認してみる

```
$ ./src/koto-cli z_gettotalbalance
{
  "transparent": "0.01",
  "private": "81.30075682",
  "total": "81.31075682"
}
```

移行できてるみたい。取引の詳細は、z_getoperationresultで見られる。

```
$ ./src/koto-cli z_getoperationresult
[
  {
    "id": "opid-879048b1-7519-4651-a7cb-2c4fafc7acc9",
    "status": "success",
    "creation_time": 1513538543,
    "result": {
      "txid": "31a8ba32cd7fcf8f35611415aafec6339f3a7ce3791d0ca2913a24620d1b2cb8"
    },
    "execution_secs": 45.451398521,
    "method": "z_shieldcoinbase",
    "params": {
      "fromaddress": "*",
      "toaddress": "zkQhUbGP9Fh1xJwwme4Ms2y1ZpBhNdEkhKiYNGdtBA7sG7Anwg1xBLLXdoKUXcPAwWCuMTWAt3nbm8EnuGU9K2JSVk3V1X5",
      "fee": 0.00010000
    }
  }
]
```

## 通常アドレス⇔プライベートアドレスの送受信
W.I.P