Skip to content

Commit 2d98737

Browse files
committed
feat: query witnesses
1 parent 104396c commit 2d98737

File tree

3 files changed

+93
-3
lines changed

3 files changed

+93
-3
lines changed

p2p/log.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ type MessageCount struct {
2121
Pings int64 `json:"pings,omitempty"`
2222
Errors int64 `json:"errors,omitempty"`
2323
Disconnects int64 `json:"disconnects,omitempty"`
24+
NewWitness int64 `json:"new_witness,omitempty"`
25+
NewWitnessHashes int64 `json:"new_witness_hashes,omitempty"`
26+
GetWitnessRequest int64 `json:"get_witness_request,omitempty"`
27+
Witness int64 `json:"witness,omitempty"`
2428
}
2529

2630
// Load takes a snapshot of all the counts in a thread-safe manner. Make sure

p2p/rlpx.go

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ func Dial(n *enode.Node) (*rlpxConn, error) {
3737
{Name: "eth", Version: 66},
3838
{Name: "eth", Version: 67},
3939
{Name: "eth", Version: 68},
40+
{Name: "wit", Version: 1},
4041
},
4142
}
4243

@@ -194,6 +195,7 @@ func (c *rlpxConn) ReadAndServe(count *MessageCount) error {
194195
atomic.AddInt64(&count.BlockHashes, int64(len(*msg)))
195196
c.logger.Trace().Msgf("Received %v NewBlockHashes", len(*msg))
196197

198+
var hashes []common.Hash
197199
for _, hash := range *msg {
198200
headersRequest := &GetBlockHeaders{
199201
GetBlockHeadersRequest: &eth.GetBlockHeadersRequest{
@@ -215,11 +217,30 @@ func (c *rlpxConn) ReadAndServe(count *MessageCount) error {
215217
if err := c.Write(bodiesRequest); err != nil {
216218
c.logger.Error().Err(err).Msg("Failed to write GetBlockBodies request")
217219
}
220+
221+
hashes = append(hashes, hash.Hash)
218222
}
219223

224+
req := GetWitnessPacket{
225+
GetWitnessRequest: &GetWitnessRequest{
226+
Hashes: hashes,
227+
},
228+
}
229+
if err := c.Write(req); err != nil {
230+
log.Error().Err(err).Msg("Failed to write GetWitnessPacket request")
231+
}
220232
case *NewBlock:
221233
atomic.AddInt64(&count.Blocks, 1)
222234
c.logger.Trace().Str("hash", msg.Block.Hash().Hex()).Msg("Received NewBlock")
235+
236+
req := GetWitnessPacket{
237+
GetWitnessRequest: &GetWitnessRequest{
238+
Hashes: []common.Hash{msg.Block.Hash()},
239+
},
240+
}
241+
if err := c.Write(req); err != nil {
242+
log.Error().Err(err).Msg("Failed to write GetWitnessPacket request")
243+
}
223244
case *Transactions:
224245
atomic.AddInt64(&count.Transactions, int64(len(*msg)))
225246
c.logger.Trace().Msgf("Received %v Transactions", len(*msg))
@@ -248,15 +269,27 @@ func (c *rlpxConn) ReadAndServe(count *MessageCount) error {
248269
atomic.AddInt64(&count.Errors, 1)
249270
c.logger.Trace().Err(msg.Unwrap()).Msg("Received Error")
250271

251-
if !strings.Contains(msg.Error(), "timeout") {
252-
return msg.Unwrap()
253-
}
272+
// if !strings.Contains(msg.Error(), "timeout") {
273+
// return msg.Unwrap()
274+
// }
254275
case *Disconnect:
255276
atomic.AddInt64(&count.Disconnects, 1)
256277
c.logger.Debug().Msgf("Disconnect received: %v", msg)
257278
case *Disconnects:
258279
atomic.AddInt64(&count.Disconnects, 1)
259280
c.logger.Debug().Msgf("Disconnect received: %v", msg)
281+
case *NewWitnessPacket:
282+
atomic.AddInt64(&count.NewWitness, 1)
283+
c.logger.Debug().Any("msg", msg).Msg("Received NewWitness")
284+
case *NewWitnessHashesPacket:
285+
atomic.AddInt64(&count.NewWitnessHashes, 1)
286+
c.logger.Debug().Any("msg", msg).Msg("Received NewWitnessHashes")
287+
case *GetWitnessPacket:
288+
atomic.AddInt64(&count.GetWitnessRequest, 1)
289+
c.logger.Debug().Any("msg", msg).Msg("Received GetWitnessRequest")
290+
case *WitnessPacketRLPPacket:
291+
atomic.AddInt64(&count.Witness, 1)
292+
c.logger.Debug().Any("msg", msg).Msg("Received Witness")
260293
default:
261294
c.logger.Info().Interface("msg", msg).Int("code", msg.Code()).Msg("Received message")
262295
}

p2p/types.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import (
66
"time"
77

88
"github.com/ethereum/go-ethereum/common"
9+
"github.com/ethereum/go-ethereum/core/stateless"
910
"github.com/ethereum/go-ethereum/eth/protocols/eth"
1011
"github.com/ethereum/go-ethereum/eth/protocols/snap"
1112
"github.com/ethereum/go-ethereum/p2p"
1213
"github.com/ethereum/go-ethereum/p2p/enode"
1314
"github.com/ethereum/go-ethereum/p2p/rlpx"
1415
"github.com/ethereum/go-ethereum/rlp"
1516
"github.com/rs/zerolog"
17+
"github.com/rs/zerolog/log"
1618
)
1719

1820
type Message interface {
@@ -229,7 +231,16 @@ func (c *rlpxConn) Read() Message {
229231
return errorf("could not rlp decode message: %v", err)
230232
}
231233
return (*PooledTransactions)(ethMsg)
234+
case (NewWitnessPacket{}.Code()):
235+
msg = new(NewWitnessPacket)
236+
case (NewWitnessHashesPacket{}.Code()):
237+
msg = new(NewWitnessHashesPacket)
238+
case (GetWitnessPacket{}.Code()):
239+
msg = new(GetWitnessPacket)
240+
case (WitnessPacketRLPPacket{}.Code()):
241+
msg = new(WitnessPacketRLPPacket)
232242
default:
243+
log.Info().Any("code", code).Send()
233244
msg = errorf("invalid message code: %d", code)
234245
}
235246

@@ -331,3 +342,45 @@ type TrieNodes snap.TrieNodesPacket
331342

332343
func (msg TrieNodes) Code() int { return 40 }
333344
func (msg TrieNodes) ReqID() uint64 { return msg.ID }
345+
346+
type NewWitnessPacket struct {
347+
Witness *stateless.Witness
348+
}
349+
350+
func (msg NewWitnessPacket) Code() int { return 33 }
351+
func (msg NewWitnessPacket) ReqID() uint64 { return 0 }
352+
353+
type NewWitnessHashesPacket struct {
354+
Hashes []common.Hash
355+
Numbers []uint64
356+
}
357+
358+
func (msg NewWitnessHashesPacket) Code() int { return 34 }
359+
func (msg NewWitnessHashesPacket) ReqID() uint64 { return 0 }
360+
361+
// GetWitnessRequest represents a list of witnesses query by block hashes.
362+
type GetWitnessRequest struct {
363+
Hashes []common.Hash // Request by list of block hashes
364+
}
365+
366+
// GetWitnessPacket represents a witness query with request ID wrapping.
367+
type GetWitnessPacket struct {
368+
RequestId uint64
369+
*GetWitnessRequest
370+
}
371+
372+
func (msg GetWitnessPacket) Code() int { return 35 }
373+
func (msg GetWitnessPacket) ReqID() uint64 { return msg.RequestId }
374+
375+
// WitnessPacketRLPPacket represents a witness response with request ID wrapping.
376+
type WitnessPacketRLPPacket struct {
377+
RequestId uint64
378+
WitnessPacketResponse
379+
}
380+
381+
// WitnessPacketResponse represents a witness response, to use when we already
382+
// have the witness rlp encoded.
383+
type WitnessPacketResponse []rlp.RawValue
384+
385+
func (msg WitnessPacketRLPPacket) Code() int { return 36 }
386+
func (msg WitnessPacketRLPPacket) ReqID() uint64 { return msg.RequestId }

0 commit comments

Comments
 (0)