Kubo で対応しているハッシュ・アルゴリズム一覧
IPFS コマンド(
ipfs
)の Go 版実装である Kubo(旧go-ipfs
)がサポートしている、CID
に使えるハッシュ・アルゴリズムが知りたい。
- ハッシュ?CID?という方は、以下を参照
TL; DR (今北産業)
-
--hash
オプションでアルゴリズムを指定できます。- 例)
ipfs add ../hoge.md --hash=sha3-224
- 注意)この場合、
CID
のバージョンはCID v1
が使われます。また、実験版のオプションであるため、利用可能なアルゴリズムは将来的に変わる可能性があります。
- 例)
-
サポートされている最新のアルゴリズム。
- multihash.go | go-multihash | multiformats @ GitHub
-
2023/04/26 現在、(実験的に)IPFS でサポートされているハッシュ・アルゴリズム(一部未実装)
設定値 備考 identity
ハッシュ化しない(極小さなデータの場合に使われ、入力と同じバイトを示す)1 sha1
20 年前に定番だったアルゴリズム(現在は非推奨) sha2-256
指定がない場合のデフォルトのアルゴリズム。
20 年前に生まれた、現在では定番のアルゴリズム SHA2 の 256 ビット版(返り値が 256 ビットのハッシュ・アルゴリズム)。現在は SHA3 の利用が推奨されている。sha2-512
上記の 512 ビット版 sha3
NIST 推奨のアルゴリズム(SHA3-512 のエイリアス)。後述の KECCAK をベースに NIST が制定した SHA の最新アルゴリズム。 sha3-224
SHA3 の 224 ビット版 sha3-256
SHA3 の 256 ビット版 sha3-384
SHA3 の 384 ビット版 sha3-512
SHA3 の 512 ビット版(上記 sha3
と同じもの)dbl-sha2-256
Double SHA256(SHA256D)と呼ばれる、SHA2-256 を 2 回ストレッチングしたもの。つまり、SHA2 の 256 ビット版のハッシュ関数に通したものを、さらに通したもの。ビットコインなどでも使われてる。2 murmur3-x64-64
MurmurHash3 の 128 ビット版で x64 プロセッサ向けバージョン 3。 強度・速度では BLAKE3 には敵わないものの、非暗号学的ハッシュ(セキュリティ目的ではないハッシュアルゴリズム)では比較的高速な部類に入る。 keccak-224
SHA-3 の原型となった KECCAK の 224 ビット版。依存パッケージの問題で廃止4。 keccak-256
KECCAK の 256 ビット版 keccak-384
KECCAK の 384 ビット版。依存パッケージの問題で廃止4。 keccak-512
KECCAK の 512 ビット版 blake3
NIST の SHA3 制定にあたり、KECCAK と最後まで争った BLAKE2 の後継。爆速。 shake-128
SHA3 の可変長(最大 128 ビット)版。パディングしないぶん、SHA3 より若干速い shake-256
SHA3 の可変長(最大 256 ビット)版 sha2-256-trunc254-padded
SHA2 の可変長(最大 256 ビット)版 x11
ブロックチェーンのマイニングなどで使われるストレッチングのアルゴリズム。ストレッチングを行う(複数回ハッシュ関数を通す)際に、ラウンドロビン方式で 11 個の異なるアルゴリズムに通すアルゴリズム。 BLAKE
、BMW
、Grostl
、JH
、Keccak
、Skin
、Loofah
、CubeHash
、SHavite-3
、SIMD
、ECHOP
が順番に使われる5。依存パッケージが多いため、実装はペンディング(保留)されている4。md5
SHA1 と並ぶ、20 年前では定番だった 128 ビットのハッシュ・アルゴリズム(現在は非推奨)。 poseidon-bls12_381-a2-fc1
Etherium や Polygon などの、ブロックチェーンのゼロ知識証明でも使われるハッシュ・アルゴリズム。楕円曲線暗号と同じ考え方で算出しているのが特徴。6 (出典: multihash.go のソースコードより)
$ echo 'Hello, Qiita!' > hello_qiita.txt
$ # アルゴリズム無指定
$ ipfs add ./hello_qiita.txt
added QmSuyo747aBeA4yzXy354VUH3Z3pUBC3rULAQ5oF62fy5B hello_qiita.txt
14 B / 14 B [================================================================] 100.00%
$ # デフォルトのアルゴリズム(上記と比較)
$ ipfs add ./hello_qiita.txt --hash=sha2-256
added QmSuyo747aBeA4yzXy354VUH3Z3pUBC3rULAQ5oF62fy5B hello_qiita.txt
14 B / 14 B [================================================================] 100.00%
$ # 爆速アルゴリズムを指定
$ ipfs add ./hello_qiita.txt --hash=blake3
added bafkr4ifqg6zutkurq7ctgfrjaqxroevcihgl62atnrfgrwwhxjoqgjzmwu hello_qiita.txt
14 B / ? [-----------------------------------------------------=-------------]
$ # 最強のアルゴリズムを指定
$ ipfs add ./hello_qiita.txt --hash=sha3
added bafkriqa3kk2tr6i6zcp7snuepiexsfm4h7ujgsdijzqzipgeovpsy6ujilfm7ozg2g5a76vysvffzb2nkcvkvk7nuemau6xksqgerp4vxkxh4 hello_qiita.txt
14 B / ? [-----------------------------------------------------=-------------]
Web Gateway 経由でコンテンツを取得する場合、(古いバージョンや experimental
が有効になっていないため)63 文字以上の CID
は受け付けないことが多いです。SHA3
などの 512 ビット系アルゴリズムを使った CID
を発行する場合は注意します。
TS; DR (コマンドのヘルプが助けにならないのでソースを確認した)
ローカルの IPFS リポジトリにコンテンツを追加して CID
(コンテンツ ID)を発行したい場合、通常は以下のように ipfs add
コマンドを実行します。
$ ipfs add ./hoge.md
added QmSuyo747aBeA4yzXy354VUH3Z3pUBC3rULAQ5oF62fy5B hoge.md
14 B / 14 B [================================================================] 100.00%
この場合、(Qm...
から始まる CID
)の CID バージョンは v0
で、使われるハッシュ・アルゴリズムはデフォルトの SHA2-256
です(2023/04/26 現在)。
複数のラズパイ Zero で IPFS ノードを立ち上げているのですが、コンテンツの同一性を高めるために、ノードごとに CID
発行時に利用するハッシュ・アルゴリズムを変えたいと思いました。
つまり、SHA-1
はもってのほか、20 年選手の SHA-2
でもはなく、SHA-3
などの新しいハッシュ・アルゴリズムの CID
でも提供したかったのです。
ipfs help add
を見ると、ipfs add ./hoge.md --hash=sha3-224
のように、実験的(experimental
)ではあるものの--hash
オプションでアルゴリズムを指定できることはわかりました。
しかし、ヘルプには「デフォルトは sha2-256
」としか情報がなく、指定できるアルゴリズムがわかりません。調べてみたところ、BLAKE3
などの爆速アルゴリズムもサポートしていたので、正式サポートまでの、自分のググラビリティとして。
参考文献
- The Multihash Data Format @ IETF
- Issue #4207 コメント | "sha3 hash functions unrecognised" | Kubo | IPFS @ GitHub
-
Remarks | Class HashingAlgorithm | HashingAlgorithm | API Documentation @ richardschneider.github.io ↩
-
https://en.bitcoin.it/wiki/Protocol_documentation#Merkle_Trees ↩
-
https://github.com/multiformats/go-multihash/issues/120 ↩ ↩2 ↩3
-
https://academy.bit2me.com/en/what-is-x11-mining-algorithm/ ↩
-
POSEIDON: A New Hash Function for Zero-Knowledge Proof Systems @ IACR ↩