8 wire "github.com/tendermint/go-wire"
10 "github.com/bytom/consensus"
11 "github.com/bytom/protocol/bc/types"
12 "github.com/bytom/test/mock"
18 flag consensus.ServiceFlag
21 remoteNode *SyncManager
26 func NewP2PPeer(addr, id string, flag consensus.ServiceFlag) *P2PPeer {
29 ip: &net.IPAddr{IP: net.ParseIP(addr)},
31 msgCh: make(chan []byte),
36 func (p *P2PPeer) Addr() net.Addr {
40 func (p *P2PPeer) ID() string {
44 func (p *P2PPeer) ServiceFlag() consensus.ServiceFlag {
48 func (p *P2PPeer) SetConnection(srcPeer *P2PPeer, node *SyncManager) {
53 func (p *P2PPeer) TrySend(b byte, msg interface{}) bool {
54 msgBytes := wire.BinaryBytes(msg)
58 msgType, msg, _ := DecodeMessage(msgBytes)
59 p.remoteNode.processMsg(p.srcPeer, msgType, msg)
64 func (p *P2PPeer) setAsync(b bool) {
68 func (p *P2PPeer) postMan() {
69 for msgBytes := range p.msgCh {
70 msgType, msg, _ := DecodeMessage(msgBytes)
71 p.remoteNode.processMsg(p.srcPeer, msgType, msg)
77 func NewPeerSet() *PeerSet {
81 func (ps *PeerSet) AddBannedPeer(string) error { return nil }
82 func (ps *PeerSet) StopPeerGracefully(string) {}
85 nodes map[*SyncManager]P2PPeer
88 func NewNetWork() *NetWork {
89 return &NetWork{map[*SyncManager]P2PPeer{}}
92 func (nw *NetWork) Register(node *SyncManager, addr, id string, flag consensus.ServiceFlag) {
93 peer := NewP2PPeer(addr, id, flag)
94 nw.nodes[node] = *peer
97 func (nw *NetWork) HandsShake(nodeA, nodeB *SyncManager) error {
98 B2A, ok := nw.nodes[nodeA]
100 return errors.New("can't find nodeA's p2p peer on network")
102 A2B, ok := nw.nodes[nodeB]
104 return errors.New("can't find nodeB's p2p peer on network")
107 A2B.SetConnection(&B2A, nodeB)
108 B2A.SetConnection(&A2B, nodeA)
112 nodeA.handleStatusRequestMsg(&A2B)
113 nodeB.handleStatusRequestMsg(&B2A)
120 func mockBlocks(startBlock *types.Block, height uint64) []*types.Block {
121 blocks := []*types.Block{}
122 indexBlock := &types.Block{}
123 if startBlock == nil {
124 indexBlock = &types.Block{BlockHeader: types.BlockHeader{Nonce: uint64(rand.Uint32())}}
125 blocks = append(blocks, indexBlock)
127 indexBlock = startBlock
130 for indexBlock.Height < height {
131 block := &types.Block{
132 BlockHeader: types.BlockHeader{
133 Height: indexBlock.Height + 1,
134 PreviousBlockHash: indexBlock.Hash(),
135 Nonce: uint64(rand.Uint32()),
138 blocks = append(blocks, block)
144 func mockSync(blocks []*types.Block) *SyncManager {
145 chain := mock.NewChain()
146 peers := newPeerSet(NewPeerSet())
147 chain.SetBestBlockHeader(&blocks[len(blocks)-1].BlockHeader)
148 for _, block := range blocks {
149 chain.SetBlockByHeight(block.Height, block)
152 genesis, _ := chain.GetHeaderByHeight(0)
154 genesisHash: genesis.Hash(),
156 blockKeeper: newBlockKeeper(chain, peers),