欠陥ピースをチェックする方法。

ファイルの "piece length"バイト分のSHA hash値と、メタ情報ファイル(.torrent)に含まれる metainfo["info"]["pieces"] の 20 bytesを比較するとチェックできるらしい。

BEncodingのソースは以前載せたので、.torrentのデコードにはそれを利用して。

 require 'digest/sha1'

 # fh .. ファイル ハンドル
 # pieces .. メタ情報ファイルの meta["info"]["pieces"]
 # piece_length .. メタ情報ファイル内の meta["info"]["piece length"].to_i

 def check_pieces(fh, pieces, piece_length)
   pieces = pieces.scan(/(.{20})/m)
   for index in (0...pieces.length)
     a = Digest.SHA1.digest( fh.read(piece_length) )
     b = pieces[index]
     print (a == b) ? "*" : "X"
   end
 end

公式のpythonクライアントでは、StorageWrapperのhave(BitField)をチェックするとどのピースが欠けているかをチェックできるらしい。(IRC#bittorrentで聞いた方法)

 # StorageWrapper.__init__の最後の方に追加

 for i in range(len(self.have)):
   if self.have[i]: print "%d have" % i
   else:            print "%d not have" % i