Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.
  • 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代などが分かる。

関連しそうなページ

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away