proto/p2p/p2p.proto (82 lines of code) (raw):
/*
P2PMessage represents a flavor of a P2P torrent protocol that kraken supports
*/
syntax = "proto3";
package p2p;
// Binary set of all pieces that peer has downloaded so far. Also serves as a
// handshaking message, which each peer sends once at the beginning of the
// connection to declare what their peer id is and what info hash they want to
// transmit.
message BitfieldMessage {
string infoHash = 2;
// TODO: Torrent name is the content hash. Current torrent storage is
// content addressable. Adding name as a part of handshake makes looking
// up torrents faster. If storage supports addressing torrent by infohash,
// this extra field should removed.
// XXX(codyg): We rely on this name field for announcing too, so tracker can
// look up origins that have this content.
// We currently treat infohash as verification of torrents.
string name = 3;
string peerID = 4;
bytes bitfieldBytes = 5;
string namespace = 6;
// remoteBitfieldBytes contains the binary sets of pieces downloaded of
// all peers that the sender is currently connected to.
map<string, bytes> remoteBitfieldBytes = 7;
}
// Requests a piece of the given index. Note: offset and length are unused fields
// and if set, will be rejected.
message PieceRequestMessage {
int32 index = 2;
int32 offset = 3; // Unused.
int32 length = 4; // Unused.
}
// Provides binary payload response to a peer request. Always immediately followed
// by a binary blob sent over socket, so the receiver should be ready to treat the
// blob as a non-protobuf message.
message PiecePayloadMessage {
int32 index = 2;
int32 offset = 3; // Unused.
int32 length = 4; // Unused.
string digest = 5; // Cryptographic signature of a piece content (sha1, md5).
}
// Announces that a piece is available to other peers.
message AnnouncePieceMessage {
int32 index = 2;
}
// Unused.
message CancelPieceMessage {
int32 index = 2;
}
// General purpose error message. Receivers may check the error code to determine
// the origin of the message.
message ErrorMessage {
enum ErrorCode {
PIECE_REQUEST_FAILED = 0;
}
string error = 2;
int32 index = 3;
ErrorCode code = 4;
}
// Notifies other peers that the torrent has completed and all pieces are available.
message CompleteMessage {}
message Message {
enum Type {
BITFIELD = 0;
PIECE_REQUEST = 1;
PIECE_PAYLOAD = 2;
ANNOUCE_PIECE = 3;
CANCEL_PIECE = 4;
ERROR = 5;
COMPLETE = 6;
}
string version = 1;
Type type = 2;
BitfieldMessage bitfield = 3;
PieceRequestMessage pieceRequest = 4;
PiecePayloadMessage piecePayload = 5;
AnnouncePieceMessage announcePiece = 6;
CancelPieceMessage cancelPiece = 7;
ErrorMessage error = 8;
CompleteMessage complete = 9;
}