1概要

スマートコントラクトを実行する機能は、Ethereumブロックチェーンを非常に人気のある破壊的なものにしました。

スマートコントラクトとは何かを説明する前に、

blockchain

の定義から始めましょう。

ブロックチェーンは、デジタル取引の恒久的な記録を保持する公共のデータベースである。それは信頼できない取引システム、個人が第三者または互いを信用する必要なしにピアツーピア取引をすることができる枠組みとして作動する。

__solidityを使ってEthereumでスマートな契約を作成する方法を見てみましょう。

===

2 Ethereum

Ethereumは、ブロックチェーンテクノロジを使用して分散型アプリケーションを効率的に作成できるプラットフォームです。

分散アプリケーション(

Dapp

)は、対話のさまざまな側面にいる人々や組織にとって、一元化された仲介者なしで一緒にやってくるためのツールです。 Dappの初期の例には、BitTorrent(ファイル共有)とBitcoin(通貨)があります。

Ethereumは、プログラミング言語を組み込んだブロックチェーンとして記述できます。

====

2.1. Ethereum Virtual Machine(EVM)

実用的な観点から、EVMは

accounts

と呼ばれる何百万ものオブジェクトを含む大規模な分散システムとして考えることができ、内部データベースを維持し、コードを実行し、互いに対話することができます。

最初の種類のアカウントは、おそらくネットワークを使用している一般のユーザーにとって最も身近なものです。その名前は

EOA

