RSKネットワークが提供するユニークな機能の一つは、ビットコインのブロックチェーン上でスマートコントラクトをコーディングできることです。そのため、開発者はスマートコントラクトの柔軟性を活用し、ビットコインのブロックチェーンが提供するセキュリティにそれらを重ねることができるようになります。このガイドでは、スマートコントラクトのコーディングがどのように機能するのか、そしてどのようにしてRSKにデプロイすることができるのかを見ていきます。
ブロックチェーンにおけるスマートコントラクト
スマートコントラクトは、ブロックチェーン技術の中でも興味深いユースケースの一つです。ビットコインが最初に登場したとき、誰もがブロックチェーンは分散型金融を実現するための手段に過ぎないと考えていました。しかし、スマートコントラクトの登場で状況は大きく変わり、開発者は必要に応じてブロックチェーンをカスタマイズすることが可能になりました。スマートコントラクトは自動化された契約履行システムです。それらはコードに書かれた特定の命令で自己実行しており、特定の条件が満たされたときに実行されます。
Solidityについて
dAPPs(分散型アプリケーション)の作り方を学びたい人にとってSolidityを学ぶことは必須です。SolidityはGavin Wood、Christian Reitwiessner、Alex Beregszaszi、Yoichi Hirai、そして数人の元Ethereumコアの貢献者によって開発され、Ethereumのようなブロックチェーンプラットフォーム上でスマートコントラクトを書けるようになりました。
Solidityは意図的に簡素化されたJavaScript に非常に似た構文を持つライトなタイプの言語です。Solidityのドキュメントはこちらからチェックできます。
Solidityを使用することでEthereum Virtual Machine別名EVMで実行されるスマートコントラクトをコーディングすることになります。Ethereumの開発者は、契約に割り当てられるガスの量を設定することに言及しています。契約の各行は実行するためにある程度のガス量を必要とします。ガスの上限はコントラクトを完全に実行するのに十分な量でなければなりません。
Solidityのデータタイプ
まず、Solidityで使用するデータタイプについて説明しましょう。コンピュータサイエンスやコンピュータプログラミングでは、データタイプまたは単にタイプとは、プログラマーがどのように使用するつもりかをコンパイラやインタプリタに伝えるデータの分類のことです。
データは整数なのか、文字列なのか、配列なのか。
コンパイラがこれらを判断する方法は、データタイプを見て判断します。
ということで、まずはsolidityで持っているであろう整数型のデータタイプを確認してみましょう。
- int “と呼ばれる通常の整数宣言で、-128から127までの範囲になります
- 0から255までの範囲で、負の値を格納しない無符号整数 “uint”
次は、”true “か “false “のみを格納するブール値データタイプです。ブール値を宣言するには、次のようにします。
その後、文字列とバイトがあります。
solidityではこのように文字列を使うことができます:文字列名。文字列はsolidityでは値の配列として格納されます。バイトは1~32文字のバイトの配列です。では、文字列とバイトの違いは何でしょうか?
Solidityのドキュメントによると
「経験則として、任意長の生のバイトデータにはbyteを、任意長の文字列(UTF-8)データにはstringを使用します。ある程度の長さに制限できるのであれば、byte1~byte32のいずれかの方がはるかに安価なので、必ず使用してください。」
次は「enum」というクールなものです。列挙型はSolidityでユーザー定義型を作成する方法の1つです。宣言方法はこんな感じです。
enum Action {REMOVE, UPDATE}
では、プログラムではどのように使うのでしょうか?
Action myAction = Action.UPDATE;
上の例で使用したenumの名前であるAction型の変数を作成します。そして、それらにアクションを割り当てるだけです。
solidityのドキュメントを読むことで、様々なデータタイプについてより深い知識を得ることができます。
Basic Programs
#1 Hello World
//section 1
pragma solidity ^0.4.19;
contract myfirstcontract{
string public greeting;
address public owner;
event GreetingChanged(string oldGreeting, string newGreeting);
//section 2
function myfirstcontract(string _greeting) {
greeting = _greeting;
owner = msg.sender;
}
//section 3
function setGreeting(string _greeting) {
require(owner == msg.sender);
GreetingChanged(greeting, _greeting);
greeting = _greeting;
}
}
ということで、スマートコントラクトを3つのセクションに分けてみました。それぞれのセクションを見て、その中で何が起こっているのかを見てみましょう。
Section 1
//section 1
pragma solidity ^0.4.19;
contract myfirstcontract{
string public greeting;
address public owner;
event GreetingChanged(string oldGreeting, string newGreeting);
“pragma solidity ^0.4.19 “は、0.4.19バージョンのsolidityを使用していることを示しています。この”^”は、プログラムがそれ以上のバージョンでも実行できることを示しています。
“contract myfirstcontract “は、私たちが “myfirstcontract “と名付けたコントラクトを宣言します。
その後、メッセージを保存するために使用する “greeting “という文字列を宣言しています。この文字列は「公開」文字列です。また、コントラクトの所有者のアドレスを保存するために、address型の “owner “という名前のパブリック変数を宣言しています。
public “変数を使用する利点は、自動的に “getter”関数が割り当てられることです。getter関数は変数の値にアクセスするのに役立ち、”setter”関数は値を変更することができます。
その後、”GreetingChanged “というイベントがあります。このイベントは指示に変更があった場合にはいつでもその変更が放送されるようにしています。
Section 2
//section 2
function myfirstcontract(string _greeting) {
greeting = _greeting;
owner = msg.sender;
}
ここではコンストラクターを宣言します。お気づきかもしれませんが、コンストラクターはコントラクトと同じ名前を持っています。コンストラクターの仕事は、実行時に変数を初期化することです。コンストラクターは”_greeting “をパラメータとして受け取り、それを使って “greeting “を初期化します。同時に、パラメータを送信する相手のアドレスが owner に保存されます。コンストラクターは実行時の最初にしか実行されないので、アドレスが保存されるのはコントラクト作成者です。
Section 3
//section 3
function setGreeting(string _greeting) {
require(owner == msg.sender);
GreetingChanged(greeting, _greeting);
greeting = _greeting;
}
3番目のセクションでは、変数に保持されている値を変更するのに役立つセッター関数があります。パラメータとして、この関数は修正が必要な場合に備えて、新しい指示を受け取ります。
では、関数の中では何が起こっているのでしょうか?
プログラムにアクセス制御を導入したい。そのために、修正をした人がコントラクトの所有者かどうかをチェックしています。後述するように、他の人が修正を加えようとすると、コンパイラは例外を投げてエラーを返します。
つまり、その条件が満たされるとGreetingChangedイベントが発生し、”greeting “の値が”_greeting “に更新されます。
RSKでのスマートコントラクトの展開
ビットコインの上にあるスマートコントラクトプラットフォーム「RSK」上でコントラクトを展開する方法はいくつかありますが、今回はRSKの公式ブログで紹介されているような標準化された方法を見ていきます。
#1 環境設定
環境設定をするためにいくつかのツールを使うことができますが、それはほとんどの場合、あなたのOSやあなたが最も快適に使えるプラットフォームに依存します。これらのいくつかの例は以下の通りです。

#2 ツール
RSKにはテストネットとメインネットがあります。独自のノードを作成し、テストネットとメインネットのどちらかに接続することができます。OSにもよりますが、以下の方法でノードをインストールすることができます。
- Microsoft Azure Marketplace: https://github.com/rsksmart/rskj/wiki/install-rskj-using-azure
- Amazon Web Services Marketplace: https://github.com/rsksmart/rskj/wiki/install-rskj-using-aws
接続し、ネットワークの状態を見るために、ここではリンクを見つけることができます。
RSK testnetでは、開発者に以下のツールを提供しています。
- 開発者がスマートコントラクトを実行するための「R-BTC」コインを提供する蛇口。
- 開発者が自由にスマートコントラクトを作成し、テストアウトできるテストネット。
#3 コントラクトの作成
さて、大体の理論は終わったので、早速コーディングに取り掛かりましょう。これらのプログラムを実行するためには、実行できる環境が必要です。
今回はVisual Studioのコードを使用します。そのためには、code.visualstudio.comにアクセスして、Visual Studioの最新版をダウンロードします。
それをインストールすると、このような画面が表示されます。

ここで、ファイル→開くと進みます。その後、フォルダを作成して便利なフォルダに入れておきます。あとは「表示」→「統合ターミナル」をクリックして、Visual Studioにハードコードされている内蔵のコマンドラインインターフェイスを開きます。
#4 Truffleの紹介
コマンドラインインターフェイスができたので、truffleとその仕組みを見てみましょう。Truffleはethereumのための優れたフレームワークで、ethereum開発のための開発環境とアセットパイプラインを提供します。また、複雑なethereumアプリをリンクするライブラリのサポートや、カスタムデプロイメントを提供し、新しいコントラクトのコーディングをより簡単に行えるようにしてくれます。以下は、Truffleで楽しめる機能の一部です(Truffle GitHubドキュメントより抜粋)。
- ビルトインのスマートコントラクトのコンパイル、リンク、デプロイメント、バイナリ管理。
- Mocha と Chai を使用した自動コントラクトテスト。
- カスタムビルドプロセスをサポートする設定可能なビルドパイプライン
- スクリプト可能なデプロイとマイグレーションフレームワーク
- 多くのパブリック&プライベートネットワークにデプロイするためのネットワーク管理
- コントラクトとの直接通信を可能にするインタラクティブなコンソール
- 開発中のアセットの即時再構築
- Truffle 環境内でスクリプトを実行する外部スクリプト・ランナー
truffleを使ってコーディングを始めるには、コマンドインターフェイス上で次のように入力します。
truffle init
これを行うと、以下のようなフォルダが作成されます。
- “contracts” フォルダは、.sol ファイルやスマートコントラクトを保存します。
- “migrations “フォルダは、javascriptの移行コードであり、デプロイ時に実行されます。
- コントラクトをデプロイする “truffle.js “として知られるtruffle設定ファイル。
さてさて、どのようにしてすべてが一緒に来るのでしょうか?contracts “フォルダにスマートコントラクトを作成します。この場合、以前にコード化した”HelloWorld.sol”コントラクトを作成してみましょう。覚えていると思いますが、これはシンプルなスマートコントラクトで、変数は1つだけで、getGreeting()とsetGreeting()関数を使って質問したり、置き換えたりすることができます。
#5 コンパイル
コード実行に続いて、次のフェーズ→コンパイルを見てみましょう。truffleで定義されている “migrations “フォルダ内の “1_initial_migration.js “ファイルを開きます。ファイルの末尾はこのようになっているはずです。
var Migrations = artifacts.require(“./Migrations.sol”);
var HelloWorld = artifacts.require(“./HelloWorld.sol”);
module.exports = function(deployer) {
deployer.deploy(Migrations);
deployer.deploy(HelloWorld);
};
このコードブロックを使って、私たちのコードをデプロイする方法をtruffleに正確に示しています。さて、このコードをターミナルで実行するには、次のコマンド – truffle compile を実行します。
この操作では、スマートコントラクトをコンパイルし、それぞれのスマートコントラクトに対応するJSONファイルを作成します。コンパイルされたスマートコントラクト (“HelloWorld.json” は新しく作成された “build/contracts” フォルダの中にあります) を開いて中身を確認してください。
#6 インメモリーブロックチェーン
開発プロセス中のガス使用量や長い待ち時間を避けるために、truffleはインメモリブロックチェーンを実装し、スマートコントラクトを展開して通信できるようにしています。
インメモリブロックチェーンを起動してターミナルに接続するには、このコマンドを実行します。
truffle develop
#7 デプロイ
コントラクトを実行する前に、まずデプロイします。truffle開発コンソールでは、以下のコマンドでコントラクトのデプロイを開始します。
migrate
コマンドを実行した瞬間、以下のようなデータが送られてきます。
- トランザクションID
- コントラクトアドレス(コントラクトの呼び出し方が重要)
#8 スマートコントラクトの実行
実行すると、Truffleは上で宣言したようにマイグレーションファイル「1_initial_migration.js」を実行します。2行目では、スマートコントラクトを含むHelloWorldというグローバル変数を作成し、コンソールに入力して結果を確認します。
HelloWorld
getGreeting関数とsetGreeting関数は、上で説明した方法と同じように動作します。
#9 リモートデプロイ
最後になりますが、スマートコントラクトをリモートで展開する必要があります。次に、ネットワークをこのように構成してTruffle に精通していることを確認します。
module.exports = {
// See <http://truffleframework.com/docs/advanced/configuration>
// to customize your Truffle configuration!
networks: {
blockgeeks: {
gas : 2500000,
gasPrice : 1,
from : “0xsomeaddress”,
host: “some host”,
port: 4444,
network_id: “*” // Match any network id
}
}
};
上記のコードを「truffle.js」の設定ファイルにコピーし、migrateコマンドを実行します。
truffle migrate –reset –network blockgeeks
注:コントラクトの名前を “blockgeeks “にする必要はありません。何でも構いません。
結論:RSK Smart Contracts
開発者としてRSKのコントラクトを作成することの素晴らしさは、Ethereumのプログラミング性とBitcoinのブロックチェーンのセキュリティという、両方の世界のベストを活用できることです。詳細については、RSKのスマートコントラクト開発ガイドをご確認ください。
原文:https://blockgeeks.com/guides/rsk-smart-contracts/ By blockgeeks
参照ガイド:https://blog.alebanzas.com.ar/2018/04/how-to-deploy-a-smart-contract-in-rsk/ By RSK