-
Rootstock(RSK)のチュートリアル をやった時のメモです。
- Rootstock(RSK)は、Bitcoin上でスマートコントラクト(Solidity)が動くようにするプロジェクトです。
- 基本コピペですが、細かい部分で追加手順が必要だったので記載しています。
- 環境はMacOS High Sierraです。
- Node.jsやnpmはインストール済みです。
環境構築
Truffle(トリュフ) のインストール
$ sudo npm install -g truffle
ganache(ガナッシュ) のインストール
- 開発用のチェーンを作成したり、ブロックの中身を見たりするツール。
- Truffle suite内のganacheのページから、Mac用のパッケージをダウンロード。
- コマンドライン版も入れた
$ sudo npm install -g ganache-cli
0:用語の説明
Module 0 – A little about DApps and Smart Contracts (10 minutes)を読みます。
スマートコントラクトや、DApps(=フロントエンド+コントラクト)、アドレスとは何かといった説明が書かれています。
1:シンプルなプログラム例
Module 1 – Saying hello to the smart world (10 minutes)を読みます。
-
シンプルなスマートコントラクトのプログラム例があります。
- コンストラクタ、変数へのget、setをするプログラム
2:開発環境へのデプロイ
2-1: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 テストネットへのデプロイ
無料のパブリックチェーン。
BTCではなく、SBTCというテスト用通貨を使う。
パブリックノード経由でアクセスできる。(ローカルにノードを立てる方法もある)
4つのステップに別れている
3-1:RSKアカウントを取得する
- アカウントは、ウォーレット上の資産を管理するために必要。
- このチュートリアルでは、BIP-39に沿った12語のニーモニック・フレーズを使用する。
- https://iancoleman.io/bip39/で、12語の英単語を生成して、メモしておく。
3-2:TruffleをRSKのパブリックノード(テストネット)に接続する
-
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'
が出る。
- 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のページを開いて、メモしたアドレスと、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で、「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代などが分かる。