「Quorum」で学ぶ、“トランザクション”と“プライベートトランザクション”の発行方法:Ethereumではじめる“スマートコントラクト開発”(終)(2/2 ページ)
Ethereumをベースに、企業向けに改良されているスマートコントラクトプラットフォーム「Quorum」を使った、“トランザクション”と“プライベートトランザクション”の発行方法を紹介する。
プライベートトランザクション発行
手順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の使い方を説明しました。実際のサービスにスマートコントラクトを組み込むためには、他にもさまざまな技術やライブラリが必要になってきます。ブロックチェーン技術の進歩は目覚ましく、日々新しい技術やライブラリが生まれているので、また紹介できればと思います。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 「Enterprise Ethereum」はなぜできた? 「Ethereum」のビジネス活用の問題点とは
「Ethereum」がブロックチェーン技術、スマートコントラクト技術の1つとして企業に注目されている。しかし、Ethereumをビジネスで活用するにはさまざまな課題がある。そこで今回は、「企業向けスマートコントラクト」の要件を考えてみたい。 - スマートコントラクトって何? 「競合との協業」という新たなビジネスの地平を開ける仕組みである理由とは
本連載では、「Ethereum」を使った契約の条件確認や履行などを自動で行う「スマートコントラクト」の開発方法を紹介していきます。第1回目は、スマートコントラクトとは、どのような仕組みで、どのような場面で使えるのかを紹介します。 - ブロックチェーン技術「Ethereum」とは何か、アプリのアーキテクチャはどう変わるのか
リクルートテクノロジーズの社内ラボで行っている、主に非金融領域に対するブロックチェーンの活用に向けたR&Dを紹介する連載。今回は、スクリプティング機能をより広汎に使える形にしたブロックチェーンの構築を目指したオープンソースソフトウェア「Ethereum」を利用し、「履歴書データベース」として実装した課程と、その結果を紹介。