1. 概要
スマートコントラクトを実行する機能が、Ethereumブロックチェーンを非常に人気のある破壊的なものにしました。
スマートコントラクトとは何かを説明する前に、blockchainの定義から始めましょう。
ブロックチェーンは、デジタルトランザクションの永続的な記録を保持するパブリックデータベースです。 これは、信頼できないトランザクションシステムとして機能します。これは、個人が第三者や相互に信頼することなくピアツーピアトランザクションを実行できるフレームワークです。
solidity:を使用してEthereumでスマートコントラクトを作成する方法を見てみましょう。
2. イーサリアム
イーサリアムは、人々がブロックチェーンテクノロジーを効率的に使用して分散型アプリケーションを作成できるようにするプラットフォームです。
分散型アプリケーション( Dapp )は、一元化された仲介なしで一緒になっていた、相互作用のさまざまな側面にいる人々や組織のためのツールです。 Dappsの初期の例には、BitTorrent(ファイル共有)とBitcoin(通貨)が含まれます。
イーサリアムは、プログラミング言語が組み込まれたブロックチェーンとして説明できます。
2.1. イーサリアム仮想マシン(EVM)
実用的な観点から、EVMは、アカウントと呼ばれる数百万のオブジェクトを含む大規模な分散型システムと考えることができます。このシステムは、内部データベースを維持し、コードを実行し、相互に通信できます。
最初のタイプのアカウントは、ネットワークを使用する平均的なユーザーにとっておそらく最もよく知られています。 その名前はEOA(外部所有アカウント)です。 値( Ether など)を送信するために使用され、秘密鍵によって制御されます。
一方、契約という別のタイプのアカウントがあります。先に進んで、これが何であるかを見てみましょう。
3. スマートコントラクトとは何ですか?
スマートコントラクトは、通常 Solidityで記述され、バイナリまたはJSONにコンパイルされ、ブロックチェーンの特定のアドレスにデプロイされるスタンドアロンスクリプトです。 RESTful APIの特定のURLエンドポイントを呼び出して、 HttpRequest を介してロジックを実行できるのと同じように、デプロイされたスマートコントラクトを特定ので同様に実行できます。アドレス、デプロイおよびコンパイルされたSolidity関数を呼び出すために必要なEthereumとともに正しいデータを送信します。
ビジネスの観点からは、スマートコントラクト関数を本質的に現金化できることを意味します(ユーザーがインスタンスごとではなくコンピューティングサイクルごとを支払うことができるAWSLambda関数に似ています。 X220X])。 重要なのは、スマートコントラクト機能を実行するためにEthereumのコストをかける必要がないことです。
簡単に言えば、スマートコントラクトは、コントラクトを使用するすべての関係者が同意する条件を定義する、ブロックチェーンネットワークに格納されたコードのコレクションと見なすことができます。
これにより、開発者はまだ発明されていないものを作成できます。 少し考えてみてください。仲介者は必要なく、カウンターパーティリスクもありません。 新しい市場を作成し、債務または約束のレジストリを保存し、トランザクションを検証するネットワークのコンセンサスがあることを確認できます。
誰でも、含まれているコードのストレージサイズに比例した料金で、分散型データベースにスマートコントラクトを展開できます。 スマートコントラクトの使用を希望するノードは、ネットワークの他の部分への参加の結果を何らかの形で示す必要があります。
3.1. 堅牢性
イーサリアムで使用される主な言語はSolidityです。これは、スマートコントラクトを作成するために特別に開発されたJavascriptのような言語です。 Solidityは静的に型付けされ、継承、ライブラリ、その他の機能の中でも複雑なユーザー定義型をサポートします。
SolidityコンパイラはコードをEVMバイトコードに変換し、それを展開トランザクションとしてイーサリアムネットワークに送信できます。 このような展開には、スマートコントラクトの相互作用よりもかなりの取引手数料がかかり、契約の所有者が支払う必要があります。
4. 堅実なスマートコントラクトの作成
Solidityコントラクトの最初の行は、ソースコードのバージョンを設定します。 これは、コントラクトが新しいコンパイラバージョンで突然異なる動作をしないようにするためです。
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. コンストラクタ
関数キーワードに続けてコントラクトの名前を使用してコンストラクターを宣言します(Javaの場合と同様)。
コンストラクターは、コントラクトが最初にイーサリアムブロックチェーンにデプロイされたときに一度だけ呼び出される特別な関数です。 コントラクトに対して宣言できるコンストラクターは1つだけです。
function Greeting(string _message) {
message = _message;
creator = msg.sender;
}
また、初期文字列 _message をパラメーターとしてコンストラクターに挿入し、message状態変数に設定します。
コンストラクターの2行目で、creator変数をmsg.senderという値に初期化します。 msg をコンストラクターに挿入する必要がない理由は、 msg が、メッセージを送信するアカウントのアドレスなど、メッセージに関する特定の情報を提供するグローバル変数であるためです。
この情報を使用して、特定の機能のアクセス制御を実装できる可能性があります。
4.2. セッターとゲッターのメソッド
最後に、メッセージのsetterメソッドとgetterメソッドを実装します:
function greet() constant returns (string) {
return message;
}
function setGreeting(string _message) {
message = _message;
}
関数の呼び出し挨拶現在保存されているものを返すだけですメッセージ。 を使用します絶え間ないこの関数がコントラクト状態を変更せず、ブロックチェーンへの書き込みをトリガーしないことを指定するキーワード。
これで、関数 setGreeting を呼び出すことにより、コントラクトの状態の値を変更できます。 この関数を呼び出すだけで、誰でも値を変更できます。 このメソッドには戻り型はありませんが、パラメーターとしてString型を取ります。
最初のスマートコントラクトを作成したので、次のステップはそれをイーサリアムブロックチェーンにデプロイして、誰もが使用できるようにすることです。 Remix を使用できます。これは、現在最高のオンラインIDEであり、簡単に使用できます。
5. スマートコントラクトとの相互作用
分散型ネットワーク(ブロックチェーン)でスマートコントラクトとやり取りするには、クライアントの1つにアクセスできる必要があります。
これを行うには2つの方法があります。
- 自分でクライアントを実行する
- Infuraなどのサービスを使用してリモートノードに接続します。
Infuraは最も簡単なオプションなので、無料アクセストークンをリクエストします。 サインアップしたら、RinkebyテストネットワークのURLを選択する必要があります。 「https://rinkeby.infura.io/ 」。
Javaからのスマートコントラクトを処理できるようにするには、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スマートコントラクト関数ラッパーを生成する
コマンドラインツールは、プロジェクトリポジトリの releases ページ、ダウンロードセクション、またはOSXユーザーの場合はhomebrewからzipファイル/tarballとして入手できます。
brew tap web3j/web3j
brew install web3j
新しいイーサリアムウォレットを生成するには、コマンドラインで次のように入力するだけです。
$ web3j wallet create
パスワードとウォレットを保存できる場所を尋ねられます。 ファイルはJson形式であり、覚えておくべき主なことはイーサリアムアドレスです。
次のステップでそれを使用してEtherをリクエストします。
5.2. RinkebyTestnetでEtherをリクエストする
無料のEtherこちらをリクエストできます。 悪意のある攻撃者が利用可能なすべての資金を使い果たすのを防ぐために、彼らは私たちのイーサリアムアドレスを持つ1つのソーシャルメディア投稿へのパブリックリンクを提供するように私たちに求めています。
これは非常に単純なステップであり、ほぼ瞬時にEtherを提供するため、テストを実行できます。
5.3. スマートコントラクトラッパーの生成
Web3jは、スマートコントラクトラッパーコードを自動生成して、JVMを離れることなくスマートコントラクトをデプロイおよび操作できます。
ラッパーコードを生成するには、スマートコントラクトをコンパイルする必要があります。 コンパイラをインストールする手順はここにあります。 そこから、コマンドラインで次のように入力します。
$ solc Greeting.sol --bin --abi --optimize -o <output_dir>/
後者は2つのファイルを作成します: Greeting.binとGreeting.abi。これで、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/<your_token>"));
次に、Ethereumウォレットファイルをロードする必要があります。
Credentials credentials = WalletUtils.loadCredentials(
"<password>",
"/path/to/<walletfile>");
それでは、スマートコントラクトをデプロイしましょう:
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/ 」。
一方、トランザクションを実行するスマートコントラクトの値を変更できます。
TransactionReceipt transactionReceipt = contract.setGreeting("Hello again").send();
最後に、保存された新しい値を表示する場合は、次のように記述できます。
String newValue = contract.greet().send();
7. 結論
このチュートリアルでは、 Solidity が、EVMで実行されるスマートコントラクトを開発するために設計された静的に型付けされたプログラミング言語であることを確認しました。
また、この言語との簡単な契約を作成し、他のプログラミング言語と非常によく似ていることを確認しました。
スマートコントラクトは、価値の交換を容易にすることができるコンピューターコードを説明するために使用される単なるフレーズです。 ブロックチェーンで実行する場合、スマートコントラクトは、特定の条件が満たされたときに自動的に実行される自己動作型のコンピュータープログラムになります。
この記事では、ブロックチェーンでコードを実行する機能がイーサリアムの主な違いであることがわかりました。これにより、開発者はこれまでに見たことのない新しいタイプのアプリケーションを構築できるようになります。
いつものように、コードサンプルはGitHubのにあります。