Solidityを使用したスマートコントラクトの作成と展開
1. 概要
smart contractsを実行する機能が、Ethereumブロックチェーンを非常に人気があり破壊的なものにしている理由です。
スマートコントラクトとは何かを説明する前に、blockchainの定義から始めましょう。
ブロックチェーンは、デジタルトランザクションの永続的な記録を保持するパブリックデータベースです。 信頼性のないトランザクションシステムとして動作します。これは、第三者が互いに信頼する必要なく、個人がピアツーピアトランザクションを行うことができるフレームワークです。
solidity:を使用してEthereumでスマートコントラクトを作成する方法を見てみましょう
2. イーサリアム
イーサリアムは、ブロックチェーン技術を効率的に使用して分散型アプリケーションを作成できるプラットフォームです。
分散型アプリケーション(Dapp)は、相互作用のさまざまな側面にいる人々や組織のためのツールであり、集中化された仲介者なしで一緒になります。 Dappsの初期の例には、BitTorrent(ファイル共有)とBitcoin(通貨)が含まれます。
Ethereumは、組み込みプログラミング言語を備えたブロックチェーンとして説明できます。
2.1. イーサリアム仮想マシン(EVM)
実用的な観点から、EVMは、accountsと呼ばれる数百万のオブジェクトを含む大規模な分散型システムと考えることができます。このシステムは、内部データベースを維持し、コードを実行し、相互に通信できます。
最初のタイプのアカウントは、おそらくネットワークを使用する平均的なユーザーにとって最も馴染みのあるものです。 その名前はEOA(外部所有アカウント)です。値(Etherなど)を送信するために使用され、秘密鍵によって制御されます。
一方、contract.という別の種類のアカウントがあります。先に進んで、これが何であるかを見てみましょう。
3. スマートコントラクトとは何ですか?
smart contractは、通常はwritten in Solidity and compiled into binary or JSON and deployed to a specific address on the blockchainのスタンドアロンスクリプトです。 RESTful APIの特定のURLエンドポイントを呼び出してHttpRequestを介してロジックを実行できるのと同じ方法で、デプロイされたsmart contractを特定のaddressで実行するには、デプロイおよびコンパイルされたSolidityfunctionを呼び出すために必要なEthereumとともにデータを修正します。
ビジネスの観点からは、it means that smart contract functions can be inherently monetized(ユーザーがper instanceではなくper compute cycleを支払うことができるAWS Lambda関数に似ています)。 重要なのは、smart contract functionsを実行するためにイーサリアムのコストをかける必要がないことです。
簡単に言うと、smart contractは、コントラクトを使用するすべての関係者が同意する条件を定義する、ブロックチェーンネットワークに格納されているコードのコレクションと見なすことができます。
これにより、開発者はまだ発明されていないものを作成できます。 もう一度考えてみてください。仲介者は必要ありません。また、取引相手のリスクもありません。 新しい市場を作り、負債や約束の登録を保存し、取引を検証するネットワークのコンセンサスがあることを保証します。
誰でも、含まれるコードのストレージサイズに比例した料金で、スマートコントラクトを分散型データベースに展開できます。 スマートコントラクトの使用を希望するノードは、ネットワークの他の部分への参加の結果を何らかの形で示す必要があります。
3.1. 堅牢性
イーサリアムで使用される主な言語はSolidityです。これは、スマートコントラクトを作成するために特別に開発されたJavascriptのような言語です。 Solidityは静的に型付けされ、継承、ライブラリ、複雑なユーザー定義型などの機能をサポートしています。
Solidityコンパイラーは、コードをEVMバイトコードに変換し、その後、展開トランザクションとしてEthereumネットワークに送信できます。 このような展開には、スマートな契約のやり取りよりも実質的な取引手数料がかかり、契約の所有者が支払う必要があります。
4. 堅実なスマートコントラクトの作成
ソリッドコントラクトの最初の行は、ソースコードバージョンを設定します。 これは、新しいコンパイラバージョンでコントラクトが突然異なる動作をしないようにするためです。
pragma solidity ^0.4.0;
この例では、コントラクトの名前はGreetingであり、その作成はJavaまたは別のオブジェクト指向プログラミング言語のクラスに似ています。
contract Greeting {
address creator;
string message;
// functions that interact with state variables
}
この例では、creatorとmessageの2つの状態変数を宣言しました。 Solidityでは、addressという名前のデータ型を使用してアカウントのアドレスを格納します。
次に、コンストラクターで両方の変数を初期化する必要があります。
4.1. コンストラクタ
コンストラクターは、functionキーワードに続けてコントラクトの名前を使用して宣言します(Javaの場合と同様)。
コンストラクターは、コントラクトが最初にEthereumブロックチェーンにデプロイされたときに一度だけ呼び出される特別な関数です。 コントラクトに対して1つのコンストラクターのみを宣言できます。
function Greeting(string _message) {
message = _message;
creator = msg.sender;
}
また、初期文字列_messageをパラメーターとしてコンストラクターに挿入し、それをmessage状態変数に設定します。
コンストラクターの2行目で、creator変数をmsg.senderという値に初期化します。 コンストラクターにmsgを挿入する必要がない理由は、msgが、メッセージを送信するアカウントのアドレスなど、メッセージに関する特定の情報を提供するグローバル変数であるためです。
この情報を使用して、特定の機能のアクセス制御を実装できます。
4.2. セッターとゲッターのメソッド
最後に、message:のsetterメソッドとgetterメソッドを実装します
function greet() constant returns (string) {
return message;
}
function setGreeting(string _message) {
message = _message;
}
関数greetを呼び出すと、現在保存されているmessage.が返されます。constantキーワードを使用して、この関数がコントラクト状態を変更せず、ブロックチェーンへの書き込みをトリガーしないことを指定します。 。
関数setGreetingを呼び出すことにより、コントラクトの状態の値を変更できるようになりました。 この関数を呼び出すだけで、誰でも値を変更できます。 このメソッドには戻り値の型はありませんが、パラメーターとしてString型を取ります。
最初のスマートコントラクトを作成したので、次のステップはそれをイーサリアムブロックチェーンにデプロイして、誰もが使用できるようにすることです。 Remixを使用できます。これは、現在最高のオンラインIDEであり、簡単に使用できます。
5. スマートコントラクトとの相互作用
分散ネットワーク(ブロックチェーン)のスマートコントラクトと対話するには、クライアントの1つにアクセスする必要があります。
これを行うには2つの方法があります。
-
Infuraなどのサービスを使用してリモートノードに接続します。
Infuraは最も簡単なオプションなので、free access tokenをリクエストします。 サインアップしたら、RinkebyテストネットワークのURLを選択する必要があります:“https://rinkeby.infura.io/<token>”.
Javaからのスマートコントラクトを処理できるようにするには、Web3jというライブラリを使用する必要があります。 Mavenの依存関係は次のとおりです。
org.web3j
core
3.3.1
そしてGradleで:
compile ('org.web3j:core:3.3.1')
コードを書き始める前に、最初にやらなければならないことがいくつかあります。
5.1. ウォレットの作成
Web3jでは、コマンドラインからその機能の一部を使用できます。
-
ウォレット作成
-
ウォレットのパスワード管理
-
あるウォレットから別のウォレットへの送金
-
Solidityスマートコントラクト関数ラッパーを生成する
コマンドラインツールは、プロジェクトリポジトリのreleasesページ、ダウンロードセクション、またはOSXユーザーの場合はhomebrewを介してzipファイル/ tarballとして入手できます。
brew tap web3j/web3j
brew install web3j
新しいイーサリアムウォレットを生成するには、コマンドラインで次を入力するだけです:
$ web3j wallet create
パスワードと、ウォレットを保存できる場所を尋ねられます。 ファイルはJson形式であり、留意すべき主なものはEthereumアドレスです。
次のステップでそれを使用してEtherをリクエストします。
5.2. RinkebyTestnetでEtherをリクエストする
無料のEtherhereをリクエストできます。 悪意のあるアクターが利用可能なすべての資金を使い果たすのを防ぐため、イーサリアムのアドレスを含むソーシャルメディアの投稿へのパブリックリンクを提供するよう求められます。
これは非常に簡単な手順で、ほとんど瞬時にEtherが提供されるため、テストを実行できます。
5.3. スマートコントラクトラッパーの生成
Web3jは、スマートコントラクトラッパーコードを自動生成して、JVMを離れることなくスマートコントラクトを展開および操作できます。
ラッパーコードを生成するには、スマートコントラクトをコンパイルする必要があります。 コンパイラhereをインストールするための命令を見つけることができます。 そこから、コマンドラインで次のように入力します。
$ solc Greeting.sol --bin --abi --optimize -o /
後者は、Greeting.binとGreeting.abi.の2つのファイルを作成します。これで、web3jのコマンドラインツールを使用してラッパーコードを生成できます。
$ web3j solidity generate /path/to/Greeting.bin
/path/to/Greeting.abi -o /path/to/src/main/java -p com.your.organisation.name
これで、メインコードのコントラクトと対話するためのJavaクラスができました。
6. スマートコントラクトとの相互作用
メインクラスでは、まず新しいweb3jインスタンスを作成して、ネットワーク上のリモートノードに接続します。
Web3j web3j = Web3j.build(
new HttpService("https://rinkeby.infura.io/"));
次に、Ethereumウォレットファイルをロードする必要があります。
Credentials credentials = WalletUtils.loadCredentials(
"",
"/path/to/");
それでは、スマートコントラクトをデプロイしましょう。
Greeting contract = Greeting.deploy(
web3j, credentials,
ManagedTransaction.GAS_PRICE, Contract.GAS_LIMIT,
"Hello blockchain world!").send();
ネットワークでの作業によっては、契約の展開に時間がかかる場合があります。 デプロイされたら、契約がデプロイされたアドレスを保存することができます。 この方法で住所を取得できます。
String contractAddress = contract.getContractAddress();
契約で行われたすべてのトランザクションは、次のURLで確認できます。「https://rinkeby.etherscan.io/address/<contract_address>”.
一方、トランザクションを実行するスマートコントラクトの値を変更できます。
TransactionReceipt transactionReceipt = contract.setGreeting("Hello again").send();
最後に、保存されている新しい値を表示する場合は、次のように簡単に記述できます。
String newValue = contract.greet().send();
7. 結論
このチュートリアルでは、Solidityが、EVMで実行されるスマートコントラクトを開発するために設計された静的に型指定されたプログラミング言語であることを確認しました。
また、この言語との簡単な契約を作成し、他のプログラミング言語と非常によく似ていることを確認しました。
smart contractは、値の交換を容易にすることができるコンピューターコードを説明するために使用される単なるフレーズです。 ブロックチェーンで実行する場合、スマートコントラクトは、特定の条件が満たされると自動的に実行される自動実行コンピュータープログラムになります。
この記事では、ブロックチェーンでコードを実行する機能がイーサリアムの主な差別化であることがわかりました。これにより、開発者はこれまで見たことのない新しいタイプのアプリケーションを構築できます。
いつものように、コードサンプルはover on GitHubで見つけることができます。