まえがき
私は大学でアシスタントとして(趣味として)働いており、私は「分散システム」分野の学生のためにいくつかの研究室を書くことにしました。 前半ではブロックチェーンの可能性、構造、デジタル署名について、 後半では次のことについて説明します。署名の検証、マイニング、おおよそのネットワーク構成。 私は分散システムの専門家ではないことに注意してください(ネットワーク組織が間違っている可能性があります)。
構造と機能
ブロックチェーンは、ピアツーピアネットワーク、暗号化、データベースの3つの既知の技術を使用する分散データストレージの一種です。 データベースはブロックのチェーンで、特別に暗号化され、同じ形式ですべてのネットワークノードに保存されます(複製は正確なコピーです)。 完全な秘密は、暗号化によるブロック間の接続にあります。その結果、ブロック内の情報を偽造することはほとんど不可能です。
ブロックチェーンを使用すると、信頼できないネットワークを介して複数のユーザー間でデータを安全に配布および/または処理できます。 データは何でも構いませんが、データの最も興味深いオプションは、信頼できる第三者を必要とする情報を送信する機能です。 そのような情報の例は、お金(銀行の参加が必要)、財産権(公証人の参加が必要)、ローン契約などです。 本質的に、ブロックチェーンは第三者が参加する必要を排除します。
ブロックチェーンが使用される最も興味深いプロジェクト:
- Monegraphを使用すると、著者は自分の作品に対する権利を確保し、作品の使用に関するルール(および支払い)を確立できます。
- La Zoozは分散型Uberです。 あなたの車を提供し、Uberに手数料なしで運送業者を見つけます。
- Augurはオンラインブックメーカーです。 ベットして、勝ちます;
- Storj.ioはP2Pデータウェアハウスです。 未使用のディスク容量を提供するか、最も安価なオンラインストレージを見つけます。
- Museは、特に音楽業界向けの分散型のオープンで透過的なデータベースです。
- Rippleは、銀行への低コストの国境を越えた支払いを可能にします。
- ゴーレムは、オープンソースのグローバルな分散型スーパーコンピューターであり、誰もがアクセスして分散コンピューティングを実行できます(画像処理から研究、ウェブサイトの立ち上げまで)。 Golemを使用すると、ユーザーは自分自身でコンピューティングパワーを売買できます。
- 他の多くの暗号通貨は、仕事の高い匿名性、転送の低コスト、スマート契約などによって特徴付けられます。
データベース
最も単純な形式では、データベース(DB)はブロックのチェーンであり、JSONファイルとして表すことができます。
ブロック構造
各ブロックは、アドレス、作成日時、ハッシュ、およびトランザクションのリストで構成されます。 図1のように。
- アドレス-ユーザーが発明した秘密鍵に基づいて、非対称暗号化アルゴリズム(RSAなど)によって生成された公開鍵。
- 日付と時刻-ブロックが作成された瞬間(トランザクションには作成の日付と時刻もあります);
- ハッシュ(バインダー)-前のブロックのアドレスと現在のブロック内のすべてのトランザクションのハッシュの合計からSHA512を使用して計算されたのはなぜですか? なぜなら、それを計算するとき、前のブロックのアドレスが必要だからです。
- 情報-メッセージ、金額(暗号通貨)、ドキュメント、病歴、プログラムコード(スマートコントラクト)など
図1-3ブロックのブロックチェーン
ブロックが何であるかを簡単に理解するには、ロック付きのチェストの形でそれを想像してください。そこに何かを置きたい場合は、キーでロックを解除する必要があります。このキーはブロックを作成するときにあなたによって作成され、秘密鍵と呼ばれます
電子デジタル署名
トランザクション内の情報を偽造できないように、ブロック内の各トランザクションは電子デジタル署名(EDS)で署名されます。
電子デジタル署名は、暗号化アルゴリズムを使用して署名された情報を変換することによって形成される一連のバイトであり、電子文書の作成者を検証することを目的としています。
EDSは、非対称暗号化とハッシュ関数の使用に基づいています。
暗号化方法について簡単に説明します。
- 対称暗号化では、暗号化と復号化の両方に同じキーが使用されます。
- 非対称暗号化は2つの異なるキーを使用します。1つは暗号化(パブリックとも呼ばれます)、もう1つは復号化(プライベートと呼ばれます)に使用されます。
非対称暗号化アルゴリズムでは、公開鍵を使用して暗号化が実行され、秘密鍵を使用して復号化が実行されます。
しかし、非対称デジタル署名スキームでは、署名は秘密鍵を使用して実行され、署名検証は公開鍵を使用して実行されます。つまり、秘密鍵で暗号化し、公開鍵で検証します(この「検証」を「解読」せず、混同しないでください)。
そのようなアルゴリズムの1つにRSAがあります。 非対称暗号化の選択は、他のネットワーク参加者が変更を行って自分の署名でブロックに署名したのがブロック所有者であることを確認する必要があるという事実によって正当化されます(検証については2番目の部分で説明します)。
秘密鍵と公開鍵
プライベート(プライベート)キーは、ユーザー自身が生成し、トランザクションに署名するために使用されます。 秘密鍵の所有者は誰でも、ブロックチェーンセルにアクセスできます。これは、ウォレット、任意のデータ(個人的な通信、重要なドキュメントなど)を含むコンテナで表すことができます。
公開(公開)キーは秘密キーに基づいて生成する必要があります。つまり、それらの間には数学的な関係があります(公開キーは頭から発明されたものではありません)。 さらに、ブロックチェーンで公開することができ、ブロックのアドレスとして使用されるほか、サードパーティのネットワーク参加者による他のブロックの情報の認証検証として使用されます。 公開鍵を知っていると、秘密鍵を判別できなくなります。
情報に署名するためのアルゴリズム(ドキュメント)
署名を作成するには、次のものが必要です。
- 非対称暗号化アルゴリズム(RSAなど)。
- ハッシュ関数(SHA512など);
- 署名する情報。
非対称アルゴリズムは対称アルゴリズムと比較してかなり遅いため、署名されるデータの量は大きな役割を果たし、それが大きい場合、通常はデータ自体ではなく署名されるデータからハッシュを取得します。 ハッシュは、SHA512などのハッシュ関数を使用して取得されます。SHA512は、入力として情報を受け取り、特定の長さのハッシュを返します。 ハッシュ関数は肉挽き器のようなもので、肉をスクロールしてひき肉を取得できますが、ひき肉から肉を戻すことはできません。 したがって、デジタル署名はドキュメント自体ではなく、そのハッシュに配置されます。 ハッシュ関数はEDSアルゴリズムの一部ではないため、信頼できる任意のハッシュ関数をスキームで使用できます。
ステージ:
- RSAを使用して、公開キーと秘密キーのペアを生成します。
- 署名されたデータをSHA512関数に置き換えてハッシュを取得します。
- 結果のハッシュとプライベートキーは、RSA非対称暗号化関数、つまりRSAEncode(情報からのハッシュ、プライベートキー)に置き換えられます。出力はEDSです。
データ署名アルゴリズムを図2に示します。
図2-データ署名アルゴリズム
ブロックハッシュ
バインディングハッシュは、新しいトランザクションが追加されるたびに再計算されます。 現在のブロックのすべてのトランザクションハッシュと前のブロックのアドレスを合計することで考慮されます。
() = SHA512(block_prev_adress_hash + transaction_hash1 + transaction_hash2 + … + transaction_hashN)
たとえば、図1から、3番目のブロックのハッシュは2番目のブロックのアドレスと2つの内部トランザクションの2つのハッシュとして計算されたことがわかります。
3 = SHA512(JD9100...NNBAXVB + B35BCA...H78C + A144...875D)
ブロックを単一のチェーンに結合するのは接続ハッシュであり、最も重要なことは、ブロックチェーンを攻撃者による詐欺から保護することです。 誰かが自分のブロックをチェーンの中央に「捨てる」または挿入したい場合、次のブロックはテストに合格しません。 ハッシュは、置換または削除するアドレスに基づいていました。 ネットワーク参加者がネットワーク保全をチェックするか、またはモニターする方法は次の部分で議論されるでしょう。
C#署名の例
キーペアを生成するには、さまざまなライブラリを使用できます。たとえば、C#言語には、暗号化およびデジタル署名アルゴリズムを操作するための組み込みパッケージがあります。
// 1024 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024); // , XML string privateKey = rsa.ToXmlString(true); // , XML string publicKey = rsa.ToXmlString(false);
結果の秘密鍵は別のファイルに保存する必要があります。公開鍵はブロックのアドレスなので、保存する必要はありません。
したがって、各ユーザーのログインはブロック(公開キー)のアドレスであり、パスワードはこれら2つのキーを知っている秘密キーです。このアドレスの下にあるブロックチェーンセルにアクセスし、その中の情報を管理できます。
RSA暗号化アルゴリズムによる任意のデータの署名。データと秘密鍵を転送し、署名を取得します。
private static string SignData(string data, string privateKey) { // RSA RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024); // , ( ) rsa.FromXmlString(privateKey); // byte[] byteData = Encoding.UTF8.GetBytes(data); // SHA512 ( , , ) byte[] signedByteData = rsa.SignData(byteData, CryptoConfig.MapNameToOID("SHA512")); // Base64 string signedData = Convert.ToBase64String(signedByteData); // return signedData; }
タスク
ブロックのチェーンをJSON形式の別のファイルに保存するPSを実装する必要があります。新しいブロックまたはトランザクションが追加されるたびに、ファイルを更新する必要があります。
お客様の特徴:
- 新しいユーザーの登録(1ブロック= 1ユーザー)-つまり、新しいブロックを作成し、ユーザーに秘密キーを返し、公開キーをブロックのアドレスとして使用します。
- 許可-ブロックチェーンセルへのアクセス、ログインはブロックのアドレス、パスワードは秘密鍵です。
- 承認後-任意の情報を含むトランザクションをブロックに挿入します(いずれかではなく、アクセス権のあるトランザクションに挿入します)。
- ブロックとトランザクションのリストをわかりやすい方法で表示します。
ブロックとトランザクションの構造は、マニュアルの説明に対応している必要があります。 また、ユーザーの秘密鍵を別のファイルに保存する必要があります(このブロックチェーンでは、各ユーザーが自分の秘密鍵を持っています。プログラムの操作性をチェックするためにこのような機能が必要です)。
継続 -署名検証、マイニング、およびサンプルネットワーク組織