11package message
22
33import (
4+ "encoding/binary"
5+
46 "github.com/ethereum/go-ethereum/common"
7+ "github.com/ethereum/go-ethereum/crypto"
58
69 "github.com/offchainlabs/nitro/arbos/arbostypes"
710 "github.com/offchainlabs/nitro/arbutil"
@@ -12,6 +15,8 @@ const (
1215 TimeboostedVersion = byte (0 )
1316)
1417
18+ var uniquifyingPrefix = []byte ("Arbitrum Nitro Feed:" )
19+
1520// BroadcastMessage is the base message type for messages to send over the network.
1621//
1722// Acts as a variant holding the message types. The type of the message is
@@ -37,7 +42,7 @@ type BroadcastFeedMessage struct {
3742 SequenceNumber arbutil.MessageIndex `json:"sequenceNumber"`
3843 Message arbostypes.MessageWithMetadata `json:"message"`
3944 BlockHash * common.Hash `json:"blockHash,omitempty"`
40- Signature []byte `json:"signature "`
45+ Signature []byte `json:"signatureV2 "`
4146 BlockMetadata common.BlockMetadata `json:"blockMetadata,omitempty"`
4247
4348 CumulativeSumMsgSize uint64 `json:"-"`
@@ -52,8 +57,34 @@ func (m *BroadcastFeedMessage) UpdateCumulativeSumMsgSize(val uint64) {
5257 m .CumulativeSumMsgSize += val + m .Size ()
5358}
5459
55- func (m * BroadcastFeedMessage ) Hash (chainId uint64 ) (common.Hash , error ) {
56- return m .Message .Hash (m .SequenceNumber , chainId )
60+ // SignatureHash creates a hash for the feed message that include all fields that need to
61+ // be signed. Be aware that changing this function can break compatibility with older clients.
62+ func (m * BroadcastFeedMessage ) SignatureHash (chainId uint64 ) common.Hash {
63+ data := []byte {}
64+ data = append (data , uniquifyingPrefix ... )
65+
66+ data = binary .BigEndian .AppendUint64 (data , chainId )
67+ data = binary .BigEndian .AppendUint64 (data , uint64 (m .SequenceNumber ))
68+ if m .BlockHash != nil {
69+ data = append (data , m .BlockHash .Bytes ()... )
70+ }
71+ data = append (data , m .BlockMetadata ... )
72+ data = binary .BigEndian .AppendUint64 (data , m .Message .DelayedMessagesRead )
73+
74+ l1IncomingMessage := m .Message .Message
75+ data = append (data , l1IncomingMessage .Header .Kind )
76+ data = append (data , l1IncomingMessage .Header .Poster .Bytes ()... )
77+ data = binary .BigEndian .AppendUint64 (data , l1IncomingMessage .Header .BlockNumber )
78+ data = binary .BigEndian .AppendUint64 (data , l1IncomingMessage .Header .Timestamp )
79+ if l1IncomingMessage .Header .RequestId != nil {
80+ data = append (data , l1IncomingMessage .Header .RequestId .Bytes ()... )
81+ }
82+ if l1IncomingMessage .Header .L1BaseFee != nil {
83+ data = append (data , l1IncomingMessage .Header .L1BaseFee .Bytes ()... )
84+ }
85+ data = append (data , l1IncomingMessage .L2msg ... )
86+
87+ return crypto .Keccak256Hash (data )
5788}
5889
5990type ConfirmedSequenceNumberMessage struct {
0 commit comments