github.com/ylsgit/go-ethereum@v1.6.5/whisper/whisperv5/topic.go (about) 1 // Copyright 2016 The go-ethereum Authors 2 // This file is part of the go-ethereum library. 3 // 4 // The go-ethereum library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The go-ethereum library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 16 17 // Contains the Whisper protocol Topic element. 18 19 package whisperv5 20 21 import ( 22 "fmt" 23 "strings" 24 25 "github.com/ethereum/go-ethereum/common" 26 ) 27 28 // Topic represents a cryptographically secure, probabilistic partial 29 // classifications of a message, determined as the first (left) 4 bytes of the 30 // SHA3 hash of some arbitrary data given by the original author of the message. 31 type TopicType [TopicLength]byte 32 33 func BytesToTopic(b []byte) (t TopicType) { 34 sz := TopicLength 35 if x := len(b); x < TopicLength { 36 sz = x 37 } 38 for i := 0; i < sz; i++ { 39 t[i] = b[i] 40 } 41 return t 42 } 43 44 // String converts a topic byte array to a string representation. 45 func (topic *TopicType) String() string { 46 return string(common.ToHex(topic[:])) 47 } 48 49 // UnmarshalJSON parses a hex representation to a topic. 50 func (t *TopicType) UnmarshalJSON(input []byte) error { 51 length := len(input) 52 if length >= 2 && input[0] == '"' && input[length-1] == '"' { 53 input = input[1 : length-1] 54 } 55 // strip "0x" for length check 56 if len(input) > 1 && strings.ToLower(string(input[:2])) == "0x" { 57 input = input[2:] 58 } 59 // validate the length of the input 60 if len(input) != TopicLength*2 { 61 return fmt.Errorf("unmarshalJSON failed: topic must be exactly %d bytes", TopicLength) 62 } 63 b := common.FromHex(string(input)) 64 if b == nil { 65 return fmt.Errorf("unmarshalJSON failed: wrong topic format") 66 } 67 *t = BytesToTopic(b) 68 return nil 69 }