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

  • 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:用語の説明

1:シンプルなプログラム例

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 テストネットへのデプロイ

  • Module 3 – Smart contract on RSK (40 minutes)

  • 無料のパブリックチェーン。

  • 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'が出る。
$ 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代などが分かる。

関連しそうなページ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です