IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ エヌ・ティ・ティ・ソフトウェア株式会社の特許一覧

特開2024-60246移転管理システム、移転管理方法、プログラム、及びデータ構造
<>
  • 特開-移転管理システム、移転管理方法、プログラム、及びデータ構造 図1
  • 特開-移転管理システム、移転管理方法、プログラム、及びデータ構造 図2
  • 特開-移転管理システム、移転管理方法、プログラム、及びデータ構造 図3
  • 特開-移転管理システム、移転管理方法、プログラム、及びデータ構造 図4
  • 特開-移転管理システム、移転管理方法、プログラム、及びデータ構造 図5
  • 特開-移転管理システム、移転管理方法、プログラム、及びデータ構造 図6
  • 特開-移転管理システム、移転管理方法、プログラム、及びデータ構造 図7
  • 特開-移転管理システム、移転管理方法、プログラム、及びデータ構造 図8
  • 特開-移転管理システム、移転管理方法、プログラム、及びデータ構造 図9
  • 特開-移転管理システム、移転管理方法、プログラム、及びデータ構造 図10
  • 特開-移転管理システム、移転管理方法、プログラム、及びデータ構造 図11
  • 特開-移転管理システム、移転管理方法、プログラム、及びデータ構造 図12
  • 特開-移転管理システム、移転管理方法、プログラム、及びデータ構造 図13
  • 特開-移転管理システム、移転管理方法、プログラム、及びデータ構造 図14
  • 特開-移転管理システム、移転管理方法、プログラム、及びデータ構造 図15
  • 特開-移転管理システム、移転管理方法、プログラム、及びデータ構造 図16
  • 特開-移転管理システム、移転管理方法、プログラム、及びデータ構造 図17
  • 特開-移転管理システム、移転管理方法、プログラム、及びデータ構造 図18
  • 特開-移転管理システム、移転管理方法、プログラム、及びデータ構造 図19
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024060246
(43)【公開日】2024-05-02
(54)【発明の名称】移転管理システム、移転管理方法、プログラム、及びデータ構造
(51)【国際特許分類】
   G06Q 10/0833 20230101AFI20240424BHJP
   B65G 61/00 20060101ALI20240424BHJP
