123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- package eth
- import (
- "errors"
- "github.com/ethereum/go-ethereum/eth/protocols/eth"
- "github.com/ethereum/go-ethereum/p2p"
- "github.com/ethereum/go-ethereum/p2p/enode"
- )
- // Quorum: quorum_protocol enables the eth service to return two different protocols, one for the eth mainnet "eth" service,
- // and one for the quorum specific consensus algo, obtained from engine.consensus
- // 2021 Jan in the future consensus (istanbul) may run from its own service and use a single subprotocol there,
- // instead of overloading the eth service.
- var (
- // errEthPeerNil is returned when no eth peer is found to be associated with a p2p peer.
- errEthPeerNil = errors.New("eth peer was nil")
- errEthPeerNotRegistered = errors.New("eth peer was not registered")
- )
- // quorum consensus Protocol variables are optionally set in addition to the "eth" protocol variables (eth/protocol.go).
- var quorumConsensusProtocolName = ""
- // ProtocolVersions are the supported versions of the quorum consensus protocol (first is primary), e.g. []uint{Istanbul64, Istanbul99, Istanbul100}.
- var quorumConsensusProtocolVersions []uint
- // protocol Length describe the number of messages support by the protocol/version map[uint]uint64{Istanbul64: 18, Istanbul99: 18, Istanbul100: 18}
- var quorumConsensusProtocolLengths map[uint]uint64
- func (s *Ethereum) quorumConsensusProtocols(backend eth.Backend, network uint64, dnsdisc enode.Iterator) []p2p.Protocol {
- protos := make([]p2p.Protocol, len(quorumConsensusProtocolVersions))
- for i, vsn := range quorumConsensusProtocolVersions {
- // if we have a legacy protocol, e.g. istanbul/99, istanbul/64 then the protocol handler is will be the "eth"
- // protocol handler, and the subprotocol "eth" will not be used, but rather the legacy subprotocol will handle
- // both eth messages and consensus messages.
- if isLegacyProtocol(quorumConsensusProtocolName, vsn) {
- length, ok := quorumConsensusProtocolLengths[vsn]
- if !ok {
- panic("makeProtocol for unknown version")
- }
- lp := s.handler.makeLegacyProtocol(quorumConsensusProtocolName, vsn, length, backend, network, dnsdisc)
- protos[i] = lp
- } else {
- length, ok := quorumConsensusProtocolLengths[vsn]
- if !ok {
- panic("makeQuorumConsensusProtocol for unknown version")
- }
- protos[i] = s.handler.makeQuorumConsensusProtocol(quorumConsensusProtocolName, vsn, length, backend, network, dnsdisc)
- }
- }
- return protos
- }
- // istanbul/64, istanbul/99, clique/63, clique/64 all override the "eth" subprotocol.
- func isLegacyProtocol(name string, version uint) bool {
- // protocols that override "eth" subprotocol and run only the quorum subprotocol.
- quorumLegacyProtocols := map[string][]uint{"istanbul": {64, 99}, "clique": {63, 64}}
- for lpName, lpVersions := range quorumLegacyProtocols {
- if lpName == name {
- for _, v := range lpVersions {
- if v == version {
- return true
- }
- }
- }
- }
- return false
- }
|