Rootstock(RSK)のチュートリアルをやった時のメモ

- [Rootstock(RSK)のチュートリアル](https://github.com/rsksmart/tutorials/wiki/Developing-Smart-Contracts-in-RSK) をやった時のメモです。
 - [Rootstock(RSK)](https://www.rsk.co/)は、Bitcoin上でスマートコントラクト(Solidity)が動くようにするプロジェクトです。
- 基本コピペですが、細かい部分で追加手順が必要だったので記載しています。
- 環境はMacOS High Sierraです。
- Node.jsやnpmはインストール済みです。

# 環境構築


## Truffle(トリュフ) のインストール

```
$ sudo npm install -g truffle
```

## ganache(ガナッシュ) のインストール

- 開発用のチェーンを作成したり、ブロックの中身を見たりするツール。
- [Truffle suite内のganacheのページ](https://truffleframework.com/ganache)から、Mac用のパッケージをダウンロード。
- コマンドライン版も入れた
```
$ sudo npm install -g ganache-cli
```

# 0:用語の説明

- [Module 0 – A little about DApps and Smart Contracts (10 minutes)](https://github.com/rsksmart/tutorials/wiki/Module-0-%E2%80%93-A-little-about-DApps-and-Smart-Contracts-(10-minutes))を読みます。

- スマートコントラクトや、DApps(=フロントエンド+コントラクト)、アドレスとは何かといった説明が書かれています。

# 1:シンプルなプログラム例
- [Module 1 – Saying hello to the smart world (10 minutes)](https://github.com/rsksmart/tutorials/wiki/Module-2-%E2%80%93-Deploying-a-smart-contract-on-development-environment-(30-minutes))を読みます。

- シンプルなスマートコントラクトのプログラム例があります。
 - コンストラクタ、変数へのget、setをするプログラム

# 2:開発環境へのデプロイ
- [Module 2 – Deploying a smart contract on development environment (30 minutes)](https://github.com/rsksmart/tutorials/wiki/Module-2-%E2%80%93-Deploying-a-smart-contract-on-development-environment-(30-minutes))

- 5つのステップに別れています。

## 2-1:Truffleの紹介([リンク](https://github.com/rsksmart/tutorials/wiki/Module-2-%E2%80%93-Deploying-a-smart-contract-on-development-environment-(30-minutes)#introduction-to-truffle))

- Truffleは、Solidityの開発・テストができる環境。
- サンプル用プロジェクトの作成

```
$ mkdir simple-storage
$ cd simple-storage
$ truffle init
```

## 2-2:ローカルでブロックチェーンを動かす
 - アカウントが自動で10個作られて、truffleのコマンドラインが表示される```truffle(develop)> ``` 
 - ターミナルを閉じると環境が消えてしまうので、ターミナルは開いたままにする。

```
truffle develop 
```

## 2-3: scaffoldで新しいコントラクトを作成

```
truffle(develop)> create contract SimpleStorage
```
- (contractsフォルダに、「SimpleStorage.sol」と「Migrations.sol」が作成される。SimpleStorage.solは、空のコンストラクタが入っているだけのコントラクト。)

- 「Module 1 – Saying hello to the smart world (10 minutes)」にある例を、SimpleStorage.solにコピペする。


## 2-4:(ローカルの)ブロックチェーン上にデプロイ

- デプロイ用スクリプトを作成
 - すでにmigrationsフォルダに「1_initial_migration.js」というデプロイ用スクリプトがある。
 - migrationsフォルダ内に、新たに「2_simple_storage.js」を作って、以下を記述する。

```
var SimpleStorage = artifacts.require("./SimpleStorage.sol");

module.exports = function(deployer) {
  deployer.deploy(SimpleStorage);
};
```

- コンパイル
 - contractsフォルダの全ての.solファイルがコンパイルされる
 - buildフォルダに、コンパイル済みバイトコードを含むjsonファイルが作成される
 - プログラムを書き換えてリコンパイルする場合は、buildフォルダを丸ごと消す?(ファイルの日付を見て自動的に置き換えてくれたり しないぽい)

```
truffle(develop)> compile
```


- デプロイ(マイグレーション)

```
truffle(develop)> migrate
```

- 「Saving successful migration to network...」と、アドレスと、「Saving artifacts...」が出れば成功。


## 2-5:デプロイしたコントラクトを使う
- Truffleコンソールで対話的にプログラムを試す。

### (1)SimpleStorageをインスタンス化
 - 利用できる関数や変数が表示される(最後の方に、自分で書いたgetやsetも表示される)

```
truffle(develop)> var simpleStorage
truffle(develop)> SimpleStorage.deployed().then(instance => simpleStorage = instance)
```

### (2)get()メソッドを呼び出して、変数の中身を得る

```
truffle(development)> simpleStorage.get()
```
- BigNumber型で中身がわからないので、bn.toNumber()で変換して表示する

```
truffle(develop)> simpleStorage.get().then(bn => bn.toNumber())
```

- 読み出しのみ(コントラクトを変更しない)ので、gas代はかからない


### (3)set()メソッドを呼び出して、変数の中身を書き換える

```
truffle(develop)> simpleStorage.set(10)
```

- txやreceiptが表示される。

### (4)書き換えた変数の中身をget()で再確認

- カーソルの上で履歴がたどれる。```simpleStorage.set(10)```で表示して、10になっているのを確認する。



# 3:RSK テストネットへのデプロイ
- [Module 3 – Smart contract on RSK (40 minutes)](https://github.com/rsksmart/tutorials/wiki/Module-3-%E2%80%93-Smart-contract-on-RSK-(40-minutes))

- 無料のパブリックチェーン。
- BTCではなく、SBTCというテスト用通貨を使う。
- パブリックノード経由でアクセスできる。(ローカルにノードを立てる方法もある)

- 4つのステップに別れている

## 3-1:RSKアカウントを取得する

- アカウントは、ウォーレット上の資産を管理するために必要。
- このチュートリアルでは、BIP-39に沿った12語のニーモニック・フレーズを使用する。
- [https://iancoleman.io/bip39/](https://iancoleman.io/bip39/)で、12語の英単語を生成して、メモしておく。


## 3-2:TruffleをRSKのパブリックノード(テストネット)に接続する

- [truffle-hdwallet-provider](https://github.com/trufflesuite/truffle-hdwallet-provider)を使う
 - 外部のネットワークに接続するが、アカウントはローカルにあるものを使う(?)
 - truffle-hdwallet-providerをインストールする

```
$ sudo npm install -g truffle-hdwallet-provider
```

- プロジェクトのフォルダ直下にある「truffle.js」を、以下の内容に書き換える。

```
var HDWalletProvider = require('truffle-hdwallet-provider')

var mnemonic = 'ここにメモした12語のフレーズを入れる'
var publicNode = 'https://public-node.testnet.rsk.co:443'

module.exports = {
  networks: {
    rsk: {
      provider: () =>
        new HDWalletProvider(mnemonic, publicNode),
      network_id: '*',
      gas: 2500000,
      gasPrice: 183000
    }
  }
}
```

- 新しいコンソールを開き、以下のコマンドでRSKのパブリックノード(テストネット)に接続する
 - truffle-hdwallet-providerのインストールがうまくいっていないと、```Error: Cannot find module 'truffle-hdwallet-provider'```が出る。


```
$ cd mywork/simple-storage/
$ truffle console --network rsk
```

- Truffleコンソールで、以下のコマンドでブロック番号を表示して、接続確認する
 - 「web3.eth.blockNumber」を使う方法もあるが、ノードとのやり取りは非同期で行うべきなので「web3.eth.getBlockNumber」を使うとのこと。

```
truffle(rsk)> web3.eth.getBlockNumber((err, res) => console.log(res))
```

## 3-3:自分のRSKアカウントのアドレスを調べて、テスト用のSBTCをもらう
- 以下のコマンドで、最初に表示される「0x273501b...」のようなアドレスをメモ。

```
truffle(rsk)> web3.currentProvider.wallets
```

- [RSK Faucetのページ](https://faucet.testnet.rsk.co)を開いて、メモしたアドレスと、CAPCHAを入れて、「Get Smart-BTCs!」をクリック。

```
RSK TESTNET FAUCET
Faucet balance is 148.531671301698798998 SBTC
Successfully sent some SBTCs to that address
```
のように、SBTCがもらえる。

- 残高を確認。(1000000000000000入っているはず)

```
truffle(rsk)> var account = Object.keys(web3.currentProvider.wallets)[0]

truffle(rsk)> web3.eth.getBalance(account, (err, res) => console.log(res.toNumber()))
```


## 3-4:デプロイして、呼び出してみる

- 以下のコマンドで、デプロイ。(--resetで、既にデプロイ済みでも再度(別なアドレスに)デプロイする)
- 少し時間がかかる(1つ目は2分ぐらい、2つ目は5分ぐらいかかった）。

```
truffle(rsk)> compile
truffle(rsk)> migrate --reset
```
結果のアドレスをメモして、下記のエクスプローラで見る。


```

Using network 'rsk'.

Running migration: 1_initial_migration.js
  Deploying Migrations...
  ... 0xa1be864286268bc6f2c46a25c3eef189361d0612d96da922692e5b002d91fd71
  Migrations: 0xfe0105962d0a0a89876722df3e7bb42ba58a8c6d
Saving successful migration to network...
  ... 0xb14625f546ed790276916b1caa731bd75c26cc101e61a7f944a06a9617a05198
Saving artifacts...
Running migration: 2_simple_storage.js
  Deploying SimpleStorage...
  ... 0xfe7d337eddf6e6361e5db550a8986cbbf2ef5bce05900a131e7b3b005f09d2ba
  SimpleStorage: 0xd93c15eed8bd9a8f97d34f958d820d6dd29e7b9e
Saving successful migration to network...
  ... 0x5eb9345adb23dea9a054194a3e80dedf436121b62debafc9e8d056965e43e0f3
Saving artifacts...
```


- [RSK Testnet explorer](https://explorer.testnet.rsk.co/)で、「SimpleStorage: 0xd93c15eed8bd9a8f97d34f958d820d6dd29e7b9e」のアドレスを入力


- 以下のように、set()で変数に10を入れて(2分ほど待たされた)、get()で確認。

```
truffle(rsk)> var simpleStorage
truffle(rsk)> SimpleStorage.deployed().then(instance => simpleStorage = instance)
truffle(rsk)> simpleStorage.get()
truffle(rsk)> simpleStorage.get().then(bn => bn.toNumber())
0
truffle(rsk)> simpleStorage.set(10)
{ tx:
   '0xa9e080660e7d17da0c67d5951ff5d095b6b9e047c5d4ea8f409e6f12639d9856',
  receipt:
   { transactionHash:
      '0xa9e080660e7d17da0c67d5951ff5d095b6b9e047c5d4ea8f409e6f12639d9856',
     transactionIndex: 0,
     blockHash:
      '0x5b7166b6036edfaee1e29762e3db9e3d3229df67daa03b3e9339fbe4ff363a99',
     blockNumber: 803615,
     cumulativeGasUsed: 41942,
     gasUsed: 41942,
     contractAddress: null,
     logs: [],
     from: '0x273501b56af124b22c3850aaeca413fe98301fdb',
     to: '0xd93c15eed8bd9a8f97d34f958d820d6dd29e7b9e',
     root: '0x01',
     status: '0x01' },
  logs: [] }
truffle(rsk)> simpleStorage.get().then(bn => bn.toNumber())
10
```

- RSK Testnet explorerで、transactionHashのアドレスを入力すると、
実行されたブロック番号や、使用されたgas代などが分かる。


# 関連しそうなページ
- [サーバーレスフレームワークTruffleでÐappを爆速開発する ①Tutorial](https://qiita.com/syrohei/items/5eb573b781caedde16a1)

- [Truffleを使ってEthereumでペットショップアプリを作る〜前半：コントラクトの実装＆テスト〜](https://qiita.com/gaisho81/items/06c58d5eb24ae302f690)