【FI】
G06Q10/08 306
B65G61/00 510
【審査請求】有
【請求項の数】10
【出願形態】OL
(21)【出願番号】P 2022167497
(22)【出願日】2022-10-19
(71)【出願人】
【識別番号】000102717
【氏名又は名称】NTTテクノクロス株式会社
(74)【代理人】
【識別番号】100107766
【弁理士】
【氏名又は名称】伊東 忠重
(74)【代理人】
【識別番号】100070150
【弁理士】
【氏名又は名称】伊東 忠彦
(72)【発明者】
【氏名】小森 絵未
(72)【発明者】
【氏名】宮崎 泰彦
(72)【発明者】
【氏名】兼松 和広
【テーマコード(参考)】
5L010
5L049
【Fターム(参考)】
5L010AA16
5L049AA16
(57)【要約】
【課題】相互参照可能な階層構造を持つデータにより物品の占有移転をブロックチェーン上で管理できる技術を提供すること。
【解決手段】本開示の一態様による移転管理システムは、物の占有移転を管理する移転管理システムであって、物に紐付けられているトークンを子、1以上の物の占有移転を行う場合の管理単位に紐付けられているトークンを親として相互参照可能な親子関係を持つトークンが記録されるブロックチェーンを含み、前記物の占有移転の管理を実現するためのトランザクションを前記ブロックチェーンに発行するように構成されているトランザクション発行部、を有する。
【選択図】図2
【特許請求の範囲】
【請求項1】
物の占有移転を管理する移転管理システムであって、
物に紐付けられているトークンを子、1以上の物の占有移転を行う場合の管理単位に紐付けられているトークンを親として相互参照可能な親子関係を持つトークンが記録されるブロックチェーンを含み、
前記物の占有移転の管理を実現するためのトランザクションを前記ブロックチェーンに発行するように構成されているトランザクション発行部、を有する移転管理システム。
【請求項2】
前記トランザクションには、
前記管理単位に紐付けられているトークンの占有移転を前記ブロックチェーンに記録することで、前記管理単位で1以上の物の占有移転を実現する占有移転トランザクションが含まれる、請求項1に記載の移転管理システム。
【請求項3】
前記トランザクションには、
前記物又は前記管理単位に紐付けられるトークンを生成するためのトークン生成トランザクション、
前記管理単位に紐付けられているトークンの占有移転先として許可する1以上のアドレスを前記トークンに設定するための占有移転許可トランザクション、
前記管理単位に紐付けられているトークンに対して、前記管理単位で占有移転が行われる1以上の物の各々に紐付けられている1以上のトークンを子として紐付けるための親子関係紐付けトランザクション、
前記管理単位に紐付けられているトークンと、該トークンに子として紐付けられている1以上のトークンとの紐付けを解除するための親子関係紐付け解除トランザクション、
前記物又は前記管理単位に紐付けられているトークンを償却するためのトークン償却トランザクション、の少なくとも1つが含まれる、請求項2に記載の移転管理システム。
【請求項4】
前記トークン生成トランザクションは、
生成対象のトークンを識別するためのトークンIDが未使用である場合、又は、生成対象のトークンを識別するためのトークンIDが、前記トークン償却トランザクションによって償却されたトークンのトークンIDである場合、前記生成対象のトークンを生成する、請求項3に記載の移転管理システム。
【請求項5】
前記トランザクションには、
前記ブロックチェーン上に占有移転の記録漏れが存在する場合、前記記録漏れが発生している占有移転を管理者権限で前記ブロックチェーン上に記録するための特殊占有移転トランザクションが含まれる、請求項2に記載の移転管理システム。
【請求項6】
前記トランザクションには、
前記特殊占有移転トランザクションによって記録される占有移転を、該占有移転を記録すべきだったユーザに承認させるための履歴承認トランザクションが含まれる、請求項5に記載の移転管理システム。
【請求項7】
前記占有移転の履歴を表す占有移転履歴の作成対象となるトークンIDを持つトークンに関する情報を前記ブロックチェーンから取得し、取得したトークンに関する情報を用いて、前記トークンIDを持つトークンと他のトークンとの親子関係を少なくとも考慮した占有移転履歴を作成するように構成されている作成部、を有する請求項1乃至6の何れか一項に記載の移転管理システム。
【請求項8】
物の占有移転を管理する移転管理システムが、
物に紐付けられているトークンを子、1以上の物の占有移転を行う場合の管理単位に紐付けられているトークンを親として相互参照可能な親子関係を持つトークンが記録されるブロックチェーンに対して、前記物の占有移転の管理を実現するためのトランザクションを発行するトランザクション発行手順、を実行する移転管理方法。
【請求項9】
物の占有移転を管理する移転管理システムに、
物に紐付けられているトークンを子、1以上の物の占有移転を行う場合の管理単位に紐付けられているトークンを親として相互参照可能な親子関係を持つトークンが記録されるブロックチェーンに対して、前記物の占有移転の管理を実現するためのトランザクションを発行するトランザクション発行手順、を実行させるプログラム。
【請求項10】
物の占有移転を管理するためにブロックチェーンに記録されるトークンのデータ構造であって、
物に紐付けられているトークンを子、1以上の物の占有移転を行う場合の管理単位に紐付けられているトークンを親として相互参照可能な親子関係が定義されたデータ構造。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、移転管理システム、移転管理方法、プログラム、及びデータ構造に関する。
【背景技術】
【0002】
近年、サプライチェーン分野では、商品や製品等といった何等かの物品の不具合時のトレーサビリティ確保を目的として、占有移転履歴をステークホルダ間で共有することの重要性が認識されている。占有移転履歴とは、例えば、何が、いつ、どこからどこへ移動したのかを或る単位で記録したもの(つまり、或る単位で各物品がいつどの占有者からどの占有者に移転したのかを記録したもの)のことである。
【0003】
例えば、従来技術の1つとして、特許文献1には、複数のノードで構成されるブロックチェーンにより資源物のトレーサビリティシステムを実現することが記載されている。
【0004】
ところで、物品の輸送の際にはパレットやコンテナ等が利用されることが多い。このとき、例えば、物品がパレットを利用して輸送されている場合、物品を子、パレットを親とした親子関係があるとみなすことできる。同様に、物品がコンテナを利用して輸送されている場合、物品を子、コンテナを親とした親子関係があるとみなすことができる。このため、物品やパレット、コンテナ等の占有移転を管理するための情報も親子関係を持たせることが可能である必要があり、また親と子の間で相互に参照可能である必要がある。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開2021-131620号公報
【発明の概要】
【発明が解決しようとする課題】
【0006】
しかしながら、従来では、ブロックチェーン上で親子関係(つまり、階層構造)を持ち、かつ、親と子の間で相互に参照可能な情報で占有移転を管理することはできなかった。
【0007】
本開示は、上記の点に鑑みてなされたもので、相互参照可能な階層構造を持つデータにより物品の占有移転をブロックチェーン上で管理できる技術を提供することを目的とする。
【課題を解決するための手段】
【0008】
本開示の一態様による移転管理システムは、物の占有移転を管理する移転管理システムであって、物に紐付けられているトークンを子、1以上の物の占有移転を行う場合の管理単位に紐付けられているトークンを親として相互参照可能な親子関係を持つトークンが記録されるブロックチェーンを含み、前記物の占有移転の管理を実現するためのトランザクションを前記ブロックチェーンに発行するように構成されているトランザクション発行部、を有する。
【発明の効果】
【0009】
相互参照可能な階層構造を持つデータにより物品の占有移転をブロックチェーン上で管理できる技術が提供される。
【図面の簡単な説明】
【0010】
図1】物流上での物品の輸送の一例を説明するための図である。
図2】ERC998を利用する場合に発生するトランザクションの一例を説明するための図である。
図3】提案手法を利用する場合に発生するトランザクションの一例を説明するための図である。
図4】提案手法によるトークンの親子関係の一例を説明するための図である。
図5】トークンID再利用の一例を説明するための図である。
図6】第一の実施形態に係る物流管理システムの全体構成の一例を示す図である。
図7】第一の実施形態に係るノードの機能構成の一例を示す図である。
図8】第一の実施形態に係る端末の機能構成の一例を示す図である。
図9】第一の実施形態に係るトランザクション発行及び実行処理の一例を示すシーケンス図である。
図10】占有移転の記録漏れの一例を説明するための図である。
図11】第二の実施形態に係る端末の機能構成の一例を示す図である。
図12】第二の実施形態に係る特殊占有移転、補足履歴承認及び補足履歴更新処理の一例を示すシーケンス図である。
図13】第三の実施形態に係る物流管理システムの全体構成の一例を示す図である。
図14】第三の実施形態に係る端末の機能構成の一例を示す図である。
図15】第三の実施形態に係るデータベースサーバの機能構成の一例を示す図である。
図16】トークンのイベント発生履歴の一例を示す図である。
図17】第三の実施形態に係る占有移転履歴作成処理の一例を示すフローチャートである。
図18】第三の実施形態に係る占有移転履歴可視化処理の一例を示すシーケンス図である。
図19】コンピュータのハードウェア構成の一例を示す図である。
【発明を実施するための形態】
【0011】
以下、本発明の一実施形態について説明する。
【0012】
[第一の実施形態]
まず、第一の実施形態について説明する。
【0013】
<占有者>
占有者とは、現物としての物(モノ(有体物))やサービス(ライセンスや電子的なコンテンツ等といった無形の物(無体物))を一時的又は非一時的に支配・管理している自然人や法人、又はその支配・管理下にある空間等の支配・管理対象のことである。本実施形態では、商品を一時的又は非一時的に支配・管理している空間等も占有者に含まれていることに留意されたい。
【0014】
占有者の具体例としては、例えば、荷台等により物品を運搬可能なトラック等といった輸送車、物品を運搬可能な列車、物品を保管可能な倉庫や工場、物品を販売等する店舗等が挙げられる。なお、1台のトラックや1台の列車、1つの倉庫、1つの店舗等に複数の占有者が含まれていてもよい。例えば、倉庫内に複数の部屋が存在する場合、各部屋のそれぞれを1つの占有者としてもよいし、所定の2つ以上の部屋を1つの占有者としてもよい。同様に、倉庫内に複数のフロアが存在する場合、各フロアのそれぞれを1つの占有者としてもよいし、所定の2つ以上のフロアを1つの占有者としてもよい。輸送車が複数の荷台を備えている場合や列車が複数の車両で構成されている場合等についても同様である。
【0015】
<物流上での物品の輸送>
商品や製品等といった物品を物流上で輸送する際には、複数の商品をまとめたケース単位でコンテナに格納して輸送したり、パレットに載せて輸送したりすることが一般的である。例えば、図1に示すように、メーカーから出荷された物品を含むケースはコンテナに格納され、コンテナ単位で倉庫A等の物流拠点に輸送される。その後、倉庫Aでは輸送先に応じてケースがパレットに積み替えられ、パレット単位で倉庫B等の物流拠点に輸送される。倉庫Bでは、例えば、輸送先に応じてパレット上のケースが更に積み替えが行われ、パレット単位で倉庫C等の物流拠点に輸送される。そして、物流拠点Cでは、パレット上のケースがケース単位で店舗に輸送される。
【0016】
このように、物品を物流上で輸送する際には、比較的大容量のコンテナ等にケースが格納されて出荷され、その後、途中の物流拠点で輸送先に応じてパレット上に積まれたり、パレット間でケースの積み替えが行われたりした後、最終的にケース単位で店舗に輸送されることが一般的である。このため、コンテナ単位やパレット単位で物品を輸送している間は、ケース単位ではなく、コンテナ単位やパレット単位で占有移転を記録するようにすればトランザクションの発行数を抑制することができる。すなわち、コンテナ単位やパレット単位で物品を輸送している間は、その単位で占有移転を管理すればトランザクションの発行数を抑制することができる。以下、コンテナやパレット等といった複数の物品をまとめて輸送又は管理し、コンテナやパレット単位で占有移転が行われる対象のことを「管理単位」とも呼ぶ。
【0017】
ここで、コンテナには複数のケースが格納されるため、コンテナとケースの間には親子関係があるといえる。同様に、パレットには複数のケースが載せられるため、パレットとケースの間には親子関係があるといえる。また、コンテナには複数のパレットが格納されることもあり得るため、コンテナとパレットの間と、パレットとケースの間とのそれぞれに親子関係があることもあり得る。すなわち、物流上で輸送される対象と、その輸送に用いられるコンテナやパレット等の輸送容器との間には輸送容器を親、その輸送容器に格納される対象を子とする親子関係があり、また輸送容器同士にも一方の輸送容器が他方の輸送容器に含まれる場合には親子関係がある。
【0018】
このため、より一般的には、或る対象の占有移転を記録する際に、その対象に親が存在する場合、最上位の親(つまり、当該対象の親を辿っていったときに最上位に位置する親)単位で占有移転を記録するようにすればトランザクションの発行数を抑制することができる。
【0019】
<親子関係と占有移転をブロックチェーン上で管理可能な既存技術>
親子関係と物品の占有移転をブロックチェーン(以下、BCともいう。)上で管理可能な既存技術としてERC(Ethereum Request for Comments)998と呼ばれる規格がある。ERC998は、ERC721に規定されている代替不可トークン(NFT:Non-Fungible Token)を階層化して、所有者をまとめて変更できるトークンの規格である。この規格を用いて、例えばRFID(Radio Frequency Identification)タグやQRコード(登録商標)等により代替不可トークンと物品や輸送容器等とを紐付けることで、それらの占有移転をBC上で管理することができる。しかしながら、ERC998では、親と子の間で相互に参照可能ではなく、また親子関係の紐付け、解除のたびにトランザクションを発行する必要があり、大量のトランザクションが必要になることがある。
【0020】
このため、例えば、図2に示すように、メーカーAで4つのケースを1つのコンテナに格納する場合、コンテナのトークンを親、ケースのトークンを子とする親子関係の紐付けを行うためのトランザクションを合計4つ発行する必要がある。メーカーBについても同様である。
【0021】
同様に、例えば、図2に示すように、センター倉庫でコンテナから4つのケースを取り出す場合、コンテナのトークンを親、ケースのトークンを子とする親子関係の紐付け解除を行うためのトランザクションを合計4つ発行する必要がある。
【0022】
また、例えば、図2に示すように、センター倉庫から地域倉庫にコンテナやパレットを輸送する際に、同一の輸送先であっても、コンテナのトークンの占有移転を行うためのトランザクションとパレットのトークンの占有移転を行うためのトランザクションとをそれぞれ発行する必要がある。
【0023】
このように、ERC998では物品のケース等といった対象のトークンと、その輸送に利用される輸送容器のトークンとの間に親子関係を持たせて、親トークン単位でその子トークンもまとめて占有移転が可能である。一方で、親トークンと子トークンは相互に参照可能ではなく、また親子関係の紐付け及びその解除を行う場合には子トークン毎にトランザクション発行が必要であり、更に複数の親トークンが同一の占有者に占有移転される場合であってもそれらの親トークンの占有移転にはそれぞれトランザクション発行が必要である。このため、トランザクション発行数の抑制が十分であるとはいえず、例えば、大量の貨物が行き交う物流拠点では依然として占有移転に伴う負荷が高いものと考えられる。また、ERC998では親トークンと子トークンが相互に参照可能でなく、子トークンは親トークンを参照できないため、例えば、或る物品の占有移転に関する情報を確認する際に、その物品を輸送したコンテナを特定すること等ができない。そこで、以下では、親と子の間で相互参照可能で、かつ、トランザクション発行数をより抑制できる手法を提案する。
【0024】
なお、以下で提案する手法はERC721、ERC998の規格に準拠したものではないが、物流トレーサビリティを確保することを目的としたBCは、一般に、複数の企業のコンソーシアムなネットワークやプライベートなネットワークとして構築されることが多い。このため、物流トレーサビリティを確保することを目的としたBCでは、ERC721、ERC998の規格に準拠していないことに関して何等の不都合も生じないことに留意されたい。
【0025】
<提案手法>
本提案手法を利用した場合、或るモノと親子関係にある他のモノの情報(例えば、占有移転に関する情報等)を容易に確認することができると共に、例えば、図3に示すように、メーカーAで4つのケースを1つのコンテナに格納する場合、コンテナのトークンを親、ケースのトークンを子とする親子関係の紐付けを1つのトランザクションで行うことができる。メーカーBについても同様である。
【0026】
同様に、例えば、図3に示すように、センター倉庫でコンテナから4つのケースを取り出す場合、コンテナのトークンを親、ケースのトークンを子とする親子関係の紐付け解除を1つのトランザクションで行うことができる。
【0027】
また、例えば、図3に示すように、センター倉庫から地域倉庫にコンテナやパレットを輸送する際に、同一の輸送先であれば複数の占有移転を1つのトランザクションで行うことができる。
【0028】
上記のような親子関係の紐付け/解除と占有移転とを実現するためのトークンのデータ構造とトランザクションを実現するコントラクトメソッド(以下、単に「メソッド」ともいう。)とを定義する。
【0029】
≪トークンのデータ構造≫
以下、例えば、物品や、1つ以上の物品が含まれるケース、輸送容器等と紐付けられるトークンのデータ構造を定義する。以下、物品自体や、1つ以上の物品が含まれるケース等を総称して「物品」と呼ぶことにする。なお、現実に存在する物品や輸送容器等とトークンは、例えば、現実に存在する物品や輸送容器等を管理するためのID(識別子)、現実に存在する物品や輸送容器等に貼り付け等するRFIDタグやQRコード等を利用して、後述するトークンIDにより紐付けることができる。また、例えば、占有移転の管理対象となる物がライセンスや電子的なコンテンツ等といった無体物である場合には、その物に付与されたID(識別子)等を利用して、後述するトークンIDにより紐付けることができる。
【0030】
トークンは、トークンIDにより一意に識別可能なプロパティ(属性)をまとめたものであり、プロパティとして「トークンID」、「親トークンID」、「子トークンIDリスト」、「移転許可先リスト」、「トークンタイプ」を持つものとする。すなわち、トークンは、以下のデータ形式で表されるものとする。
【0031】
{トークンID,親トークンID,占有者,子トークンIDリスト,移転許可先リスト,トークンタイプ}
ここで、トークンIDプロパティには、トークンを一意に識別するID(トークンID)が設定される。親トークンIDプロパティには、当該トークンに親トークンがいる場合は親トークンのトークンID、親トークンがいない場合は空文字(例えば、""やNULL等)が設定される。占有者プロパティには、当該トークンに親トークンがいる場合は0、親トークンがいない場合は当該トークンの占有者のBCアドレスが設定される。子トークンIDリストプロパティには、当該トークンに子トークンがいる場合は子トークンのトークンIDのリスト(配列)、子トークンがいない場合は空配列が設定される。移転許可先リストプロパティには、当該トークンの現在の占有者が占有移転先として許諾したBCアドレスのリスト(ただし、現在の占有者が占有移転先として許諾したBCアドレスがない場合は空配列)が設定される。トークンタイププロパティには、トークン種別を示す情報(0又は1)が設定される。なお、トークンには、そのプロパティを補足するメタ情報が設定されるメタ情報プロパティが設けられていてもよい。なお、これらのプロパティ以外にも、トークンは、様々なプロパティを有していてもよい。
【0032】
・親子関係について
トークンの親トークンIDプロパティと子トークンIDリストプロパティで親子関係の紐付けを表現する。一例として、トークンの親子関係を図4に示す。なお、図4に示す例では、簡単のため一部のプロパティ(トークンID、占有者、親トークンID及び子トークンIDリスト)のみを図示している。
【0033】
図4に示すように、提案手法におけるトークンは、親トークンIDプロパティと子トークンIDリストプロパティとを有しており、親子関係の双方向の紐付けを表現できる(つまり、親トークンと子トークンとの間で相互に参照することが可能である。)。
【0034】
・占有者について
トークンの占有者プロパティには、親がいない場合のみ占有者のBCアドレスが設定され、親がいる場合には0が設定される。親トークンがいるトークンの占有者プロパティは、そのトークンの親トークンIDプロパティを辿って最上位の親トークンの占有者プロパティとして取得できる。
【0035】
・占有移転について
占有移転は最上位の親トークン単位(つまり、或る管理単位を表すトークン単位)で実施し、その親トークンに紐付く子トークンには変更を与えない。例えば、図4に示す例では、トークンID「T01」のトークン単位で占有移転が行われ、その子トークン(トークンID「T02」、「T03」、「T04」、「T05」)には変更を与えない。すなわち、親トークンの占有移転が行われた場合であっても、その子トークンの占有者プロパティには「0」が設定されたままである。これは、親トークンの占有者プロパティによってその子トークンの占有者も同時に表現しているためである。
【0036】
・トークン種別について
トークン種別としてはパッケージトークンとアイテムトークンが存在し、トークンタイププロパティに「0」が設定されている場合はパッケージトークン、「1」が設定されている場合はアイテムトークンであるものとする。
【0037】
アイテムトークンとは、占有移転の追跡対象(例えば、物品等)と紐付けられるトークンのことである。一方で、パッケージトークンとは、輸送容器(例えば、コンテナやパレット等)等といった管理単位と紐付けられるトークンのことである。パッケージトークンは、アイテムトークンや他のパッケージトークンの親となるトークンである。ここで、トークン種別がパッケージトークンであるトークンに関しては1輸送区間をライフサイクルとしてもよい。すなわち、トークン種別がパッケージトークンであるトークンに関しては1輸送区間単位で生成及び償却してもよい。なお、1輸送区間とは、或る占有者から別の占有者に占有が移転されるまでの時間的区間のことをいう。例えば、物品を或る拠点から別の或る拠点に輸送するまでの時間的区間、或る拠点に物品が搬入されてから別の或る拠点へと当該物品を搬出するまでの時間的区間等のことである。
【0038】
≪コントラクトメソッド≫
以下、トークンの生成、親子関係の紐付け/解除、占有移転許可、占有移転、トークンの償却を行うためのトランザクションを実現するメソッドとして以下の6つを定義する。
【0039】
・Mintメソッド
・Packメソッド
・Approveメソッド
・Transferメソッド
・Unpackメソッド
・Burnメソッド
≪イベント≫
コントラクトメソッドの実行に伴い発行されるイベントとして以下の8つを定義する。イベントには、コントラクトメソッド実行時の各種パラメータや実行結果、オペレーションタイプ等の情報が含まれる。オペレーションタイプとは、トランザクション実行時の種別を表し、例えば、「0」のとき「ユーザ実行」、「1」のとき「システム実行」を表す。ユーザ実行は一般ユーザがコントラクトメソッドを実行したことを表し、システム実行は何等かの条件に応じてシステムがコントラクトメソッドを自動実行したことを表す。
【0040】
・Mintイベント
・Packイベント
・Packedイベント
・Unpackイベント
・Unpackedイベント
・Transferイベント
・Approveイベント
・Burnイベント
なお、上記のメソッド及びイベントに関して、互いに混同する恐れが無い場合は「メソッド」や「イベント」との語を省略するものとする。例えば、メソッドであることが明らかである場合には、Mintメソッドを単にMintと表記する。イベントに関しても同様である。
【0041】
以下、上記の6つのメソッドの詳細について説明する。なお、イベントに関してはメソッドの詳細を説明する中であわせて説明する。
【0042】
≪Mintメソッド≫
Mintメソッドは、1つ以上のトークンを生成するトランザクションを実行するためのメソッドである。
【0043】
引数:Mintメソッドには、以下が引数として指定される。
【0044】
・トークンIDリスト
・トークンタイプ
・占有者
ここで、トークンIDリストには、生成するトークンのトークンIDを要素とするリストが設定される。トークンIDリストには、(トークンID,メタ情報)という形式で表される要素のリストが設定されてもよい。トークンタイプには、生成するトークンのトークン種別を示す情報が設定される。トークンタイプに「0」が設定されたときはパッケージトークン、「1」が設定されたときはアイテムトークンが生成される。占有者には、生成するトークンの占有者のBCアドレスが設定される。
【0045】
制限:Mintメソッドの実行時にはメソッド内で以下の条件を満たすか否かがチェックされる。なお、いずれかの条件を満たさない場合はエラーとなる。
【0046】
a:トランザクション発行者が、引数として指定された占有者と一致すること
b:引数として指定されたトークンIDリストの各要素が指すトークンがBC上に有効な状態で存在しないこと
ここで、BC上に有効な状態で存在しないとは、当該トークンが未発行又は償却済であることを意味する。
【0047】
処理:引数として指定されたトークンIDリストの要素毎に以下のStep11~Step12を実行する。
【0048】
Step11)当該要素に含まれるトークンIDと紐付けて、引数として指定された占有者及びトークンタイプをプロパティとして持つトークンを登録する。このとき、親トークンIDプロパティは空文字、子トークンIDリストプロパティは空配列、移転許可先リストプロパティは空配列とする。これにより、トークンが生成される。なお、メタ情報が含まれる場合、当該要素に含まれるトークンID及びメタ情報をトークンと紐付ける。
【0049】
Step12)Mintイベントを発行する。
【0050】
ここで、Mintイベントとは、トークンが生成されたことを表すイベントのことである。Mintイベントには、例えば、Mintメソッドによって生成されたトークンのトークンIDと、当該トークンの占有者(のBCアドレス)と、Mintメソッドのトランザクション発行者(のBCアドレス)と、当該トークンのトークンタイプと、オペレーションタイプとが含まれる。
【0051】
具体例:以下の引数が指定されたMintメソッドがトランザクション発行者「0x111」により実行されたものとする。
【0052】
トークンIDリスト=["T01","T02","T03"]
トークンタイプ:1(アイテムトークン)
占有者:0x111
この場合、以下のプロパティを持つ3つのトークンが生成される。
【0053】
{トークンID:"T01",親トークンID:"",占有者:0x111,子トークンIDリスト:[],移転許可先リスト:[],トークンタイプ:1(アイテムトークン)}
{トークンID:"T02",親トークンID:"",占有者:0x111,子トークンIDリスト:[],移転許可先リスト:[],トークンタイプ:1(アイテムトークン)}
{トークンID:"T03",親トークンID:"",占有者:0x111,子トークンIDリスト:[],移転許可先リスト:[],トークンタイプ:1(アイテムトークン)}
なお、[]は空配列を表す。
【0054】
≪Packメソッド≫
Packメソッドは、1つ以上のトークンを子、別のトークンを親として、子トークンを親トークンに紐付けるトランザクションを実行するためのメソッドである。また、このとき、Packメソッドは、親トークンが存在しない場合は、パッケージトークンの親トークンを自動的に生成する。
【0055】
引数:Packメソッドには、以下が引数として指定される。
【0056】
・親トークンID
・子トークンIDリスト
ここで、親トークンIDには、紐付け先となる親トークンのトークンIDが設定される。子トークンIDリストには、紐付け対象となる子トークンのトークンIDを要素とするリストが設定される。
【0057】
制限:Packメソッドの実行時にはメソッド内で以下の条件を満たすか否かがチェックされる。なお、いずれかの条件を満たさない場合はエラーとなる。
【0058】
a:トランザクション発行者が、引数として指定された親トークンIDが指すトークンの占有者プロパティと一致すること
b:引数として指定された親トークンIDが指すトークンの占有者プロパティと、引数として指定された子トークンIDリストの各要素が指すトークンの占有者プロパティとが一致していること
c:引数として指定された子トークンIDリストの各要素が指すトークンの親トークンIDプロパティが空文字であること
d:引数として指定された親トークンIDが指すトークンの移転許可先リストプロパティが空配列であること(親トークンに更に親トークンが存在する場合(これは、親トークンIDプロパティにて判断する。)、最上位の親トークンまで再帰的に移転許可先リストプロパティを確認し、すべての移転許可先リストプロパティが空配列であること)
e:引数として指定された親トークンIDと、引数として指定された子トークンIDリストの各要素のトークンIDとが一致しないこと
処理:以下のStep21~Step23を実行する。
【0059】
Step21)引数として指定された親トークンIDが指すトークンがBC上に有効な状態で存在しない場合、当該親トークンIDとトークンタイプ「0」(パッケージトークン)とを持つトークンをMintメソッドにより生成する。Mintメソッドの実行により、Mintイベントが発行されるが、その際のオペレーションタイプは「1」(システム実行)とする。
【0060】
Step22)引数として指定された子トークンIDリストの各要素が指すトークン毎に以下のStep22-1~Step22-3を実行する。
【0061】
Step22-1)当該トークンの移転許可先リストプロパティに空配列以外が設定されている場合、当該移転許可先リストプロパティをクリアする(つまり、当該移転許可先リストプロパティに空配列を設定する。)。
【0062】
Step22-2)当該トークンの親トークンIDプロパティに、引数として指定された親トークンIDを設定する。また、当該トークンの占有者プロパティに「0」(0x0)を設定する。
【0063】
Step22-3)Packedイベントを発行する。
【0064】
ここで、Packedイベントとは、子トークンが親トークンに紐付けられたことを表すイベントのことである。Packedイベントには、例えば、当該子トークンのトークンIDと、当該子トークンの占有者(のBCアドレス)と、Packメソッドのトランザクション発行者(のBCアドレス)と、当該子トークンのトークンタイプと、Packメソッドのトランザクションのオペレーションタイプと、当該子トークンと紐付けられた親トークンのトークンIDを示す親トークンIDと、当該子トークンの子トークンIDリストとが含まれる。
【0065】
Step23)引数として指定された親トークンIDが指すトークンに関して以下のStep23-1~Step23-2を実行する。
【0066】
Step23-1)当該トークンの子トークンIDリストプロパティに、引数として指定された子トークンIDリストに含まれるトークンIDを追加する。
【0067】
Step23-2)Packイベントを発行する。
【0068】
ここで、Packイベントとは、新たな子トークンが親トークンに紐付けられたことを表すイベントのことである。Packイベントには、例えば、新たな子トークンが紐付けられた親トークンのトークンIDと、当該親トークンの占有者(のBCアドレス)と、Packメソッドのトランザクション発行者(のBCアドレス)と、当該親トークンのトークンタイプと、Packメソッドのトランザクションのオペレーションタイプと、当該親トークンの親トークンIDと、当該親トークンの子トークンIDリストと、子トークンIDリスト差分とが含まれる。子トークンIDリスト差分とは、Packメソッドの実行前後における当該親トークンが持つ子トークンIDリストプロパティの差分のことである。
【0069】
具体例:以下のプロパティを持つ4つのトークンが存在するものとする。
【0070】
{トークンID:"T01",親トークンID:"",占有者:0x111,子トークンIDリスト:[],移転許可先リスト:[],トークンタイプ:1(アイテムトークン)}
{トークンID:"T02",親トークンID:"",占有者:0x111,子トークンIDリスト:[],移転許可先リスト:[],トークンタイプ:1(アイテムトークン)}
{トークンID:"T03",親トークンID:"",占有者:0x111,子トークンIDリスト:[],移転許可先リスト:[],トークンタイプ:1(アイテムトークン)}
{トークンID:"T04",親トークンID:"",占有者:0x111,子トークンIDリスト:[],移転許可先リスト:[],トークンタイプ:0(パッケージトークン)}
このとき、以下の引数が指定されたPackメソッドがトランザクション発行者「0x111」により実行されたものとする。
【0071】
親トークンID="T04"
子トークンIDリスト=["T01","T02","T03"]
この場合、上記の4つのトークンは以下となる。
【0072】
{トークンID:"T01",親トークンID:"T04",占有者:0x0,子トークンIDリスト:[],移転許可先リスト:[],トークンタイプ:1(アイテムトークン)}
{トークンID:"T02",親トークンID:"T04",占有者:0x0,子トークンIDリスト:[],移転許可先リスト:[],トークンタイプ:1(アイテムトークン)}
{トークンID:"T03",親トークンID:"T04",占有者:0x0,子トークンIDリスト:[],移転許可先リスト:[],トークンタイプ:1(アイテムトークン)}
{トークンID:"T04",親トークンID:"",占有者:0x111,子トークンIDリスト:["T01","T02","T03"],移転許可先リスト:[],トークンタイプ:0(パッケージトークン)}
≪Approveメソッド≫
Approveメソッドは、1つ以上のトークンに対して或るBCアドレスへの占有移転許可を与えるトランザクションを実行するためのメソッドである。
【0073】
引数:Approveメソッドには、以下が引数として指定される。
【0074】
・移転許可情報リスト
ここで、移転許可情報リストには、移転許可対象のトークンIDとそのトークンIDが指すトークンの移転許可先リストプロパティに追加されるBCアドレスを要素とするリストである移転許可先BCアドレスリストとで構成される要素のリストが設定される。すなわち、移転許可情報リストには、(トークンID,移転許可先BCアドレスリスト)という形式で表される要素のリストが設定される。移転許可先リストプロパティは、後述するTransferメソッドのトランザクション発行者が移転許可先リストプロパティに存在するBCアドレスである場合、そのBCアドレスにトークンの占有者を移転することを可能とするものである。
【0075】
制限:Approveメソッドの実行時にはメソッド内で以下の条件を満たすか否かがチェックされる。なお、いずれかの条件を満たさない場合はエラーとなる。
【0076】
a:トランザクション発行者が、引数として指定された移転許可情報リストの各要素のトークンIDが指すトークンの占有者プロパティと一致すること
b:引数として指定された移転許可情報リストの各要素のトークンIDが指すトークンの親トークンIDプロパティが空文字であること
なお、上記の2つ目の条件は、最上位の親トークン単位で占有移転が行われるために必要となる条件である。
【0077】
処理:以下のStep31を実行する。
【0078】
Step31)引数として指定された移転許可情報リストの要素毎に以下のStep31-1~Step31-2を繰り返す。
【0079】
Step31-1)当該要素に含まれるトークンIDが指すトークンの移転許可先リストプロパティに、当該要素に含まれる移転許可先BCアドレスリストに設定されているBCアドレスを追加する。
【0080】
Step31-2)Approveイベントを発行する。
【0081】
ここで、Approveイベントとは、或るトークンに対して占有移転許可が与えられたことを表すイベントのことである。Approveイベントには、例えば、占有移転許可が与えられたトークンのトークンIDと、当該トークンの占有者(のBCアドレス)と、Approveメソッドのトランザクション発行者(のBCアドレス)と、当該トークンのトークンタイプと、Approveメソッドのトランザクションのオペレーションタイプと、当該トークンの子トークンIDリストとが含まれる。
【0082】
具体例:以下のプロパティを持つ2つのトークンが存在するものとする。
【0083】
{トークンID:"T04",親トークンID:"",占有者:0x111,子トークンIDリスト:["T01","T02","T03"],移転許可先リスト:[],トークンタイプ:0(パッケージトークン)}
{トークンID:"T05",親トークンID:"",占有者:0x111,子トークンIDリスト:[],移転許可先リスト:[],トークンタイプ:1(アイテムトークン)}
このとき、以下の引数が指定されたApproveメソッドがトランザクション発行者「0x111」により実行されたものとする。
【0084】
移転許可情報リスト=[
{トークンID:"T04",移転許可先BCアドレスリスト:[0x222,0x333]},
{トークンID:"T05",移転許可先BCアドレスリスト:[0x222,0x444]}]
この場合、上記の2つのトークンは以下となる。
【0085】
{トークンID:"T04",親トークンID:"",占有者:0x111,子トークンIDリスト:["T01","T02","T03"],移転許可先リスト:[0x222,0x333],トークンタイプ:0(パッケージトークン)}
{トークンID:"T05",親トークンID:"",占有者:0x111,子トークンIDリスト:[],移転許可先リスト:[0x222,0x444],トークンタイプ:1(アイテムトークン)}
≪Transferメソッド≫
Transferメソッドは、1つ以上のトークンを1つの移転先に移転(占有移転)するトランザクションを実行するためのメソッドである。
【0086】
引数:Transferメソッドには、以下が引数として指定される。
【0087】
・移転対象トークンIDリスト
・移転先BCアドレス
ここで、移転対象トークンIDリストには、占有移転の対象となるトークンのトークンIDを要素とするリストが設定される。移転先BCアドレスには、占有移転の移転先となる占有者のBCアドレスが設定される。
【0088】
制限:Transferメソッドの実行時にはメソッド内で以下の条件を満たすか否かがチェックされる。なお、いずれかの条件を満たさない場合はエラーとなる。
【0089】
a:トランザクション発行者が、引数として指定された移転先BCアドレスと一致すること
b:引数として指定された移転対象トークンIDリストの各要素が指すトークンの親トークンIDプロパティが空文字であること
c:引数として指定された移転先BCアドレスが、引数として指定された移転対象トークンIDリストの各要素が指すトークンの移転許可先リストプロパティに存在すること
処理:以下のStep41を実行する。
【0090】
Step41)引数として指定された移転対象トークンIDリストの要素が指すトークン毎に以下のStep41-1~Step41-3を繰り返す。
【0091】
Step41-1)当該トークンの占有者プロパティを、引数として指定された移転先BCアドレスに変更する。
【0092】
Step41-2)当該トークンの移転許可先リストプロパティをクリアする(つまり、当該移転許可先リストプロパティに空配列を設定する。)。
【0093】
Step41-3)Transferイベントを発行する。
【0094】
ここで、Transferイベントとは、或るトークンの占有者が移転されたことを表すイベントのことである。Transferイベントには、例えば、占有移転が行われたトークンのトークンIDと、当該トークンの占有移転後の占有者(のBCアドレス)と、Transferメソッドのトランザクション発行者(のBCアドレス)と、当該トークンのトークンタイプと、Transferメソッドのトランザクションのオペレーションタイプと、当該トークンの子トークンIDリストとが含まれる。
【0095】
具体例:以下のプロパティを持つ2つのトークンが存在するものとする。
【0096】
{トークンID:"T04",親トークンID:"",占有者:0x111,子トークンIDリスト:["T01","T02","T03"],移転許可先リスト:[0x222,0x333],トークンタイプ:0(パッケージトークン)}
{トークンID:"T05",親トークンID:"",占有者:0x111,子トークンIDリスト:[],移転許可先リスト:[0x222,0x444],トークンタイプ:1(アイテムトークン)}
このとき、以下の引数が指定されたTransferメソッドがトランザクション発行者「0x222」により実行されたものとする。
【0097】
移転対象トークンIDリスト=["T04","T05"]
移転先BCアドレス=0x222
この場合、上記の2つのトークンは以下となる。
【0098】
{トークンID:"T04",親トークンID:"",占有者:0x222,子トークンIDリスト:["T01","T02","T03"],移転許可先リスト:[],トークンタイプ:0(パッケージトークン)}
{トークンID:"T05",親トークンID:"",占有者:0x222,子トークンIDリスト:[],移転許可先リスト:[],トークンタイプ:1(アイテムトークン)}
≪Unpackメソッド≫
Unpackメソッドは、1つ以上の子トークンを持つ親トークンに関して1つ以上の子トークンとの紐付けを解除するトランザクションを実行するためのメソッドである。また、このとき、Unpackメソッドは、トークンタイプ「0」(パッケージトークン)の親トークンに子トークンが存在しなくなった場合、親トークンを再帰的に償却する。
【0099】
引数:Unpackメソッドには、以下が引数として指定される。
【0100】
・親トークンID
・子トークンIDリスト
ここで、親トークンIDには、子トークンとの紐付けを解除する親トークンのトークンIDが設定される。子トークンIDリストには、当該親トークンとの紐付けを解除する子トークンのトークンIDを要素とするリストが設定される。
【0101】
制限:Unpackメソッドの実行時にはメソッド内で以下の条件を満たすか否かがチェックされる。なお、いずれかの条件を満たさない場合はエラーとなる。
【0102】
a:トランザクション発行者が、引数として指定された親トークンIDが指すトークンの占有者プロパティと一致すること(親トークンに更に親トークンが存在する場合(これは、親トークンIDプロパティにて判断する。)、親トークンIDプロパティにより再帰的に取得した最上位の親トークンの占有者プロパティとトランザクション発行者とが一致すること)
処理:以下のStep51~Step52を実行する。
【0103】
Step51)引数として指定された子トークンIDリストの各要素が指すトークン毎に以下のStep51-1~Step51-3を繰り返す。
【0104】
Step51-1)当該トークンの親トークンIDプロパティに空文字を設定する。
【0105】
Step51-2)当該トークンの占有者プロパティに、引数として指定された親トークンIDを持つトークンの占有者を設定する。このとき、引数として指定された親トークンIDが指すトークンに親トークンが存在する場合(これは、親トークンIDプロパティにて判断する。)、最上位の親トークンの占有者プロパティを設定する。
【0106】
Step51-3)Unpackedイベントを発行する。
【0107】
ここで、Unpackedイベントとは、子トークンが親トークンとの紐付けが解除されたことを表すイベントのことである。Unpackedイベントには、例えば、親トークンとの紐付けが解除されたトークンのトークンIDと、当該トークンの占有者(のBCアドレス)と、Unpackメソッドのトランザクション発行者(のBCアドレス)と、当該トークンのトークンタイプと、Unpackメソッドのトランザクションのオペレーションタイプと、当該トークンとの紐付けが解除された親トークンのトークンIDと、当該トークンの子トークンIDリストとが含まれる。
【0108】
Step52)引数として指定された親トークンIDが指すトークンに関して以下のStep52-1~Step52-3を実行する。
【0109】
Step52-1)当該トークンの子トークンIDリストプロパティから、引数として指定された子トークンIDリストに含まれるトークンIDを削除する。
【0110】
Step52-2)Unpackイベントを発行する。
【0111】
ここで、Unpackイベントは、1つ以上の子トークンとの紐付けが解除されたことを表すイベントのことである。Unpackイベントには、例えば、1つ以上の子トークンとの紐付けが解除された親トークンのトークンIDと、当該親トークンの占有者(のBCアドレス)と、Unpackメソッドのトランザクション発行者(のBCアドレス)と、当該親トークンのトークンタイプと、Unpackメソッドのトランザクションのオペレーションタイプと、当該親トークンの親トークンIDと、当該親トークンの子トークンIDリストと、子トークンIDリスト差分とが含まれる。子トークンIDリスト差分とは、Unpackメソッドの実行前後における当該親トークンが持つ子トークンIDリストプロパティの差分のことである。
【0112】
Step52-3)当該トークンのトークンタイププロパティが「0」(パッケージトークン)であり、かつ、当該トークンの子トークンIDリストプロパティが空配列となった場合、当該トークンをBurnメソッドにより償却する。Burnメソッドの実行によりBurnイベントが発行されるが、その際のオペレーションタイプは「1」(システム実行)とする。また、このとき、当該親トークンに更に親トークンが存在していた場合(これは、親トークンIDプロパティにて判断する。)、この親トークンに関してStep52-1~Step52-3を再帰的に実行する。
【0113】
具体例:以下のプロパティを持つ3つのトークンが存在するものとする。
【0114】
{トークンID:"T01",親トークンID:"T04",占有者:0x0,子トークンIDリスト:[],移転許可先リスト:[],トークンタイプ:1(アイテムトークン)}
{トークンID:"T02",親トークンID:"T04",占有者:0x0,子トークンIDリスト:[],移転許可先リスト:[],トークンタイプ:1(アイテムトークン)}
{トークンID:"T04",親トークンID:"",占有者:0x222,子トークンIDリスト:["T01","T02","T03"],移転許可先リスト:[],トークンタイプ:0(パッケージトークン)}
このとき、以下の引数が指定されたUnpackメソッドがトランザクション発行者「0x222」により実行されたものとする。
【0115】
親トークンID="T04"
子トークンIDリスト=["T01","T02"]
この場合、上記のトークンは以下となる。
【0116】
{トークンID:"T01",親トークンID:"",占有者:0x222,子トークンIDリスト:[],移転許可先リスト:[],トークンタイプ:1(アイテムトークン)}
{トークンID:"T02",親トークンID:"",占有者:0x222,子トークンIDリスト:[],移転許可先リスト:[],トークンタイプ:1(アイテムトークン)}
{トークンID:"T04",親トークンID:"",占有者:0x222,子トークンIDリスト:["T03"],移転許可先リスト:[],トークンタイプ:0(パッケージトークン)}
≪Burnメソッド≫
Burnメソッドは、1つ以上のトークンを償却するトランザクションを実行するためのメソッドである。また、このとき、Burnメソッドは、トークンタイプ「0」(パッケージトークン)の親トークンに子トークンが存在しなくなった場合、親トークンを再帰的に償却する。
【0117】
引数:Burnメソッドには、以下が引数として指定される。
【0118】
・償却対象トークンIDリスト
ここで、償却対象トークンIDリストには、償却対象となるトークンのトークンIDを要素とするリストが設定される。
【0119】
制限:Burnメソッドの実行時にはメソッド内で以下の条件を満たすか否かがチェックされる。なお、いずれかの条件を満たさない場合はエラーとなる。
【0120】
a:トランザクション発行者が、引数として指定されたトークンIDリストの各要素が指すトークンの占有者プロパティと一致すること(償却対象となるトークンに親トークンが存在する場合(これは、親トークンIDプロパティにて判断する。)、親トークンIDプロパティにより再帰的に取得した最上位の親トークンの占有者プロパティとトランザクション発行者とが一致すること)
b:引数として指定された償却対象トークンIDリストの各要素が指すトークンの子トークンIDリストプロパティが空配列であること
処理:以下のStep61~Step62を実行する。
【0121】
Step61)引数として指定された償却対象トークンIDリストの各要素が指すトークン毎に以下のStep61-1~Step61-2を繰り返す。
【0122】
Step61-1)当該トークンの各プロパティをクリアする。
【0123】
Step61-2)Burnイベントを発行する。
【0124】
ここで、Burnイベントとは、或るトークンが償却されたことを表すイベントのことである。Burnイベントには、例えば、償却されたトークンのトークンIDと、当該トークンの占有者と、Burnメソッドのトランザクション発行者(のBCアドレス)と、当該トークンのトークンタイプと、Burnメソッドのトランザクションのオペレーションタイプと、当該トークンの親トークンIDとが含まれる。
【0125】
Step62)償却されたトークンに親トークンが存在していた場合(これは、親トークンIDプロパティにて判断する。)、以下のStep62-1~Step62-3を実行する。
【0126】
Step62-1)当該親トークンの子トークンIDリストプロパティから、償却されたトークンのトークンIDを削除する。
【0127】
Step62-2)Unpackイベントを発行する。
【0128】
Step62-3)当該親トークンのトークンタイププロパティが「0」(パッケージトークン)であり、かつ、当該親トークンの子トークンIDリストプロパティが空配列となった場合、当該親トークンをBurnメソッドにより償却する。Burnメソッドの実行によりBurnイベントが発行されるが、その際のオペレータタイプは「1」(システム実行)とする。また、このとき、当該親トークンに更に親トークンが存在していた場合(これは、親トークンIDプロパティにて判断する。)、この親トークンに関してStep62-1~Step62-3を再帰的に実行する。
【0129】
具体例:以下のプロパティを持つ3つのトークンが存在するものとする。
【0130】
{トークンID:"T01",親トークンID:"",占有者:0x222,子トークンIDリスト:[],移転許可先リスト:[],トークンタイプ:1(アイテムトークン)}
{トークンID:"T02",親トークンID:"T04",占有者:0x0,子トークンIDリスト:[],移転許可先リスト:[],トークンタイプ:1(アイテムトークン)}
{トークンID:"T04",親トークンID:"",占有者:0x222,子トークンIDリスト:["T02,T03"],移転許可先リスト:[],トークンタイプ:0(パッケージトークン)}
このとき、以下の引数が指定されたBurnメソッドがトランザクション発行者「0x222」により実行されたものとする。
【0131】
償却対象トークンIDリスト=["T01","T02"]
この場合、上記のトークンID「T01」、「T02」のトークンは償却されプロパティがクリアされる(0はデフォルト値であるものとする。)。
【0132】
{トークンID:"",親トークンID:"",占有者:0x0,子トークンIDリスト:[],移転許可先リスト:[],トークンタイプ:0}
また、上記のトークンID「T04」は以下となる。
【0133】
{トークンID:"T04",親トークンID:"",占有者:0x222,子トークンIDリスト:["T03"],移転許可先リスト:[],トークンタイプ:0(パッケージトークン)}
これは、トークンID「T01」、「T02」のトークンが償却され、トークンID「T04」のトークンからトークンID「T02」のトークンの紐付けが解除されたことを意味している。
【0134】
<トークンIDの再利用>
トークンIDは、現実に存在する物品や輸送容器等と紐付けられたトークンがBC上に存在する間(つまり、当該トークンの生成から償却までの間)は重複してはならない。これは、トークンIDによって現実のモノ(例えば、物品や輸送容器等)とトークンとが一意に紐付けられるためである。しかしながら、トークンIDが増えると、トークンと現実のモノとを紐付けるためのRFIDタグやQRコード等といった記憶媒体の数量が膨大になり管理コストが高くなるという問題がある。
【0135】
一方で、トークンが償却された後であれば、このトークンと同じトークンIDのトークンが新たに生成されたとしても、トークンを表す情報を更新する上で問題はない。
【0136】
このため、トークンが償却された後であれば、そのトークンのトークンIDと、トークンと紐付けられた管理対象である物品や輸送容器等を識別するためのRFIDタグやQRコード等の識別子とを再利用することが可能である。これにより、例えば、現実のモノに貼り付け等されるRFIDタグやQRコードを書き換えることなく再利用することができる。特に、QRコードの印刷等のコストと比較してRFIDタグの購入コストは高価であるため、RFIDタグの再利用はコスト削減に有効である。
【0137】
本提案手法はトークンIDの再利用が可能である。そこで、以下では、トークン種別がパッケージトークンであるトークンのトークンID再利用と、トークン種別がアイテムトークンであるトークンのトークンID再利用とについて説明する。
【0138】
≪パッケージトークンのトークンID再利用≫
パッケージトークンは、輸送容器等と紐付けられ、物流サプライチェーンの中で何度も使いまわしされることが想定される。このとき、1輸送区間を超えて占有移転を管理する場合、運用上の取り回しが困難となる事態が想定される。例えば、倉庫Aから倉庫Bにパレットに載せた物品を輸送し、これらの物品を倉庫Bに搬入したものとすると、パレットに紐付くトークンの占有移転が行われないまま、パレットのみを輸送者が倉庫Aに持ち帰ってしまった場合、パレットの占有者はBC上では倉庫Bのままであるため、倉庫Aでは当該パレットのトークンに関してBC上で操作ができないことになる。一方で、パレットを倉庫Aに持ち帰る際に、パレットに紐付くトークンの占有者を倉庫Bから倉庫Aに占有移転すれば倉庫Aでの操作は可能になるが、トランザクションの発行数が増加してしまう。またパッケージトークンを1輸送区間で生成・償却すると、パッケージトークンのトークンIDが大量になり、トランザクションの発行数も更に増加してしまう。そこで、トークン種別がパッケージトークンであるトークンに関しては1輸送区間単位で生成及び償却し、新たな占有者のものとしてトークンを発行(生成)してもよい。この場合、倉庫Bでパレットに紐付くトークンから子トークンの紐付きがすべて解除された時点でそのトークンを償却することができ、その後は、同一トークンIDを使用してトークンの再生成が可能となる。
【0139】
上述したコントラクトメソッドを使用することにより、Packメソッドが実行されたときに存在しなければ自動でトークンが生成され、Unpackメソッドで子トークンが無くなると自動でトークンが償却されるため、パッケージトークンと紐付けたトークンIDの自動再利用が可能となる。
【0140】
また、パッケージトークンは、複数のトークンをまとめて占有移転するために用いられる。すなわち、パッケージトークンは、それ自体の占有移転を追跡するものではない。このため、パッケージトークンを再生成する際は、そのトークンに紐付く輸送容器に貼り付け済のRFIDタグやQRコードを再利用する。
【0141】
これにより、輸送容器に張り付けたRFIDタグやQRコードに記録されているID(識別子)を書き換えずにそのまま利用できる。このため、例えば、RFIDタグの購入コスト、QRコードの印刷コスト、RFIDタグやQRコードの張り直しに要する業務コストを削減することができる。また、トークンIDの再利用によって、トークンIDが枯渇する可能性を低減することができる。
【0142】
ここで、パッケージトークンのトークンIDを再利用した場合の例を図5に示す。図5に示す例では、トークンID「T01」のパッケージトークンが再利用されている例を示している。なお、ブロック番号とは、BC上の分散台帳を構成するブロックの番号のことである。
【0143】
≪アイテムトークンのトークンID再利用≫
アイテムトークンは追跡対象の物品と紐付くため、トークンのライフサイクルが終えた後も、例えば、物品の問題発生時における影響範囲の特定等のために一定期間はBC上にそのトークンの情報を即座に取得できる状態で保持しておく必要がある。一方で、時間の経過と共に即時性のある追跡が必要となる頻度は低くなるため、一定期間(例えば、法律や契約、BC参加者の合意等により決定された期間)が経過した場合はトークンIDが再利用されてもよいと考えられる。
【0144】
なお、再利用されたトークンIDに関して、再利用前のトークンの情報等を追跡したい場合もイベントと過去のブロックとを参照すればその追跡も可能である。
【0145】
<物流管理システム1の全体構成例>
以下、上記の提案手法により、トークンの生成、親子関係の紐付け/解除、占有移転許可、占有移転、トークンの償却を行って物流中の追跡対象(例えば、物品等)を管理する物流管理システム1について説明する。第一の実施形態に係る物流管理システム1の全体構成例を図6に示す。図6に示すように、第一の実施形態に係る物流管理システム1には、ブロックチェーン(BC)を構成する複数のノード10と、ユーザが利用する複数の端末20とが含まれる。これらは、例えば、企業間ネットワーク等を含む通信ネットワークを介して通信可能に接続される。
【0146】
ノード10は、BCを構成する汎用サーバやPC(パーソナルコンピュータ)等である。各ノード10は、BCネットワーク上に分散して存在しており、互いにP2P(Peer to Peer)で接続されている。また、各ノード10は、互いに共有する分散台帳を有していると共に、上記の各メソッド(Mintメソッド、Packメソッド、Approveメソッド、Transferメソッド、Unpackメソッド及びBurnメソッド)が実装されたスマートコントラクトを有しておりトランザクションの実行等を行う。
【0147】
端末20は、トークンの生成、親子関係の紐付け/解除、占有移転許可、占有移転、トークンの償却等を行うユーザが利用する各種端末(例えば、PC、スマートフォン、タブレット端末、ウェアラブルデバイス等)である。以下では、複数の端末20の各々を区別するときは「端末20-1」、「端末20-2」等と表記する。また、ユーザが利用する端末20を「ユーザ端末21」と表記する。これは、後述する管理者端末22と区別するためである。
【0148】
なお、図6に示す物流管理システム1の全体構成例は一例であって、これに限られるものではない。例えば、ノード10及び端末20以外にも、何等かの機能を実現する装置や機器等が物流管理システム1に含まれていてもよい。
【0149】
<物流管理システム1に含まれるノード10及び端末20の機能構成例>
以下、第一の実施形態に係る物流管理システム1に含まれるノード10及び端末20の機能構成例について説明する。
【0150】
≪ノード10≫
第一の実施形態に係るノード10の機能構成例を図7に示す。図7に示すように、第一の実施形態に係るノード10は、トランザクション実行部101を有する。トランザクション実行部101は、当該ノード10が有するブロックチェーンプラットフォーム上に実装されたスマートコントラクトが、CPU(Central Processing Unit)やGPU(Graphic Processing Unit)等のプロセッサに実行させる処理により実現される。また、第一の実施形態に係るノード10は、記憶部102を有する。記憶部102は、例えば、HDD(Hard Disk Drive)やSSD(Solid State Drive)、フラッシュメモリ等の補助記憶装置により実現される。
【0151】
トランザクション実行部101は、上記の各メソッド(Mintメソッド、Packメソッド、Approveメソッド、Transferメソッド、Unpackメソッド及びBurnメソッド)により、トークンの生成、親子関係の紐付け/解除、占有移転許可、占有移転又はトークンの償却を行うためのトランザクションを実行する。
【0152】
記憶部102は、分散台帳を記憶する。分散台帳は、トランザクション、各イベント(Mintイベント、Packイベント、Packedイベント、Unpackイベント、Unpackedイベント、Transferイベント、Approveイベント及びBurnイベント)を表す情報(以下、この情報を「イベント情報」ともいう。)、各トークンを表す情報(以下、この情報を「トークンストレージ情報」ともいう。)等が記録されるブロックで構成される。なお、記憶部102には、分散台帳以外にも、トークンの生成、親子関係の紐付け/解除、占有移転許可、占有移転又はトークンの償却等に必要な様々な情報が記憶されてもよい。
【0153】
≪端末20≫
第一の実施形態に係る端末20の機能構成例を図8に示す。図8に示すように、第一の実施形態に係る端末20は、トランザクション発行部201を有する。トランザクション発行部201は、例えば、端末20にインストールされた1以上のプログラムが、CPU等のプロセッサに実行させる処理により実現される。また、第一の実施形態に係る端末20は、記憶部202を有する。記憶部202は、例えば、HDDやSSD、フラッシュメモリ等の補助記憶装置により実現される。
【0154】
トランザクション発行部201は、トークンの生成、親子関係の紐付け/解除、占有移転許可、占有移転、トークンの償却を行うためのトランザクションを発行する。
【0155】
記憶部202は、トランザクションの発行に必要な情報(例えば、端末20を利用する利用者のBCアドレス等)を記憶する。なお、記憶部202には、これら以外にも、例えば、物品等に貼り付け等されたRFIDタグやQRコードからIDを読み取ってトランザクションを発行するために必要な様々な情報等が記憶されてもよい。
【0156】
<トランザクション発行及び実行処理例>
以下、トークンの生成、親子関係の紐付け/解除、占有移転許可、占有移転、又はトークンの償却を行うためのトランザクションを発行及び実行する処理の流れについて、図9を参照しながら説明する。
【0157】
端末20のトランザクション発行部201は、トークンの生成、親子関係の紐付け/解除、占有移転許可、占有移転、又はトークンの償却を行うためのトランザクションを発行する(ステップS101)。すなわち、端末20のトランザクション発行部201は、以下のようにトランザクションを発行する。
【0158】
・トークンの生成を行う場合、Mintメソッドとその引数とを指定したトランザクションを発行する。
【0159】
・親子関係の紐付けを行う場合、Packメソッドとその引数とを指定したトランザクションを発行する。
【0160】
・占有移転許可を行う場合、Approveメソッドとその引数とを指定したトランザクションを発行する。
【0161】
・占有移転を行う場合、Transferメソッドとその引数とを指定したトランザクションを発行する。
【0162】
・親子関係の紐付け解除を行う場合、Unpackメソッドとその引数とを指定したトランザクションを発行する。
【0163】
・トークンの償却を行う場合、Burnメソッドとその引数とを指定したトランザクションを発行する。
【0164】
次に、端末20のトランザクション発行部201は、上記のステップS101で発行されたトランザクションを或るノード10(例えば、当該端末20に対して予め決められたノード10)に送信する(ステップS102)。
【0165】
ノード10のトランザクション実行部101は、トランザクションを受信すると、このトランザクションを実行する(ステップS103)。すなわち、ノード10のトランザクション実行部101は、以下によりトランザクションを実行する。
【0166】
・Mintメソッドとその引数とが指定されたトランザクションを受信した場合、その引数を指定したMintメソッドを実行する。
【0167】
・Packメソッドとその引数とが指定されたトランザクションを受信した場合、その引数を指定したPackメソッドを実行する。
【0168】
・Approveメソッドとその引数とが指定されたトランザクションを受信した場合、その引数を指定したApproveメソッドを実行する。
【0169】
・Transferメソッドとその引数とが指定されたトランザクションを受信した場合、その引数を指定したTransferメソッドを実行する。
【0170】
・Unpackメソッドとその引数とが指定されたトランザクションを受信した場合、その引数を指定したUnpackメソッドを実行する。
【0171】
・Burnメソッドとその引数とが指定されたトランザクションを受信した場合、その引数を指定したBurnメソッドを実行する。
【0172】
なお、上記のステップS103で実行されたトランザクションと当該トランザクションを実現するメソッドの実行中に発行されたイベントのイベント情報は、分散台帳を構成するブロックに記録される。
【0173】
以上により、第一の実施形態に係る物流管理システム1では、物流中の追跡対象(例えば、物品等)とその輸送容器との親子関係を利用して効率的な占有移転を実現することができる。すなわち、親子関係が相互に参照可能であり、その紐付け/解除を1トランザクションで実現することができると共に、親単位でそれよりも下位の階層の子をまとめて1トランザクションで占有移転させることが可能となる。また、占有移転先が同一であれば、複数のトークンを親単位でまとめて1トランザクションで占有移転させることが可能である。このため、或るモノと親子関係にある他のモノの情報を容易に参照することができると共に、トランザクションの発行数が削減され、追跡対象の占有移転をBCに記録する際に負荷(例えば、トランザクション発行による作業者の業務負荷、ブロックチェーン上の各ノードの検証・同期に要するネットワークリソース・サーバリソース負荷等)を削減することが可能となる。
【0174】
[第二の実施形態]
次に、第二の実施形態について説明する。なお、第二の実施形態では、主に、第一の実施形態との相違点について説明し、第一の実施形態と同様としてよい点に関してはその説明を省略する。
【0175】
<占有移転の記録漏れ>
物流サプライチェーンの中で作業者のミスにより占有移転の記録漏れが発生する可能性がある。この場合、BC上のトークンと現実のモノとの間で占有者の乖離が発生することになる。一方で、BC上のトークンは、その占有者又は占有移転許可を与えられた者でなければその占有の移転を実施することはできない。
【0176】
例えば、ユーザとして、A(BCアドレス:0x111)、B(BCアドレス:0x222)及びC(BCアドレス:0x333)が存在し、図10に示すように、トークンID「T01」のトークンに関して、ユーザAがユーザBに占有移転許可(トランザクション発行者:A、占有者:A)が行われたものとする。その後、ユーザBが自身への占有移転とユーザCへの占有移転許可を本来行うべきところだが、そのトランザクションの記録漏れが発生しているものとする。このとき、ユーザCが自身に占有移転するためのトランザクションを発行したとしても、そのトランザクションは実行できない。これは、上記の記録漏れにより、BC上では当該トークンの移転許可先リストプロパティにユーザCのBCアドレス「0x333」が含まれていないためである。
【0177】
このため、BC上で占有移転の記録を再開するためには占有者の乖離が生じているモノの物流を一旦中止した上で、占有移転の記録漏れが生じた時点から各ユーザが本来実施すべきだった占有移転を実施し、BC上の分散台帳にトランザクションを記録する必要がある。しかしながら、記録漏れの期間が長いほど関係するユーザ(以下、関係者ともいう。)が多くなり、その結果、物流を中止する時間が長くなるため、そのような是正措置は非現実的である。そこで、以下では、記録漏れ発生時に管理者が占有移転を代行して行える手法を提案する。
【0178】
<提案手法>
以下、本提案手法について説明するが、特に言及する箇所以外は、第一の実施形態と同様としてよいことに留意されたい。
【0179】
≪コントラクトメソッドの実行権限≫
一般的な権限を持つ「ユーザ」と、特権的な権限を持つ「管理者」とが少なくとも存在するものとする。管理者は、例えば、上記のコントラクトメソッドが実装されたコントラクトを各ノード10にデプロイした者、他の管理者から管理者としての権限が与えられたユーザ、等が挙げられる。また、管理者は1人である必要はなく、複数存在してもよい。
【0180】
また、各コントラクトメソッドでは、トランザクション発行者が更新対象のトークンの特定のプロパティ(占有者プロパティ、移転許可先リストプロパティ等)と一致するか否かを判定しアクセスを制限している(メソッドの「制限」の「a」に記載)。ここで、トランザクション発行者が、制限「a」に記載するユーザであるか、又は上述する「管理者」ユーザであればアクセス可能なように、制限「a」を変更する。
≪イベントのオペレーションタイプ≫
トランザクションの発行者の種別を表すオペレーションタイプとして、「管理者実行」を表す「2」を追加する。すなわち、オペレーションタイプは、「0」(一般ユーザ実行)、「1」(システム実行)、「2」(管理者実行)で表現される。
【0181】
≪補足履歴リストマップ≫
コントラクトは、ストレージ情報として補足リストマップを持つものとする。ここで、補足履歴リストマップは、占有移転の記録漏れが発生したトークンのトークンID、後述する特殊占有移転を行うためのトランザクションが記録されたブロックのブロック番号と紐付けて、補足履歴リストを保存する。補足履歴リストは複数の補足履歴を含み、補足履歴には、当該占有移転の移転元のBCアドレス(以下、移転元BCアドレスともいう。)、当該占有移転の移転先のBCアドレス(以下、移転先BCアドレス)、移転元BCアドレスを持つユーザが当該補足履歴を承認したか否かを表す移転元承認区分、移転先BCアドレスを持つユーザの当該補足履歴の承認状態を表す移転先承認区分等が設定される。移転元承認区分及び移転先承認区分は、「0」が設定されている場合は「未承認」、「1」が設定されている場合は「承認」、「2」が設定されている場合は「否認」であるものとする。例えば、補足履歴リストマップは以下のようなデータ形式で表される。
【0182】
補足履歴リストマップ[トークンID][ブロック番号]=[{移転元BCアドレス,移転先BCアドレス,移転元承認区分,移転先承認区分}]
なお、これは一例であって、補足履歴には、例えば、管理者が特殊占有移転を実施した理由等が更に含まれていてもよい。
【0183】
上記の補足履歴は関係者によって承認又は否認される。これは、管理者が占有移転を代行しているため、実際に記録漏れを生じさせたユーザ(関係者)による承認又は否認を求めて信頼性を高めるためのものである。
【0184】
≪コントラクトメソッド≫
以下、管理者が占有移転を代行することを「特殊占有移転」と呼び、特殊占有移転を行うためのトランザクションを実現するメソッドを定義する。また、補足履歴を関係者が承認又は否認(以下、「補足履歴承認」ともいう。)するためのトランザクション、補足履歴を管理者が更新(以下、「補足履歴更新」ともいう。)するためのトランザクションを実現するメソッドも定義する。更に、これらのメソッド内で発行されるイベントも定義する。
【0185】
メソッドとしては以下の3つを定義する。
【0186】
・SpecialTransferメソッド
・Confirmメソッド
・UpdateSupplementalHistoryメソッド
≪イベント≫
イベントとしては以下の2つを定義する。
【0187】
・Noticeイベント
・Confirmイベント
以下、上記の3つのメソッドの詳細について説明する。なお、イベントに関してはメソッドの詳細を説明する中であわせて説明する。
【0188】
≪SpecialTransferメソッド≫
SpecialTransferメソッドは、管理者権限で1つ以上のトークンの占有移転を強制的に行うと共に占有移転の補足履歴を行うトランザクション(つまり、特殊占有移転を行うトランザクション)を実行するためのメソッドである。
【0189】
引数:SpecialTransferメソッドには、以下が引数として指定される。
【0190】
・トークンIDリスト
・移転経路リスト
・理由
ここで、トークンIDリストには、特殊占有移転の対象となるトークンのトークンIDを要素とするリストが設定される。移転経路リストには、本来あるべき占有移転の流れの順に占有者のBCアドレスを格納したリストが設定される。理由には、特殊占有移転の事由が必要に応じて設定される。
【0191】
制限:SpecialTransferメソッドの実行時にはメソッド内で以下の条件を満たすか否かがチェックされる。なお、いずれかの条件を満たさない場合はエラーとなる。
【0192】
・トランザクション発行者が管理者であること
処理:以下のStep71を実行する。
【0193】
Step71)引数として指定されたトークンIDリストの各要素毎に以下のStep71-1~Step71-4を繰り返す。
【0194】
Step71-1)Transferメソッドの引数として、移転先トークンIDリストに当該要素のトークンIDを、移転先BCアドレスに当該SpecialTransferメソッドの引数として指定された移転経路リストの末尾のBCアドレスをそれぞれ指定して、当該Transferメソッドを実行する。Transferメソッドの実行によりTransferイベントが発行されるが、その際のオペレーションタイプは「2」(管理者実行)とする。
【0195】
Step71-2)当該トークンIDと、上記のStep71-1における変更前のBCアドレスと、引数として指定された移転経路リストに含まれるBCアドレスとを用いて、移転経路毎の補足履歴リストを作成する。すなわち、上記のStep71-1における変更前のBCアドレスを移転元BCアドレス、当該移転経路リストに含まれる先頭のBCアドレスを移転先BCアドレスとして1番目の補足履歴を作成する。また、n=1,・・・,N-1(ただし、Nは移転経路リストに含まれるBCアドレスの数)に対して、当該移転経路リストに含まれるn番目のBCアドレスを移転元BCアドレス、当該移転経路リストに含まれるn+1番目のBCアドレスを移転先BCアドレスとしてn+1番目の補足履歴を作成する。これにより、N個の補足履歴を要素とする補足履歴リストが作成される。ここで、すべての補足履歴のトークンIDには当該トークンID(つまり、Step71-1~Step71-4の現在の繰り返しに用いられているトークンID)が設定され、ブロック番号には特殊占有移転のトランザクションが記録される分散台帳のブロック番号が設定される。また、すべての補足履歴の移転元承認区分及び移転先承認区分には、例えば、未承認であることを表す「0」が設定される。
【0196】
Step71-3)上記のStep71-2で作成された補足履歴リストを、当該トークンのトークンID及び特殊占有移転のトランザクションが記録されるブロック番号をキーとして、補足履歴リストマップに追加する。
【0197】
Step71-4)Noticeイベントを発行する。
【0198】
ここで、Noticeイベントとは、特殊占有移転又は補足履歴更新が行われたことを通知するイベントのことである。Noticeイベントには、例えば、特殊占有移転又は補足履歴更新が行われたトークンのトークンIDと、当該トークンの占有者と、SpecialTransferメソッド又はUpdateSupplementalHistoryメソッドのトランザクション発行者(のBCアドレス)と、当該トークンのトークンタイプと、SpecialTransferメソッド又はUpdateSupplementalHistoryメソッドのトランザクションのオペレーションタイプと、特殊占有移転又は補足履歴更新のトランザクションが記録された分散台帳のブロック番号を表す特殊占有移転ブロック番号と、通知タイプと、理由とが含まれる。通知タイプには、例えば、特殊占有移転のときは「0」、補足履歴更新のときは「1」が設定される。また、理由には、引数として指定された理由が設定される。
【0199】
具体例:以下のトークンが存在するものとする。
【0200】
{トークンID:"T01",親トークンID:"",占有者:0x111,子トークンIDリスト:[],移転許可先リスト:[],トークンタイプ:1(アイテムトークン)}
このとき、以下の引数が指定されたSpecialTransferメソッドが管理者により実行され、ブロック番号100に記録されたものとする。
【0201】
トークンIDリスト=["T01"]
移転経路リスト=[0x222,0x333]
理由="占有移転の記録漏れのため"
この場合、上記のトークンは以下となる。
【0202】
{トークンID:"T01",親トークンID:"",占有者:0x333,子トークンIDリスト:[],移転許可先リスト:[],トークンタイプ:1(アイテムトークン)}
補足履歴リストマップは以下となる。
【0203】
補足履歴リストマップ["T01"][100]=[
{移転元BCアドレス:0x111,移転先BCアドレス:0x222,移転元承認区分:0(未承認),移転先承認区分:0(未承認)},
{移転元BCアドレス:0x222,移転先BCアドレス:0x333,移転元承認区分:0(未承認),移転先承認区分:0(未承認)}]
≪Confirmメソッド≫
Confirmメソッドは、特殊占有移転の補足履歴に対して関係者が承認又は否認を行うトランザクション(つまり、補足履歴承認を行うトランザクション)を実行するためのメソッドである。
【0204】
引数:Confirmメソッドには、以下が引数として指定される。
【0205】
・補足履歴情報リスト
・補足履歴承認フラグ
ここで、補足履歴情報リストには、承認又は否認対象のトークンのトークンIDと、特殊占有移転のトランザクションが記録された分散台帳のブロック番号と、補足履歴リストにおける承認又は否認対象の補足履歴のインデックス番号とで構成される要素のリストが設定される。すなわち、補足履歴情報リストには、(トークンID,ブロック番号,インデックス番号)という形式で表される要素のリストが設定される。インデックス番号とは、承認又は否認対象の補足履歴が補足履歴リストの先頭から何番目に存在するかを表す番号であり、例えば、補足履歴リストの先頭の補足履歴を0番目とした番号を表している。補足履歴承認フラグは、「0」(承認)又は「1」(否認)のいずれかが設定される。
【0206】
制限:Confirmメソッドの実行時にはメソッド内で以下の条件を満たすか否かがチェックされる。なお、いずれかの条件を満たさない場合はエラーとなる。
【0207】
・トランザクション発行者が、承認又は否認対象の補足履歴の移転元BCアドレス又は移転先BCアドレスを持つユーザであること
処理:以下のStep81を実行する。
【0208】
Step81)引数として指定された補足履歴情報リストの各要素毎に以下のStep81-1~Step81-3を繰り返す。
【0209】
Step81-1)当該要素に含まれるトークンID、ブロック番号及びインデックス番号をキーとして補足履歴リストマップから補足履歴リストを取得する。
【0210】
Step81-2)引数として指定された補足履歴承認フラグと、トランザクション発行者が移転元BCアドレスのユーザ又は移転先BCアドレスのユーザのいずれであるかとに応じて、上記のStep81-1で取得した補足履歴リストに含まれる各補足履歴の移転元承認区分又は移転先承認区分を更新する。すなわち、補足履歴承認フラグが「0」である場合に、トランザクション発行者が移転元BCアドレスのユーザであるときは移転元承認区分を「1」(承認)、トランザクション発行者が移転先BCアドレスのユーザであるときは移転先承認区分を「1」(承認)に更新する。一方で、補足履歴承認フラグが「1」である場合に、トランザクション発行者が移転元BCアドレスのユーザであるときは移転元承認区分を「2」(否認)、トランザクション発行者が移転先BCアドレスのユーザであるときは移転先承認区分を「2」(否認)に更新する。
【0211】
なお、承認区分として移転元承認区分と移転先承認区分とを設けた理由は、移転元のユーザと移転先のユーザのそれぞれが承認することで、特殊占有移転の信頼性を高めることができると考えられるためである。
【0212】
Step81-3)Confirmイベントを発行する。
【0213】
ここで、Confirmイベントとは、補足履歴の承認又は否認されたことを表すイベントのことである。Confirmイベントには、例えば、承認又は否認対象のトークンのトークンIDと、当該トークンの占有者と、Confirmイベントのトランザクション発行者(のBCアドレス)と、当該トークンのトークンタイプと、Confirmイベントのトランザクションのオペレーションタイプと、承認又は否認された補足履歴が補足履歴リストの先頭から何番目に存在するかを表す補足履歴インデックス番号と、承認又は否認された補足履歴の移転元BCアドレスを表す補足履歴移転元と、承認又は否認された補足履歴の移転先BCアドレスを表す補足履歴移転先と、当該補足履歴が承認されたか又は否認されたかを表す補足履歴承認フラグとが含まれる。
【0214】
具体例:以下の補足履歴リストマップが存在するものとする。
【0215】
補足履歴リストマップ["T01"][100]=[
{移転元BCアドレス:0x111,移転先BCアドレス:0x222,移転元承認区分:0(未承認),移転先承認区分:0(未承認)},
{移転元BCアドレス:0x222,移転先BCアドレス:0x333,移転元承認区分:0(未承認),移転先承認区分:0(未承認)}]
このとき、以下の引数が指定されたConfirmメソッドがトランザクション発行者「0x222」により実行されたものとする。
【0216】
補足履歴情報リスト=[
{トークンID:"T01",ブロック番号:100,インデックス番号:0},
{トークンID:"T01",ブロック番号:100,インデックス番号:1}]
補足履歴承認フラグ=1(否認)
この場合、上記の補足履歴リストマップは以下となる。
【0217】
補足履歴リストマップ["T01"][100]=[
{移転元BCアドレス:0x111,移転先BCアドレス:0x222,移転元承認区分:0(未承認),移転先承認区分:2(否認)},
{移転元BCアドレス:0x222,移転先BCアドレス:0x333,移転元承認区分:2(否認),移転先承認区分:0(未承認)}]
≪UpdateSupplementalHistoryメソッド≫
UpdateSupplementalHistoryメソッドは、管理者権限で特殊占有移転の補足履歴リストの移転経路を更新するトランザクション(つまり、補足履歴更新を行うトランザクション)を実行するためのメソッドである。本メソッドを実行すると、各補足履歴の承認状態はリセットされる。
【0218】
引数:UpdateSupplementalHistoryメソッドには、以下が引数として指定される。
【0219】
・補足履歴情報リスト
・移転経路リスト
ここで、補足履歴情報リストには、承認又は否認対象のトークンのトークンIDと、特殊占有移転のトランザクションが記録された分散台帳のブロック番号とで構成される要素のリストが設定される。すなわち、補足履歴情報リストには、(トークンID,ブロック番号)という形式で表される要素のリストが設定される。移転経路リストには、本来あるべき占有移転の流れの順に占有者のBCアドレスを格納したリストが設定される。
【0220】
制限:UpdateSupplementalHistoryメソッドの実行時にはメソッド内で以下の条件を満たすか否かがチェックされる。なお、いずれかの条件を満たさない場合はエラーとなる。
【0221】
・トランザクション発行者が管理者であること
処理:以下のStep91を実行する。
【0222】
Ste91)引数として指定された補足履歴情報の各要素毎に以下のStep91-1~Step91-4を繰り返す。
【0223】
Step91-1)当該要素に含まれるトークンID及びブロック番号をキーとして補足履歴リストマップから補足履歴リストを取得する。
【0224】
Step91-2)当該トークンIDと、上記のStep91-1で取得した補足履歴リストに含まれる先頭の補足履歴の移転元BCアドレスと、引数として指定された移転経路リストに含まれるBCアドレスとを用いて、移転経路毎の補足履歴を作成する。すなわち、上記のStep91-1で取得した補足履歴リストに含まれる先頭の補足履歴の移転元BCアドレスに設定されているBCアドレスを移転元BCアドレス、当該移転経路リストに含まれる先頭のBCアドレスを移転先BCアドレスとして1番目の補足履歴を作成する。また、n=1,・・・,N-1(ただし、Nは移転経路リストに含まれるBCアドレスの数)に対して、当該移転経路リストに含まれるn番目のBCアドレスを移転元BCアドレス、当該移転経路リストに含まれるn+1番目のBCアドレスを移転先BCアドレスとしてn+1番目の補足履歴を作成する。これにより、N個の補足履歴が作成される。ここで、すべての補足履歴のトークンIDには当該要素に含まれるトークンID(つまり、Step91-1~Step91-4の現在の繰り返しに用いられているトークンID)が設定され、ブロック番号には当該要素に含まれるブロック番号が設定される。また、すべての補足履歴の移転元承認区分及び移転先承認区分には、例えば、未承認であることを表す「0」が設定される。
【0225】
Step91-3)当該要素に含まれるトークンID及びブロック番号をキーとして、補足履歴リストマップから補足履歴リストをクリアした上で、上記のStep91-2で作成した補足履歴を、当該要素に含まれるトークンID及びブロック番号をキーとして補足履歴リストマップに追加する。
【0226】
Step91-4)Noticeイベントを発行する。
【0227】
具体例:以下の補足履歴リストマップが存在するものとする。
【0228】
補足履歴リストマップ["T01"][100]=[
{移転元BCアドレス:0x111,移転先BCアドレス:0x222,移転元承認区分:1(承認),移転先承認区分:2(否認)},
{移転元BCアドレス:0x222,移転先BCアドレス:0x333,移転元承認区分:2(否認),移転先承認区分:1(承認)}]
このとき、以下の引数が指定されたUpdateSupplementalHistoryメソッドが管理者により実行されたものとする。
【0229】
補足履歴情報リスト=[{トークンID:"T01",ブロック番号:100}]
移転経路リスト=[0x444,0x333]
この場合、上記の補足履歴リストマップは以下となる。
【0230】
補足履歴リストマップ["T01"][100]=[
{移転元BCアドレス:0x111,移転先BCアドレス:0x444,移転元承認区分:0(未承認),移転先承認区分:0(未承認)},
{移転元BCアドレス:0x444,移転先BCアドレス:0x333,移転元承認区分:0(未承認),移転先承認区分:0(未承認)}]
<物流管理システム1の全体構成例>
上記の提案手法により、特殊占有移転、補足履歴承認、補足履歴更新を行う物流管理システム1の全体構成例は第一の実施形態と同様としてよいため、その説明を省略する。ただし、以下では、管理者が利用する端末20を「管理者端末22」と表記する。
【0231】
<物流管理システム1に含まれるノード10及び端末20の機能構成例>
以下、第二の実施形態に係る端末20の機能構成例について説明する。なお、第二の実施形態に係るノード10の機能構成例は第一の実施形態と同様としてよいため、その説明を省略する。
【0232】
≪端末20≫
第二の実施形態に係る端末20の機能構成例を図11に示す。図11に示すように、第二の実施形態に係る端末20は、第一の実施形態で説明した各部に加えて、占有移転代行依頼部203と、補足履歴リスト取得部204とを有する。これら各部は、例えば、端末20にインストールされた1以上のプログラムが、CPU等のプロセッサに実行させる処理により実現される。
【0233】
占有移転代行依頼部203は、当該端末20の利用者が占有移転代行を希望するユーザである場合(つまり、当該端末20が、占有移転代行を希望するユーザのユーザ端末21である場合)に、占有移転代行を管理者端末22に依頼する。
【0234】
補足履歴リスト取得部204は、当該端末20の利用者が占有移転の記録漏れの関係者である場合(つまり、当該端末20が、占有移転の記録漏れの関係者(ユーザ)のユーザ端末21である場合)に、補足履歴承認を行うために補足履歴リストを補足履歴リストマップから取得する。
【0235】
<特殊占有移転、補足履歴承認及び補足履歴更新処理>
以下、特殊占有移転、補足履歴承認、及び補足履歴更新を行うための処理の流れについて、図12を参照しながら説明する。なお、以下では、管理者に対して占有移転代行を依頼するユーザの端末20をユーザ端末21-1、占有移転の記録漏れをしたユーザ(関係者)の端末20をユーザ端末21-2とする。
【0236】
ユーザ端末21-1の占有移転代行依頼部203は、占有移転代行を管理者端末22に依頼する(ステップS201)。ここで、占有移転代行依頼には、例えば、SpecialTransferメソッドの引数として指定されるトークンIDリスト、移転経路リスト及び理由が含まれる。なお、占有移転代行依頼部203は、予め決められた手段(例えば、メール、メッセージングアプリケーション等)により占有移転代行依頼を行えばよい。ただし、これは一例であって、占有移転代行依頼は、例えば、電話、口頭、手紙等により行われてもよい。
【0237】
管理者端末22のトランザクション発行部201は、特殊占有移転を行うためのトランザクションを発行する(ステップS202)。すなわち、管理者端末22のトランザクション発行部201は、SpecialTransferメソッドとその引数(例えば、占有移転代行依頼に含まれるトークンIDリスト、移転経路リスト及び理由)とを指定したトランザクションを発行する。
【0238】
次に、管理者端末22のトランザクション発行部201は、上記のステップS202で発行されたトランザクションを或るノード10(例えば、当該管理者端末22に対して予め決められたノード10)に送信する(ステップS203)。
【0239】
ノード10のトランザクション実行部101は、トランザクションを受信すると、このトランザクションを実行する(ステップS204)。すなわち、ノード10のトランザクション実行部101は、受信したトランザクションに指定された引数を指定したSpecialTransferメソッドを実行する。これにより、特殊占有移転が行われ、当該特殊占有移転が行われたことを表すNoticeイベントが発行される。
【0240】
ユーザ端末21-2の補足履歴リスト取得部204は、上記のステップS204で発行されたNoticeイベントに含まれるトークンID及びブロック番号をキーとして補足履歴リストを補足履歴リストマップから取得する(ステップS205)。
【0241】
以下のステップS206~ステップS208は、ユーザ端末21-2のユーザのBCアドレスが、上記のステップS205で取得された補足履歴リスト内に存在する場合(つまり、当該補足履歴リスト内の少なくとも1つの補足履歴の移転元BCアドレス又は移転先BCアドレスが、当該ユーザ端末21-2のユーザのBCアドレスである場合)に実行される。
【0242】
ユーザ端末21-2のトランザクション発行部201は、補足履歴承認を行うためのトランザクションを発行する(ステップS206)。すなわち、ユーザ端末21-2のトランザクション発行部201は、Confirmメソッドとその引数とを指定したトランザクションを発行する。なお、Confirmメソッドの引数(つまり、補足履歴情報リスト及び補足履歴承認フラグ)は、例えば、自身のBCアドレスが移転元BCアドレス又は移転先BCアドレスに設定されている補足履歴を承認するか又は否認するかを決定したユーザ(ユーザ端末21-2のユーザ)によって指定される。
【0243】
ユーザ端末21-2のトランザクション発行部201は、上記のステップS206で発行されたトランザクションを或るノード10(例えば、当該ユーザ端末21-2に対して予め決められたノード10)に送信する(ステップS207)。
【0244】
ノード10のトランザクション実行部101は、トランザクションを受信すると、このトランザクションを実行する(ステップS208)。すなわち、ノード10のトランザクション実行部101は、受信したトランザクションに指定された引数を指定したConfirmメソッドを実行する。これにより、補足履歴承認が行われ、Confirmイベントが発行される。
【0245】
以下のステップS209~ステップS211は、例えば、補足履歴に誤りがある等の理由によりユーザ端末21-2のユーザによって或る補足履歴が否認され、管理者が補足履歴を更新する場合に実行される。
【0246】
管理者端末22のトランザクション発行部201は、補足履歴更新を行うためのトランザクションを発行する(ステップS209)。すなわち、管理者端末22のトランザクション発行部201は、UpdateSupplementalHistoryメソッドとその引数(つまり、例えば、正しい補足履歴情報リスト及び移転経路リスト)とを指定したトランザクションを発行する。
【0247】
次に、管理者端末22のトランザクション発行部201は、上記のステップS209で発行されたトランザクションを或るノード10(例えば、当該管理者端末22に対して予め決められたノード10)に送信する(ステップS210)。
【0248】
ノード10のトランザクション実行部101は、トランザクションを受信すると、このトランザクションを実行する(ステップS211)。すなわち、ノード10のトランザクション実行部101は、受信したトランザクションに指定された引数を指定したUpdateSupplementalHistoryメソッドを実行する。これにより、補足履歴更新が行われ、Noticeイベントが発行される。この場合、上記のステップS205から再度実行される。
【0249】
なお、上記のステップS204、ステップS208及びステップS211で実行されたトランザクションと当該トランザクションを実現するメソッドの実行中に発行されたイベントのイベント情報は、分散台帳を構成するブロックに記録される。
【0250】
以上により、第二の実施形態に係る物流管理システム1では、占有移転の記録漏れが生じた場合であっても、その占有移転を管理者が代理で記録することが可能となる。また、このとき、記録漏れが発生した後の占有者(関係者)に対して管理者による占有移転(特殊占有移転)を承認させることにより、その特殊占有移転の信頼性を高めることができる。
【0251】
[第三の実施形態]
次に、第三の実施形態について説明する。なお、第三の実施形態は、第一の実施形態のみ、又は第一と第二の実施形態の両方を前提としてよいが、以下では、主に、第一と第二の実施形態の両方を前提として説明する。
【0252】
<占有移転履歴>
上記の第一又は第二の実施形態に係る物流管理システム1では、BC上で追跡対象の占有移転を管理することができるが、例えば、トークン間の親子関係が存在し、またトークンIDの再利用や管理者による特殊占有移転等が行われ得るため、占有移転履歴を作成する際には、これらを考慮する必要がある。これは、トークンストレージ情報はBC上では単なるトークン毎の履歴でしかないため、トークン間の親子関係、トークンIDの再利用、管理者による特殊占有移転等を考慮しないと正確な占有移転履歴が得られないためである。そこで、以下では、トークン間の親子関係、トークンIDの再利用、管理者による特殊占有移転等を考慮した占有移転履歴を作成し、この占有移転を可視化する場合について説明する。
【0253】
<物流管理システム1の全体構成例>
以下、トークン間の親子関係、トークンIDの再利用、管理者による特殊占有移転等を考慮した占有移転履歴を作成し、この占有移転を可視化することができる物流管理システム1について説明する。第三の実施形態に係る物流管理システム1の全体構成例を図13に示す。図13に示すように、第三の実施形態に係る物流管理システム1には、複数のノード10と複数の端末20に加えて、データベースサーバ30が含まれる。なお、データベースサーバ30は、例えば、企業間ネットワーク等を含む通信ネットワークを介して、ノード10及び端末20と通信可能に接続される。
【0254】
データベースサーバ30は、トークン間の親子関係、トークンIDの再利用、管理者による特殊占有移転等を考慮した占有移転履歴を作成及び管理する汎用サーバやPC等である。データベースサーバ30は、ノード10から取得したトークンストレージ情報やイベント情報等を用いて占有移転履歴を作成すると共に、端末20からの要求に応じて当該占有移転履歴を提供する。
【0255】
なお、図13に示す物流管理システム1の全体構成例は一例であって、これに限られるものではない。例えば、複数の端末20のうちの或る1つ以上の端末20がデータベースサーバ30として機能してもよい。
【0256】
<物流管理システム1に含まれるノード10、端末20及びデータベースサーバ30の機能構成例>
以下、第三の実施形態に係る物流管理システム1に含まれるノード10、端末20及びデータベースサーバ30の機能構成例について説明する。なお、ノード10の機能構成例は第一又は第二の実施形態と同様としてよいため、その説明を省略する。
【0257】
≪端末20≫
第三の実施形態に係る端末20の機能構成例を図14に示す。図14に示すように、第三の実施形態に係る端末20は、第二の実施形態で説明した各部に加えて、可視化部205を有する。可視化部205は、例えば、端末20にインストールされた1以上のプログラムが、CPU等のプロセッサに実行させる処理により実現される。
【0258】
可視化部205は、可視化対象として指定されたトークンIDを持つトークンの占有移転履歴をデータベースサーバ30に要求すると共に、この要求に応じて当該データベースサーバ30から提供された占有移転履歴をディスプレイ等の表示装置上に可視化する。
【0259】
≪データベースサーバ30≫
第三の実施形態に係るデータベースサーバ30の機能構成例を図15に示す。図15に示すように、第三の実施形態に係るデータベースサーバ30は、占有移転履歴作成部301と、占有移転履歴提供部302とを有する。これら各部は、例えば、データベースサーバ30にインストールされた1以上のプログラムが、CPU等のプロセッサに実行させる処理により実現される。また、第三の実施形態に係るデータベースサーバ30は、占有移転履歴DB303を有する。占有移転履歴DB303は、例えば、HDDやSSD、フラッシュメモリ等の補助記憶装置により実現される。
【0260】
占有移転履歴作成部301は、BCから取得したトークンストレージ情報やイベント情報等を用いて、或るトークンIDの占有移転履歴(例えば、トークン間の親子関係、トークンIDの再利用、管理者による特殊占有移転等を考慮した占有移転履歴)を作成する。また、占有移転履歴作成部301は、作成した占有移転履歴を占有移転履歴DB303に格納する。ここで、占有移転履歴作成部301は、例えば、予め決められた所定の期間(例えば、1日等)毎に、履歴作成対象となる各トークンIDの占有移転履歴を作成する。なお、履歴作成対象となるトークンIDは、例えば、すべてのトークンIDであってもよいし、予め決められた一部のトークンIDであってもよいし、予め決められた追跡対象に紐付けられたトークンのトークンIDであってもよい。
【0261】
占有移転履歴提供部302は、端末20からの要求に応じて、この要求で指定されたトークンIDの占有移転履歴を当該端末20に提供する。
【0262】
占有移転履歴DB303は、占有移転履歴作成部301によって作成された占有移転履歴を格納する。
【0263】
<占有移転履歴作成処理>
以下、一例として、トークンID「T01」のトークンには、図16に示すような親子関係とイベント発生履歴が存在するものとする。すなわち、トークンID「T01」のトークンには、3階層の親子関係が存在し、またトークンIDの再利用、管理者による特殊占有移転が発生しているものとする。このとき、トークンID「T01」の占有移転履歴を作成する場合の処理の流れについて、図17を参照しながら説明する。
【0264】
データベースサーバ30の占有移転履歴作成部301は、履歴作成対象のトークンID(ここでは、一例として、トークンID「T01」)に関するイベント情報をBCから取得し、eventInfoListと呼ぶリストに各イベント情報を要素(レコード)として追加した上で、ブロック番号(blockNo)を第一ソートキー、ログ順序(logIndex)を第二ソートキーとしてeventInfoListの要素を昇順にソートする(ステップS301)。
【0265】
上記のステップS301により、例えば、以下のeventInfoListが得られる。
【0266】
eventInfoList=[
{blockNo:100,event:Mint,logIndex:0,・・・},
{blockNo:120,event:Packed,logIndex:0,・・・},
{blockNo:150,event:Unpacked,logIndex:0,・・・},
{blockNo:160,event:Approve,logIndex:0,・・・},
{blockNo:170,event:Transfer,logIndex:0,・・・},
{blockNo:180,event:Packed,logIndex:1,・・・},
{blockNo:240,event:Burn,logIndex:0,・・・},
{blockNo:250,event:Mint,logIndex:0,・・・},
{blockNo:260,event:Burn,logIndex:0,・・・}]
ここで、ログ順序(logIndex)は、ブロック内におけるイベントの発行順序を表している。なお、イベント情報には、ブロック番号(blockNo)、イベント名(event)、ログ順序(logIndex)以外にも、トランザクション発行者やオペレーションタイプ等の様々な情報が含まれ得るが、上記では必要なものだけを記載し、それ以外を省略している。
【0267】
次に、データベースサーバ30の占有移転履歴作成部301は、eventInfoListの要素(イベント情報)毎にその要素に含まれるブロック番号時点におけるトークンID「T01」のトークンストレージ情報をBCから取得し、当該イベント情報と当該トークンストレージ情報とをあわせてtokenHistoryListと呼ぶリストの要素として追加する(ステップS302)。
【0268】
上記のステップS302により、例えば、以下のtokenHistoryListが得られる。
【0269】
tokenHistoryList=[
{blockNo:100,event:Mint,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:120,event:Packed,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:150,event:Unpacked,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:160,event:Approve,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:170,event:Transfer,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:180,event:Packed,logIndex:1,・・・,tokenInfo:{・・・}},
{blockNo:240,event:Burn,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:250,event:Mint,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:260,event:Burn,logIndex:0,・・・,tokenInfo:{・・・}}]
ここで、tokenInfoはトークンストレージ情報を表す。
【0270】
次に、データベースサーバ30の占有移転履歴作成部301は、eventInfoListの各要素からセットリストと呼ぶデータを作成し、これらのセットリストをeventFilterListと呼ぶリストの要素として追加する(ステップS303)。セットリストとは、Packedイベント発行時における親トークンのトークンIDと、Packedイベント発行時のブロック番号及びログ順序と、Unpacked又はBurnイベント発行時のブロック番号及びログ順序とで構成されるデータのことである。
【0271】
ここで、占有移転履歴作成部301は、以下のStep101によりセットリストを作成する。
【0272】
Step101)eventInfoListに含まれる要素(イベント情報)毎に以下のStep101-1~Step101-4を繰り返す。
【0273】
Step101-1)当該要素に含まれるeventが「Packed」である場合は次のStep101-2に進み、そうでない場合は当該要素に関するStep101-2~Step101-4をスキップする。
【0274】
Step101-2)当該要素(eventが「Packed」であるイベント情報)のブロック番号をfromBlockNo、ログ順序をfromLogIndexに設定する。
【0275】
Step101-3)eventInfoList内で当該要素(eventが「Packed」であるイベント情報)よりも後に存在し、かつ、eventが「Unpacked」又は「Burn」である直近の要素のブロック番号をtoBlockNo、ログ順序をtoLogIndexに設定する。ただし、当該要素(eventが「Packed」であるイベント情報)よりも後にeventが「Unpacked」又は「Burn」である要素が存在しない場合、toBlockNoには最新のブロック番号を設定し、toLogIndexには予め決められた最大値(例えば、実装プログラムにおける整数の最大値)を設定する。
【0276】
Step101-4)そして、fromBlockNo、fromLogIndex、toBlockNo、toLogIndexに対して、当該要素(eventが「Packed」であるイベント情報)のブロック番号時点における親トークン(トークンID「T01」を持つトークンの親トークン)のトークンIDをparentTokenIdとして対応付ける。これにより、(parentTokenId,fromBlockNo,fromLogIndex,toBlockNo,toLogIndex)という形式のセットリストが作成される。
【0277】
上記のステップS303により、例えば、以下のeventFilterListが得られる。
【0278】
eventFilterList=[
{parentTokenId:T02,fromBlockNo:120,fromLogIndex:0,toBlockNo:150,toLogIndex:0},
{parentTokenId:T02,fromBlockNo:180,fromLogIndex:1,toBlockNo:240,toLogIndex:0}]
次に、データベースサーバ30の占有移転履歴作成部301は、eventFilterList長(つまり、eventFilterListに含まれる要素(セットリスト)数)が0より大きい場合、eventFilterListを用いて、以下のStep111~Step112によりtokenHistoryListを更新する(ステップS304)。なお、eventFilterList長が0である場合は以下のStep111~Step112をスキップし、次のステップS305に進む。
【0279】
Step111)eventFilterListに含まれる要素(セットリスト)毎に以下のStep111-1~Step111-3を繰り返す。
【0280】
Step111-1)当該要素(セットリスト)に含まれるparentTokenIdに設定されているトークンIDのトークンストレージ情報をBCから再帰的に取得し、最上位の親トークンが持つトークンIDを取得する。
【0281】
これにより、例えば、当該要素(セットリスト)が{parentTokenId:T02,fromBlockNo:120,fromLogIndex:0,toBlockNo:150,toLogIndex:0}である場合、トークンID「T03」が取得される。また、例えば、当該要素(セットリスト)が{parentTokenId:T02,fromBlockNo:180,fromLogIndex:1,toBlockNo:240,toLogIndex:0}である場合、トークンID「T02」が取得される。
【0282】
Step111-2)以下の条件で、最上位の親トークン(つまり、上記のStep111-1で再帰的に親トークンIDを取得したときの最上位の親トークンID)のイベント情報を取得し、これらのイベント情報を、初期化(リスト内をクリア)したeventInfoListの要素として追加した上で、ブロック番号(blockNo)を第一ソートキー、ログ順序(logIndex)を第二ソートキーとしてeventInfoListの要素を昇順にソートする。
【0283】
条件:
・トークンID:Step111-1で取得したトークンID
・ブロック番号の範囲:当該要素(セットリスト)に含まれるfromBlockNoに設定されているブロック番号以上、かつ、toBlockに設定されているブロック番号以下
・イベント名:Approve、Transfer、Confirm、Notice、Packed、又はUnpacked
ただし、イベント情報が以下のA又はBである場合はeventInfoListに追加しない。
【0284】
A:イベント情報に含まれるブロック番号がfromBlockNoに設定されているブロック番号と同じ、かつ、イベント情報に含まれるログ順序がFromLogIndexに設定されているログ順序よりも小さい
B:イベント情報に含まれるブロック番号がtoBlockNoに設定されているブロック番号と同じ、かつ、イベント情報に含まれるログ順序がtoLogIndexに設定されているログ順序よりも大きい
上記のA、Bにより、同一ブロックであっても、ログ順序の大小によって適切なイベント情報をeventInfoListに追加することが可能となる。
【0285】
上記のStep111-2により、例えば、セットリストが{parentTokenId:T02,fromBlockNo:120,fromLogIndex:0,toBlockNo:150,toLogIndex:0}である場合、以下のeventInfoListが得られる。
【0286】
eventInfoList=[
{blockNo:130,event:Approve,logIndex:0,・・・},
{blockNo:140,event:Transfer,logIndex:0,・・・}]
また、例えば、セットリストが{parentTokenId:T02,fromBlockNo:180,fromLogIndex:1,toBlockNo:240,toLogIndex:0}である場合、以下のeventInfoListが得られる。
【0287】
eventInfoList=[
{blockNo:190,event:Approve,logIndex:0,・・・},
{blockNo:200,event:Transfer,logIndex:0,・・・},
{blockNo:210,event:Packed,logIndex:1,・・・}]
なお、以下、上記の2つのeventInfoListをそれぞれ「第1のeventInfoList」、「第2のeventInfoList」とも呼ぶことにする。
【0288】
Step111-3)上記のStep111-2で得られたeventInfoListの各要素(イベント情報)に関して、その要素に含まれるイベント名がApprove、Transfer、Notice又はConfirmである場合、以下の(1)を実行する。一方で、当該要素に含まれるイベント名がPackedである場合は以下の(2)、Unpackedである場合は以下の(3)を実行する。
【0289】
(1)当該要素(イベント情報)に含まれるブロック番号時点におけるトークンID「T01」のトークンストレージ情報をBCから取得し、当該イベント情報と当該トークンストレージ情報とをあわせてtokenHistoryListに追加し、ブロック番号(blockNo)を第一ソートキー、ログ順序(logIndex)を第二ソートキーとしてtokenHistoryListに含まれる各要素を昇順にソートする 。
【0290】
(2)当該要素(イベント情報)からセットリストを作成し、このセットリストをparentFilterListと呼ぶリストの要素として追加する。セットリストは以下の(2-1)~(2-3)により作成される。
【0291】
(2-1)当該要素(イベント情報)のブロック番号をfromBlockNo、ログ順序をfromLogIndexに設定する。
【0292】
(2-2)eventInfoList内で当該要素(イベント情報)よりも後に存在し、かつ、eventが「Unpacked」である直近の要素のブロック番号をtoBlockNo、ログ順序をtoLogIndexに設定する。ただし、当該要素(eventが「Packed」であるイベント情報)よりも後にeventが「Unpacked」である要素が存在しない場合、toBlockNo及びtoLogIndexには、Step111-1~Step111-3の繰り返しに用いられているeventFilterListの要素(セットリスト)のtoBlockNo及びtoLogIndexをそれぞれ設定する。
【0293】
(2-3)そして、fromBlockNo、fromLogIndex、toBlockNo、toLogIndexに対して、当該要素(eventが「Packed」であるイベント情報)のブロック番号時点における親トークンのトークンIDをparentTokenIdとして対応付ける。これにより、(parentTokenId,fromBlockNo,fromLogIndex,toBlockNo,toLogIndex)という形式のセットリストが作成される。
【0294】
例えば、第2のeventInfoListに含まれる要素{blockNo:210,event:Packed,logIndex:0,・・・}に対して、以下のparentFilterListが得られる。
【0295】
parentFilterList=[
{parentTokenId:T03,fromBlockNo:210,fromLogIndex:0,toBlockNo:240,toLogIndex:1}]
(3)当該要素をスキップする(何もしない)。
【0296】
上記のStep111-3が第1のeventInfoList及び第2のeventInfoListに対して実行された場合、例えば、以下のtokenHistoryListが得られる。
【0297】
tokenHistoryList=[
{blockNo:100,event:Mint,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:120,event:Packed,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:130,event:Approve,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:140,event:Transfer,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:150,event:Unpacked,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:160,event:Approve,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:170,event:Transfer,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:180,event:Packed,logIndex:1,・・・,tokenInfo:{・・・}},
{blockNo:190,event:Approve,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:200,event:Transfer,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:240,event:Burn,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:250,event:Mint,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:260,event:Burn,logIndex:0,・・・,tokenInfo:{・・・}}]
Step112)parentFilterList長(つまり、parentFilterListに含まれる要素(セットリスト)数)が0より大きい場合、eventFilterListをparentFilterListで上書き更新した上で上記のStep111に戻る。一方で、parentFilterList長が0である場合は次のステップS305に進む。
【0298】
上記のステップS304により、例えば、最終的に以下のtokenHistoryListが得られる。
【0299】
tokenHistoryList=[
{blockNo:100,event:Mint,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:120,event:Packed,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:130,event:Approve,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:140,event:Transfer,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:150,event:Unpacked,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:160,event:Approve,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:170,event:Transfer,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:180,event:Packed,logIndex:1,・・・,tokenInfo:{・・・}},
{blockNo:190,event:Approve,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:200,event:Transfer,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:220,event:Transfer,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:220,event:Notice,logIndex:1,・・・,tokenInfo:{・・・}},
{blockNo:230,event:Confirm,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:240,event:Burn,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:250,event:Mint,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:260,event:Burn,logIndex:0,・・・,tokenInfo:{・・・}}]
最後に、データベースサーバ30の占有移転履歴作成部301は、上記のステップS304で得られたtokenHistoryListの要素に関して、イベント名が「Mint」の要素から「Burn」の要素までを1つのセットとして区切る(ステップS305)。これは、Mintイベント発行からBurnイベント発行までが1つのライフサイクルであるため、このライフサイクル単位で区切ることで、トークンのライフサイクルを明示できるためである。本ステップで得られたtokenHistoryListが占有移転履歴(本具体例ではトークンID「T01」の占有移転履歴)であり、この占有移転履歴はトークンIDと対応付けられて占有移転履歴DB303に格納される。
【0300】
上記のステップS305により、例えば、以下のtokenHistoryListが得られる。
【0301】
tokenHistoryList=[
[{blockNo:100,event:Mint,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:120,event:Packed,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:130,event:Approve,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:140,event:Transfer,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:150,event:Unpacked,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:160,event:Approve,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:170,event:Transfer,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:180,event:Packed,logIndex:1,・・・,tokenInfo:{・・・}},
{blockNo:190,event:Approve,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:200,event:Transfer,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:220,event:Transfer,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:220,event:Notice,logIndex:1,・・・,tokenInfo:{・・・}},
{blockNo:230,event:Confirm,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:240,event:Burn,logIndex:0,・・・,tokenInfo:{・・・}}],
[{blockNo:250,event:Mint,logIndex:0,・・・,tokenInfo:{・・・}},
{blockNo:260,event:Burn,logIndex:0,・・・,tokenInfo:{・・・}}]]
上記の例では、ブロック番号「100」~「240」までとブロック番号「250」~「260」までとの2つに区切られている。
【0302】
なお、上記の例では、トークン間の親子関係、トークンIDの再利用、管理者による特殊占有移転を考慮した占有移転履歴を作成したが、例えば、トークンIDの再利用や管理者による特殊占有移転が行われない場合であっても、同様に占有移転履歴を作成することが可能であることはいうまでもない。
【0303】
<占有移転履歴可視化処理>
以下、占有移転履歴を端末20のディスプレイ等の表示装置上に可視化する場合の処理の流れについて、図18を参照しながら説明する。
【0304】
端末20の可視化部205は、可視化対象のトークンIDの指定を受け付ける(ステップS401)。なお、可視化対象のトークンIDは、例えば、当該端末20を利用する利用者(ユーザ又は管理者)によって指定される。
【0305】
端末20の可視化部205は、上記のステップS401で指定が受け付けられたトークンIDを含む占有移転履歴取得要求をデータベースサーバ30に送信する(ステップS402)。
【0306】
データベースサーバ30の占有移転履歴提供部302は、占有移転履歴取得要求を受信すると、この占有移転履歴取得要求に含まれるトークンIDと対応付けられている占有移転履歴を占有移転履歴DB303から取得する(ステップS403)。
【0307】
データベースサーバ30の占有移転履歴提供部302は、上記のステップS403で取得した占有移転履歴を当該端末20に返信する(ステップS404)。
【0308】
端末20の可視化部205は、データベースサーバ30から返信された占有移転履歴をディスプレイ等の表示装置上に可視化する(ステップS405)。これにより、可視化対象のトークンIDを持つトークンに関して、トークン間の親子関係、トークンIDの再利用、管理者による特殊占有移転等を考慮した占有移転履歴を可視化することができる。このため、この占有移転履歴からイベント情報やトークンストレージ情報を確認できるため、当該トークンに紐付けられた追跡対象がいつどこからどこへ占有が移転したのかを知ることが可能となる。また、当該トークンと親子関係にある他のトークンの情報を容易に確認することができるため、例えば、当該トークンが物品と紐付けられている場合は、その物品を輸送したコンテナやパレットの情報を確認することができる。又は、例えば、当該トークンがコンテナと紐付けられている場合は、そのコンテナを輸送した更に大きなコンテナ等の情報を確認することができる。
【0309】
[ハードウェア構成例]
上記の各実施形態で説明したノード10、端末20及びデータベースサーバ30は、例えば、図19に示すコンピュータ500のハードウェア構成により実現できる。図19に示すコンピュータ500は、入力装置501と、表示装置502と、外部I/F503と、通信I/F504と、RAM(Random Access Memory)505と、ROM(Read Only Memory)506と、補助記憶装置507と、プロセッサ508とを有する。また、これらの各ハードウェアは、それぞれがバス509を介して通信可能に接続されている。
【0310】
入力装置501は、例えば、キーボード、マウス、タッチパネル、物理ボタン等である。表示装置502は、例えば、ディスプレイ、表示パネル等である。なお、コンピュータ500は、例えば、入力装置501及び表示装置502のうちの少なくとも一方を有していなくてもよい。
【0311】
外部I/F503は、記録媒体503a等の外部装置とのインタフェースである。コンピュータ500は、外部I/F503を介して、記録媒体503aの読み取りや書き込み等を行うことができる。記録媒体503aとしては、例えば、フレキシブルディスク、CD(Compact Disc)、DVD(Digital Versatile Disk)、SDメモリカード(Secure Digital memory card)、USB(Universal Serial Bus)メモリカード等が挙げられる。
【0312】
通信I/F504は、コンピュータ500が通信ネットワーク等に接続するためのインタフェースである。RAM505は、プログラムやデータを一時保持する揮発性の半導体メモリ(記憶装置)である。ROM506は、電源を切ってもプログラムやデータを保持することができる不揮発性の半導体メモリ(記憶装置)である。補助記憶装置507は、例えば、HDD、SSD、フラッシュメモリ等のストレージ装置(記憶装置)である。プロセッサ508は、CPU、GPU等の演算装置である。
【0313】
上記の各実施形態で説明したノード10、端末20及びデータベースサーバ30は、例えば、図19に示すコンピュータ500のハードウェア構成を有することにより、上述した各種処理を実現することができる。なお、図19に示すコンピュータ500のハードウェア構成は一例であって、これに限られるものではない。例えば、コンピュータ500は、複数の補助記憶装置507や複数のプロセッサ508を有していてもよいし、図示したハードウェアの一部を有していなくてもよいし、図示したハードウェア以外の様々なハードウェアを有していてもよい。
【0314】
本発明は、具体的に開示された上記の実施形態に限定されるものではなく、特許請求の範囲の記載から逸脱することなく、種々の変形や変更、既知の技術との組み合わせ等が可能である。
【符号の説明】
【0315】
1 物流管理システム
10 ノード
20 端末
30 データベースサーバ
101 トランザクション実行部
102 記憶部
201 トランザクション発行部
202 記憶部
203 占有移転代行依頼部
204 補足履歴リスト取得部
205 可視化部
301 占有移転履歴作成部
302 占有移転履歴提供部
303 占有移転履歴DB
500 コンピュータ
501 入力装置
502 表示装置
503 外部I/F
503a 記録媒体
504 通信I/F
505 RAM
506 ROM
507 補助記憶装置
508 プロセッサ
509 バス
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15
図16
図17
図18
図19