署名および暗号化されたデータを IPFS に保存する方法

署名および暗号化されたデータを IPFS に保存する方法

認証され暗号化されたデータを IPFS に保存することは、多くの Web3 アプリケーションの中心的な構成要素ですが、これまでのところ、このタイプのデータをエンコードするための標準化された方法はありませんでした。

標準がなかったため、多くの開発者は署名および暗号化されたデータ用にカスタム形式を作成せざるを得ませんでした。データを IPFS の特定の実装に保存することにより、IPFS に保存された情報のオープン性と相互運用性が妨げられていました。データを検証する別の方法は、データを IPFS に格納し、データの CID を Ethereum などのブロックチェーン上のスマート コントラクトに格納することです。本質的には、データに署名を追加し、ブロックチェーン上に署名の記録を保持するコストのかかる方法です。

EIP-2844 の導入により、ウォレットが DID と dag-joseIPLD コーデックに基づいてデータの署名と復号化を行う新しい方法をサポートできる標準が実現し、認証および暗号化されたデータを IPFS に直接置くことができるようになりました。

DID と JOSE とは何ですか?

DID は、分散識別子の W3C 標準です。

詳細については、前回の記事「Astral が新しい世界を構築」を参照してください。簡潔にするために、DID では、文字列識別子 (例: did:3:bafy...) から署名検証と鍵交換のための公開鍵を含む DID ドキュメントに変換するための一般的な方法を指定します。ほとんどの DID アプローチでは、セキュリティ上の理由からキーがローテーションされるときにドキュメントを更新できます。

JOSE は IETF (Internet Engineering Task Force) の標準であり、JSON Object Signature and Encryption の略称です。その意味はほぼこれで説明できますこの標準には、JWS (JSON Web 署名) と JWE (JSON Web 暗号化) という 2 つの主要なプリミティブがあります。どちらの形式でも複数の参加者が許可されます。JWS ではペイロードに 1 つ以上の署名が存在する可能性があり、JWE では暗号化されたプレーンテキストの受信者が 1 人以上存在する可能性があります。

dag-jose と EIP2844 を使った構築

基本的な構成要素として dag-jose と EIP-2844 を使用して Ceramic を構築した際に、これらのテクノロジをより簡単に使用できるようにする低レベルのツールを作成しました。

js-3id-did-provider は、3ID を DID メソッドとして使用する EIP-2844 の実装です。単独で DID プロバイダーとして使用することも、3ID Connect ライブラリ内でより便利に使用することもできます。 3ID Connect を使用すると、ユーザーは Ethereum ウォレットを使用して DID プロバイダーにアクセスできます (他のブロックチェーンのサポートも近日中に開始されます)。

key-did-provider-ed25519 は、Key DID メソッドを使用した EIP-2844 の実装です。これは、署名と暗号化の両方をサポートする最もシンプルな DID プロバイダーです。

js-did は、開発者がユーザーを DID の形式で表現できるようにするライブラリです。これは、このチュートリアルで取り上げるメイン インターフェースです。これにより、現在認証されているユーザーでデータに署名したり、任意のユーザー (DID) に対してデータを暗号化したり、現在認証されているユーザーでデータを復号化したりできるようになります。

IPFSの署名データ

dag-jose IPLD コーデックを使用すると、リンクされ署名されたデータ構造を作成できます。これは、他のデータへのリンクを含む JSON Web 署名 (JWS) を作成することによって行われます。 dag-jose コーデックが解決する主な問題の 1 つは、JWS ペイロードが従来 base64url としてエンコードされていることです。つまり、IPLD リンクが含まれている場合、それらを通過することはできません。

代わりに、DagJWS では、ペイロードを CID のバイトに強制します。次に、コーデックはペイロードを CID インスタンスに変換し、それを DagJWS のリンク プロパティとして設定します。これにより、結果の DAG を簡単に走査できるようになります。

dag-jose サポートによる IPFS の設定

dag-jose は新しい IPLD コーデックであるため、js-ipfs にはまだデフォルトで含まれていません。また、js-ipfs がまだサポートしていない新しい IPLD コーデック API も実装しています。したがって、IPFS インスタンスを作成するときは、次の操作を行う必要があります。

'ipfs' から IPFS をインポートします。 'dag-jose' から dagJose をインポートします。 'multiformats/basics' から multiformats をインポートします。 'multiformats/legacy' から legacy をインポートします。 multiformats.multicodec.add(dagJose) const dagJoseFormat = legacy(multiformats, dagJose.name) const ipfs = await Ipfs.create({ ipld: { formats: [dagJoseFormat] } })

正しいマルチフォーマットバージョンがインストールされていることを確認してください。

$ npm i マルチフォーマット@3.0.3
DIDインスタンスの設定

以下の設定例では、key-did-provider-ed25519 を使用します。上記のネットワークを使用することを選択した場合、バックグラウンドで 3ID Connect と js-3id-did-provider が使用されます。

