Identity on Ethereum

アプリやWebのサービスを受ける際にOAuth2.0プロトコルにより、著名な認証サーバーに自身のIDを認証してもらう仕組みが一般的です。非中央集権化したい理想のもとではこれは好ましくないとして、ブロックチェーンならではのアイデンティティ管理方法を統合したイーサリアム上のフレームワークとして、EIPとしてERC-1484 があります。ID自体の認証は信頼できる機関が行うように依頼(Claim)としても、アイデンティティ(ID)を自分の手元に置いておきたい、という要望を満たすフレームワークとなっています。

IoTの業務を行っていると、中央集権というと大げさですが、中央管理がそぐわないケースというのによく出会うので、非中央集権環境下でのIDマネージメントについて潜在的な要望は高いと感じています。今現在としては、おそらく職歴の証明などに使用され始めているのではないでしょうか?詐称、改善できない身元証明として実用化されているようです。

ERC-1484 では、IDはIDレジストリ(実装例)としいるスマートコントラクトに登録されます、このIDレジストリのデータはスマートコントラクトの中で以下のような形で定義されています。識別番号からIDに関する、復元アドレス関連するアドレス、Provider、Resolver情報を登録管理するスマートコントラクトとして実装されています。

    struct Identity {
        address recoveryAddress;
        AddressSet.Set associatedAddresses;
        AddressSet.Set providers;
        AddressSet.Set resolvers;
    }

    mapping (uint => Identity) private identityDirectory;

ここでSolidityの構造体のメンバーの定義はERC-1484 によると、以下のようになっています。

フィールド名 説明
復元アドレス (recoveryAddress) 失われたIDを復旧するために使用できるイーサリアムアドレス
関連アドレス (associatedAddresses) IDにパブリックに関連付けられ証明されたイーサリアムのアドレス。アドレスに対するIDは1つだけで、この関連付けは削除することも可能
プロバイダー (Provider) IDを持つものの振る舞い代行することを許可されたイーサリアムのアドレス。これがスマートコントラクトであれば、IDを持つものの振る舞いをEVM上で実行することができるのでしょう
リゾルバー (Resolver) IDに関する公開鍵などの情報を含むスマートコントラクト

これらは、単純な認証構造またはより洗練された金融dApp、ソーシャルメディアdAppなどです。IDに追加された各リゾルバーは、IDをより有益にします。

IDを恒久的に無効にする手段についても定義されており、 関連付けられたすべてのアドレス、プロバイダー、およびオプションでリゾルバーを削除し、存在の証拠は保持しながら、それ以降の制御は無効になります。

実装例の https://github.com/NoahZinsmeister/ERC-1484については、以下のようにしてテストできるようにななっています。

上で説明したIDのレジスリ実装については、
テストケースが機能(というよりコード)を100%カバーしているようなので、実装例のみならず、使用例としても参照できるでしょう。

$ git clone https://github.com/NoahZinsmeister/ERC-1484
$ Install dependencies: npm install
$ Build contracts: npm run build
$In one terminal tab, spin up a development blockchain: npm run chain

別端末を起動

npm test

テストの実行結果は、

$ npm test

> identity-erc@1.0.0 test /home/hajime/git/ERC-1484
> truffle test --network development

