はじめに
本連載では、ブロックチェーンを活用したDID(Decentralized Identity及びDecentralized ID)技術の概要と仕組み、現状について概観します。あまり表立って議論のテーマになることはないDIDですが、ブロックチェーンの金融エコシステムやWeb3の発展には欠かせない技術です。今回は2回目の記事として「ERC725/735の仕組み 1」をテーマにClaimの概念、ERC725/735の概要や仕組みを説明していきます。
概要
ERC725は、ERC20やWeb3.jsを開発したFabian Vogelsteller氏により提案されたEthereumブロックチェーンの新しいスマートコントラクト標準規格です。ERC725を活用することで、個人・集団・ソフトウェア・デバイスなどが自己主権型の分散アイデンティティを持つことができます。ERC735は、ERC725で作られるIDに紐ずけられたClaimを追加・削除できるスマートコントラクト標準規格です。またERC734は、ERC725のバージョン2で登場した規格で、アクション(トランザクション、ドキュメント、ログイン、アクセスなど)に署名するためのキーを保持し、ERC 725プロキシアカウントを介して指示を実行できます。
既存のサービスでは、ユーザーが中央集権的な機関に自らの個人情報の保存・アイデンティティの証明を依存しなくてはならなかったため、情報漏洩や不正なデータ売却、データ偽造などのリスクを排除できません。
一方でERC725が可能にする自己主権型のアイデンティティは、ユーザーは自分自身のデータを自分で保有できるため、そのようなリスクがありません。オープンでポータブルなデジタル分散IDは、例えば分散的な評価システムやガバナンス、コンプライアンスなどの用途に用いることができます。さらに、ユーザーは自身のIDを異なるDApps・プラットホームの間でもシームレスに利用することが可能になります。
ちなみに、ERC725規格を実用段階へ広めようと始まった、ERC725 Allianceというコミュニティも存在します。ERC-725Allianceには現在日本の企業も含め多くのブロックチェーン・スタートアップが参画しています。そのうちの一つに、Origin Protocolというプロジェクトが存在します。
以下はERC-725 Allianceに参加している企業の一覧。STの発行プラットフォームを構築するPolymathのような金融系企業も参画しています。
Claimとは
ERC735では、Claimを管理します。ここではClaimという概念について具体例とともに解説します。
ある日、Aさんはドライブをしていました。すると警察から呼び止められ、運転免許証の提示を求められます。警察官は、Aさんが運転を許可されているかどうかを確かめようとしています。Aさんは警察官に運転免許証を渡します。その時のポイントは、以下です。
- Claim(申し立て): 私は、訓練を受け、認定されたドライバーです。
- Claim issuer : 東京都公安委員会
- Verifiable Claim(検証可能なClaim): 運転免許証
- Verifier(検証者): 警察官
警察官は、Aさんの運転免許証を確認して、Aさんの写真をみてその免許証に偽りがないかどうかを確認します。
このプロセスを主にERC735が担っています。
参考
A Companion Guide to “First impressions with ERC 725 and ERC 735 – identity and claims” (Part 1)
https://medium.com/@kctheservant/a-companion-guide-to-first-impressions-with-erc-725-and-erc-735-identity-and-claims-part-1-51b53603cfc0
仕組み
ERC725には、バージョン1とバージョン2が存在します。ここでは、バージョン1について詳しく解説していきます。
関連資料
ERC : Proxy Account #725 https://github.com/ethereum/EIPs/issues/725
eip-725.md https://github.com/ethereum/EIPs/blob/master/EIPS/eip-725.md
ERC : Claim Holder #735 https://github.com/ethereum/EIPs/issues/735
ERC725Allianceによる実装 : https://github.com/ERC725Alliance/erc725/tree/master/contracts/contracts
Naive implementation of ERC725 (& ERC735)
https://github.com/JosefJ/IdentityContract
ER725とは
pragma solidity ^0.4.19;
contract ERC725 {
enum PURPOSES {
MANAGEMENT_KEY,
ACTION_KEY,
CLAIM_SIGNER_KEY,
ENCRYPTION_KEY
}
struct Key {
uint256[] purposes; //e.g., MANAGEMENT_KEY = 1, ACTION_KEY = 2, etc.
uint256 keyType; // e.g. 1 = ECDSA, 2 = RSA, etc.
bytes32 key;
}
struct Execution {
address to;
uint256 value;
bytes data;
bool approved;
bool executed;
}
// Events
event KeyAdded(bytes32 indexed key, uint256[] purposes, uint256 indexed keyType);
event KeyRemoved(bytes32 indexed key, uint256[] purposes, uint256 indexed keyType);
event ExecutionRequested(uint256 indexed executionId, address indexed to, uint256 indexed value, bytes data);
event Executed(uint256 indexed executionId, address indexed to, uint256 indexed value, bytes data);
event Approved(uint256 indexed executionId, bool approved);
// Setters
function addKey(bytes32 _key, uint256[] _purposes, uint256 _type) external returns (bool success);
function approve(uint256 _id, bool _approve) public returns (bool success);
function execute(address _to, uint256 _value, bytes _data) public returns (uint256 executionId);
function removeKey(bytes32 _key) external returns (bool success);
// Getters
function getKey(bytes32 _key) public view returns (uint256[] purposes, uint256 keyType, bytes32 key);
function getKeyPurposes(bytes32 _key) public view returns (uint256[] purposes);
function getKeysByPurpose(uint256 _purpose) public view returns (bytes32[] keys);
}
ERC725では、ユーザーの鍵(公開鍵アカウント)を管理できます。鍵には以下の種類があり、用途別に鍵を登録できます。
- MANAGEMENT_KEY
- ACTION_KEY
- CLAIM_SIGNER_KEY
- ENCRYPTION_KEY
コントラクト内で鍵が保有する情報です。
- 鍵の用途(MANAGEMENT_KEYやACTION_KEYなど)
- 鍵の技術的種類(ECDSAやRSAなど)
- 鍵自体の情報のバイト列
以下は鍵に関する関数です。
- addKey(…) : 鍵の追加
- removeKey(…): 鍵の削除
- getKey(…) : 鍵のデータを渡すことで、鍵の用途や鍵の技術的な種類を取得できる。
- getKeyPurposes(…): 鍵用途だけ取得できる。
- getKeysByPurpose(…): 特定の用途の鍵の情報を取得できる。
その他の関数です。
関数execute(…)を実行することで、ERC725コントラクトが一旦デプロイされると、プロキシコントラクトとして、機能することが可能です。ERC725コントラクトを通じて、他のコントラクトの機能を実行することが可能です。
- execute(…)
- approve(…)
ERC735とは
この規格は、Claim Holder ContractとしてIDにひもづくClaimを追加・削除・保持する機能を持っています。DAppsのスマートコントラクトは、このClaim Holder Contractを利用することで、ユーザーのクレームを取得して、ユーザーを認証することが可能です。claim issuerは、主にKYCなどのサービスプロバイダで、申請者に署名を行いClaimをオフチェーンで発行します。
pragma solidity ^0.4.18;
contract ERC735 {
event ClaimRequested(uint256 indexed claimRequestId, uint256 indexed topic, uint256 scheme, address indexed issuer, bytes signature, bytes data, string uri);
event ClaimAdded(bytes32 indexed claimId, uint256 indexed topic, uint256 scheme, address indexed issuer, bytes signature, bytes data, string uri);
event ClaimRemoved(bytes32 indexed claimId, uint256 indexed topic, uint256 scheme, address indexed issuer, bytes signature, bytes data, string uri);
event ClaimChanged(bytes32 indexed claimId, uint256 indexed topic, uint256 scheme, address indexed issuer, bytes signature, bytes data, string uri);
struct Claim {
uint256 topic;
uint256 scheme;
address issuer; // msg.sender
bytes signature; // this.address + topic + data
bytes data;
string uri;
}
function getClaim(bytes32 _claimId) public constant returns(uint256 topic, uint256 scheme, address issuer, bytes signature, bytes data, string uri);
function getClaimIdsByTopic(uint256 _ topic) public constant returns(bytes32[] claimIds);
function addClaim(uint256 _topic, uint256 _scheme, address _issuer, bytes _signature, bytes _data, string _uri) public returns (uint256 claimRequestId);
changeClaim(bytes32 _claimId, uint256 _topic, uint256 _scheme, address _issuer, bytes _signature, bytes _data, string _uri) returns (bool success);
function removeClaim(bytes32 _claimId) public returns (bool success);
}
claimに含められるデータには以下のものがあります。
- topic : 「生体認証」や「居住地」などこのclaimが表す大まかな内容についてです。
- scheme : このclaimの処理や検証に使用するスキームです。例えばECDSA、RSA、コントラクト検証などがあります。
- issuer : 発行者IDコントラクトアドレスまたはschemeに署名するアドレスです。
- signature : この署名は、claim発行者がこのtopicのclaimを発行した証拠です。
- data : 別の場所にあるクレームデータのハッシュなどです。
- uri : クレームが保存されている場所のリンクです。
関数には以下のものがあります。
- getClaim(…) : 保有されているclaimを参照できます。主にサービスプロバイダーが、この機能を利用してユーザーのclaim(例えば運転が許可されているかどうか)を参照する用途が想定されます。
- getClaimIdsByTopic(…): topicを指定してclaimを参照できます。つまり認証の種類によって呼び出すということです。
- addClaim(…) : オフチェーン上作成されてclaimを追加できます。引数に作成されたClaim情報として、「_claimType」・「_scheme」「issuer」・「_signature」・「_data」・「_uri」を渡します。「_signature」は、作成者がオフチェーン上で署名したデータです。
- removeClaim(..): claimを削除できます。
免責事項
本記事に掲載されている記事の内容につきましては、正しい情報を提供することに務めてはおりますが、提供している記事の内容及び参考資料からいかなる損失や損害などの被害が発生したとしても、弊社では責任を負いかねます。実施される際には、法律事務所にご相談ください。
技術・サービス・実装方法等のレビュー、その他解説・分析・意見につきましてはblock-chani.jp運営者の個人的見解です。正確性・正当性を保証するものではありません。本記事掲載の記事内容のご利用は読者様個人の判断により自己責任でお願いいたします。
ブロックチェーン学習に最適の書籍の紹介
図解即戦力 ブロックチェーンのしくみと開発がこれ1冊でしっかりわかる教科書
本書は、ブロックチェーン技術に興味を持ったエンジニアや、その仕組みを学び、自分の仕事に活かしたいビジネスパーソンを対象にして、ブロックチェーンのコア技術とネットワーク維持の仕組みを平易な言葉で解説しています。この本を読んだうえで、実際にコードを書くような専門書、ブロックチェーンビジネスの解説書を読むことで、理解度が飛躍的に高まるでしょう。(はじめにより)
会社紹介
弊社(コンセンサス・ベイス株式会社)は、2015年設立の国内で最も古いブロックチェーン専門企業です。これまでに、大手企業の顧客を中心に、日本トップクラスのブロックチェーンの開発・コンサルティング実績があります。ブロックチェーンに関わるビジネスコンサル・システム開発・教育・講演などご希望でしたら、お気軽にお問い合わせください。
会社ホームページ
https://www.consensus-base.com/