import { DID } from 'dids'import { Ed25519Provider } from 'key-did-provider-ed25519'import KeyResolver from '@ceramicnetwork/key-did-resolver'import { randomBytes } from '@stablelib/random'// DID のシークレットとして使用されるシードを生成const seed = randomBytes(32)// did インスタンスを作成const provider = new Ed25519Provider(seed)const did = new DID({ provider,resolver: KeyResolver.getResolver() })await did.authenticate()window.did = didconsole.log('DID に接続しました:', did.id)
署名付きデータ構造を作成する

これで、IPFS への署名とデータの追加を開始できます。まず、ペイロードを受け入れ、did.createDagJWS メソッドを使用して署名し、結果のデータを IPFS に追加する簡単な関数を作成しましょう。

以下のコードからわかるように、このメソッドからは、jwsDagJWS 自体と linkedBlock でエンコードされたペイロードの生のバイトの 2 つのオブジェクトが取得されます。バックグラウンドでは、ペイロードが dag-cbor を使用してエンコードされ、その後、エンコードされたペイロードの CID が作成された jws のペイロードとして使用されます。 jws.link を介して DagJWS インスタンス上のペイロード CID にアクセスできます。

async function addSignedObject(payload) { // ペイロードを dag-jose として署名します const { jws, linkedBlock } = await did.createDagJWS(payload) // JWS を ipfs dag に配置します const jwsCid = await ipfs.dag.put(jws, { format: 'dag-jose', hashAlg: 'sha2-256' }) // ペイロードを ipfs dag に配置します await ipfs.block.put(linkedBlock, { cid: jws.link }) return jwsCid}

この関数を使用して、最初の署名付きデータ オブジェクトを作成しましょう。

// 最初の署名済みオブジェクトを作成しますconst cid1 = await addSignedObject({ hello: 'world' })// DagJWS をログに記録します:console.log((await ipfs.dag.get(cid1)).value)// >{// > payload: "AXESIHhRlyKdyLsRUpRdpY4jSPfiee7e0GzCynNtDoeYWLUB",// > signatures: [{// > signature: "h7bHmTaBGza_QlFRI9LBfgB3Nw0m7hLzwMm4nLvcR3n9sHKRoCrY0soWnDbmuG7jfVgx4rYkjJohDuMNgbTpEQ",// > protected: ], // > link: CID(bafyreidykglsfhoixmivffc5uwhcgshx4j465xwqntbmu43nb2dzqwfvae)// > }// ペイロードをログに記録:ipfs.dag.get(cid1, { path: '/link' }).then(b => dag.get(cid2, { path: '/link/prev/link' }).then(b => console.log(b.value))// > { // > hello: 'getting the hang of this'// > prev: CID(bagcqcerappi42sb4uyrjkhhakqvkiaibkl4pfnwpyt53xkmsbkns4y33ljzq)// > }// 古いペイロードをログに記録:ipfs.dag.get(cid2, { path: '/link/prev/link' }).then(b => console.log(b.value))// > { // > hello: '慣れてきました'// > prev: CID(bagcqcerappi42sb4uyrjkhhakqvkiaibkl4pfnwpyt53xkmsbkns4y33ljzq)// > } > { hello: 'world' }

ペイロードは DID によって署名されるため、CID と JWS の値は異なることに注意してください。

署名検証のためのデータ構造

JWS の検証は非常に簡単です。 JWS オブジェクトを取得して、verifyJWS メソッドに渡すだけです。署名が無効な場合、この関数はエラーをスローします。署名が有効な場合は、JWS の署名に使用された DID (キー フラグメントを含む) を返します。

const jws1 = ipfs.dag.get(cid1) を待機しますconst jws2 = ipfs.dag.get(cid2) を待機しますconst signingDID1 = did.verifyJWS(jws1) を待機しますdid.verifyJWS(jws2)
IPFS で暗号化されたデータ

IPFS でデータに署名するのは難しい問題ですが、おそらくもっと興味深いのはデータの暗号化です。 dag-jose と EIP-2844 を使用すると、データを 1 つ以上の DID に暗号化し、IPFS に直接保存できます。以下では、js-did ライブラリが提供する便利なツールを使用してこれを行う方法を示します。

IPLDデータの暗号化

1 つ以上の DID に暗号化された DagJWE オブジェクトを作成する簡単な方法があります。createDagJWE。このメソッドは、IPLD オブジェクト (CID リンクの JSON オブジェクトも含まれる場合があります) と DID の配列を受け入れます。

DID を解決して、DID ドキュメント内にある公開暗号化キーを取得し、それらのキーで暗号化された JWE を作成します。まず、JWE を作成して IPFS に配置するヘルパー関数を作成しましょう。

非同期関数 addEncryptedObject(cleartext, dids) { const jwe = await did.createDagJWE(cleartext, dids) return ipfs.dag.put(jwe, { format: 'dag-jose', hashAlg: 'sha2-256' })}

この機能があれば、暗号化されたオブジェクトをいくつか作成できます。次の例では、最初に単純な暗号化オブジェクトを作成し、次に前のオブジェクトにリンクされた追加の暗号化オブジェクトを作成します。

const cid3 = await addEncryptedObject({ hello: 'secret' }, [did.id]) const cid4 = await addEncryptedObject({ hello: 'cool!', prev: cid3 }, [did.id])

上記の例では、[did.id](を使用していることに注意してください。 ) は、データを現在検証されている DID に暗号化します。もちろん、ローカルで認証されていないユーザー (別のユーザーなど) の DID にデータを暗号化することもできます。

IPLDデータの復号化

IPFS からデータを取得した後、暗号化された JWE のみが取得されます。つまり、データを取得した後でそれを復号化する必要があるということです。相互にリンクされたオブジェクトはすでに作成されているので、これらのオブジェクトを取得して再帰的に復号化する関数を作成しましょう。

非同期関数 followSecretPath(cid) { const jwe = (await ipfs.dag.get(cid)).value const cleartext = await did.decryptDagJWE(jwe) console.log(cleartext) if (cleartext.prev) { followSecretPath(cleartext.prev) }}

上記の関数は例であり、復号化されたオブジェクトのみをログに記録します。これを使用して、これらのオブジェクトの内容を表示できます。

// 単一のオブジェクトを取得しますfollowSecretPath(cid3)// > { hello: 'secret' }// 複数のリンクされたオブジェクトを取得しますfollowSecretPath(cid4)// > { hello: 'cool!', path: CID(bagcqceraqittnizulygv6qldqgezp3siy2o5vpg66n7wms3vhffvyc7pu7ba) }// > { hello: 'secret' }

<<:  イーサリアムネットワークの1日の取引量はビットコインより28%高い

>>:  2021 年の Polkadot エコシステムの価値は何ですか? |オンライン教室

推薦する

「カード凍結」の影響を受けた暗号通貨マイナーは電気代の支払いに大きな問題を抱えている

ある上級鉱山労働者はこう語った。「今、最も頭を悩ませ、困難なのは電気代の支払いだ。」今年初め以来、中...

ブロックチェーンは中央銀行の注目を集め、デンマークはeクローナの発行を検討

クレイジーな解説:ますます多くの国の中央銀行が紙幣印刷の重要性に疑問を持ち始めている。デンマークの現...

海外メディアが中国に注目:ビットコインの価格が上昇し中国で人気

11月25日。 11月19日、中国市場におけるビットコインの最高取引価格は8,000元近くに達した。...

Ingenesist (TIP) と Bitshares が共同で歴史的なブロックチェーン イベントを計画

BitShares コミュニティは、ビットコインを上回るという傲慢さゆえに、ビットコイン コミュニテ...

スウェーデンは土地登記にブロックチェーン技術をテスト中

クレイジーレビュー:スウェーデンは土地登録システムをブロックチェーン上に導入するテストを行う。ブロッ...

昨日、ジアナンに何が起こったのですか? (Bitmain のコピー? 必ずしもそうとは限りません)

昨日、ジアナンに何が起こったのですか?物語は実際には4つのセクションに分かれています。最初の段落: ...

恒生銀行:金融業界における「ブロックチェーン」技術の革新イベントを見逃さない

最近開催された中国上場企業協会2016年第1回実務会議およびブロックチェーン技術セミナーにおいて、恒...

世界は再び不況に陥っているのか?米国債はビットコインの10万倍の価値がある

米国の国家債務はすべての現金の価値より数倍大きく、ビットコインより10万倍も価値があります。米国連邦...

風水調査ノート:鉱業は小規模鉱山労働者のための金融商品にすぎない

「私のような小規模な鉱山労働者は、送金して電気代を支払い、利益の分け前を待つだけです。将来的には大口...

ETH 5,000 ドルへの道: 短期的な触媒と中期的な見通し

今月、暗号通貨市場は大きな売りを経験した。多くの投資家はパニックに陥り、「HODL」と言うよりも早く...

AI vs. BTC: どちらが電力網をより早く消耗させるのか?

人工知能(AI)とBTCマイニングの間のエネルギー競争が激化している。ハイテク企業が人工知能を向上さ...

イングランド銀行関係者:デジタル通貨は銀行融資に影響を及ぼす可能性がある

イングランド銀行の金融政策担当副総裁ベン・ブロードベント氏は本日の演説で、ビットコインは広く普及しな...

グラフィックカードを使用したBTMマイニングに関するさまざまな質問に答える記事

BTM グラフィック カードのマイニング チュートリアルが公開された後、当社のカスタマー サービス担...

OKCoin、ビットコイン取引をよりスマートにするため、ストッププロフィットとストップロス注文を開始

世界最大のビットコイン取引プラットフォームであるOKCoinは、ストッププロフィット注文とストップロ...

楊左星氏との対談:鉱山機械メーカーは分散化の時代へ

著者: 唐漢編集者:秦進制作者: Carbon Chain Value (ID: cc-value)...