やりたいこと
Goで4つの要素(ブロック)からなるハッシュチェーンを実装しています。
まずArrayに4つの要素を準備し、一つ目をハッシュ化します。2つ目以降の要素は前のハッシュとその要素を足してハッシュ化していきます。
各過程で得たハッシュを表示していくプログラムを作るのが目標です。
Goに関しては初心者なのですが、試行錯誤しながらコーディングしてみました。
実際に書いたコード
package main import ( "crypto/sha256" "fmt" ) func main() { Array := [...]string{"0001", "0002", "0003", "0004"} h := sha256.New() //構造体を定義 type Block struct { Index int Data string Hash []byte //crypto/sha256の返り値に合わせたスライス } //構造体配列を定義 type BlockArray []*Block var hashChain BlockArray for i := 0; i < len(Array); i++ { if i == 0 { fmt.Println("index = ", i) h.Write([]byte(Array[i])) hashChain = []*Block{ &Block{i, Array[i], h.Sum(nil)}, } fmt.Printf("Block %x Hash = %x \n", i, hashChain[i].Hash) } else { fmt.Println("index = ", i) message := append([]byte(Array[i]), hashChain[i-1].Hash...) //スライスの結合? h.Write([]byte(message)) fmt.Printf("Block %x Hash = %x \n", i, h.Sum(nil)) hashChain = []*Block{ &Block{i, Array[i], h.Sum(nil)}, } fmt.Printf("Block %x Hash = %x \n", i, hashChain[i].Hash) } fmt.Printf("LatestBlock_Hash= %x \n", hashChain[i].Hash) } }
エラー
実行してみると、以下のエラーが表示されました。
% go run hashChain.go index = 0 Block 0 Hash = 888b19a43b151683c87895f6211d9f8640f97bdc8ef32f03dbe057c8f5e56d32 LatestBlock_Hash= 888b19a43b151683c87895f6211d9f8640f97bdc8ef32f03dbe057c8f5e56d32 index = 1 Block 1 Hash = 6dac394913764d4e0c4beed3aae22375fa8692079798d7dd6502e132935311d3 panic: runtime error: index out of range [1] with length 1 goroutine 1 [running]: main.main() /Users/username/go-crypto-imp/hashChain.go:44 +0x92a exit status 2
for文内で使っているインデックスiが範囲外にあるようなのですが、for文に問題があるのでしょうか
ここでの、44行目はi>0のBlockHashを表示するこの1行です(else文内)
fmt.Printf("Block %x Hash = %x \n", i, hashChain[i].Hash)
また、おかしいのは、index = 1で処理が止まっていること、処理の途中でLatestBlock_HashがBlock 0 Hashと同じ値で表示されていることです。
試行錯誤1
試しに、44行目をコメントアウトして再実行すると、
% go run hashChain.go index = 0 Block 0 Hash = 888b19a43b151683c87895f6211d9f8640f97bdc8ef32f03dbe057c8f5e56d32 LatestBlock_Hash= 888b19a43b151683c87895f6211d9f8640f97bdc8ef32f03dbe057c8f5e56d32 index = 1 Block 1 Hash = 6dac394913764d4e0c4beed3aae22375fa8692079798d7dd6502e132935311d3 panic: runtime error: index out of range [1] with length 1 goroutine 1 [running]: main.main() /Users/username/go-crypto-imp/hashChain.go:46 +0x91b exit status 2 tsudashouki@ts21
つぎは 46行目のLatestBlock_Hashの部分で同様のエラーがでました。
fmt.Printf("LatestBlock_Hash= %x \n", hashChain[i].Hash)
hashChain[i]のインデックスiに値が渡っていないように思えます。
試行錯誤2
シンプルなfor文に変更し、インデックスごとにハッシュを表示する形を試してみました。
for i := 0; i < len(Array); i++ { fmt.Println("index = ", i) h.Write([]byte(Array[i])) hashChain = []*Block{ &Block{i, Array[i], h.Sum(nil)}, } fmt.Printf("Block %x Hash = %x \n", i, hashChain[i].Hash) }
結果はやはり、hashchain[i]の部分(31行目)の部分が問題のようでした。
% go run hashChain.go index = 0 Block 0 Hash = 888b19a43b151683c87895f6211d9f8640f97bdc8ef32f03dbe057c8f5e56d32 index = 1 panic: runtime error: index out of range [1] with length 1 goroutine 1 [running]: main.main() /Users/username/go-crypto-imp/hashChain.go:31 +0x426 exit status 2
このように、いろいろ調べて試してみましたが原因と解決方法がわかりませんでした。
何かの基礎的知識が抜けているのであれば、そのあたりをご指摘もらえると幸甚です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/09 08:02