Using network 'development'.

  Contract: Testing Identity
    Deploying Contracts
      ✓ IdentityRegistry contract deployed (83ms)
    Modifier FAIL Tests
      ✓ _hasIdentity FAIL
      ✓ _identityExists FAIL
    Testing Identity Registry
      ✓ Signatures verify correctly (545ms)
      ✓ Identity can be created (70ms)
      ✓ Identity can be created FAIL -- timestamp
      ✓ Identity can be created FAIL -- signature
      ✓ Identity created (134ms)
      ✓ Identity created FAIL -- has an address
      ✓ provider can add other addresses FAIL -- approving signature (166ms)
      ✓ provider can add other addresses FAIL -- adding signature (185ms)
      ✓ provider can add other addresses -- FAIL too many (2060ms)
      ✓ estimating destruction cost (153ms)
      ✓ provider can add other addresses -- FAIL too many cleaning up (1790ms)
      ✓ self could add other addresses (103ms)
      ✓ provider can add other addresses (483ms)
      ✓ provider can remove addresses -- FAIL signature (62ms)
      ✓ self could remove addresses
      ✓ provider can remove addresses (144ms)
      ✓ identity can add a provider itself
      ✓ provider can add a provider for -- FAIL
      ✓ provider can add a provider for (174ms)
      ✓ identity can remove a provider (182ms)
      ✓ self could add resolvers
      ✓ provider can add resolvers (193ms)
      ✓ provider could remove resolvers
      ✓ provider can remove resolvers (167ms)
    Testing Recovery Process
      ✓ Could recover
      ✓ Could trigger change in recovery address
      ✓ Can trigger change in recovery address (134ms)
      ✓ New recovery address cannot trigger recovery
      ✓ Cannot trigger another change in recovery address yet
      ✓ After 2 weeks, old recovery address cannot trigger recovery
      ✓ Can trigger another change in recovery address (157ms)
      ✓ Recently removed recovery address can trigger recovery -- FAIL signature
      ✓ Cannot trigger destruction
      ✓ Recently removed recovery address can trigger recovery (101ms)
      ✓ Recently removed recovery address can trigger recovery -- FAIL too soon (39ms)
    Testing Destruction
      ✓ Any of the recently removed address can trigger destruction (39ms)
      ✓ Any of the recently removed address can trigger destruction -- FAIL
      ✓ Triggering destruction on an identity works as expected (69ms)

  Contract: Testing AddressSet
    ✓ Testing contract deployed
    ✓ Set initialized correctly (89ms)
    ✓ Member added correctly (107ms)
    ✓ Member removed correctly (127ms)
    ✓ Member re-added correctly (104ms)
    ✓ Other members added correctly (336ms)
    ✓ Set reset correctly (120ms)
    ✓ Removing a non-existent member has no effect (120ms)

  Contract: Testing Sample Provider and Resolver
    Deploying Contracts
      ✓ IdentityRegistry contract deployed
      ✓ Provider contract deployed
      ✓ Resolver contract deployed
    Testing Provider
      ✓ Identity can be created (126ms)
      ✓ provider can add other addresses (128ms)
      ✓ provider can remove addresses (98ms)
      ✓ can add a provider (116ms)
      ✓ identity can remove a provider (100ms)
      ✓ provider can remove resolvers (87ms)
      ✓ provider can trigger recovery address change (83ms)
    Testing Resolver
      ✓ resolver cannot be used when not set (42ms)
      ✓ once added, email address can be set and read (65ms)
      ✓ cannot access email addresses for non-existent EINs

  Contract: Testing Burner Provider
    ✓ contracts deployed (71ms)
    ✓ Identity burned (90ms)

  Contract: Testing MetaTransactions Provider
    ✓ contracts deployed (66ms)
    ✓ Identity created (102ms)
    ✓ Can call via proxy for self
    ✓ Can call via proxy for self -- FAIL call
    ✓ Can call via proxy for self via external
    ✓ Can call via proxy delegated via external
    ✓ Can call via proxy delegated via external -- FAIL signature (44ms)
    ✓ Can call via external proxy -- FAIL
    ✓ Can call via proxy for self -- FAIL provider (59ms)

  Contract: Testing ERC1056 Resolver
    ✓ contracts deployed (95ms)
    Create Identity
      ✓ Identity created (98ms)
    initialize
      ✓ change owner -- FAIL
      ✓ add delegate -- FAIL
      ✓ remove delegate -- FAIL
      ✓ add attribute -- FAIL
      ✓ remove attribute -- FAIL
      ✓ 1056 owner changed (45ms)
    initialize FAIL
      ✓ already initialized
    change owner
      ✓ change owner
      ✓ change owner signed (40ms)
      ✓ change owner signed FAIL (40ms)
    delegates normal
      ✓ add delegate
      ✓ remove delegate
    delegates signed
      ✓ add delegate signed (43ms)
      ✓ add delegate signed FAIL (41ms)
      ✓ revoke delegate signed (66ms)
      ✓ revoke delegate signed FAIL (41ms)
    attributes normal
      ✓ add attribute
      ✓ remove attribute
    attributes signed
      ✓ set attribute signed (40ms)
      ✓ set attribute signed FAIL (43ms)
      ✓ revoke attribute signed (49ms)
      ✓ revoke attribute signed FAIL (42ms)

  Contract: Testing ERC725 Resolver
    ✓ contracts deployed (66ms)
    Create Snowflake
      ✓ Identity created (129ms)
    All 725 logic
      ✓ 725 mint
      ✓ 725 create FAIL
      ✓ 725 get
      ✓ 725 remove
      ✓ 725 claim (48ms)
      ✓ 725 claim FAIL
      ✓ 725 claim FAIL 2 (85ms)

  106 passing (12s)

ID周りは兼ねてから興味があったので、IDの復旧の仕方も含めたIDライフサイクル、プロバイダの例などについて、調査してみたいと思います。

コメント

タイトルとURLをコピーしました