Rootstock(RSK)のmemo

#RSK
機会があって、RootStockを触ったので、覚書として残しておきます。
RSKはビットコインマイナーのための、スマートコントラクト・プラットフォームで、
dAppsはSolidityCompilerなどを利用して作成でき、Ethereumとの互換性を保つのが特徴。
RBTCとRIFToken(RIFOS用、ERC677)を使用するため、基本的な下記の手順は、以前Ethereum用に書いた
https://qiita.com/oggata/items/7073a74323b1852f0310
あたりと全く変わらない感じでTruffleを使えば、Ethereumも併用して利用できるのが便利。

#仕組み
この辺りがわかりやすかった
https://zoom-blc.com/sidechain
![alt](https://i2.wp.com/zoom-blc.com/wp-content/uploads/2017/11/sidechain1.png?w=1057&ssl=1)

two-way peg
https://blog.rsk.co/ja/noticia/%E6%9C%80%E5%85%88%E7%AB%AF%E3%81%AE%E3%82%B5%E3%82%A4%E3%83%89%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%EF%BC%88the-cutting-edge-of-sidechains%EF%BC%89%EF%BC%9Aliquid-%E3%81%8A%E3%82%88%E3%81%B3rsk/

Symmetric two-way peg
https://techmedia-think.hatenablog.com/entry/2015/11/23/150538

Two way pegをどのように実施させているかというBlockstreamのホワイトペーパー
https://blockstream.com/sidechains.pdf

実際に体験したい場合は、このあたりを試すと良さそう。時間があるときに試してみよう。。
https://developers.rsk.co/rsk/rbtc/conversion/

RBTCとRIFトークン対応wallet
https://rsk-rif-jp.com/wallet

#RSK
(本家)
https://www.rsk.co/
(チュートリアル)
https://github.com/rsksmart/tutorials/wiki/Module-3-%E2%80%93-Smart-contract-on-RSK-(40-minutes)

#アドレス生成〜コントラクト実行まで
##1.アドレスを作成
```
BIP-39に沿った12語のニーモニック・フレーズ
https://iancoleman.io/bip39/
->
12wordをメモ
brain lonely dutch example forum kind sibling river gap alpha ghost arena slim exit flower
```

##2.環境構築
```
//Truffleをインストール
$ npm install -g truffle
//フォルダ作成
$ mkdir rsk_demo
$ cd ~/rsk_demo
//初期化
$ truffle init
npm init -f
// truffle-hdwallet-providerを入れる
npm install truffle-hdwallet-provider --save
```

##3.設定ファイル

Ethereumにおけるinfura.ioのような形で、publicnodeが用意されていて、
Testnet : https://public-node.testnet.rsk.co/1.1.0
Mainnet : https://public-node.rsk.co
が利用できる。
(参考) https://developers.rsk.co/rsk/public-nodes/

ちなみに、network_idを*(アスタリスク)指定した場合うまく動作しなかったので下記のように指定すると良いかも！？


```truffle-config.js
var HDWalletProvider = require('truffle-hdwallet-provider')
var mnemonic = 'brain lonely dutch example forum kind sibling river gap alpha ghost arena slim exit flower'

module.exports = {
  networks: {
    rsk: {
      provider: () =>
        new HDWalletProvider(mnemonic, 'https://public-node.testnet.rsk.co/1.1.0'),
        network_id: 31,
        gasPrice: 6000000000,
    }
  },
  // Configure your compilers
  compilers: {
     solc: {
       version: "0.5.0",
       evmVersion: "byzantium"
     }
  }
}
```

##4.RSKへ接続と、確認

```
$ truffle console --network rsk

//ブロック番号の確認
truffle(rsk)> web3.eth.getBlockNumber((err, res) => console.log(res))
//walletの確認
web3.currentProvider.wallets
0xc6011686ae8aec3ff83380ff7854494bb5f31931

truffle(rsk)> var account = Object.keys(web3.currentProvider.wallets)[0]
truffle(rsk)> web3.eth.getBalance(account, (err, res) => console.log(res));
50000000000000000
'50000000000000000'
```

##5.RSK Faucetを開いて、上記のアドレスを入れる
https://faucet.testnet.rsk.co/

##6.contractの作成
(参考)
https://github.com/rsksmart/tutorials/wiki/Module-2-%E2%80%93-Deploying-a-smart-contract-on-development-environment-(30-minutes)

```
truffle(rsk)> create contract SimpleStorage
-->rsk_demo/contracts/SimpleStorage.sol  が作られる
```

```SimpleStorage.sol
pragma solidity ^0.5.0;

contract SimpleStorage {
    address private deployer;
    uint private storedData;

    constructor() public {
        deployer = msg.sender;
    }

    function set(uint n) public {
        if(msg.sender == deployer)
            storedData = n;
    }

    function get() public view returns (uint) {
        return storedData;
    }
}
```

```
//2_simple_storage.jsを作成する
touch migrations/2_simple_storage.js
```

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

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

##6.deployする

```
truffle(rsk)> compile
truffle(rsk)> migrate --reset

//contract addressから下記のexplorerで確認
https://explorer.testnet.rsk.co/
```

```
2_simple_storage.js
===================

   Deploying 'SimpleStorage'
   -------------------------
   > transaction hash:    0x38c867cf4365ab0363132839c582b052312b22bab2c5de8d4d07dc3f25035b72
   > Blocks: 1            Seconds: 52
   > contract address:    0xA549bA4BBE95F4A39FE04363C73f09593a1b91eE
   > block number:        572451
   > block timestamp:     1580373729
   > account:             0xf8f258A4670f9837045dB01709984D74C4f982c7
   > balance:             0.047716118
   > gas used:            152575
   > gas price:           6 gwei
   > value sent:          0 ETH
   > total cost:          0.00091545 ETH
```

##7.実行する
```
truffle(rsk)> var simpleStorage
truffle(rsk)> SimpleStorage.deployed().then(instance => simpleStorage = instance)
truffle(rsk)> simpleStorage.get()
truffle(rsk)> simpleStorage.get().then(bn => bn.toNumber())
```