「Quorum」で学ぶ、“トランザクション”と“プライベートトランザクション”の発行方法Ethereumではじめる“スマートコントラクト開発”(終)(2/2 ページ)

» 2018年09月04日 05時00分 公開
[田中昭博トライデントアーツ]
前のページへ 1|2       

プライベートトランザクション発行

手順1:各nodeのアドレス(公開鍵)を確認する

 下記のコマンドでnode1、node2、node3のアドレス(公開鍵)を確認します。

$ cd quorum-examples/7nodes
$ more keys/tm1.pub
BULeR8JyUWhiuuCMU/HLA0Q5pzkYT+cHII3ZKBey3Bo=
$ more keys/tm2.pub
QfeDAys9MPDs2XHExtc84jKGHxZg/aj52DTh0vtA3Xc=
$ more keys/tm3.pub
1iTZde/ndBHvzhcl7V68x44Vx7pl8nwx9LqnM/AfJUg=

手順2:コントラクトをデプロイする

 前述のコントラクトを再利用します。まずはnode1のコンソールを起動します。

$ geth attach qdata/dd1/geth.ipc

 次にコントラクトをデプロイします。今回は、privateForにnode3のアドレス(公開鍵、今回は「1iTZde/ndBHvzhcl7V68x44Vx7pl8nwx9LqnM/AfJUg=」になります)を指定することで、node3にのみ公開するコントラクトとしてデプロイします。なお「privateFor」を指定する際に、自分自身のnodeは指定できません。

> var bin = "0x<binファイルの中身>"
> var abi = <abiファイルの中身>
> var contract = eth.contract(abi)
> var myContract = contract.new({ from: eth.accounts[0], data: bin, privateFor:["<node3のアドレス(公開鍵)>"]})

 下記コマンドでデプロイしたコントラクトのアドレスを確認します。

> myContract.address
"0x4d3bfd7821e237ffe84209d8e638f9f309865b87"

手順3:node1でプライベートトランザクションを発行する

 次に下記コマンドを実行し、コントラクトの関数「set」をプライベートトランザクションとして呼び出します。

> var private = eth.contract(myContract.abi).at(myContract.address)
> private.set(11,{from:eth.accounts[0],privateFor:["<node3のアドレス(公開鍵)>"]})
"0xec18fd354672268dbe053cd9704a996ccdb46e4823dd31755ffa4eeb5f5a1dfb"

 下記のコマンドでトランザクションの状態を確認し、コントラクトの関数「get」を呼び出して登録した値を参照します。

> eth.getTransaction("0xec18fd354672268dbe053cd9704a996ccdb46e4823dd31755ffa4eeb5f5a1dfb")
> private.get()

 「11」と表示されれば、トランザクションの発行は完了です。

手順4:node2でコントラクトの状態を確認する

 別途コンソールを立ち上げ、仮想環境に接続します。

$ cd quorum-examples
$ vagrant ssh

 仮想環境にてnode2のコンソールを起動します。

$ cd quorum-examples/7nodes
$ geth attach qdata/dd2/geth.ipc

 node2のコンソールで下記のコマンドを実行し、コントラクトの状態を確認します。addressには、手順2でデプロイしたコントラクトのアドレス(0x4d3bfd7821e237ffe84209d8e638f9f309865b87)を指定します。

> var abi = <abiファイルの中身>
> var address = "<前述の手順2でデプロイしたコントラクトのアドレス>"
> var private = eth.contract(abi).at(address)
> private.get()

 node1で登録した値は読み取れないので、「0」と表示されます。

手順5:node3でコントラクトの状態を確認する

 別途コンソールを立ち上げ、仮想環境に接続します。

$ cd quorum-examples
$ vagrant ssh

 仮想環境にてnode3のコンソールを起動します。

$ cd quorum-examples/7nodes
$ geth attach qdata/dd3/geth.ipc

 node3のコンソールで下記コマンドを実行し、コントラクトの状態を確認します。addressにはnode2のときと同様、手順2でデプロイしたコントラクトのアドレス(0x4d3bfd7821e237ffe84209d8e638f9f309865b87)を指定します。

> var abi = <abiファイルの中身>
> var address = "<前述の手順2でデプロイしたコントラクトのアドレス>"
> var private = eth.contract(abi).at(address)
> private.get()

 node1で登録した値は、node3から読み取れるので、「11」と表示されます。


 いかがでしたか。このように、QuorumではprivateForを指定することで、簡単にプライベートなデータ管理機能を実装できます。

 本連載では、これまでスマートコントラクトの概念の説明から始まり、最終的にはQuorumの使い方を説明しました。実際のサービスにスマートコントラクトを組み込むためには、他にもさまざまな技術やライブラリが必要になってきます。ブロックチェーン技術の進歩は目覚ましく、日々新しい技術やライブラリが生まれているので、また紹介できればと思います。

著者プロフィール

田中昭博

トライデントアーツ株式会社

ユーザーインタフェース設計を得意とするエンジニア。好きな言語はTypeScript。ReactよりAngular派。現在はブロックチェーン関連のアプリケーション開発を行っている。


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。