下記のコマンドで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=
前述のコントラクトを再利用します。まずは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"
次に下記コマンドを実行し、コントラクトの関数「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」と表示されれば、トランザクションの発行は完了です。
別途コンソールを立ち上げ、仮想環境に接続します。
$ 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」と表示されます。
別途コンソールを立ち上げ、仮想環境に接続します。
$ 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の使い方を説明しました。実際のサービスにスマートコントラクトを組み込むためには、他にもさまざまな技術やライブラリが必要になってきます。ブロックチェーン技術の進歩は目覚ましく、日々新しい技術やライブラリが生まれているので、また紹介できればと思います。
Copyright © ITmedia, Inc. All Rights Reserved.