12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- // Copyright 2016 The go-ethereum Authors
- // This file is part of the go-ethereum library.
- //
- // The go-ethereum library is free software: you can redistribute it and/or modify
- // it under the terms of the GNU Lesser General Public License as published by
- // the Free Software Foundation, either version 3 of the License, or
- // (at your option) any later version.
- //
- // The go-ethereum library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU Lesser General Public License for more details.
- //
- // You should have received a copy of the GNU Lesser General Public License
- // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
- /*
- Package whisperv5 implements the Whisper protocol (version 5).
- Whisper combines aspects of both DHTs and datagram messaging systems (e.g. UDP).
- As such it may be likened and compared to both, not dissimilar to the
- matter/energy duality (apologies to physicists for the blatant abuse of a
- fundamental and beautiful natural principle).
- Whisper is a pure identity-based messaging system. Whisper provides a low-level
- (non-application-specific) but easily-accessible API without being based upon
- or prejudiced by the low-level hardware attributes and characteristics,
- particularly the notion of singular endpoints.
- */
- package whisperv5
- import (
- "fmt"
- "time"
- )
- const (
- EnvelopeVersion = uint64(0)
- ProtocolVersion = uint64(5)
- ProtocolVersionStr = "5.0"
- ProtocolName = "shh"
- statusCode = 0 // used by whisper protocol
- messagesCode = 1 // normal whisper message
- p2pCode = 2 // peer-to-peer message (to be consumed by the peer, but not forwarded any further)
- p2pRequestCode = 3 // peer-to-peer message, used by Dapp protocol
- NumberOfMessageCodes = 64
- paddingMask = byte(3)
- signatureFlag = byte(4)
- TopicLength = 4
- signatureLength = 65
- aesKeyLength = 32
- AESNonceLength = 12
- keyIdSize = 32
- MaxMessageSize = uint32(10 * 1024 * 1024) // maximum accepted size of a message.
- DefaultMaxMessageSize = uint32(1024 * 1024)
- DefaultMinimumPoW = 0.2
- padSizeLimit = 256 // just an arbitrary number, could be changed without breaking the protocol (must not exceed 2^24)
- messageQueueLimit = 1024
- expirationCycle = time.Second
- transmissionCycle = 300 * time.Millisecond
- DefaultTTL = 50 // seconds
- SynchAllowance = 10 // seconds
- )
- type unknownVersionError uint64
- func (e unknownVersionError) Error() string {
- return fmt.Sprintf("invalid envelope version %d", uint64(e))
- }
- // MailServer represents a mail server, capable of
- // archiving the old messages for subsequent delivery
- // to the peers. Any implementation must ensure that both
- // functions are thread-safe. Also, they must return ASAP.
- // DeliverMail should use directMessagesCode for delivery,
- // in order to bypass the expiry checks.
- type MailServer interface {
- Archive(env *Envelope)
- DeliverMail(whisperPeer *Peer, request *Envelope)
- }
|