Skip to content
Merged
Changes from 3 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
bcd29fe
merge main
adshmh Jun 1, 2023
21e88c0
Validate trustless relay: available service tokens for the application
adshmh Jun 2, 2023
0c64aaa
merge main
adshmh Jun 2, 2023
6b9e44d
Fix double error wrapping until we move to go 1.20
adshmh Jun 2, 2023
934d5a3
Feature: use persistence module for token usage maintenance
adshmh Jun 6, 2023
f37b394
Add relay execution logic to servicer
adshmh Jun 6, 2023
eb1bb93
Address review comments
adshmh Jun 12, 2023
9729440
Merge remote-tracking branch 'origin/main' into feat-utility-trustles…
adshmh Jun 12, 2023
a64822b
Fix proto files
adshmh Jun 12, 2023
9ae0912
Remove gomock temp program
adshmh Jun 12, 2023
c1a6a92
Fix linter errors
adshmh Jun 13, 2023
a98595f
Fix failing unit test in runtime
adshmh Jun 13, 2023
3790f07
Address review comments round 2
adshmh Jun 17, 2023
30750ff
Merge remote-tracking branch 'origin/main' into feat-utility-trustles…
adshmh Jun 17, 2023
1400396
Fix linter warnings
adshmh Jun 17, 2023
f3bfe13
Fix default configuration override
adshmh Jun 19, 2023
58625a0
Address review comments
adshmh Jun 21, 2023
c276c99
Merge main
adshmh Jun 21, 2023
7a8dda0
Revert "Fix default configuration override"
adshmh Jun 25, 2023
821925a
Use an INCOMPLETE item for default servicer config
adshmh Jun 25, 2023
c21f729
Fix failing unit test
adshmh Jun 25, 2023
0014e20
Address review comments
adshmh Jun 26, 2023
76fa1b4
Merge main
adshmh Jun 26, 2023
b758fef
Fix failing unit tests
adshmh Jun 26, 2023
98e4930
Address review comments
adshmh Jun 29, 2023
08fb9b9
Merge main
adshmh Jun 29, 2023
e8021e3
Fix linter warning
adshmh Jun 29, 2023
bc1f3d4
Address review comments
adshmh Jun 29, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 28 additions & 20 deletions utility/servicer/module.go
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ func (s *servicer) isRelayVolumeApplicableOnChain(session *coreTypes.Session, di
func (s *servicer) executeRelay(relay *coreTypes.Relay) (*coreTypes.RelayResponse, error) {
switch payload := relay.RelayPayload.(type) {
case *coreTypes.Relay_JsonRpcPayload:
return s.executeHTTPRelay(relay.Meta, payload.JsonRpcPayload)
return s.executeJsonRPCRelay(relay.Meta, payload.JsonRpcPayload)
case *coreTypes.Relay_RestPayload:
return s.executeRESTRelay(relay.Meta, payload.RestPayload)
default:
Expand Down Expand Up @@ -413,8 +413,8 @@ func (s *servicer) calculateAppSessionTokens(session *coreTypes.Session) (*big.I
return appStake.Mul(appStake, big.NewInt(int64(appStakeTokensMultiplier))), nil
}

// executeHTTPRequest performs the HTTP request that sends the relay to the chain's/service's URL.
func (s *servicer) executeHTTPRelay(meta *coreTypes.RelayMeta, payload *coreTypes.JSONRPCPayload) (*coreTypes.RelayResponse, error) {
// executeJsonRPCRelay performs the relay for JSON-RPC payloads, sending them to the chain's/service's URL.
func (s *servicer) executeJsonRPCRelay(meta *coreTypes.RelayMeta, payload *coreTypes.JSONRPCPayload) (*coreTypes.RelayResponse, error) {
if meta == nil || meta.RelayChain == nil || meta.RelayChain.Id == "" {
return nil, fmt.Errorf("Relay for application %s does not specify relay chain", meta.ApplicationAddress)
}
Expand All @@ -424,26 +424,43 @@ func (s *servicer) executeHTTPRelay(meta *coreTypes.RelayMeta, payload *coreType
return nil, fmt.Errorf("Chain %s not found in servicer configuration: %w", meta.RelayChain.Id, errValidateRelayMeta)
}

serviceUrl, err := url.Parse(serviceConfig.Url)
relayBytes, err := codec.GetCodec().Marshal(payload)
if err != nil {
return nil, fmt.Errorf("Error parsing chain URL %s: %w", serviceConfig.Url, err)
return nil, fmt.Errorf("Error marshalling payload %s: %w", payload.String(), err)
}

relayBytes, err := codec.GetCodec().Marshal(payload)
return s.executeHTTPRelay(serviceConfig, relayBytes, payload.Headers)
}

// executeRESTRelay performs the relay for REST payloads, sending them to the chain's/service's URL.
// INCOMPLETE(#860): RESTful service relays: basic checks and execution through HTTP calls.
func (s *servicer) executeRESTRelay(meta *coreTypes.RelayMeta, _ *coreTypes.RESTPayload) (*coreTypes.RelayResponse, error) {
_, ok := s.config.Services[meta.RelayChain.Id]
if !ok {
return nil, fmt.Errorf("Chain %s not found in servicer configuration: %w", meta.RelayChain.Id, errValidateRelayMeta)
}
return nil, nil
}

// executeHTTPRequest performs the HTTP request that sends the relay to the chain's/service's URL.
func (s *servicer) executeHTTPRelay(serviceConfig *configs.ServiceConfig, payload []byte, headers map[string]string) (*coreTypes.RelayResponse, error) {
serviceUrl, err := url.Parse(serviceConfig.Url)
if err != nil {
return nil, fmt.Errorf("Error marshalling payload %s: %w", payload.String(), err)
return nil, fmt.Errorf("Error parsing chain URL %s: %w", serviceConfig.Url, err)
}

req, err := http.NewRequest(http.MethodPost, serviceUrl.String(), bytes.NewBuffer(relayBytes))
req, err := http.NewRequest(http.MethodPost, serviceUrl.String(), bytes.NewBuffer(payload))
if err != nil {
return nil, err
}
if serviceConfig.BasicAuth != nil && serviceConfig.BasicAuth.UserName != "" {
req.SetBasicAuth(serviceConfig.BasicAuth.UserName, serviceConfig.BasicAuth.Password)

auth := serviceConfig.BasicAuth
if auth != nil && auth.UserName != "" {
req.SetBasicAuth(auth.UserName, auth.Password)
}

// INVESTIGATE: do we need a default user-agent for HTTP requests?
for k, v := range payload.Headers {
for k, v := range headers {
req.Header.Set(k, v)
}
if req.Header.Get("Content-Type") == "" {
Expand All @@ -465,15 +482,6 @@ func (s *servicer) executeHTTPRelay(meta *coreTypes.RelayMeta, payload *coreType
return &coreTypes.RelayResponse{Payload: string(body)}, nil
}

// INCOMPLETE(#860): RESTful service relays: basic checks and execution through HTTP calls
func (s *servicer) executeRESTRelay(meta *coreTypes.RelayMeta, _ *coreTypes.RESTPayload) (*coreTypes.RelayResponse, error) {
_, ok := s.config.Services[meta.RelayChain.Id]
if !ok {
return nil, fmt.Errorf("Chain %s not found in servicer configuration: %w", meta.RelayChain.Id, errValidateRelayMeta)
}
return nil, nil
}

// IMPROVE: Add session height tolerance to account for session rollovers
func validateRelayBlockHeight(relayMeta *coreTypes.RelayMeta, session *coreTypes.Session) error {
sessionStartingBlock := session.SessionNumber * session.NumSessionBlocks
Expand Down