// Copyright (c) 2013-2016 The btcsuite developers // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. package domainmessage import ( "fmt" "strconv" "strings" ) // XXX pedro: we will probably need to bump this. const ( // ProtocolVersion is the latest protocol version this package supports. ProtocolVersion uint32 = 1 ) // ServiceFlag identifies services supported by a kaspa peer. type ServiceFlag uint64 const ( // SFNodeNetwork is a flag used to indicate a peer is a full node. SFNodeNetwork ServiceFlag = 1 << iota // SFNodeGetUTXO is a flag used to indicate a peer supports the // getutxos and utxos commands (BIP0064). SFNodeGetUTXO // SFNodeBloom is a flag used to indicate a peer supports bloom // filtering. SFNodeBloom // SFNodeXthin is a flag used to indicate a peer supports xthin blocks. SFNodeXthin // SFNodeBit5 is a flag used to indicate a peer supports a service // defined by bit 5. SFNodeBit5 // SFNodeCF is a flag used to indicate a peer supports committed // filters (CFs). SFNodeCF ) // Map of service flags back to their constant names for pretty printing. var sfStrings = map[ServiceFlag]string{ SFNodeNetwork: "SFNodeNetwork", SFNodeGetUTXO: "SFNodeGetUTXO", SFNodeBloom: "SFNodeBloom", SFNodeXthin: "SFNodeXthin", SFNodeBit5: "SFNodeBit5", SFNodeCF: "SFNodeCF", } // orderedSFStrings is an ordered list of service flags from highest to // lowest. var orderedSFStrings = []ServiceFlag{ SFNodeNetwork, SFNodeGetUTXO, SFNodeBloom, SFNodeXthin, SFNodeBit5, SFNodeCF, } // String returns the ServiceFlag in human-readable form. func (f ServiceFlag) String() string { // No flags are set. if f == 0 { return "0x0" } // Add individual bit flags. s := "" for _, flag := range orderedSFStrings { if f&flag == flag { s += sfStrings[flag] + "|" f -= flag } } // Add any remaining flags which aren't accounted for as hex. s = strings.TrimRight(s, "|") if f != 0 { s += "|0x" + strconv.FormatUint(uint64(f), 16) } s = strings.TrimLeft(s, "|") return s } // KaspaNet represents which kaspa network a message belongs to. type KaspaNet uint32 // Constants used to indicate the message kaspa network. They can also be // used to seek to the next message when a stream's state is unknown, but // this package does not provide that functionality since it's generally a // better idea to simply disconnect clients that are misbehaving over TCP. const ( // Mainnet represents the main kaspa network. Mainnet KaspaNet = 0x3ddcf71d // Testnet represents the test network. Testnet KaspaNet = 0xddb8af8f // Regtest represents the regression test network. Regtest KaspaNet = 0xf396cdd6 // Simnet represents the simulation test network. Simnet KaspaNet = 0x374dcf1c // Devnet represents the development test network. Devnet KaspaNet = 0x732d87e1 ) // bnStrings is a map of kaspa networks back to their constant names for // pretty printing. var bnStrings = map[KaspaNet]string{ Mainnet: "Mainnet", Testnet: "Testnet", Regtest: "Regtest", Simnet: "Simnet", Devnet: "Devnet", } // String returns the KaspaNet in human-readable form. func (n KaspaNet) String() string { if s, ok := bnStrings[n]; ok { return s } return fmt.Sprintf("Unknown KaspaNet (%d)", uint32(n)) }