(外部所有アカウント)です。それは価値を伝達するのに使用され(https://www.ethereum.org/ether[Ether]など)、秘密鍵によって制御されます。

一方で、__contractという別の種類のアカウントがあります。

===

3スマートコントラクトとは何ですか?


smart contract

は通常Solidityで書かれ


binary

またはJSONにコンパイルされ


blockchain

** の特定の

address

に展開されたスタンドアロンスクリプトです。 RESTful APIの特定のURLエンドポイントを呼び出して

HttpRequest

を介してロジックを実行できるのと同じ方法で、正しいデータを必要なEthereumと一緒に適切なデータを送信して同様に特定のアドレスで実行できます。そしてSolidity

function

をまとめました。

ビジネスの観点から見ると、

スマート契約関数は本質的に収益化することができます

(ユーザーが

インスタンス

インスタンスごとではなく

計算サイクル

を支払えるようにするAWS Lambda関数と同様)。

重要なのは、

スマート契約機能

を実行するためにEthereumにコストをかける必要がないことです。

簡単に言えば、

スマート契約

は、契約を使用しているすべての関係者が合意する条件を定義する、ブロックチェーンネットワークに格納されたコードのコレクションとして見ることができます。

これにより、開発者はまだ発明されていないものを作成できます。

ちょっと考えてみてください – 仲買人の必要はなく、また相手方のリスクもありません。私たちは新しい市場を作り、借金や約束の記録を保管し、取引を検証するネットワークの合意を確実に得ることができます。

格納しているコードのストレージサイズに比例した料金で、誰でも分散データベースにスマートコントラクトを導入できます。スマートコントラクトを使用したいノードは、何らかの方法でネットワークの他の部分への参加の結果を示さなければなりません。

====

3.1. 固さ

Ethereumで使用されている主な言語はhttps://solidity.readthedocs.io/en/develop/[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の設定メソッドと取得メソッドを実装します。

function greet() constant returns (string) {
    return message;
}

function setGreeting(string __message) {
    message = __message;
}


greet

関数を呼び出すと、現在保存されている

messageが返されるだけです。

constant__キーワードを使用して、この関数が契約状態を変更せず、ブロックチェーンへの書き込みをトリガーしないことを指定します。

これで、関数

setGreeting

を呼び出すことによって契約内の州の値を変更できます。この関数を呼び出すだけで誰でも値を変更できます。このメソッドには戻り値の型はありませんが、

String

型をパラメータとして取ります。

最初のスマートコントラクトを作成したので、次のステップはそれをEthereumブロックチェーンにデプロイして誰もが使用できるようにすることです。

Remix

を使用することができます。これは現在最良のオンラインIDEであり、使用するのは簡単です。

===

5スマート契約とのやり取り

分散ネットワーク(ブロックチェーン)でスマートコントラクトと対話するには、クライアントの1つにアクセスできる必要があります。

これを行うには2つの方法があります。

Infuraは最も簡単なオプションなので、https://infura.io/signup[無料アクセストークン]をリクエストします。サインアップしたら、RinkebyテストネットワークのURLを選ぶ必要があります。

Javaからのスマートコントラクトと取引できるようにするには、https://web3j.io/[Web3j]というライブラリを使用する必要があります。これがMavenの依存関係です。

<dependency>
    <groupId>org.web3j</groupId>
    <artifactId>core</artifactId>
    <version>3.3.1</version>
</dependency>

そしてGradleでは:

compile ('org.web3j:core:3.3.1')

コードを書き始める前に、最初にしなければならないことがいくつかあります。

====

5.1. ウォレットを作成する

Web3jでは、コマンドラインからその機能の一部を使用することができます。

  • 財布の作成

  • ウォレットパスワード管理

  • 財布間の資金移動

  • Solidityスマートコントラクト関数ラッパーの生成

コマンドラインツールは、プロジェクトリポジトリのhttps://github.com/web3j/web3j/releases/latest[releases]ページから、またはダウンロードセクションの下で、または自作を介してOS Xユーザーのためのzipファイル/tarballとして入手できます。 :

brew tap web3j/web3j
brew install web3j

新しいEthereumウォレットを生成するには、単純にコマンドラインに次のように入力します。

$ web3j wallet create

パスワードと、財布を保存できる場所を尋ねてきます。ファイルはJson形式であり、覚えておくべき主なものはEthereumアドレスです。

次のステップでそれを使ってEtherをリクエストします。

====

5.2. Rinkeby TestnetでEtherを要求する

私達は自由なエーテルhttps://www.rinkeby.io/#faucet[here]を要求することができます。悪意のある行為者が利用可能な資金をすべて使い果たすのを防ぐために、彼らは私たちのEthereumアドレスを持つ1つのソーシャルメディア投稿へのパブリックリンクを提供するよう私たちに求めます。

これは非常に簡単なステップです。ほとんど瞬時にそれらがEtherを提供するのでテストを実行できます。

====

5.3. スマートコントラクトラッパーの生成

Web3jは、JVMを離れることなくスマートコントラクトラッパーコードを自動生成してスマートコントラクトをデプロイし、対話することができます。

ラッパーコードを生成するには、スマートコントラクトをコンパイルする必要があります。

ここ

をクリックすると、コンパイラをインストールすることができます。

そこから、コマンドラインに次のように入力します。

$ solc Greeting.sol --bin --abi --optimize -o <output__dir>/----

後者は__Greeting.bin__と__Greeting.abi.という2つのファイルを作成します。これで、web3jのコマンドラインツールを使ってラッパーコードを生成できます。

[source,java,gutter:,true]

$ 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インスタンスを作成します。

[source,java,gutter:,true]

Web3j web3j = Web3j.build(
new HttpService(“https://rinkeby.infura.io/<your__token>”));

次に、Ethereum Walletファイルをロードする必要があります。

[source,java,gutter:,true]

Credentials credentials = WalletUtils.loadCredentials(
“<password>”,
“/path/to/<walletfile>”);

それでは、スマートコントラクトを展開しましょう。

[source,java,gutter:,true]

Greeting contract = Greeting.deploy(
web3j, credentials,
ManagedTransaction.GAS

PRICE, Contract.GAS

LIMIT,
“Hello blockchain world!”).send();

ネットワークでの作業によっては、契約の展開に時間がかかる場合があります。展開されたら、契約が展開された場所の住所を格納することができます。この方法で住所を取得することができます。

[source,java,gutter:,true]

String contractAddress = contract.getContractAddress();

契約で行われたすべての取引はURLで見ることができます。

“ __https://rinkeby.etherscan.io/address/<contract__address>” .__

一方、トランザクションを実行するスマートコントラクトの価値を変更することができます。

[source,java,gutter:,true]

TransactionReceipt transactionReceipt = contract.setGreeting(“Hello again”).send();

最後に、格納されている新しい値を見たい場合は、単純に次のように書くことができます。

[source,java,gutter:,true]

String newValue = contract.greet().send();

===  **  7. 結論**

このチュートリアルでは、https://solidity.readthedocs.io/en/develop/index.html[Solidity]がEVM上で動作するスマートコントラクトを開発するために設計された静的型付けプログラミング言語であることを確認しました。

この言語との直接的な契約も作成しましたが、それは他のプログラミング言語と非常に似ていることがわかりました。

__スマート契約__は、価値の交換を容易にすることができるコンピュータコードを記述するために使用される単なるフレーズです。ブロックチェーンで実行すると、スマートコントラクトは、特定の条件が満たされたときに自動的に実行される自動操作コンピュータプログラムになります。

この記事では、ブロックチェーンでコードを実行する機能がEthereumの主な差別化であることを説明しました。開発者はこれまでに見てきたことをはるかに超える新しいタイプのアプリケーションを構築できます。

いつものように、コードサンプルはhttps://github.com/eugenp/tutorials/tree/master/ethereum/src/main/java/com/baeldung/web3j[over on GitHub]にあります。