新しいブロックチェインMimbleWinbleとgrinについて

# 最初に

[Grin](https://grin-tech.org/)という新しい仮想通貨が1/15に公開されたらしい。
何がどう新しいか分からなかったので、ざっくり調べた。

# それぞれの概要

@j0hnta さんたちが翻訳した[公式ドキュメント](https://github.com/mimblewimble/grin/blob/master/doc/intro_JP.md)から抜粋したもの。
## MimbleWimbleとは
> MimbleWimble は、極めてよいスケーラビリティ、プライバシー、そして代替可能性（fungibility）の解決法を提供 するブロックチェーンのフォーマット・プロトコルである。MimbleWimble は、ほとんどすべてのブロックチェーンの 実装に存在する課題を解決する。

## Grinとは
> Grin は、その Mimblewimble ブロックチェーンを実装する OSS プロジェクトであり、完全なブロックチェーン、 暗号通貨のデプロイメントに必要なギャップを埋めるものである。

### その他

[No this, no that](https://github.com/mimblewimble/docs/wiki/No-this,-no-that)というページにあるように、通常のブロックチェーンは存在するものを利用しないことで、チェイン内にある情報を減らすことができているよう。そのため、利用するストレージを最小限に抑えられる。

  - no visible amounts
  - no transaction history
  - no reward changes ...


また暗号方式にリング署名ではなく、楕円曲線暗号を利用することで数学的に安全である...らしい。以下がプライバシー保護に関わっていそうなリスト。

- no addresses
- no trusted setup
- no ring signatures...

[プライバシーについてのFAQ](https://github.com/mimblewimble/docs/wiki/FAQ#privacy-and-security)

# もともとの論文

[MimbleWimble Origin](https://github.com/mimblewimble/docs/wiki/MimbleWimble-Origin)
githubにもともとの論文も公開されてる。

# マイニングまでの手順

以下はMacbookでしか試していない。
変化の激しそうなプロダクトなので、細かいコマンドはリンク先のドキュメントを見たほうがいい。

## Nodeの作成

公式ページ : [How to run a Grin node](https://github.com/mimblewimble/docs/wiki/How-to-run-a-Grin-node)

まずはネットワークに接続するためのNodeを作成。
[リリースページ](https://github.com/mimblewimble/grin/releases)からインストールしてもいいが、現段階でv1.0.1だった。最新版はv1.0.2。

### 手動でビルドする場合

GrinではRustを利用しているため、Rustを事前にインストールする必要がある。
また必要なパッケージもインストールする。

```
$ curl https://sh.rustup.rs -sSf | sh; source $HOME/.cargo/env
$ brew install --with-toolchain llvm
$ brew install pkg-config
$ brew install openssl
```

## Walletの作成

公式ページ : [How to use the Grin Wallet](https://github.com/mimblewimble/docs/wiki/How-to-use-the-Grin-wallet)

Walletは `grin wallet init` でパスワードを設定すると作成できる。
`grin wallet info` で現在の残高を確認できる。

```
$ grin wallet info
____ Wallet Summary Info - Account 'default' as of height 0 ____

 Total                            | 0.000000000
 Awaiting Confirmation (< 10)     | 0.000000000
 Locked by previous transaction   | 0.000000000
 -------------------------------- | -------------
 Currently Spendable              | 0.000000000

```

## Minerの作成

公式ページ : [How to mine Grin](https://github.com/mimblewimble/docs/wiki/How-to-mine-Grin)

基本はGPUでやるものだが、AVX2が利用できればCPUでもminingできる。macであれば、以下のコマンドでAVX2が利用できるか確認できる。

```
$ sysctl -a machdep.cpu | grep AVX2

machdep.cpu.features: FPU VME DE PSE TSC MSR PAE MCE CX8 APIC SEP MTRR PGE MCA CMOV PAT PSE36 CLFSH DS ACPI MMX FXSR SSE SSE2 SS HTT TM PBE SSE3 PCLMULQDQ DTES64 MON DSCPL VMX EST TM2 SSSE3 FMA CX16 TPR PDCM SSE4.1 SSE4.2 x2APIC MOVBE POPCNT AES PCID XSAVE OSXSAVE SEGLIM64 TSCTMR AVX1.0 RDRAND F16C
machdep.cpu.leaf7_features: SMEP ERMS RDWRFSGS TSC_THREAD_OFFSET BMI1 AVX2 BMI2 INVPCID SMAP RDSEED ADX IPT SGX FPU_CSDS MPX CLFSOPT

```

ここではCPUでのminingだけ説明。

[grin-minerのリリースページ](https://github.com/mimblewimble/grin-miner/releases)から最新版をインストール。

`$HOME/.grin/main/grin-server.toml` を編集して、miningを有効にする

```
enable_stratum_server = false
↓
enable_stratum_server = true
```

grin-miner.toml の `cuckaroo_cpu_avx2_29` pluginを有効であることを確認。
※ デフォルトで有効になってる。

```
[[mining.miner_plugin_config]]
plugin_name = "cuckaroo_cpu_avx2_29"
```

grin と grin-minerを同時に動かすと、miningしていることがわかる。

<img width="1665" alt="grin.png" src="https://qiita-image-store.s3.amazonaws.com/0/14275/a52df134-6710-77d6-46e2-cc3738263b3a.png">

# 最後に

CPUでやっても、数時間かけて少し取れるレベルなので、おすすめはしない。
ドキュメントがとても充実していたため、MimbleWimbleとgrinの概要がわかったので良かった。