diff --git a/consensus/model/notify.go b/consensus/model/notify.go index 49e5ceb4..b0fa5f8e 100644 --- a/consensus/model/notify.go +++ b/consensus/model/notify.go @@ -13,7 +13,7 @@ import ( // and rpc server. type Notify interface { AnnounceNewTransactions(newTxs []*types.TxDesc, filters []peer.ID) - RelayInventory(data interface{}, filters []peer.ID) + RelayInventory(block *types.SerializedBlock, flags uint32, source *peer.ID) BroadcastMessage(data interface{}) TransactionConfirmed(tx *types.Tx) AddRebroadcastInventory(newTxs []*types.TxDesc) diff --git a/core/blockchain/behaviorflags.go b/core/blockchain/behaviorflags.go index b9147ba2..7b244304 100644 --- a/core/blockchain/behaviorflags.go +++ b/core/blockchain/behaviorflags.go @@ -21,6 +21,9 @@ const ( // Add block from RPC interface BFRPCAdd + // Add block from broadcast interface + BFBroadcast + // BFNone is a convenience value to specifically indicate no flags. BFNone BehaviorFlags = 0 ) diff --git a/core/blockchain/notifications.go b/core/blockchain/notifications.go index 28fb45b5..aced903f 100644 --- a/core/blockchain/notifications.go +++ b/core/blockchain/notifications.go @@ -11,6 +11,7 @@ import ( "github.com/Qitmeer/qng/common/hash" "github.com/Qitmeer/qng/core/event" "github.com/Qitmeer/qng/core/types" + "github.com/libp2p/go-libp2p/core/peer" "time" ) @@ -69,7 +70,8 @@ type BlockAcceptedNotifyData struct { Block *types.SerializedBlock Height uint64 - Flags BehaviorFlags + Flags BehaviorFlags + Source *peer.ID } // ReorganizationNotifyData is the structure for data indicating information diff --git a/core/blockchain/orphan.go b/core/blockchain/orphan.go index d4660737..242392f8 100644 --- a/core/blockchain/orphan.go +++ b/core/blockchain/orphan.go @@ -258,7 +258,7 @@ func (b *BlockChain) processOrphans(flags BehaviorFlags) error { continue } b.RemoveOrphanBlock(cur) - b.maybeAcceptBlock(cur.block, flags) + b.maybeAcceptBlock(cur.block, flags, nil) } return nil } diff --git a/core/blockchain/process.go b/core/blockchain/process.go index 1e789931..4c37891f 100644 --- a/core/blockchain/process.go +++ b/core/blockchain/process.go @@ -8,6 +8,7 @@ package blockchain import ( "container/list" "fmt" + "github.com/libp2p/go-libp2p/core/peer" "time" "github.com/Qitmeer/qng/common/hash" @@ -36,12 +37,12 @@ import ( // // This function is safe for concurrent access. // return IsOrphan,error -func (b *BlockChain) ProcessBlock(block *types.SerializedBlock, flags BehaviorFlags) (meerdag.IBlock, bool, error) { +func (b *BlockChain) ProcessBlock(block *types.SerializedBlock, flags BehaviorFlags, source *peer.ID) (meerdag.IBlock, bool, error) { if b.IsShutdown() { return nil, false, fmt.Errorf("block chain is shutdown") } block.Reset() - msg := processMsg{block: block, flags: flags, result: make(chan *processResult)} + msg := processMsg{block: block, flags: flags, result: make(chan *processResult), source: source} b.msgChan <- &msg result := <-msg.result return result.block, result.isOrphan, result.err @@ -54,7 +55,7 @@ out: select { case msg := <-b.msgChan: start := time.Now() - ib, isOrphan, err := b.processBlock(msg.block, msg.flags) + ib, isOrphan, err := b.processBlock(msg.block, msg.flags, msg.source) blockProcessTimer.Update(time.Since(start)) msg.result <- &processResult{isOrphan: isOrphan, err: err, block: ib} case <-b.quit: @@ -75,14 +76,14 @@ cleanup: log.Trace("BlockChain handler done") } -func (b *BlockChain) processBlock(block *types.SerializedBlock, flags BehaviorFlags) (meerdag.IBlock, bool, error) { +func (b *BlockChain) processBlock(block *types.SerializedBlock, flags BehaviorFlags, source *peer.ID) (meerdag.IBlock, bool, error) { isorphan, err := b.preProcessBlock(block, flags) if err != nil || isorphan { return nil, isorphan, err } // The block has passed all context independent checks and appears sane // enough to potentially accept it into the block chain. - ib, err := b.maybeAcceptBlock(block, flags) + ib, err := b.maybeAcceptBlock(block, flags, source) if err != nil { return nil, false, err } @@ -193,7 +194,7 @@ func (b *BlockChain) preProcessBlock(block *types.SerializedBlock, flags Behavio // their documentation for how the flags modify their behavior. // // This function MUST be called with the chain state lock held (for writes). -func (b *BlockChain) maybeAcceptBlock(block *types.SerializedBlock, flags BehaviorFlags) (meerdag.IBlock, error) { +func (b *BlockChain) maybeAcceptBlock(block *types.SerializedBlock, flags BehaviorFlags, source *peer.ID) (meerdag.IBlock, error) { if onEnd := l.LogAndMeasureExecutionTime(log, "BlockChain.maybeAcceptBlock"); onEnd != nil { defer onEnd() } @@ -293,6 +294,7 @@ func (b *BlockChain) maybeAcceptBlock(block *types.SerializedBlock, flags Behavi Block: block, Flags: flags, Height: uint64(ib.GetHeight()), + Source: source, }) if b.Acct != nil { err = b.Acct.Commit() @@ -304,7 +306,7 @@ func (b *BlockChain) maybeAcceptBlock(block *types.SerializedBlock, flags Behavi } func (b *BlockChain) FastAcceptBlock(block *types.SerializedBlock, flags BehaviorFlags) (meerdag.IBlock, error) { - return b.maybeAcceptBlock(block, flags) + return b.maybeAcceptBlock(block, flags, nil) } // connectBestChain handles connecting the passed block to the chain while @@ -788,6 +790,7 @@ type processMsg struct { block *types.SerializedBlock flags BehaviorFlags result chan *processResult + source *peer.ID } type processResult struct { diff --git a/core/protocol/protocol.go b/core/protocol/protocol.go index 68c36c19..88cf37c2 100644 --- a/core/protocol/protocol.go +++ b/core/protocol/protocol.go @@ -21,8 +21,11 @@ const ( // Support continue block sync for DAG search ConSyncDAGProtocolVersion uint32 = 44 + // Support continue block sync for DAG search + BroadcastblockProtocolVersion uint32 = 45 + // ProtocolVersion is the latest protocol version this package supports. - ProtocolVersion uint32 = ConSyncDAGProtocolVersion + ProtocolVersion uint32 = BroadcastblockProtocolVersion ) // Network represents which qitmeer network a message belongs to. diff --git a/meerdag/dagsync.go b/meerdag/dagsync.go index 6c24636b..ebd53841 100644 --- a/meerdag/dagsync.go +++ b/meerdag/dagsync.go @@ -184,6 +184,27 @@ func (ds *DAGSync) getBlockChainFromMain(point IBlock, maxHashes uint) []*hash.H break } } + rlen := len(result) + if uint(rlen) < maxHashes && + rlen > 0 && + result[rlen-1].IsEqual(mainTip.GetHash()) { + pdb, ok := ds.bd.GetInstance().(*Phantom) + if ok { + if !pdb.GetDiffAnticone().IsEmpty() { + da := pdb.GetDiffAnticone().SortList(false) + for _, id := range da { + block := ds.bd.getBlockById(id) + if block == nil { + continue + } + result = append(result, block.GetHash()) + if uint(len(result)) >= maxHashes { + break + } + } + } + } + } return result } diff --git a/p2p/proto/v1/getblockdatas.pb.go b/p2p/proto/v1/getblockdatas.pb.go index f3ab9254..4886a536 100644 --- a/p2p/proto/v1/getblockdatas.pb.go +++ b/p2p/proto/v1/getblockdatas.pb.go @@ -164,16 +164,64 @@ func (m *BlockData) GetBlockBytes() []byte { return nil } +type BroadcastBlock struct { + Block *BlockData `protobuf:"bytes,1,opt,name=block,proto3" json:"block,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BroadcastBlock) Reset() { *m = BroadcastBlock{} } +func (m *BroadcastBlock) String() string { return proto.CompactTextString(m) } +func (*BroadcastBlock) ProtoMessage() {} +func (*BroadcastBlock) Descriptor() ([]byte, []int) { + return fileDescriptor_5c509316b8da1820, []int{3} +} +func (m *BroadcastBlock) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BroadcastBlock) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_BroadcastBlock.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *BroadcastBlock) XXX_Merge(src proto.Message) { + xxx_messageInfo_BroadcastBlock.Merge(m, src) +} +func (m *BroadcastBlock) XXX_Size() int { + return m.Size() +} +func (m *BroadcastBlock) XXX_DiscardUnknown() { + xxx_messageInfo_BroadcastBlock.DiscardUnknown(m) +} + +var xxx_messageInfo_BroadcastBlock proto.InternalMessageInfo + +func (m *BroadcastBlock) GetBlock() *BlockData { + if m != nil { + return m.Block + } + return nil +} + func init() { proto.RegisterType((*GetBlockDatas)(nil), "qitmeer.p2p.v1.GetBlockDatas") proto.RegisterType((*BlockDatas)(nil), "qitmeer.p2p.v1.BlockDatas") proto.RegisterType((*BlockData)(nil), "qitmeer.p2p.v1.BlockData") + proto.RegisterType((*BroadcastBlock)(nil), "qitmeer.p2p.v1.BroadcastBlock") } func init() { proto.RegisterFile("getblockdatas.proto", fileDescriptor_5c509316b8da1820) } var fileDescriptor_5c509316b8da1820 = []byte{ - // 249 bytes of a gzipped FileDescriptorProto + // 279 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4e, 0x4f, 0x2d, 0x49, 0xca, 0xc9, 0x4f, 0xce, 0x4e, 0x49, 0x2c, 0x49, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x2b, 0xcc, 0x2c, 0xc9, 0x4d, 0x4d, 0x2d, 0xd2, 0x2b, 0x30, 0x2a, 0xd0, 0x2b, 0x33, 0x94, @@ -187,9 +235,11 @@ var fileDescriptor_5c509316b8da1820 = []byte{ 0x37, 0x51, 0x12, 0xdd, 0x44, 0xb8, 0x62, 0xfc, 0xc6, 0x3a, 0x71, 0x71, 0xc2, 0x55, 0x0a, 0x99, 0x72, 0x71, 0x81, 0x83, 0xc6, 0xa9, 0xb2, 0x24, 0xb5, 0x58, 0x22, 0x45, 0x81, 0x51, 0x83, 0xc7, 0x49, 0xf4, 0xd3, 0x3d, 0x79, 0x41, 0xb8, 0x6e, 0x43, 0x03, 0x13, 0x0b, 0x53, 0x73, 0x33, 0xa5, - 0x20, 0x24, 0x85, 0x4e, 0x02, 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, - 0x1c, 0xe3, 0x8c, 0xc7, 0x72, 0x0c, 0x49, 0x6c, 0xe0, 0x80, 0x30, 0x06, 0x04, 0x00, 0x00, 0xff, - 0xff, 0x9f, 0xb2, 0x9e, 0x9d, 0x6d, 0x01, 0x00, 0x00, + 0x20, 0x24, 0x85, 0x4a, 0x8e, 0x5c, 0x7c, 0x4e, 0x45, 0xf9, 0x89, 0x29, 0xc9, 0x89, 0xc5, 0x10, + 0x5f, 0x0b, 0xe9, 0x73, 0xb1, 0x82, 0xe5, 0x25, 0x18, 0x15, 0x18, 0xf1, 0x3a, 0x2e, 0x08, 0xa2, + 0xce, 0x49, 0xe0, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, + 0xf1, 0x58, 0x8e, 0x21, 0x89, 0x0d, 0x1c, 0x96, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x31, + 0x44, 0x6b, 0xfb, 0xb0, 0x01, 0x00, 0x00, } func (m *GetBlockDatas) Marshal() (dAtA []byte, err error) { @@ -310,6 +360,45 @@ func (m *BlockData) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *BroadcastBlock) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BroadcastBlock) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BroadcastBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Block != nil { + { + size, err := m.Block.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGetblockdatas(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintGetblockdatas(dAtA []byte, offset int, v uint64) int { offset -= sovGetblockdatas(v) base := offset @@ -373,6 +462,22 @@ func (m *BlockData) Size() (n int) { return n } +func (m *BroadcastBlock) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Block != nil { + l = m.Block.Size() + n += 1 + l + sovGetblockdatas(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func sovGetblockdatas(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -643,6 +748,96 @@ func (m *BlockData) Unmarshal(dAtA []byte) error { } return nil } +func (m *BroadcastBlock) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGetblockdatas + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: BroadcastBlock: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BroadcastBlock: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Block", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGetblockdatas + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGetblockdatas + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGetblockdatas + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Block == nil { + m.Block = &BlockData{} + } + if err := m.Block.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGetblockdatas(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGetblockdatas + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthGetblockdatas + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipGetblockdatas(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/p2p/proto/v1/getblockdatas.proto b/p2p/proto/v1/getblockdatas.proto index b35ce334..8f6c5212 100644 --- a/p2p/proto/v1/getblockdatas.proto +++ b/p2p/proto/v1/getblockdatas.proto @@ -15,4 +15,8 @@ message BlockDatas { message BlockData { bytes blockBytes = 100 [(gogoproto.moretags) = "ssz-max:\"1048576\""]; +} + +message BroadcastBlock { + BlockData block =1; } \ No newline at end of file diff --git a/p2p/proto/v1/messages.ssz.go b/p2p/proto/v1/messages.ssz.go index 81e01d3d..d7a638c3 100644 --- a/p2p/proto/v1/messages.ssz.go +++ b/p2p/proto/v1/messages.ssz.go @@ -18,27 +18,27 @@ var ( errSize = fmt.Errorf("incorrect size") ) -// MarshalSSZ ssz marshals the GetBlockDatas object -func (g *GetBlockDatas) MarshalSSZ() ([]byte, error) { - buf := make([]byte, g.SizeSSZ()) - return g.MarshalSSZTo(buf[:0]) +// MarshalSSZ ssz marshals the Inventory object +func (i *Inventory) MarshalSSZ() ([]byte, error) { + buf := make([]byte, i.SizeSSZ()) + return i.MarshalSSZTo(buf[:0]) } -// MarshalSSZTo ssz marshals the GetBlockDatas object to a target array -func (g *GetBlockDatas) MarshalSSZTo(dst []byte) ([]byte, error) { +// MarshalSSZTo ssz marshals the Inventory object to a target array +func (i *Inventory) MarshalSSZTo(dst []byte) ([]byte, error) { var err error offset := int(4) - // Offset (0) 'Locator' + // Offset (0) 'Invs' dst = ssz.WriteOffset(dst, offset) - offset += len(g.Locator) * 32 + offset += len(i.Invs) * 36 - // Field (0) 'Locator' - if len(g.Locator) > 2000 { + // Field (0) 'Invs' + if len(i.Invs) > 20000 { return nil, errMarshalList } - for ii := 0; ii < len(g.Locator); ii++ { - if dst, err = g.Locator[ii].MarshalSSZTo(dst); err != nil { + for ii := 0; ii < len(i.Invs); ii++ { + if dst, err = i.Invs[ii].MarshalSSZTo(dst); err != nil { return nil, err } } @@ -46,8 +46,8 @@ func (g *GetBlockDatas) MarshalSSZTo(dst []byte) ([]byte, error) { return dst, err } -// UnmarshalSSZ ssz unmarshals the GetBlockDatas object -func (g *GetBlockDatas) UnmarshalSSZ(buf []byte) error { +// UnmarshalSSZ ssz unmarshals the Inventory object +func (i *Inventory) UnmarshalSSZ(buf []byte) error { var err error size := uint64(len(buf)) if size < 4 { @@ -57,27 +57,27 @@ func (g *GetBlockDatas) UnmarshalSSZ(buf []byte) error { tail := buf var o0 uint64 - // Offset (0) 'Locator' + // Offset (0) 'Invs' if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { return errOffset } - // Field (0) 'Locator' + // Field (0) 'Invs' { buf = tail[o0:] - num, ok := ssz.DivideInt(len(buf), 32) + num, ok := ssz.DivideInt(len(buf), 36) if !ok { return errDivideInt } - if num > 2000 { + if num > 20000 { return errListTooBig } - g.Locator = make([]*Hash, num) + i.Invs = make([]*InvVect, num) for ii := 0; ii < num; ii++ { - if g.Locator[ii] == nil { - g.Locator[ii] = new(Hash) + if i.Invs[ii] == nil { + i.Invs[ii] = new(InvVect) } - if err = g.Locator[ii].UnmarshalSSZ(buf[ii*32 : (ii+1)*32]); err != nil { + if err = i.Invs[ii].UnmarshalSSZ(buf[ii*36 : (ii+1)*36]); err != nil { return err } } @@ -85,133 +85,94 @@ func (g *GetBlockDatas) UnmarshalSSZ(buf []byte) error { return err } -// SizeSSZ returns the ssz encoded size in bytes for the GetBlockDatas object -func (g *GetBlockDatas) SizeSSZ() (size int) { +// SizeSSZ returns the ssz encoded size in bytes for the Inventory object +func (i *Inventory) SizeSSZ() (size int) { size = 4 - // Field (0) 'Locator' - size += len(g.Locator) * 32 + // Field (0) 'Invs' + size += len(i.Invs) * 36 return } -// MarshalSSZ ssz marshals the BlockDatas object -func (b *BlockDatas) MarshalSSZ() ([]byte, error) { - buf := make([]byte, b.SizeSSZ()) - return b.MarshalSSZTo(buf[:0]) +// MarshalSSZ ssz marshals the InvVect object +func (i *InvVect) MarshalSSZ() ([]byte, error) { + buf := make([]byte, i.SizeSSZ()) + return i.MarshalSSZTo(buf[:0]) } -// MarshalSSZTo ssz marshals the BlockDatas object to a target array -func (b *BlockDatas) MarshalSSZTo(dst []byte) ([]byte, error) { +// MarshalSSZTo ssz marshals the InvVect object to a target array +func (i *InvVect) MarshalSSZTo(dst []byte) ([]byte, error) { var err error - offset := int(4) - // Offset (0) 'Locator' - dst = ssz.WriteOffset(dst, offset) - for ii := 0; ii < len(b.Locator); ii++ { - offset += 4 - offset += b.Locator[ii].SizeSSZ() - } + // Field (0) 'Type' + dst = ssz.MarshalUint32(dst, i.Type) - // Field (0) 'Locator' - if len(b.Locator) > 2000 { - return nil, errMarshalList - } - { - offset = 4 * len(b.Locator) - for ii := 0; ii < len(b.Locator); ii++ { - dst = ssz.WriteOffset(dst, offset) - offset += b.Locator[ii].SizeSSZ() - } + // Field (1) 'Hash' + if i.Hash == nil { + i.Hash = new(Hash) } - for ii := 0; ii < len(b.Locator); ii++ { - if dst, err = b.Locator[ii].MarshalSSZTo(dst); err != nil { - return nil, err - } + if dst, err = i.Hash.MarshalSSZTo(dst); err != nil { + return nil, err } return dst, err } -// UnmarshalSSZ ssz unmarshals the BlockDatas object -func (b *BlockDatas) UnmarshalSSZ(buf []byte) error { +// UnmarshalSSZ ssz unmarshals the InvVect object +func (i *InvVect) UnmarshalSSZ(buf []byte) error { var err error size := uint64(len(buf)) - if size < 4 { + if size != 36 { return errSize } - tail := buf - var o0 uint64 + // Field (0) 'Type' + i.Type = ssz.UnmarshallUint32(buf[0:4]) - // Offset (0) 'Locator' - if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { - return errOffset + // Field (1) 'Hash' + if i.Hash == nil { + i.Hash = new(Hash) } - - // Field (0) 'Locator' - { - buf = tail[o0:] - num, err := ssz.DecodeDynamicLength(buf, 2000) - if err != nil { - return err - } - b.Locator = make([]*BlockData, num) - err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { - if b.Locator[indx] == nil { - b.Locator[indx] = new(BlockData) - } - if err = b.Locator[indx].UnmarshalSSZ(buf); err != nil { - return err - } - return nil - }) - if err != nil { - return err - } + if err = i.Hash.UnmarshalSSZ(buf[4:36]); err != nil { + return err } + return err } -// SizeSSZ returns the ssz encoded size in bytes for the BlockDatas object -func (b *BlockDatas) SizeSSZ() (size int) { - size = 4 - - // Field (0) 'Locator' - for ii := 0; ii < len(b.Locator); ii++ { - size += 4 - size += b.Locator[ii].SizeSSZ() - } - +// SizeSSZ returns the ssz encoded size in bytes for the InvVect object +func (i *InvVect) SizeSSZ() (size int) { + size = 36 return } -// MarshalSSZ ssz marshals the BlockData object -func (b *BlockData) MarshalSSZ() ([]byte, error) { - buf := make([]byte, b.SizeSSZ()) - return b.MarshalSSZTo(buf[:0]) +// MarshalSSZ ssz marshals the FilterAddRequest object +func (f *FilterAddRequest) MarshalSSZ() ([]byte, error) { + buf := make([]byte, f.SizeSSZ()) + return f.MarshalSSZTo(buf[:0]) } -// MarshalSSZTo ssz marshals the BlockData object to a target array -func (b *BlockData) MarshalSSZTo(dst []byte) ([]byte, error) { +// MarshalSSZTo ssz marshals the FilterAddRequest object to a target array +func (f *FilterAddRequest) MarshalSSZTo(dst []byte) ([]byte, error) { var err error offset := int(4) - // Offset (0) 'BlockBytes' + // Offset (0) 'Data' dst = ssz.WriteOffset(dst, offset) - offset += len(b.BlockBytes) + offset += len(f.Data) - // Field (0) 'BlockBytes' - if len(b.BlockBytes) > 1048576 { + // Field (0) 'Data' + if len(f.Data) > 256 { return nil, errMarshalDynamicBytes } - dst = append(dst, b.BlockBytes...) + dst = append(dst, f.Data...) return dst, err } -// UnmarshalSSZ ssz unmarshals the BlockData object -func (b *BlockData) UnmarshalSSZ(buf []byte) error { +// UnmarshalSSZ ssz unmarshals the FilterAddRequest object +func (f *FilterAddRequest) UnmarshalSSZ(buf []byte) error { var err error size := uint64(len(buf)) if size < 4 { @@ -221,126 +182,131 @@ func (b *BlockData) UnmarshalSSZ(buf []byte) error { tail := buf var o0 uint64 - // Offset (0) 'BlockBytes' + // Offset (0) 'Data' if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { return errOffset } - // Field (0) 'BlockBytes' + // Field (0) 'Data' { buf = tail[o0:] - b.BlockBytes = append(b.BlockBytes, buf...) + f.Data = append(f.Data, buf...) } return err } -// SizeSSZ returns the ssz encoded size in bytes for the BlockData object -func (b *BlockData) SizeSSZ() (size int) { +// SizeSSZ returns the ssz encoded size in bytes for the FilterAddRequest object +func (f *FilterAddRequest) SizeSSZ() (size int) { size = 4 - // Field (0) 'BlockBytes' - size += len(b.BlockBytes) + // Field (0) 'Data' + size += len(f.Data) return } -// MarshalSSZ ssz marshals the GraphState object -func (g *GraphState) MarshalSSZ() ([]byte, error) { - buf := make([]byte, g.SizeSSZ()) - return g.MarshalSSZTo(buf[:0]) +// MarshalSSZ ssz marshals the FilterClearRequest object +func (f *FilterClearRequest) MarshalSSZ() ([]byte, error) { + buf := make([]byte, f.SizeSSZ()) + return f.MarshalSSZTo(buf[:0]) } -// MarshalSSZTo ssz marshals the GraphState object to a target array -func (g *GraphState) MarshalSSZTo(dst []byte) ([]byte, error) { +// MarshalSSZTo ssz marshals the FilterClearRequest object to a target array +func (f *FilterClearRequest) MarshalSSZTo(dst []byte) ([]byte, error) { var err error - offset := int(20) - - // Field (0) 'Total' - dst = ssz.MarshalUint32(dst, g.Total) - - // Field (1) 'Layer' - dst = ssz.MarshalUint32(dst, g.Layer) - - // Field (2) 'MainHeight' - dst = ssz.MarshalUint32(dst, g.MainHeight) - - // Field (3) 'MainOrder' - dst = ssz.MarshalUint32(dst, g.MainOrder) - - // Offset (4) 'Tips' - dst = ssz.WriteOffset(dst, offset) - offset += len(g.Tips) * 32 - - // Field (4) 'Tips' - if len(g.Tips) > 100 { - return nil, errMarshalList - } - for ii := 0; ii < len(g.Tips); ii++ { - if dst, err = g.Tips[ii].MarshalSSZTo(dst); err != nil { - return nil, err - } - } return dst, err } -// UnmarshalSSZ ssz unmarshals the GraphState object -func (g *GraphState) UnmarshalSSZ(buf []byte) error { +// UnmarshalSSZ ssz unmarshals the FilterClearRequest object +func (f *FilterClearRequest) UnmarshalSSZ(buf []byte) error { var err error size := uint64(len(buf)) - if size < 20 { + if size != 0 { return errSize } - tail := buf - var o4 uint64 + return err +} - // Field (0) 'Total' - g.Total = ssz.UnmarshallUint32(buf[0:4]) +// SizeSSZ returns the ssz encoded size in bytes for the FilterClearRequest object +func (f *FilterClearRequest) SizeSSZ() (size int) { + size = 0 + return +} - // Field (1) 'Layer' - g.Layer = ssz.UnmarshallUint32(buf[4:8]) +// MarshalSSZ ssz marshals the FilterLoadRequest object +func (f *FilterLoadRequest) MarshalSSZ() ([]byte, error) { + buf := make([]byte, f.SizeSSZ()) + return f.MarshalSSZTo(buf[:0]) +} - // Field (2) 'MainHeight' - g.MainHeight = ssz.UnmarshallUint32(buf[8:12]) +// MarshalSSZTo ssz marshals the FilterLoadRequest object to a target array +func (f *FilterLoadRequest) MarshalSSZTo(dst []byte) ([]byte, error) { + var err error + offset := int(28) - // Field (3) 'MainOrder' - g.MainOrder = ssz.UnmarshallUint32(buf[12:16]) + // Offset (0) 'Filter' + dst = ssz.WriteOffset(dst, offset) + offset += len(f.Filter) - // Offset (4) 'Tips' - if o4 = ssz.ReadOffset(buf[16:20]); o4 > size { + // Field (1) 'HashFuncs' + dst = ssz.MarshalUint64(dst, f.HashFuncs) + + // Field (2) 'Tweak' + dst = ssz.MarshalUint64(dst, f.Tweak) + + // Field (3) 'Flags' + dst = ssz.MarshalUint64(dst, f.Flags) + + // Field (0) 'Filter' + if len(f.Filter) > 256 { + return nil, errMarshalDynamicBytes + } + dst = append(dst, f.Filter...) + + return dst, err +} + +// UnmarshalSSZ ssz unmarshals the FilterLoadRequest object +func (f *FilterLoadRequest) UnmarshalSSZ(buf []byte) error { + var err error + size := uint64(len(buf)) + if size < 28 { + return errSize + } + + tail := buf + var o0 uint64 + + // Offset (0) 'Filter' + if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { return errOffset } - // Field (4) 'Tips' + // Field (1) 'HashFuncs' + f.HashFuncs = ssz.UnmarshallUint64(buf[4:12]) + + // Field (2) 'Tweak' + f.Tweak = ssz.UnmarshallUint64(buf[12:20]) + + // Field (3) 'Flags' + f.Flags = ssz.UnmarshallUint64(buf[20:28]) + + // Field (0) 'Filter' { - buf = tail[o4:] - num, ok := ssz.DivideInt(len(buf), 32) - if !ok { - return errDivideInt - } - if num > 100 { - return errListTooBig - } - g.Tips = make([]*Hash, num) - for ii := 0; ii < num; ii++ { - if g.Tips[ii] == nil { - g.Tips[ii] = new(Hash) - } - if err = g.Tips[ii].UnmarshalSSZ(buf[ii*32 : (ii+1)*32]); err != nil { - return err - } - } + buf = tail[o0:] + f.Filter = append(f.Filter, buf...) } return err } -// SizeSSZ returns the ssz encoded size in bytes for the GraphState object -func (g *GraphState) SizeSSZ() (size int) { - size = 20 +// SizeSSZ returns the ssz encoded size in bytes for the FilterLoadRequest object +func (f *FilterLoadRequest) SizeSSZ() (size int) { + size = 28 - // Field (4) 'Tips' - size += len(g.Tips) * 32 + // Field (0) 'Filter' + size += len(f.Filter) return } @@ -644,104 +610,158 @@ func (m *MerkleBlockResponse) SizeSSZ() (size int) { return } -// MarshalSSZ ssz marshals the GetBlocks object -func (g *GetBlocks) MarshalSSZ() ([]byte, error) { - buf := make([]byte, g.SizeSSZ()) - return g.MarshalSSZTo(buf[:0]) +// MarshalSSZ ssz marshals the SyncDAG object +func (s *SyncDAG) MarshalSSZ() ([]byte, error) { + buf := make([]byte, s.SizeSSZ()) + return s.MarshalSSZTo(buf[:0]) } -// MarshalSSZTo ssz marshals the GetBlocks object to a target array -func (g *GetBlocks) MarshalSSZTo(dst []byte) ([]byte, error) { +// MarshalSSZTo ssz marshals the SyncDAG object to a target array +func (s *SyncDAG) MarshalSSZTo(dst []byte) ([]byte, error) { var err error - offset := int(4) + offset := int(8) - // Offset (0) 'Locator' + // Offset (0) 'MainLocator' dst = ssz.WriteOffset(dst, offset) - offset += len(g.Locator) * 32 + offset += len(s.MainLocator) * 32 - // Field (0) 'Locator' - if len(g.Locator) > 2000 { + // Offset (1) 'GraphState' + dst = ssz.WriteOffset(dst, offset) + if s.GraphState == nil { + s.GraphState = new(GraphState) + } + offset += s.GraphState.SizeSSZ() + + // Field (0) 'MainLocator' + if len(s.MainLocator) > 32 { return nil, errMarshalList } - for ii := 0; ii < len(g.Locator); ii++ { - if dst, err = g.Locator[ii].MarshalSSZTo(dst); err != nil { + for ii := 0; ii < len(s.MainLocator); ii++ { + if dst, err = s.MainLocator[ii].MarshalSSZTo(dst); err != nil { return nil, err } } + // Field (1) 'GraphState' + if dst, err = s.GraphState.MarshalSSZTo(dst); err != nil { + return nil, err + } + return dst, err } -// UnmarshalSSZ ssz unmarshals the GetBlocks object -func (g *GetBlocks) UnmarshalSSZ(buf []byte) error { +// UnmarshalSSZ ssz unmarshals the SyncDAG object +func (s *SyncDAG) UnmarshalSSZ(buf []byte) error { var err error size := uint64(len(buf)) - if size < 4 { + if size < 8 { return errSize } tail := buf - var o0 uint64 + var o0, o1 uint64 - // Offset (0) 'Locator' + // Offset (0) 'MainLocator' if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { return errOffset } - // Field (0) 'Locator' + // Offset (1) 'GraphState' + if o1 = ssz.ReadOffset(buf[4:8]); o1 > size || o0 > o1 { + return errOffset + } + + // Field (0) 'MainLocator' { - buf = tail[o0:] + buf = tail[o0:o1] num, ok := ssz.DivideInt(len(buf), 32) if !ok { return errDivideInt } - if num > 2000 { + if num > 32 { return errListTooBig } - g.Locator = make([]*Hash, num) + s.MainLocator = make([]*Hash, num) for ii := 0; ii < num; ii++ { - if g.Locator[ii] == nil { - g.Locator[ii] = new(Hash) + if s.MainLocator[ii] == nil { + s.MainLocator[ii] = new(Hash) } - if err = g.Locator[ii].UnmarshalSSZ(buf[ii*32 : (ii+1)*32]); err != nil { + if err = s.MainLocator[ii].UnmarshalSSZ(buf[ii*32 : (ii+1)*32]); err != nil { return err } } } + + // Field (1) 'GraphState' + { + buf = tail[o1:] + if s.GraphState == nil { + s.GraphState = new(GraphState) + } + if err = s.GraphState.UnmarshalSSZ(buf); err != nil { + return err + } + } return err } -// SizeSSZ returns the ssz encoded size in bytes for the GetBlocks object -func (g *GetBlocks) SizeSSZ() (size int) { - size = 4 +// SizeSSZ returns the ssz encoded size in bytes for the SyncDAG object +func (s *SyncDAG) SizeSSZ() (size int) { + size = 8 - // Field (0) 'Locator' - size += len(g.Locator) * 32 + // Field (0) 'MainLocator' + size += len(s.MainLocator) * 32 + + // Field (1) 'GraphState' + if s.GraphState == nil { + s.GraphState = new(GraphState) + } + size += s.GraphState.SizeSSZ() return } -// MarshalSSZ ssz marshals the DagBlocks object -func (d *DagBlocks) MarshalSSZ() ([]byte, error) { - buf := make([]byte, d.SizeSSZ()) - return d.MarshalSSZTo(buf[:0]) +// MarshalSSZ ssz marshals the SubDAG object +func (s *SubDAG) MarshalSSZ() ([]byte, error) { + buf := make([]byte, s.SizeSSZ()) + return s.MarshalSSZTo(buf[:0]) } -// MarshalSSZTo ssz marshals the DagBlocks object to a target array -func (d *DagBlocks) MarshalSSZTo(dst []byte) ([]byte, error) { +// MarshalSSZTo ssz marshals the SubDAG object to a target array +func (s *SubDAG) MarshalSSZTo(dst []byte) ([]byte, error) { var err error - offset := int(4) + offset := int(40) - // Offset (0) 'Blocks' + // Field (0) 'SyncPoint' + if s.SyncPoint == nil { + s.SyncPoint = new(Hash) + } + if dst, err = s.SyncPoint.MarshalSSZTo(dst); err != nil { + return nil, err + } + + // Offset (1) 'GraphState' dst = ssz.WriteOffset(dst, offset) - offset += len(d.Blocks) * 32 + if s.GraphState == nil { + s.GraphState = new(GraphState) + } + offset += s.GraphState.SizeSSZ() - // Field (0) 'Blocks' - if len(d.Blocks) > 2000 { + // Offset (2) 'Blocks' + dst = ssz.WriteOffset(dst, offset) + offset += len(s.Blocks) * 32 + + // Field (1) 'GraphState' + if dst, err = s.GraphState.MarshalSSZTo(dst); err != nil { + return nil, err + } + + // Field (2) 'Blocks' + if len(s.Blocks) > 2000 { return nil, errMarshalList } - for ii := 0; ii < len(d.Blocks); ii++ { - if dst, err = d.Blocks[ii].MarshalSSZTo(dst); err != nil { + for ii := 0; ii < len(s.Blocks); ii++ { + if dst, err = s.Blocks[ii].MarshalSSZTo(dst); err != nil { return nil, err } } @@ -749,25 +769,49 @@ func (d *DagBlocks) MarshalSSZTo(dst []byte) ([]byte, error) { return dst, err } -// UnmarshalSSZ ssz unmarshals the DagBlocks object -func (d *DagBlocks) UnmarshalSSZ(buf []byte) error { +// UnmarshalSSZ ssz unmarshals the SubDAG object +func (s *SubDAG) UnmarshalSSZ(buf []byte) error { var err error size := uint64(len(buf)) - if size < 4 { + if size < 40 { return errSize } tail := buf - var o0 uint64 + var o1, o2 uint64 - // Offset (0) 'Blocks' - if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { + // Field (0) 'SyncPoint' + if s.SyncPoint == nil { + s.SyncPoint = new(Hash) + } + if err = s.SyncPoint.UnmarshalSSZ(buf[0:32]); err != nil { + return err + } + + // Offset (1) 'GraphState' + if o1 = ssz.ReadOffset(buf[32:36]); o1 > size { return errOffset } - // Field (0) 'Blocks' + // Offset (2) 'Blocks' + if o2 = ssz.ReadOffset(buf[36:40]); o2 > size || o1 > o2 { + return errOffset + } + + // Field (1) 'GraphState' { - buf = tail[o0:] + buf = tail[o1:o2] + if s.GraphState == nil { + s.GraphState = new(GraphState) + } + if err = s.GraphState.UnmarshalSSZ(buf); err != nil { + return err + } + } + + // Field (2) 'Blocks' + { + buf = tail[o2:] num, ok := ssz.DivideInt(len(buf), 32) if !ok { return errDivideInt @@ -775,12 +819,12 @@ func (d *DagBlocks) UnmarshalSSZ(buf []byte) error { if num > 2000 { return errListTooBig } - d.Blocks = make([]*Hash, num) + s.Blocks = make([]*Hash, num) for ii := 0; ii < num; ii++ { - if d.Blocks[ii] == nil { - d.Blocks[ii] = new(Hash) + if s.Blocks[ii] == nil { + s.Blocks[ii] = new(Hash) } - if err = d.Blocks[ii].UnmarshalSSZ(buf[ii*32 : (ii+1)*32]); err != nil { + if err = s.Blocks[ii].UnmarshalSSZ(buf[ii*32 : (ii+1)*32]); err != nil { return err } } @@ -788,144 +832,407 @@ func (d *DagBlocks) UnmarshalSSZ(buf []byte) error { return err } -// SizeSSZ returns the ssz encoded size in bytes for the DagBlocks object -func (d *DagBlocks) SizeSSZ() (size int) { - size = 4 +// SizeSSZ returns the ssz encoded size in bytes for the SubDAG object +func (s *SubDAG) SizeSSZ() (size int) { + size = 40 - // Field (0) 'Blocks' - size += len(d.Blocks) * 32 + // Field (1) 'GraphState' + if s.GraphState == nil { + s.GraphState = new(GraphState) + } + size += s.GraphState.SizeSSZ() + + // Field (2) 'Blocks' + size += len(s.Blocks) * 32 return } -// MarshalSSZ ssz marshals the ChainState object -func (c *ChainState) MarshalSSZ() ([]byte, error) { +// MarshalSSZ ssz marshals the ContinueSyncDAG object +func (c *ContinueSyncDAG) MarshalSSZ() ([]byte, error) { buf := make([]byte, c.SizeSSZ()) return c.MarshalSSZTo(buf[:0]) } -// MarshalSSZTo ssz marshals the ChainState object to a target array -func (c *ChainState) MarshalSSZTo(dst []byte) ([]byte, error) { +// MarshalSSZTo ssz marshals the ContinueSyncDAG object to a target array +func (c *ContinueSyncDAG) MarshalSSZTo(dst []byte) ([]byte, error) { var err error - offset := int(61) - // Field (0) 'GenesisHash' - if c.GenesisHash == nil { - c.GenesisHash = new(Hash) + // Field (0) 'SyncPoint' + if c.SyncPoint == nil { + c.SyncPoint = new(Hash) } - if dst, err = c.GenesisHash.MarshalSSZTo(dst); err != nil { + if dst, err = c.SyncPoint.MarshalSSZTo(dst); err != nil { return nil, err } - // Field (1) 'ProtocolVersion' - dst = ssz.MarshalUint32(dst, c.ProtocolVersion) + // Field (1) 'Start' + if c.Start == nil { + c.Start = new(Hash) + } + if dst, err = c.Start.MarshalSSZTo(dst); err != nil { + return nil, err + } - // Field (2) 'Timestamp' - dst = ssz.MarshalUint64(dst, c.Timestamp) + return dst, err +} - // Field (3) 'Services' - dst = ssz.MarshalUint64(dst, c.Services) +// UnmarshalSSZ ssz unmarshals the ContinueSyncDAG object +func (c *ContinueSyncDAG) UnmarshalSSZ(buf []byte) error { + var err error + size := uint64(len(buf)) + if size != 64 { + return errSize + } - // Field (4) 'DisableRelayTx' - dst = ssz.MarshalBool(dst, c.DisableRelayTx) + // Field (0) 'SyncPoint' + if c.SyncPoint == nil { + c.SyncPoint = new(Hash) + } + if err = c.SyncPoint.UnmarshalSSZ(buf[0:32]); err != nil { + return err + } - // Offset (5) 'GraphState' - dst = ssz.WriteOffset(dst, offset) - if c.GraphState == nil { - c.GraphState = new(GraphState) + // Field (1) 'Start' + if c.Start == nil { + c.Start = new(Hash) + } + if err = c.Start.UnmarshalSSZ(buf[32:64]); err != nil { + return err } - offset += c.GraphState.SizeSSZ() - // Offset (6) 'UserAgent' + return err +} + +// SizeSSZ returns the ssz encoded size in bytes for the ContinueSyncDAG object +func (c *ContinueSyncDAG) SizeSSZ() (size int) { + size = 64 + return +} + +// MarshalSSZ ssz marshals the GetTxs object +func (g *GetTxs) MarshalSSZ() ([]byte, error) { + buf := make([]byte, g.SizeSSZ()) + return g.MarshalSSZTo(buf[:0]) +} + +// MarshalSSZTo ssz marshals the GetTxs object to a target array +func (g *GetTxs) MarshalSSZTo(dst []byte) ([]byte, error) { + var err error + offset := int(4) + + // Offset (0) 'Txs' dst = ssz.WriteOffset(dst, offset) - offset += len(c.UserAgent) + offset += len(g.Txs) * 32 - // Field (5) 'GraphState' - if dst, err = c.GraphState.MarshalSSZTo(dst); err != nil { - return nil, err + // Field (0) 'Txs' + if len(g.Txs) > 20000 { + return nil, errMarshalList + } + for ii := 0; ii < len(g.Txs); ii++ { + if dst, err = g.Txs[ii].MarshalSSZTo(dst); err != nil { + return nil, err + } } - // Field (6) 'UserAgent' - if len(c.UserAgent) > 256 { + return dst, err +} + +// UnmarshalSSZ ssz unmarshals the GetTxs object +func (g *GetTxs) UnmarshalSSZ(buf []byte) error { + var err error + size := uint64(len(buf)) + if size < 4 { + return errSize + } + + tail := buf + var o0 uint64 + + // Offset (0) 'Txs' + if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { + return errOffset + } + + // Field (0) 'Txs' + { + buf = tail[o0:] + num, ok := ssz.DivideInt(len(buf), 32) + if !ok { + return errDivideInt + } + if num > 20000 { + return errListTooBig + } + g.Txs = make([]*Hash, num) + for ii := 0; ii < num; ii++ { + if g.Txs[ii] == nil { + g.Txs[ii] = new(Hash) + } + if err = g.Txs[ii].UnmarshalSSZ(buf[ii*32 : (ii+1)*32]); err != nil { + return err + } + } + } + return err +} + +// SizeSSZ returns the ssz encoded size in bytes for the GetTxs object +func (g *GetTxs) SizeSSZ() (size int) { + size = 4 + + // Field (0) 'Txs' + size += len(g.Txs) * 32 + + return +} + +// MarshalSSZ ssz marshals the Transaction object +func (t *Transaction) MarshalSSZ() ([]byte, error) { + buf := make([]byte, t.SizeSSZ()) + return t.MarshalSSZTo(buf[:0]) +} + +// MarshalSSZTo ssz marshals the Transaction object to a target array +func (t *Transaction) MarshalSSZTo(dst []byte) ([]byte, error) { + var err error + offset := int(4) + + // Offset (0) 'TxBytes' + dst = ssz.WriteOffset(dst, offset) + offset += len(t.TxBytes) + + // Field (0) 'TxBytes' + if len(t.TxBytes) > 1048576 { return nil, errMarshalDynamicBytes } - dst = append(dst, c.UserAgent...) + dst = append(dst, t.TxBytes...) return dst, err } -// UnmarshalSSZ ssz unmarshals the ChainState object -func (c *ChainState) UnmarshalSSZ(buf []byte) error { +// UnmarshalSSZ ssz unmarshals the Transaction object +func (t *Transaction) UnmarshalSSZ(buf []byte) error { var err error size := uint64(len(buf)) - if size < 61 { + if size < 4 { return errSize } tail := buf - var o5, o6 uint64 + var o0 uint64 - // Field (0) 'GenesisHash' - if c.GenesisHash == nil { - c.GenesisHash = new(Hash) + // Offset (0) 'TxBytes' + if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { + return errOffset } - if err = c.GenesisHash.UnmarshalSSZ(buf[0:32]); err != nil { - return err + + // Field (0) 'TxBytes' + { + buf = tail[o0:] + t.TxBytes = append(t.TxBytes, buf...) } + return err +} - // Field (1) 'ProtocolVersion' - c.ProtocolVersion = ssz.UnmarshallUint32(buf[32:36]) +// SizeSSZ returns the ssz encoded size in bytes for the Transaction object +func (t *Transaction) SizeSSZ() (size int) { + size = 4 - // Field (2) 'Timestamp' - c.Timestamp = ssz.UnmarshallUint64(buf[36:44]) + // Field (0) 'TxBytes' + size += len(t.TxBytes) - // Field (3) 'Services' - c.Services = ssz.UnmarshallUint64(buf[44:52]) + return +} - // Field (4) 'DisableRelayTx' - c.DisableRelayTx = ssz.UnmarshalBool(buf[52:53]) +// MarshalSSZ ssz marshals the Transactions object +func (t *Transactions) MarshalSSZ() ([]byte, error) { + buf := make([]byte, t.SizeSSZ()) + return t.MarshalSSZTo(buf[:0]) +} - // Offset (5) 'GraphState' - if o5 = ssz.ReadOffset(buf[53:57]); o5 > size { +// MarshalSSZTo ssz marshals the Transactions object to a target array +func (t *Transactions) MarshalSSZTo(dst []byte) ([]byte, error) { + var err error + offset := int(4) + + // Offset (0) 'Txs' + dst = ssz.WriteOffset(dst, offset) + for ii := 0; ii < len(t.Txs); ii++ { + offset += 4 + offset += t.Txs[ii].SizeSSZ() + } + + // Field (0) 'Txs' + if len(t.Txs) > 20000 { + return nil, errMarshalList + } + { + offset = 4 * len(t.Txs) + for ii := 0; ii < len(t.Txs); ii++ { + dst = ssz.WriteOffset(dst, offset) + offset += t.Txs[ii].SizeSSZ() + } + } + for ii := 0; ii < len(t.Txs); ii++ { + if dst, err = t.Txs[ii].MarshalSSZTo(dst); err != nil { + return nil, err + } + } + + return dst, err +} + +// UnmarshalSSZ ssz unmarshals the Transactions object +func (t *Transactions) UnmarshalSSZ(buf []byte) error { + var err error + size := uint64(len(buf)) + if size < 4 { + return errSize + } + + tail := buf + var o0 uint64 + + // Offset (0) 'Txs' + if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { return errOffset } - // Offset (6) 'UserAgent' - if o6 = ssz.ReadOffset(buf[57:61]); o6 > size || o5 > o6 { + // Field (0) 'Txs' + { + buf = tail[o0:] + num, err := ssz.DecodeDynamicLength(buf, 20000) + if err != nil { + return err + } + t.Txs = make([]*Transaction, num) + err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { + if t.Txs[indx] == nil { + t.Txs[indx] = new(Transaction) + } + if err = t.Txs[indx].UnmarshalSSZ(buf); err != nil { + return err + } + return nil + }) + if err != nil { + return err + } + } + return err +} + +// SizeSSZ returns the ssz encoded size in bytes for the Transactions object +func (t *Transactions) SizeSSZ() (size int) { + size = 4 + + // Field (0) 'Txs' + for ii := 0; ii < len(t.Txs); ii++ { + size += 4 + size += t.Txs[ii].SizeSSZ() + } + + return +} + +// MarshalSSZ ssz marshals the GraphState object +func (g *GraphState) MarshalSSZ() ([]byte, error) { + buf := make([]byte, g.SizeSSZ()) + return g.MarshalSSZTo(buf[:0]) +} + +// MarshalSSZTo ssz marshals the GraphState object to a target array +func (g *GraphState) MarshalSSZTo(dst []byte) ([]byte, error) { + var err error + offset := int(20) + + // Field (0) 'Total' + dst = ssz.MarshalUint32(dst, g.Total) + + // Field (1) 'Layer' + dst = ssz.MarshalUint32(dst, g.Layer) + + // Field (2) 'MainHeight' + dst = ssz.MarshalUint32(dst, g.MainHeight) + + // Field (3) 'MainOrder' + dst = ssz.MarshalUint32(dst, g.MainOrder) + + // Offset (4) 'Tips' + dst = ssz.WriteOffset(dst, offset) + offset += len(g.Tips) * 32 + + // Field (4) 'Tips' + if len(g.Tips) > 100 { + return nil, errMarshalList + } + for ii := 0; ii < len(g.Tips); ii++ { + if dst, err = g.Tips[ii].MarshalSSZTo(dst); err != nil { + return nil, err + } + } + + return dst, err +} + +// UnmarshalSSZ ssz unmarshals the GraphState object +func (g *GraphState) UnmarshalSSZ(buf []byte) error { + var err error + size := uint64(len(buf)) + if size < 20 { + return errSize + } + + tail := buf + var o4 uint64 + + // Field (0) 'Total' + g.Total = ssz.UnmarshallUint32(buf[0:4]) + + // Field (1) 'Layer' + g.Layer = ssz.UnmarshallUint32(buf[4:8]) + + // Field (2) 'MainHeight' + g.MainHeight = ssz.UnmarshallUint32(buf[8:12]) + + // Field (3) 'MainOrder' + g.MainOrder = ssz.UnmarshallUint32(buf[12:16]) + + // Offset (4) 'Tips' + if o4 = ssz.ReadOffset(buf[16:20]); o4 > size { return errOffset } - // Field (5) 'GraphState' + // Field (4) 'Tips' { - buf = tail[o5:o6] - if c.GraphState == nil { - c.GraphState = new(GraphState) + buf = tail[o4:] + num, ok := ssz.DivideInt(len(buf), 32) + if !ok { + return errDivideInt } - if err = c.GraphState.UnmarshalSSZ(buf); err != nil { - return err + if num > 100 { + return errListTooBig + } + g.Tips = make([]*Hash, num) + for ii := 0; ii < num; ii++ { + if g.Tips[ii] == nil { + g.Tips[ii] = new(Hash) + } + if err = g.Tips[ii].UnmarshalSSZ(buf[ii*32 : (ii+1)*32]); err != nil { + return err + } } - } - - // Field (6) 'UserAgent' - { - buf = tail[o6:] - c.UserAgent = append(c.UserAgent, buf...) } return err } -// SizeSSZ returns the ssz encoded size in bytes for the ChainState object -func (c *ChainState) SizeSSZ() (size int) { - size = 61 - - // Field (5) 'GraphState' - if c.GraphState == nil { - c.GraphState = new(GraphState) - } - size += c.GraphState.SizeSSZ() +// SizeSSZ returns the ssz encoded size in bytes for the GraphState object +func (g *GraphState) SizeSSZ() (size int) { + size = 20 - // Field (6) 'UserAgent' - size += len(c.UserAgent) + // Field (4) 'Tips' + size += len(g.Tips) * 32 return } @@ -1070,36 +1377,32 @@ func (h *Hash) SizeSSZ() (size int) { return } -// MarshalSSZ ssz marshals the GetTxs object -func (g *GetTxs) MarshalSSZ() ([]byte, error) { - buf := make([]byte, g.SizeSSZ()) - return g.MarshalSSZTo(buf[:0]) +// MarshalSSZ ssz marshals the SyncQNR object +func (s *SyncQNR) MarshalSSZ() ([]byte, error) { + buf := make([]byte, s.SizeSSZ()) + return s.MarshalSSZTo(buf[:0]) } -// MarshalSSZTo ssz marshals the GetTxs object to a target array -func (g *GetTxs) MarshalSSZTo(dst []byte) ([]byte, error) { +// MarshalSSZTo ssz marshals the SyncQNR object to a target array +func (s *SyncQNR) MarshalSSZTo(dst []byte) ([]byte, error) { var err error offset := int(4) - // Offset (0) 'Txs' + // Offset (0) 'Qnr' dst = ssz.WriteOffset(dst, offset) - offset += len(g.Txs) * 32 + offset += len(s.Qnr) - // Field (0) 'Txs' - if len(g.Txs) > 20000 { - return nil, errMarshalList - } - for ii := 0; ii < len(g.Txs); ii++ { - if dst, err = g.Txs[ii].MarshalSSZTo(dst); err != nil { - return nil, err - } + // Field (0) 'Qnr' + if len(s.Qnr) > 300 { + return nil, errMarshalDynamicBytes } + dst = append(dst, s.Qnr...) return dst, err } -// UnmarshalSSZ ssz unmarshals the GetTxs object -func (g *GetTxs) UnmarshalSSZ(buf []byte) error { +// UnmarshalSSZ ssz unmarshals the SyncQNR object +func (s *SyncQNR) UnmarshalSSZ(buf []byte) error { var err error size := uint64(len(buf)) if size < 4 { @@ -1109,189 +1412,157 @@ func (g *GetTxs) UnmarshalSSZ(buf []byte) error { tail := buf var o0 uint64 - // Offset (0) 'Txs' + // Offset (0) 'Qnr' if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { return errOffset } - // Field (0) 'Txs' + // Field (0) 'Qnr' { buf = tail[o0:] - num, ok := ssz.DivideInt(len(buf), 32) - if !ok { - return errDivideInt - } - if num > 20000 { - return errListTooBig - } - g.Txs = make([]*Hash, num) - for ii := 0; ii < num; ii++ { - if g.Txs[ii] == nil { - g.Txs[ii] = new(Hash) - } - if err = g.Txs[ii].UnmarshalSSZ(buf[ii*32 : (ii+1)*32]); err != nil { - return err - } - } + s.Qnr = append(s.Qnr, buf...) } return err } -// SizeSSZ returns the ssz encoded size in bytes for the GetTxs object -func (g *GetTxs) SizeSSZ() (size int) { +// SizeSSZ returns the ssz encoded size in bytes for the SyncQNR object +func (s *SyncQNR) SizeSSZ() (size int) { size = 4 - // Field (0) 'Txs' - size += len(g.Txs) * 32 + // Field (0) 'Qnr' + size += len(s.Qnr) return } -// MarshalSSZ ssz marshals the Transaction object -func (t *Transaction) MarshalSSZ() ([]byte, error) { - buf := make([]byte, t.SizeSSZ()) - return t.MarshalSSZTo(buf[:0]) -} - -// MarshalSSZTo ssz marshals the Transaction object to a target array -func (t *Transaction) MarshalSSZTo(dst []byte) ([]byte, error) { - var err error - offset := int(4) - - // Offset (0) 'TxBytes' - dst = ssz.WriteOffset(dst, offset) - offset += len(t.TxBytes) - - // Field (0) 'TxBytes' - if len(t.TxBytes) > 1048576 { - return nil, errMarshalDynamicBytes - } - dst = append(dst, t.TxBytes...) - - return dst, err +// MarshalSSZ ssz marshals the ChainState object +func (c *ChainState) MarshalSSZ() ([]byte, error) { + buf := make([]byte, c.SizeSSZ()) + return c.MarshalSSZTo(buf[:0]) } -// UnmarshalSSZ ssz unmarshals the Transaction object -func (t *Transaction) UnmarshalSSZ(buf []byte) error { +// MarshalSSZTo ssz marshals the ChainState object to a target array +func (c *ChainState) MarshalSSZTo(dst []byte) ([]byte, error) { var err error - size := uint64(len(buf)) - if size < 4 { - return errSize - } - - tail := buf - var o0 uint64 + offset := int(61) - // Offset (0) 'TxBytes' - if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { - return errOffset + // Field (0) 'GenesisHash' + if c.GenesisHash == nil { + c.GenesisHash = new(Hash) } - - // Field (0) 'TxBytes' - { - buf = tail[o0:] - t.TxBytes = append(t.TxBytes, buf...) + if dst, err = c.GenesisHash.MarshalSSZTo(dst); err != nil { + return nil, err } - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the Transaction object -func (t *Transaction) SizeSSZ() (size int) { - size = 4 - // Field (0) 'TxBytes' - size += len(t.TxBytes) + // Field (1) 'ProtocolVersion' + dst = ssz.MarshalUint32(dst, c.ProtocolVersion) - return -} + // Field (2) 'Timestamp' + dst = ssz.MarshalUint64(dst, c.Timestamp) -// MarshalSSZ ssz marshals the Transactions object -func (t *Transactions) MarshalSSZ() ([]byte, error) { - buf := make([]byte, t.SizeSSZ()) - return t.MarshalSSZTo(buf[:0]) -} + // Field (3) 'Services' + dst = ssz.MarshalUint64(dst, c.Services) -// MarshalSSZTo ssz marshals the Transactions object to a target array -func (t *Transactions) MarshalSSZTo(dst []byte) ([]byte, error) { - var err error - offset := int(4) + // Field (4) 'DisableRelayTx' + dst = ssz.MarshalBool(dst, c.DisableRelayTx) - // Offset (0) 'Txs' + // Offset (5) 'GraphState' dst = ssz.WriteOffset(dst, offset) - for ii := 0; ii < len(t.Txs); ii++ { - offset += 4 - offset += t.Txs[ii].SizeSSZ() + if c.GraphState == nil { + c.GraphState = new(GraphState) } + offset += c.GraphState.SizeSSZ() - // Field (0) 'Txs' - if len(t.Txs) > 20000 { - return nil, errMarshalList - } - { - offset = 4 * len(t.Txs) - for ii := 0; ii < len(t.Txs); ii++ { - dst = ssz.WriteOffset(dst, offset) - offset += t.Txs[ii].SizeSSZ() - } + // Offset (6) 'UserAgent' + dst = ssz.WriteOffset(dst, offset) + offset += len(c.UserAgent) + + // Field (5) 'GraphState' + if dst, err = c.GraphState.MarshalSSZTo(dst); err != nil { + return nil, err } - for ii := 0; ii < len(t.Txs); ii++ { - if dst, err = t.Txs[ii].MarshalSSZTo(dst); err != nil { - return nil, err - } + + // Field (6) 'UserAgent' + if len(c.UserAgent) > 256 { + return nil, errMarshalDynamicBytes } + dst = append(dst, c.UserAgent...) return dst, err } -// UnmarshalSSZ ssz unmarshals the Transactions object -func (t *Transactions) UnmarshalSSZ(buf []byte) error { +// UnmarshalSSZ ssz unmarshals the ChainState object +func (c *ChainState) UnmarshalSSZ(buf []byte) error { var err error size := uint64(len(buf)) - if size < 4 { + if size < 61 { return errSize } tail := buf - var o0 uint64 + var o5, o6 uint64 - // Offset (0) 'Txs' - if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { + // Field (0) 'GenesisHash' + if c.GenesisHash == nil { + c.GenesisHash = new(Hash) + } + if err = c.GenesisHash.UnmarshalSSZ(buf[0:32]); err != nil { + return err + } + + // Field (1) 'ProtocolVersion' + c.ProtocolVersion = ssz.UnmarshallUint32(buf[32:36]) + + // Field (2) 'Timestamp' + c.Timestamp = ssz.UnmarshallUint64(buf[36:44]) + + // Field (3) 'Services' + c.Services = ssz.UnmarshallUint64(buf[44:52]) + + // Field (4) 'DisableRelayTx' + c.DisableRelayTx = ssz.UnmarshalBool(buf[52:53]) + + // Offset (5) 'GraphState' + if o5 = ssz.ReadOffset(buf[53:57]); o5 > size { + return errOffset + } + + // Offset (6) 'UserAgent' + if o6 = ssz.ReadOffset(buf[57:61]); o6 > size || o5 > o6 { return errOffset } - // Field (0) 'Txs' + // Field (5) 'GraphState' { - buf = tail[o0:] - num, err := ssz.DecodeDynamicLength(buf, 20000) - if err != nil { - return err + buf = tail[o5:o6] + if c.GraphState == nil { + c.GraphState = new(GraphState) } - t.Txs = make([]*Transaction, num) - err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { - if t.Txs[indx] == nil { - t.Txs[indx] = new(Transaction) - } - if err = t.Txs[indx].UnmarshalSSZ(buf); err != nil { - return err - } - return nil - }) - if err != nil { + if err = c.GraphState.UnmarshalSSZ(buf); err != nil { return err } } + + // Field (6) 'UserAgent' + { + buf = tail[o6:] + c.UserAgent = append(c.UserAgent, buf...) + } return err } -// SizeSSZ returns the ssz encoded size in bytes for the Transactions object -func (t *Transactions) SizeSSZ() (size int) { - size = 4 +// SizeSSZ returns the ssz encoded size in bytes for the ChainState object +func (c *ChainState) SizeSSZ() (size int) { + size = 61 - // Field (0) 'Txs' - for ii := 0; ii < len(t.Txs); ii++ { - size += 4 - size += t.Txs[ii].SizeSSZ() + // Field (5) 'GraphState' + if c.GraphState == nil { + c.GraphState = new(GraphState) } + size += c.GraphState.SizeSSZ() + + // Field (6) 'UserAgent' + size += len(c.UserAgent) return } @@ -1368,125 +1639,27 @@ func (m *MemPoolRespond) SizeSSZ() (size int) { return } -// MarshalSSZ ssz marshals the StateRootReq object -func (s *StateRootReq) MarshalSSZ() ([]byte, error) { - buf := make([]byte, s.SizeSSZ()) - return s.MarshalSSZTo(buf[:0]) -} - -// MarshalSSZTo ssz marshals the StateRootReq object to a target array -func (s *StateRootReq) MarshalSSZTo(dst []byte) ([]byte, error) { - var err error - - // Field (0) 'Block' - if s.Block == nil { - s.Block = new(Hash) - } - if dst, err = s.Block.MarshalSSZTo(dst); err != nil { - return nil, err - } - - return dst, err -} - -// UnmarshalSSZ ssz unmarshals the StateRootReq object -func (s *StateRootReq) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size != 32 { - return errSize - } - - // Field (0) 'Block' - if s.Block == nil { - s.Block = new(Hash) - } - if err = s.Block.UnmarshalSSZ(buf[0:32]); err != nil { - return err - } - - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the StateRootReq object -func (s *StateRootReq) SizeSSZ() (size int) { - size = 32 - return -} - -// MarshalSSZ ssz marshals the StateRootRsp object -func (s *StateRootRsp) MarshalSSZ() ([]byte, error) { - buf := make([]byte, s.SizeSSZ()) - return s.MarshalSSZTo(buf[:0]) -} - -// MarshalSSZTo ssz marshals the StateRootRsp object to a target array -func (s *StateRootRsp) MarshalSSZTo(dst []byte) ([]byte, error) { - var err error - - // Field (0) 'Root' - if s.Root == nil { - s.Root = new(Hash) - } - if dst, err = s.Root.MarshalSSZTo(dst); err != nil { - return nil, err - } - - // Field (1) 'Has' - dst = ssz.MarshalBool(dst, s.Has) - - return dst, err -} - -// UnmarshalSSZ ssz unmarshals the StateRootRsp object -func (s *StateRootRsp) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size != 33 { - return errSize - } - - // Field (0) 'Root' - if s.Root == nil { - s.Root = new(Hash) - } - if err = s.Root.UnmarshalSSZ(buf[0:32]); err != nil { - return err - } - - // Field (1) 'Has' - s.Has = ssz.UnmarshalBool(buf[32:33]) - - return err -} - -// SizeSSZ returns the ssz encoded size in bytes for the StateRootRsp object -func (s *StateRootRsp) SizeSSZ() (size int) { - size = 33 - return -} - -// MarshalSSZ ssz marshals the Inventory object -func (i *Inventory) MarshalSSZ() ([]byte, error) { - buf := make([]byte, i.SizeSSZ()) - return i.MarshalSSZTo(buf[:0]) +// MarshalSSZ ssz marshals the GetBlocks object +func (g *GetBlocks) MarshalSSZ() ([]byte, error) { + buf := make([]byte, g.SizeSSZ()) + return g.MarshalSSZTo(buf[:0]) } -// MarshalSSZTo ssz marshals the Inventory object to a target array -func (i *Inventory) MarshalSSZTo(dst []byte) ([]byte, error) { +// MarshalSSZTo ssz marshals the GetBlocks object to a target array +func (g *GetBlocks) MarshalSSZTo(dst []byte) ([]byte, error) { var err error offset := int(4) - // Offset (0) 'Invs' + // Offset (0) 'Locator' dst = ssz.WriteOffset(dst, offset) - offset += len(i.Invs) * 36 + offset += len(g.Locator) * 32 - // Field (0) 'Invs' - if len(i.Invs) > 20000 { + // Field (0) 'Locator' + if len(g.Locator) > 2000 { return nil, errMarshalList } - for ii := 0; ii < len(i.Invs); ii++ { - if dst, err = i.Invs[ii].MarshalSSZTo(dst); err != nil { + for ii := 0; ii < len(g.Locator); ii++ { + if dst, err = g.Locator[ii].MarshalSSZTo(dst); err != nil { return nil, err } } @@ -1494,8 +1667,8 @@ func (i *Inventory) MarshalSSZTo(dst []byte) ([]byte, error) { return dst, err } -// UnmarshalSSZ ssz unmarshals the Inventory object -func (i *Inventory) UnmarshalSSZ(buf []byte) error { +// UnmarshalSSZ ssz unmarshals the GetBlocks object +func (g *GetBlocks) UnmarshalSSZ(buf []byte) error { var err error size := uint64(len(buf)) if size < 4 { @@ -1505,27 +1678,27 @@ func (i *Inventory) UnmarshalSSZ(buf []byte) error { tail := buf var o0 uint64 - // Offset (0) 'Invs' + // Offset (0) 'Locator' if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { return errOffset } - // Field (0) 'Invs' + // Field (0) 'Locator' { buf = tail[o0:] - num, ok := ssz.DivideInt(len(buf), 36) + num, ok := ssz.DivideInt(len(buf), 32) if !ok { return errDivideInt } - if num > 20000 { + if num > 2000 { return errListTooBig } - i.Invs = make([]*InvVect, num) + g.Locator = make([]*Hash, num) for ii := 0; ii < num; ii++ { - if i.Invs[ii] == nil { - i.Invs[ii] = new(InvVect) + if g.Locator[ii] == nil { + g.Locator[ii] = new(Hash) } - if err = i.Invs[ii].UnmarshalSSZ(buf[ii*36 : (ii+1)*36]); err != nil { + if err = g.Locator[ii].UnmarshalSSZ(buf[ii*32 : (ii+1)*32]); err != nil { return err } } @@ -1533,94 +1706,46 @@ func (i *Inventory) UnmarshalSSZ(buf []byte) error { return err } -// SizeSSZ returns the ssz encoded size in bytes for the Inventory object -func (i *Inventory) SizeSSZ() (size int) { +// SizeSSZ returns the ssz encoded size in bytes for the GetBlocks object +func (g *GetBlocks) SizeSSZ() (size int) { size = 4 - // Field (0) 'Invs' - size += len(i.Invs) * 36 - - return -} - -// MarshalSSZ ssz marshals the InvVect object -func (i *InvVect) MarshalSSZ() ([]byte, error) { - buf := make([]byte, i.SizeSSZ()) - return i.MarshalSSZTo(buf[:0]) -} - -// MarshalSSZTo ssz marshals the InvVect object to a target array -func (i *InvVect) MarshalSSZTo(dst []byte) ([]byte, error) { - var err error - - // Field (0) 'Type' - dst = ssz.MarshalUint32(dst, i.Type) - - // Field (1) 'Hash' - if i.Hash == nil { - i.Hash = new(Hash) - } - if dst, err = i.Hash.MarshalSSZTo(dst); err != nil { - return nil, err - } - - return dst, err -} - -// UnmarshalSSZ ssz unmarshals the InvVect object -func (i *InvVect) UnmarshalSSZ(buf []byte) error { - var err error - size := uint64(len(buf)) - if size != 36 { - return errSize - } - - // Field (0) 'Type' - i.Type = ssz.UnmarshallUint32(buf[0:4]) - - // Field (1) 'Hash' - if i.Hash == nil { - i.Hash = new(Hash) - } - if err = i.Hash.UnmarshalSSZ(buf[4:36]); err != nil { - return err - } - - return err -} + // Field (0) 'Locator' + size += len(g.Locator) * 32 -// SizeSSZ returns the ssz encoded size in bytes for the InvVect object -func (i *InvVect) SizeSSZ() (size int) { - size = 36 return } -// MarshalSSZ ssz marshals the FilterAddRequest object -func (f *FilterAddRequest) MarshalSSZ() ([]byte, error) { - buf := make([]byte, f.SizeSSZ()) - return f.MarshalSSZTo(buf[:0]) +// MarshalSSZ ssz marshals the DagBlocks object +func (d *DagBlocks) MarshalSSZ() ([]byte, error) { + buf := make([]byte, d.SizeSSZ()) + return d.MarshalSSZTo(buf[:0]) } -// MarshalSSZTo ssz marshals the FilterAddRequest object to a target array -func (f *FilterAddRequest) MarshalSSZTo(dst []byte) ([]byte, error) { +// MarshalSSZTo ssz marshals the DagBlocks object to a target array +func (d *DagBlocks) MarshalSSZTo(dst []byte) ([]byte, error) { var err error offset := int(4) - // Offset (0) 'Data' + // Offset (0) 'Blocks' dst = ssz.WriteOffset(dst, offset) - offset += len(f.Data) + offset += len(d.Blocks) * 32 - // Field (0) 'Data' - if len(f.Data) > 256 { - return nil, errMarshalDynamicBytes + // Field (0) 'Blocks' + if len(d.Blocks) > 2000 { + return nil, errMarshalList + } + for ii := 0; ii < len(d.Blocks); ii++ { + if dst, err = d.Blocks[ii].MarshalSSZTo(dst); err != nil { + return nil, err + } } - dst = append(dst, f.Data...) return dst, err } -// UnmarshalSSZ ssz unmarshals the FilterAddRequest object -func (f *FilterAddRequest) UnmarshalSSZ(buf []byte) error { +// UnmarshalSSZ ssz unmarshals the DagBlocks object +func (d *DagBlocks) UnmarshalSSZ(buf []byte) error { var err error size := uint64(len(buf)) if size < 4 { @@ -1630,287 +1755,250 @@ func (f *FilterAddRequest) UnmarshalSSZ(buf []byte) error { tail := buf var o0 uint64 - // Offset (0) 'Data' + // Offset (0) 'Blocks' if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { return errOffset } - // Field (0) 'Data' + // Field (0) 'Blocks' { buf = tail[o0:] - f.Data = append(f.Data, buf...) + num, ok := ssz.DivideInt(len(buf), 32) + if !ok { + return errDivideInt + } + if num > 2000 { + return errListTooBig + } + d.Blocks = make([]*Hash, num) + for ii := 0; ii < num; ii++ { + if d.Blocks[ii] == nil { + d.Blocks[ii] = new(Hash) + } + if err = d.Blocks[ii].UnmarshalSSZ(buf[ii*32 : (ii+1)*32]); err != nil { + return err + } + } } return err } -// SizeSSZ returns the ssz encoded size in bytes for the FilterAddRequest object -func (f *FilterAddRequest) SizeSSZ() (size int) { +// SizeSSZ returns the ssz encoded size in bytes for the DagBlocks object +func (d *DagBlocks) SizeSSZ() (size int) { size = 4 - // Field (0) 'Data' - size += len(f.Data) + // Field (0) 'Blocks' + size += len(d.Blocks) * 32 return } -// MarshalSSZ ssz marshals the FilterClearRequest object -func (f *FilterClearRequest) MarshalSSZ() ([]byte, error) { - buf := make([]byte, f.SizeSSZ()) - return f.MarshalSSZTo(buf[:0]) +// MarshalSSZ ssz marshals the StateRootReq object +func (s *StateRootReq) MarshalSSZ() ([]byte, error) { + buf := make([]byte, s.SizeSSZ()) + return s.MarshalSSZTo(buf[:0]) } -// MarshalSSZTo ssz marshals the FilterClearRequest object to a target array -func (f *FilterClearRequest) MarshalSSZTo(dst []byte) ([]byte, error) { +// MarshalSSZTo ssz marshals the StateRootReq object to a target array +func (s *StateRootReq) MarshalSSZTo(dst []byte) ([]byte, error) { var err error + // Field (0) 'Block' + if s.Block == nil { + s.Block = new(Hash) + } + if dst, err = s.Block.MarshalSSZTo(dst); err != nil { + return nil, err + } + return dst, err } -// UnmarshalSSZ ssz unmarshals the FilterClearRequest object -func (f *FilterClearRequest) UnmarshalSSZ(buf []byte) error { +// UnmarshalSSZ ssz unmarshals the StateRootReq object +func (s *StateRootReq) UnmarshalSSZ(buf []byte) error { var err error size := uint64(len(buf)) - if size != 0 { + if size != 32 { return errSize } + // Field (0) 'Block' + if s.Block == nil { + s.Block = new(Hash) + } + if err = s.Block.UnmarshalSSZ(buf[0:32]); err != nil { + return err + } + return err } -// SizeSSZ returns the ssz encoded size in bytes for the FilterClearRequest object -func (f *FilterClearRequest) SizeSSZ() (size int) { - size = 0 +// SizeSSZ returns the ssz encoded size in bytes for the StateRootReq object +func (s *StateRootReq) SizeSSZ() (size int) { + size = 32 return } -// MarshalSSZ ssz marshals the FilterLoadRequest object -func (f *FilterLoadRequest) MarshalSSZ() ([]byte, error) { - buf := make([]byte, f.SizeSSZ()) - return f.MarshalSSZTo(buf[:0]) +// MarshalSSZ ssz marshals the StateRootRsp object +func (s *StateRootRsp) MarshalSSZ() ([]byte, error) { + buf := make([]byte, s.SizeSSZ()) + return s.MarshalSSZTo(buf[:0]) } -// MarshalSSZTo ssz marshals the FilterLoadRequest object to a target array -func (f *FilterLoadRequest) MarshalSSZTo(dst []byte) ([]byte, error) { +// MarshalSSZTo ssz marshals the StateRootRsp object to a target array +func (s *StateRootRsp) MarshalSSZTo(dst []byte) ([]byte, error) { var err error - offset := int(28) - - // Offset (0) 'Filter' - dst = ssz.WriteOffset(dst, offset) - offset += len(f.Filter) - - // Field (1) 'HashFuncs' - dst = ssz.MarshalUint64(dst, f.HashFuncs) - - // Field (2) 'Tweak' - dst = ssz.MarshalUint64(dst, f.Tweak) - - // Field (3) 'Flags' - dst = ssz.MarshalUint64(dst, f.Flags) - // Field (0) 'Filter' - if len(f.Filter) > 256 { - return nil, errMarshalDynamicBytes + // Field (0) 'Root' + if s.Root == nil { + s.Root = new(Hash) } - dst = append(dst, f.Filter...) + if dst, err = s.Root.MarshalSSZTo(dst); err != nil { + return nil, err + } + + // Field (1) 'Has' + dst = ssz.MarshalBool(dst, s.Has) return dst, err } -// UnmarshalSSZ ssz unmarshals the FilterLoadRequest object -func (f *FilterLoadRequest) UnmarshalSSZ(buf []byte) error { +// UnmarshalSSZ ssz unmarshals the StateRootRsp object +func (s *StateRootRsp) UnmarshalSSZ(buf []byte) error { var err error size := uint64(len(buf)) - if size < 28 { + if size != 33 { return errSize } - tail := buf - var o0 uint64 - - // Offset (0) 'Filter' - if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { - return errOffset + // Field (0) 'Root' + if s.Root == nil { + s.Root = new(Hash) + } + if err = s.Root.UnmarshalSSZ(buf[0:32]); err != nil { + return err } - // Field (1) 'HashFuncs' - f.HashFuncs = ssz.UnmarshallUint64(buf[4:12]) - - // Field (2) 'Tweak' - f.Tweak = ssz.UnmarshallUint64(buf[12:20]) - - // Field (3) 'Flags' - f.Flags = ssz.UnmarshallUint64(buf[20:28]) + // Field (1) 'Has' + s.Has = ssz.UnmarshalBool(buf[32:33]) - // Field (0) 'Filter' - { - buf = tail[o0:] - f.Filter = append(f.Filter, buf...) - } return err } -// SizeSSZ returns the ssz encoded size in bytes for the FilterLoadRequest object -func (f *FilterLoadRequest) SizeSSZ() (size int) { - size = 28 - - // Field (0) 'Filter' - size += len(f.Filter) - +// SizeSSZ returns the ssz encoded size in bytes for the StateRootRsp object +func (s *StateRootRsp) SizeSSZ() (size int) { + size = 33 return } -// MarshalSSZ ssz marshals the SyncDAG object -func (s *SyncDAG) MarshalSSZ() ([]byte, error) { - buf := make([]byte, s.SizeSSZ()) - return s.MarshalSSZTo(buf[:0]) +// MarshalSSZ ssz marshals the GetBlockDatas object +func (g *GetBlockDatas) MarshalSSZ() ([]byte, error) { + buf := make([]byte, g.SizeSSZ()) + return g.MarshalSSZTo(buf[:0]) } -// MarshalSSZTo ssz marshals the SyncDAG object to a target array -func (s *SyncDAG) MarshalSSZTo(dst []byte) ([]byte, error) { +// MarshalSSZTo ssz marshals the GetBlockDatas object to a target array +func (g *GetBlockDatas) MarshalSSZTo(dst []byte) ([]byte, error) { var err error - offset := int(8) - - // Offset (0) 'MainLocator' - dst = ssz.WriteOffset(dst, offset) - offset += len(s.MainLocator) * 32 + offset := int(4) - // Offset (1) 'GraphState' + // Offset (0) 'Locator' dst = ssz.WriteOffset(dst, offset) - if s.GraphState == nil { - s.GraphState = new(GraphState) - } - offset += s.GraphState.SizeSSZ() + offset += len(g.Locator) * 32 - // Field (0) 'MainLocator' - if len(s.MainLocator) > 32 { + // Field (0) 'Locator' + if len(g.Locator) > 2000 { return nil, errMarshalList } - for ii := 0; ii < len(s.MainLocator); ii++ { - if dst, err = s.MainLocator[ii].MarshalSSZTo(dst); err != nil { + for ii := 0; ii < len(g.Locator); ii++ { + if dst, err = g.Locator[ii].MarshalSSZTo(dst); err != nil { return nil, err } } - // Field (1) 'GraphState' - if dst, err = s.GraphState.MarshalSSZTo(dst); err != nil { - return nil, err - } - return dst, err } -// UnmarshalSSZ ssz unmarshals the SyncDAG object -func (s *SyncDAG) UnmarshalSSZ(buf []byte) error { +// UnmarshalSSZ ssz unmarshals the GetBlockDatas object +func (g *GetBlockDatas) UnmarshalSSZ(buf []byte) error { var err error size := uint64(len(buf)) - if size < 8 { + if size < 4 { return errSize } tail := buf - var o0, o1 uint64 + var o0 uint64 - // Offset (0) 'MainLocator' + // Offset (0) 'Locator' if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { return errOffset } - // Offset (1) 'GraphState' - if o1 = ssz.ReadOffset(buf[4:8]); o1 > size || o0 > o1 { - return errOffset - } - - // Field (0) 'MainLocator' + // Field (0) 'Locator' { - buf = tail[o0:o1] + buf = tail[o0:] num, ok := ssz.DivideInt(len(buf), 32) if !ok { return errDivideInt } - if num > 32 { + if num > 2000 { return errListTooBig } - s.MainLocator = make([]*Hash, num) + g.Locator = make([]*Hash, num) for ii := 0; ii < num; ii++ { - if s.MainLocator[ii] == nil { - s.MainLocator[ii] = new(Hash) - } - if err = s.MainLocator[ii].UnmarshalSSZ(buf[ii*32 : (ii+1)*32]); err != nil { - return err - } - } - } - - // Field (1) 'GraphState' - { - buf = tail[o1:] - if s.GraphState == nil { - s.GraphState = new(GraphState) - } - if err = s.GraphState.UnmarshalSSZ(buf); err != nil { - return err + if g.Locator[ii] == nil { + g.Locator[ii] = new(Hash) + } + if err = g.Locator[ii].UnmarshalSSZ(buf[ii*32 : (ii+1)*32]); err != nil { + return err + } } } return err } -// SizeSSZ returns the ssz encoded size in bytes for the SyncDAG object -func (s *SyncDAG) SizeSSZ() (size int) { - size = 8 - - // Field (0) 'MainLocator' - size += len(s.MainLocator) * 32 +// SizeSSZ returns the ssz encoded size in bytes for the GetBlockDatas object +func (g *GetBlockDatas) SizeSSZ() (size int) { + size = 4 - // Field (1) 'GraphState' - if s.GraphState == nil { - s.GraphState = new(GraphState) - } - size += s.GraphState.SizeSSZ() + // Field (0) 'Locator' + size += len(g.Locator) * 32 return } -// MarshalSSZ ssz marshals the SubDAG object -func (s *SubDAG) MarshalSSZ() ([]byte, error) { - buf := make([]byte, s.SizeSSZ()) - return s.MarshalSSZTo(buf[:0]) +// MarshalSSZ ssz marshals the BlockDatas object +func (b *BlockDatas) MarshalSSZ() ([]byte, error) { + buf := make([]byte, b.SizeSSZ()) + return b.MarshalSSZTo(buf[:0]) } -// MarshalSSZTo ssz marshals the SubDAG object to a target array -func (s *SubDAG) MarshalSSZTo(dst []byte) ([]byte, error) { +// MarshalSSZTo ssz marshals the BlockDatas object to a target array +func (b *BlockDatas) MarshalSSZTo(dst []byte) ([]byte, error) { var err error - offset := int(40) - - // Field (0) 'SyncPoint' - if s.SyncPoint == nil { - s.SyncPoint = new(Hash) - } - if dst, err = s.SyncPoint.MarshalSSZTo(dst); err != nil { - return nil, err - } - - // Offset (1) 'GraphState' - dst = ssz.WriteOffset(dst, offset) - if s.GraphState == nil { - s.GraphState = new(GraphState) - } - offset += s.GraphState.SizeSSZ() + offset := int(4) - // Offset (2) 'Blocks' + // Offset (0) 'Locator' dst = ssz.WriteOffset(dst, offset) - offset += len(s.Blocks) * 32 - - // Field (1) 'GraphState' - if dst, err = s.GraphState.MarshalSSZTo(dst); err != nil { - return nil, err + for ii := 0; ii < len(b.Locator); ii++ { + offset += 4 + offset += b.Locator[ii].SizeSSZ() } - // Field (2) 'Blocks' - if len(s.Blocks) > 2000 { + // Field (0) 'Locator' + if len(b.Locator) > 2000 { return nil, errMarshalList } - for ii := 0; ii < len(s.Blocks); ii++ { - if dst, err = s.Blocks[ii].MarshalSSZTo(dst); err != nil { + { + offset = 4 * len(b.Locator) + for ii := 0; ii < len(b.Locator); ii++ { + dst = ssz.WriteOffset(dst, offset) + offset += b.Locator[ii].SizeSSZ() + } + } + for ii := 0; ii < len(b.Locator); ii++ { + if dst, err = b.Locator[ii].MarshalSSZTo(dst); err != nil { return nil, err } } @@ -1918,173 +2006,145 @@ func (s *SubDAG) MarshalSSZTo(dst []byte) ([]byte, error) { return dst, err } -// UnmarshalSSZ ssz unmarshals the SubDAG object -func (s *SubDAG) UnmarshalSSZ(buf []byte) error { +// UnmarshalSSZ ssz unmarshals the BlockDatas object +func (b *BlockDatas) UnmarshalSSZ(buf []byte) error { var err error size := uint64(len(buf)) - if size < 40 { + if size < 4 { return errSize } tail := buf - var o1, o2 uint64 - - // Field (0) 'SyncPoint' - if s.SyncPoint == nil { - s.SyncPoint = new(Hash) - } - if err = s.SyncPoint.UnmarshalSSZ(buf[0:32]); err != nil { - return err - } - - // Offset (1) 'GraphState' - if o1 = ssz.ReadOffset(buf[32:36]); o1 > size { - return errOffset - } + var o0 uint64 - // Offset (2) 'Blocks' - if o2 = ssz.ReadOffset(buf[36:40]); o2 > size || o1 > o2 { + // Offset (0) 'Locator' + if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { return errOffset } - // Field (1) 'GraphState' + // Field (0) 'Locator' { - buf = tail[o1:o2] - if s.GraphState == nil { - s.GraphState = new(GraphState) - } - if err = s.GraphState.UnmarshalSSZ(buf); err != nil { + buf = tail[o0:] + num, err := ssz.DecodeDynamicLength(buf, 2000) + if err != nil { return err } - } - - // Field (2) 'Blocks' - { - buf = tail[o2:] - num, ok := ssz.DivideInt(len(buf), 32) - if !ok { - return errDivideInt - } - if num > 2000 { - return errListTooBig - } - s.Blocks = make([]*Hash, num) - for ii := 0; ii < num; ii++ { - if s.Blocks[ii] == nil { - s.Blocks[ii] = new(Hash) + b.Locator = make([]*BlockData, num) + err = ssz.UnmarshalDynamic(buf, num, func(indx int, buf []byte) (err error) { + if b.Locator[indx] == nil { + b.Locator[indx] = new(BlockData) } - if err = s.Blocks[ii].UnmarshalSSZ(buf[ii*32 : (ii+1)*32]); err != nil { + if err = b.Locator[indx].UnmarshalSSZ(buf); err != nil { return err } + return nil + }) + if err != nil { + return err } } return err } -// SizeSSZ returns the ssz encoded size in bytes for the SubDAG object -func (s *SubDAG) SizeSSZ() (size int) { - size = 40 +// SizeSSZ returns the ssz encoded size in bytes for the BlockDatas object +func (b *BlockDatas) SizeSSZ() (size int) { + size = 4 - // Field (1) 'GraphState' - if s.GraphState == nil { - s.GraphState = new(GraphState) + // Field (0) 'Locator' + for ii := 0; ii < len(b.Locator); ii++ { + size += 4 + size += b.Locator[ii].SizeSSZ() } - size += s.GraphState.SizeSSZ() - - // Field (2) 'Blocks' - size += len(s.Blocks) * 32 return } -// MarshalSSZ ssz marshals the ContinueSyncDAG object -func (c *ContinueSyncDAG) MarshalSSZ() ([]byte, error) { - buf := make([]byte, c.SizeSSZ()) - return c.MarshalSSZTo(buf[:0]) +// MarshalSSZ ssz marshals the BlockData object +func (b *BlockData) MarshalSSZ() ([]byte, error) { + buf := make([]byte, b.SizeSSZ()) + return b.MarshalSSZTo(buf[:0]) } -// MarshalSSZTo ssz marshals the ContinueSyncDAG object to a target array -func (c *ContinueSyncDAG) MarshalSSZTo(dst []byte) ([]byte, error) { +// MarshalSSZTo ssz marshals the BlockData object to a target array +func (b *BlockData) MarshalSSZTo(dst []byte) ([]byte, error) { var err error + offset := int(4) - // Field (0) 'SyncPoint' - if c.SyncPoint == nil { - c.SyncPoint = new(Hash) - } - if dst, err = c.SyncPoint.MarshalSSZTo(dst); err != nil { - return nil, err - } + // Offset (0) 'BlockBytes' + dst = ssz.WriteOffset(dst, offset) + offset += len(b.BlockBytes) - // Field (1) 'Start' - if c.Start == nil { - c.Start = new(Hash) - } - if dst, err = c.Start.MarshalSSZTo(dst); err != nil { - return nil, err + // Field (0) 'BlockBytes' + if len(b.BlockBytes) > 1048576 { + return nil, errMarshalDynamicBytes } + dst = append(dst, b.BlockBytes...) return dst, err } -// UnmarshalSSZ ssz unmarshals the ContinueSyncDAG object -func (c *ContinueSyncDAG) UnmarshalSSZ(buf []byte) error { +// UnmarshalSSZ ssz unmarshals the BlockData object +func (b *BlockData) UnmarshalSSZ(buf []byte) error { var err error size := uint64(len(buf)) - if size != 64 { + if size < 4 { return errSize } - // Field (0) 'SyncPoint' - if c.SyncPoint == nil { - c.SyncPoint = new(Hash) - } - if err = c.SyncPoint.UnmarshalSSZ(buf[0:32]); err != nil { - return err - } + tail := buf + var o0 uint64 - // Field (1) 'Start' - if c.Start == nil { - c.Start = new(Hash) - } - if err = c.Start.UnmarshalSSZ(buf[32:64]); err != nil { - return err + // Offset (0) 'BlockBytes' + if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { + return errOffset } + // Field (0) 'BlockBytes' + { + buf = tail[o0:] + b.BlockBytes = append(b.BlockBytes, buf...) + } return err } -// SizeSSZ returns the ssz encoded size in bytes for the ContinueSyncDAG object -func (c *ContinueSyncDAG) SizeSSZ() (size int) { - size = 64 +// SizeSSZ returns the ssz encoded size in bytes for the BlockData object +func (b *BlockData) SizeSSZ() (size int) { + size = 4 + + // Field (0) 'BlockBytes' + size += len(b.BlockBytes) + return } -// MarshalSSZ ssz marshals the SyncQNR object -func (s *SyncQNR) MarshalSSZ() ([]byte, error) { - buf := make([]byte, s.SizeSSZ()) - return s.MarshalSSZTo(buf[:0]) +// MarshalSSZ ssz marshals the BroadcastBlock object +func (b *BroadcastBlock) MarshalSSZ() ([]byte, error) { + buf := make([]byte, b.SizeSSZ()) + return b.MarshalSSZTo(buf[:0]) } -// MarshalSSZTo ssz marshals the SyncQNR object to a target array -func (s *SyncQNR) MarshalSSZTo(dst []byte) ([]byte, error) { +// MarshalSSZTo ssz marshals the BroadcastBlock object to a target array +func (b *BroadcastBlock) MarshalSSZTo(dst []byte) ([]byte, error) { var err error offset := int(4) - // Offset (0) 'Qnr' + // Offset (0) 'Block' dst = ssz.WriteOffset(dst, offset) - offset += len(s.Qnr) + if b.Block == nil { + b.Block = new(BlockData) + } + offset += b.Block.SizeSSZ() - // Field (0) 'Qnr' - if len(s.Qnr) > 300 { - return nil, errMarshalDynamicBytes + // Field (0) 'Block' + if dst, err = b.Block.MarshalSSZTo(dst); err != nil { + return nil, err } - dst = append(dst, s.Qnr...) return dst, err } -// UnmarshalSSZ ssz unmarshals the SyncQNR object -func (s *SyncQNR) UnmarshalSSZ(buf []byte) error { +// UnmarshalSSZ ssz unmarshals the BroadcastBlock object +func (b *BroadcastBlock) UnmarshalSSZ(buf []byte) error { var err error size := uint64(len(buf)) if size < 4 { @@ -2094,25 +2154,33 @@ func (s *SyncQNR) UnmarshalSSZ(buf []byte) error { tail := buf var o0 uint64 - // Offset (0) 'Qnr' + // Offset (0) 'Block' if o0 = ssz.ReadOffset(buf[0:4]); o0 > size { return errOffset } - // Field (0) 'Qnr' + // Field (0) 'Block' { buf = tail[o0:] - s.Qnr = append(s.Qnr, buf...) + if b.Block == nil { + b.Block = new(BlockData) + } + if err = b.Block.UnmarshalSSZ(buf); err != nil { + return err + } } return err } -// SizeSSZ returns the ssz encoded size in bytes for the SyncQNR object -func (s *SyncQNR) SizeSSZ() (size int) { +// SizeSSZ returns the ssz encoded size in bytes for the BroadcastBlock object +func (b *BroadcastBlock) SizeSSZ() (size int) { size = 4 - // Field (0) 'Qnr' - size += len(s.Qnr) + // Field (0) 'Block' + if b.Block == nil { + b.Block = new(BlockData) + } + size += b.Block.SizeSSZ() return } diff --git a/p2p/service.go b/p2p/service.go index 0fdb6c9d..e78b3497 100644 --- a/p2p/service.go +++ b/p2p/service.go @@ -11,6 +11,7 @@ import ( "github.com/Qitmeer/qng/core/event" "github.com/Qitmeer/qng/core/json" pv "github.com/Qitmeer/qng/core/protocol" + "github.com/Qitmeer/qng/core/types" "github.com/Qitmeer/qng/node/service" "github.com/Qitmeer/qng/p2p/common" "github.com/Qitmeer/qng/p2p/discover" @@ -479,6 +480,30 @@ func (s *Service) BroadcastMessage(data interface{}) { } +func (s *Service) BroadcastBlock(block *types.SerializedBlock, source *peer.ID) error { + for _, pe := range s.Peers().CanSyncPeers() { + if source != nil { + if pe.GetID() == *source { + continue + } + } + if pe.ChainState().ProtocolVersion < uint32(pv.BroadcastblockProtocolVersion) { + continue + } + go func(pe *peers.Peer) { + blockBytes, err := block.Bytes() + if err != nil { + log.Error(err.Error()) + return + } + if _, err := s.sy.Send(pe, synch.RPCBroadcastBlock, &pb.BroadcastBlock{Block: &pb.BlockData{BlockBytes: blockBytes}}); err != nil { + log.Error(err.Error()) + } + }(pe) + } + return nil +} + func (s *Service) GetBanlist() map[peer.ID][]*json.BadResponse { result := map[peer.ID][]*json.BadResponse{} bads := s.Peers().Bad() diff --git a/p2p/synch/getblockdatas.go b/p2p/synch/getblockdatas.go index 1c9c01a8..6dedac11 100644 --- a/p2p/synch/getblockdatas.go +++ b/p2p/synch/getblockdatas.go @@ -231,7 +231,7 @@ func (ps *PeerSync) processGetBlockDatas(pe *peers.Peer, blocks []*hash.Hash) *P block = b.Block } // - _, IsOrphan, err := ps.sy.p2p.BlockChain().ProcessBlock(block, behaviorFlags) + _, IsOrphan, err := ps.sy.p2p.BlockChain().ProcessBlock(block, behaviorFlags, nil) if err != nil { log.Error(fmt.Sprintf("Failed to process block:hash=%s err=%s", block.Hash(), err), "processID", ps.processID) continue @@ -333,3 +333,50 @@ func (ps *PeerSync) OnGetData(sp *peers.Peer, invList []*pb.InvVect) error { } return nil } + +func (s *Sync) sendBroadcastBlockRequest(stream network.Stream, pe *peers.Peer) *common.Error { + e := ReadRspCode(stream, s.p2p) + if !e.Code.IsSuccess() { + e.Add("get block date request rsp") + return e + } + msg := new(uint64) + if err := DecodeMessage(stream, s.p2p, msg); err != nil { + return common.NewError(common.ErrStreamRead, err) + } + if *msg != 0 { + log.Trace("broadcast block is added") + } + return nil +} + +func (s *Sync) broadcastBlockHandler(ctx context.Context, msg interface{}, stream libp2pcore.Stream, pe *peers.Peer) *common.Error { + m, ok := msg.(*pb.BroadcastBlock) + if !ok { + err := fmt.Errorf("message is not type *pb.Hash") + return ErrMessage(err) + } + block, err := types.NewBlockFromBytes(m.Block.BlockBytes) + if err != nil { + return ErrMessage(err) + } + ret := uint64(0) + if s.p2p.BlockChain().BlockDAG().HasBlock(block.Hash()) || + s.p2p.BlockChain().IsOrphan(block.Hash()) || + s.p2p.BlockChain().HasBlockInDB(block.Hash()) { + return s.EncodeResponseMsg(stream, ret) + } + for _, ph := range block.Block().Parents { + if !s.p2p.BlockChain().BlockDAG().HasBlock(ph) { + return s.EncodeResponseMsg(stream, ret) + } + } + peid := pe.GetID() + _, _, err = s.p2p.BlockChain().ProcessBlock(block, blockchain.BFBroadcast, &peid) + if err != nil { + log.Error("Failed to process block", "hash", block.Hash(), "error", err) + return s.EncodeResponseMsg(stream, ret) + } + ret = 1 + return s.EncodeResponseMsg(stream, ret) +} diff --git a/p2p/synch/sync.go b/p2p/synch/sync.go index 900ef3d8..c4ac80ca 100644 --- a/p2p/synch/sync.go +++ b/p2p/synch/sync.go @@ -62,6 +62,8 @@ const ( RPCGetData = "/qitmeer/req/getdata/1" // RPCStateRoot defines the topic for the stateroot rpc method. RPCStateRoot = "/qitmeer/req/stateroot/1" + // RPCBroadcastBlock defines the topic for the broadcast block rpc method. + RPCBroadcastBlock = "/qitmeer/req/broadcastblock/1" ) // Time to first byte timeout. The maximum time to wait for first byte of @@ -236,6 +238,12 @@ func (s *Sync) registerRPCHandlers() { &pb.StateRootReq{}, s.stateRootHandler, ) + + s.registerRPC( + RPCBroadcastBlock, + &pb.BroadcastBlock{}, + s.broadcastBlockHandler, + ) } // registerRPC for a given topic with an expected protobuf message type. @@ -290,6 +298,8 @@ func (s *Sync) Send(pe *peers.Peer, protocol string, message interface{}) (inter ret, e = s.sendTxRequest(stream, pe) case RPCStateRoot: ret, e = s.sendStateRootRequest(stream, pe) + case RPCBroadcastBlock: + e = s.sendBroadcastBlockRequest(stream, pe) default: return nil, fmt.Errorf("Can't support:%s", protocol) } diff --git a/services/miner/miner.go b/services/miner/miner.go index 2d7d1056..b5319ddc 100644 --- a/services/miner/miner.go +++ b/services/miner/miner.go @@ -606,7 +606,7 @@ func (m *Miner) submitBlock(block *types.SerializedBlock) (interface{}, error) { } // Process this block using the same rules as blocks coming from other // nodes. This will in turn relay it to the network like normal. - ib, IsOrphan, err := m.consensus.BlockChain().(*blockchain.BlockChain).ProcessBlock(block, blockchain.BFRPCAdd) + ib, IsOrphan, err := m.consensus.BlockChain().(*blockchain.BlockChain).ProcessBlock(block, blockchain.BFRPCAdd, nil) if err != nil { // Anything other than a rule violation is an unexpected error, // so log that error as an internal error. diff --git a/services/notifymgr/notifymgr.go b/services/notifymgr/notifymgr.go index e60855f5..a4f80235 100644 --- a/services/notifymgr/notifymgr.go +++ b/services/notifymgr/notifymgr.go @@ -65,14 +65,16 @@ func (ntmgr *NotifyMgr) AnnounceNewTransactions(newTxs []*types.TxDesc, filters // RelayInventory relays the passed inventory vector to all connected peers // that are not already known to have it. -func (ntmgr *NotifyMgr) RelayInventory(data interface{}, filters []peer.ID) { +func (ntmgr *NotifyMgr) RelayInventory(block *types.SerializedBlock, flags uint32, source *peer.ID) { if ntmgr.IsShutdown() { return } - _, ok := data.(types.BlockHeader) - if !ok { - log.Warn(fmt.Sprintf("No support relay data:%v", data)) - return + fs := blockchain.BehaviorFlags(flags) + if fs.Has(blockchain.BFRPCAdd) || fs.Has(blockchain.BFBroadcast) { + err := ntmgr.Server.BroadcastBlock(block, source) + if err != nil { + log.Error(err.Error()) + } } ntmgr.Server.PeerSync().RelayGraphState() } @@ -207,7 +209,7 @@ func (ntmgr *NotifyMgr) handleNotifyMsg(notification *blockchain.Notification) { return } log.Trace("we are current, can do relay") - ntmgr.RelayInventory(block.Block().Header, nil) + ntmgr.RelayInventory(block, uint32(band.Flags), band.Source) // A block has been connected to the main block chain. case blockchain.BlockConnected: