tree(マークル木)の説明をします。tree(マークル木)の仕様と実装方法を理解します。tree)は、コンピュータで保存・処理・転送される任意データの検証処理に使われるデータ構造です。Peerネットワークで他のピアから受信したデータブロックが破損したり改竄されたりしていないか、あるいは他のピアが偽のデータブロックを送信していないかといった検証処理に用いられています。DynamoCassandra最近は、BitcoinやEthereumといった仮想通貨で頻繁に用いられています。treeを使って、ブロック中の全てのトランザクションの概要を含んでいます。treeは、ビットコイン内で、ブロック内の全てのトランザクションをまとめるために使われています。treeは提供します。treeのrootを用いる理由は、あるトランザクションがブロックに含まれているかを確認するためです。treeは一つのハッシュになるまで、ノードペアの再帰的なハッシュによって生成されます。計算量で探索可能です。実際にコードを実装していきます。最初に、ハッシュの生成や左のリーフ(葉)と右のリーフ(葉)のハッシュを結合するMerkleHashクラスを実装します。BitcoinやEthereumで利用するなら、BitcoinHash、EthereumHashと命名し、暗号化の方法を各仮想通貨の仕様に変更します。文字列をバイト配列に変換します。str.getBytes()getBytes()メソッドは、プラットフォームのデフォルトの文字セットを使用して、文字列をバイト配列に変換します。Windows環境で利用しないのであれば、文字コードはUTF-8になるはずなので、引数を指定する必要はありません。Windowsだと、デフォルトの文字セットがUnicodeの可能性があるので、文字コードにUTF-8に指定します。ハッシュ関数SHA-256バイト配列に変換したバイト配列を、ハッシュ関数SHA-256でハッシュ化します。MessageDigest.getInstance("SHA-256").digest(str.getBytes());ハッシュ関数とは、任意のメッセージを入力すると、固定長の値を出力する関数です。同じハッシュ関数に同じメッセージを入力すると、必ず同じ値を返します。上記のプログラムは、ハッシュ関数に任意のメッセージ文字列をバイト配列(str.getBytes())で入力し、固定長のバイト配列を出力します。SHA-256は、256ビット(32バイト)長のハッシュ値を取得します。ハッシュ関数ハッシュ関数は、セキュリティ関連の実装で必ず理解する必要がある知識です。『暗号技術のすべて』(書影をクリックするとアマゾンのサイトにジャンプします)。暗号の知識が全くない人は、暗号技術入門から読むのをオススメします。いえ、OSやプログラミング言語では、色々なハッシュ関数があらかじめ用意されています。ゼロから実装できるようになる必要はありません。必要な知識は、ハッシュ関数の特性や、内部でどういった処理が行われているか、そしてどのような場面で用いられているかです。暗号に関する本は色々と発売されていますが、暗号技術入門と暗号技術のすべての2冊をオススメします。Codecのコードを読んでさらに理解を深めるとよいでしょう。バイト配列を16進数に変換javaのハッシュ関数SHA-256で返却される値はバイト配列です。人間が扱いやすい16進数の文字列に変換します。javaでは、DatatypeConverterクラスを利用すればバイト配列を16進数文字列に変換できます。AndroidではDatatypeConverterクラスが実装されていません。Android環境では自分でバイト配列を16進数文字列に変換する実装をおこなう必要があります。バイトを16進数に変換する方法は、重要な知識なので、以下で実装の説明をします。0xF)]);}for文でバイト配列をバイトで取り出します。16進数変換なので、上位部は右に4ビット論理シフトします。1/16の乗算、もしくは16の除算と同じです。右へ4ビット論理シフトしてみます。10進数の90を2進数にして考えます。01011010右に4ビット論理シフトします。右に1ビットシフトします。右に1ビットシフトシフトで値がなくなった左端は、ゼロで埋めます。4ビット論理シフトなので、右に4回論理シフトします。