diff --git a/arcadia/arcadia.go b/arcadia/arcadia.go index 7bcfa55859..0175031a06 100644 --- a/arcadia/arcadia.go +++ b/arcadia/arcadia.go @@ -585,17 +585,30 @@ func (cli *Arcadia) GetBlockPayloadFromArcadia(ctx context.Context, maxBw, block MaxBandwidth: maxBw, BlockNumber: blockNumber, } - reqRaw, err := json.Marshal(reqr) + reqRaw, err := reqr.Payload() if err != nil { return nil, err } + uwm, err := warp.NewUnsignedMessage(cli.vm.NetworkID(), cli.vm.ChainID(), reqRaw) + if err != nil { + return nil, err + } + sig, err := cli.vm.Sign(uwm) + if err != nil { + return nil, err + } + sigStr := hexutil.Encode(sig) + + cli.vm.Logger().Debug("signing GetArcadiaBlock request with", zap.String("pubkey", hexutil.Encode(cli.vm.Signer().Compress())), zap.Uint64("height", blockNumber), zap.String("chainID", cli.vm.ChainID().String()), zap.Uint32("networkID", cli.vm.NetworkID())) + req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewBuffer(reqRaw)) if err != nil { return nil, err } req.Header.Set("Content-Type", "application/json") + req.Header.Set(GetArcadiaBlockSignatureHeader, sigStr) resp, err := client.Do(req) if err != nil { diff --git a/arcadia/consts.go b/arcadia/consts.go index 052bddaa01..c3c5b4ff89 100644 --- a/arcadia/consts.go +++ b/arcadia/consts.go @@ -3,3 +3,4 @@ package arcadia var DefaultNMTNamespace = make([]byte, 8) const DefaultBuilderLRUSize = 20 +const GetArcadiaBlockSignatureHeader = "X-Arcadia-GetBlock-Sig" diff --git a/arcadia/types.go b/arcadia/types.go index 1fed2901a6..eccc5b97f9 100644 --- a/arcadia/types.go +++ b/arcadia/types.go @@ -1,6 +1,8 @@ package arcadia import ( + "encoding/json" + "github.com/ava-labs/avalanchego/ids" "github.com/bits-and-blooms/bitset" @@ -69,6 +71,10 @@ type GetBlockPayloadFromArcadia struct { BlockNumber uint64 `json:"blockNumber"` } +func (req *GetBlockPayloadFromArcadia) Payload() ([]byte, error) { + return json.Marshal(req) +} + type ChunkInterface interface { Marshal() ([]byte, error) Transactions() []*chain.Transaction diff --git a/arcadia/utils.go b/arcadia/utils.go index 124a505242..f5fc5c4615 100644 --- a/arcadia/utils.go +++ b/arcadia/utils.go @@ -97,7 +97,9 @@ func replaceHTTPWithWS(url string) string { } func namespaceToChainIDStr(ns []byte) string { - chainIDu64 := binary.LittleEndian.Uint64(ns) + nsPadded := make([]byte, 8) + copy(nsPadded[:], ns) + chainIDu64 := binary.LittleEndian.Uint64(nsPadded) chainID := big.NewInt(int64(chainIDu64)) return hexutil.EncodeBig(chainID)