署名および暗号化されたデータを 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 エコシステムの価値は何ですか? |オンライン教室

推薦する

世界最強のアンカーポイント:ビットコインシステムの再発見

1. 翻訳者序文:タイトル画像は万向副会長:暁鋒より拝借。肖氏の講演資料にはブロックチェーンの要素が...

インターネットはプライバシーへの脅威だけではない

Facebook のプライバシー侵害に対する反応はさまざまで、データ侵害の規模に衝撃を受けた人から、...

国勝:世界初のマイニングマシン株カナンテクノロジーの1万語分析

原題:「国盛通信宋家基 | カナンテクノロジーの詳細:世界初の採掘機械株、業界拡張はAIに注目」著者...

英国財務省はステーブルコイン規制の提案を発表する:金融サービスの歴史に新たな章を開く

英国財務省は、ステーブルコインを規制する提案を起草しているとともに、現金の代替として中央銀行デジタル...

ロシア中央銀行がCBDC報告書を発表:政府資金の使用状況を追跡するためにデジタルルーブルを試験運用する可能性

ロシア中央銀行は本日、デジタルルーブル導入の可能性に関する報告書を発表した。報道によると、銀行はこの...

イーサリアムがハードフォークするとき、私たちは何を本当に気にするべきでしょうか?

Ethereum PoS アップグレード日が近づくにつれ、コミュニティ内の複数のチームが、Ethe...

マスク氏のドージコインとビットコインに関する陰謀には市場操作が含まれるのだろうか?

先週、ビットコインの採掘から取引までの汚染レベルが高いため、テスラは自動車購入の支払い方法としてビッ...

イーサリアム(ETH)は再びハードフォークするのでしょうか?少なくとも、創設者のヴィタリックはそう考えています。

見慣れた光景?イーサリアム(ETH)の開発者は、ネットワークへの攻撃に対処するために硬分叉を使用する...

Bitcoin Core 0.12.1ソフトウェアアップデートが発表され、一部のマイニングプールはすぐに採用すると述べている

Bitcoin Core ソフトウェアがさらにアップグレードされ、この新しいアップデートである Bi...

米国防総省はブロックチェーンメッセージングシステムの構築を目指しており、米軍兵士はブロックチェーンを使用する予定である。

高度な研究開発に取り組んでいる米国の大手防衛機関は現在、安全なブロックチェーンベースのメッセージング...

ビットコイン採掘会社Greenidgeは9月15日にナスダックに上場する予定

BlockBeatsによると、ビットコイン採掘会社Greenidge Generation Hold...

金は急落し、ビットコインは崩壊したが、機関投資家の強気感情は依然として高い

昨日の早朝、ずっと高騰していた金価格が突然「一転」して暴落し、7年ぶりの大幅な下落を記録しました!金...

暗号アナリスト:マイナーによるビットコイン売り圧力は17か月ぶりの高水準

BlockBeatsによると、1月11日、暗号資産アナリストのジョセフ・ヤング氏は、CryptoQu...

アルトコインを使用してビットコイン取引を決済するとお金を節約できますか?考えないで

ビットコインネットワークは取引の混雑と高額な手数料に直面しているため、多くの人々がこれらの問題を回避...

イーサリアムの導入はデリバティブ市場にどのような機会をもたらし、需要と供給のダイナミクスにどのような変化をもたらすでしょうか?

合併に注目が集まる中、いくつかの問題が浮上している。 – ハードフォークされたトークンをどのように評...