mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2025-01-16 06:58:20 +00:00
223d5309a0
* remove irrelevant comment * fix proto documentation * first implementation * register validator server * first working version * add sync checker and test file * first test * gzl * final version + tests * gzl * run duties through API Middleware * extract dependent root getter * dependentRoot docs * wrap indices in array * fix static analysis issues * modify err nil check * create local variables in slot processing test * Update proto/eth/v1/validator_service.proto * review * simplify index loops * better calculation of committees at slot * comment about impossible comndition Co-authored-by: terence tsao <terence@prysmaticlabs.com> Co-authored-by: Raul Jordan <raul@prysmaticlabs.com> Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com>
58 lines
2.3 KiB
Go
58 lines
2.3 KiB
Go
package apimiddleware
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"io/ioutil"
|
|
"net/http"
|
|
|
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
|
"github.com/prysmaticlabs/prysm/shared/bytesutil"
|
|
"github.com/prysmaticlabs/prysm/shared/gateway"
|
|
)
|
|
|
|
// https://ethereum.github.io/eth2.0-APIs/#/Beacon/submitPoolAttestations expects posting a top-level array.
|
|
// We make it more proto-friendly by wrapping it in a struct with a 'data' field.
|
|
func wrapAttestationsArray(endpoint gateway.Endpoint, _ http.ResponseWriter, req *http.Request) gateway.ErrorJson {
|
|
if _, ok := endpoint.PostRequest.(*submitAttestationRequestJson); ok {
|
|
atts := make([]*attestationJson, 0)
|
|
if err := json.NewDecoder(req.Body).Decode(&atts); err != nil {
|
|
return gateway.InternalServerErrorWithMessage(err, "could not decode attestations array")
|
|
}
|
|
j := &submitAttestationRequestJson{Data: atts}
|
|
b, err := json.Marshal(j)
|
|
if err != nil {
|
|
return gateway.InternalServerErrorWithMessage(err, "could not marshal wrapped attestations array")
|
|
}
|
|
req.Body = ioutil.NopCloser(bytes.NewReader(b))
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// https://ethereum.github.io/eth2.0-APIs/#/Validator/getAttesterDuties expects posting a top-level array.
|
|
// We make it more proto-friendly by wrapping it in a struct with an 'index' field.
|
|
func wrapValidatorIndicesArray(endpoint gateway.Endpoint, _ http.ResponseWriter, req *http.Request) gateway.ErrorJson {
|
|
if _, ok := endpoint.PostRequest.(*attesterDutiesRequestJson); ok {
|
|
indices := make([]string, 0)
|
|
if err := json.NewDecoder(req.Body).Decode(&indices); err != nil {
|
|
return gateway.InternalServerErrorWithMessage(err, "could not decode attestations array")
|
|
}
|
|
j := &attesterDutiesRequestJson{Index: indices}
|
|
b, err := json.Marshal(j)
|
|
if err != nil {
|
|
return gateway.InternalServerErrorWithMessage(err, "could not marshal wrapped validator indices array")
|
|
}
|
|
req.Body = ioutil.NopCloser(bytes.NewReader(b))
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Posted graffiti needs to have length of 32 bytes, but client is allowed to send data of any length.
|
|
func prepareGraffiti(endpoint gateway.Endpoint, _ http.ResponseWriter, _ *http.Request) gateway.ErrorJson {
|
|
if block, ok := endpoint.PostRequest.(*beaconBlockContainerJson); ok {
|
|
b := bytesutil.ToBytes32([]byte(block.Message.Body.Graffiti))
|
|
block.Message.Body.Graffiti = hexutil.Encode(b[:])
|
|
}
|
|
return nil
|
|
}
|