mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2025-01-11 12:10:05 +00:00
0c7292b85b
* prysmctl: Add support for writing signed validator exits to disk * Add dir suffix * Add test to ensure no broadcast call was made --------- Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com>
190 lines
8.1 KiB
Go
190 lines
8.1 KiB
Go
package beacon_api
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
|
"github.com/prysmaticlabs/prysm/v4/beacon-chain/rpc/apimiddleware"
|
|
enginev1 "github.com/prysmaticlabs/prysm/v4/proto/engine/v1"
|
|
ethpb "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1"
|
|
)
|
|
|
|
func jsonifyTransactions(transactions [][]byte) []string {
|
|
jsonTransactions := make([]string, len(transactions))
|
|
for index, transaction := range transactions {
|
|
jsonTransaction := hexutil.Encode(transaction)
|
|
jsonTransactions[index] = jsonTransaction
|
|
}
|
|
return jsonTransactions
|
|
}
|
|
|
|
func jsonifyBlsToExecutionChanges(blsToExecutionChanges []*ethpb.SignedBLSToExecutionChange) []*apimiddleware.SignedBLSToExecutionChangeJson {
|
|
jsonBlsToExecutionChanges := make([]*apimiddleware.SignedBLSToExecutionChangeJson, len(blsToExecutionChanges))
|
|
for index, signedBlsToExecutionChange := range blsToExecutionChanges {
|
|
blsToExecutionChangeJson := &apimiddleware.BLSToExecutionChangeJson{
|
|
ValidatorIndex: uint64ToString(signedBlsToExecutionChange.Message.ValidatorIndex),
|
|
FromBLSPubkey: hexutil.Encode(signedBlsToExecutionChange.Message.FromBlsPubkey),
|
|
ToExecutionAddress: hexutil.Encode(signedBlsToExecutionChange.Message.ToExecutionAddress),
|
|
}
|
|
signedJson := &apimiddleware.SignedBLSToExecutionChangeJson{
|
|
Message: blsToExecutionChangeJson,
|
|
Signature: hexutil.Encode(signedBlsToExecutionChange.Signature),
|
|
}
|
|
jsonBlsToExecutionChanges[index] = signedJson
|
|
}
|
|
return jsonBlsToExecutionChanges
|
|
}
|
|
|
|
func jsonifyEth1Data(eth1Data *ethpb.Eth1Data) *apimiddleware.Eth1DataJson {
|
|
return &apimiddleware.Eth1DataJson{
|
|
BlockHash: hexutil.Encode(eth1Data.BlockHash),
|
|
DepositCount: uint64ToString(eth1Data.DepositCount),
|
|
DepositRoot: hexutil.Encode(eth1Data.DepositRoot),
|
|
}
|
|
}
|
|
|
|
func jsonifyAttestations(attestations []*ethpb.Attestation) []*apimiddleware.AttestationJson {
|
|
jsonAttestations := make([]*apimiddleware.AttestationJson, len(attestations))
|
|
for index, attestation := range attestations {
|
|
jsonAttestations[index] = jsonifyAttestation(attestation)
|
|
}
|
|
return jsonAttestations
|
|
}
|
|
|
|
func jsonifyAttesterSlashings(attesterSlashings []*ethpb.AttesterSlashing) []*apimiddleware.AttesterSlashingJson {
|
|
jsonAttesterSlashings := make([]*apimiddleware.AttesterSlashingJson, len(attesterSlashings))
|
|
for index, attesterSlashing := range attesterSlashings {
|
|
jsonAttesterSlashing := &apimiddleware.AttesterSlashingJson{
|
|
Attestation_1: jsonifyIndexedAttestation(attesterSlashing.Attestation_1),
|
|
Attestation_2: jsonifyIndexedAttestation(attesterSlashing.Attestation_2),
|
|
}
|
|
jsonAttesterSlashings[index] = jsonAttesterSlashing
|
|
}
|
|
return jsonAttesterSlashings
|
|
}
|
|
|
|
func jsonifyDeposits(deposits []*ethpb.Deposit) []*apimiddleware.DepositJson {
|
|
jsonDeposits := make([]*apimiddleware.DepositJson, len(deposits))
|
|
for depositIndex, deposit := range deposits {
|
|
proofs := make([]string, len(deposit.Proof))
|
|
for proofIndex, proof := range deposit.Proof {
|
|
proofs[proofIndex] = hexutil.Encode(proof)
|
|
}
|
|
|
|
jsonDeposit := &apimiddleware.DepositJson{
|
|
Data: &apimiddleware.Deposit_DataJson{
|
|
Amount: uint64ToString(deposit.Data.Amount),
|
|
PublicKey: hexutil.Encode(deposit.Data.PublicKey),
|
|
Signature: hexutil.Encode(deposit.Data.Signature),
|
|
WithdrawalCredentials: hexutil.Encode(deposit.Data.WithdrawalCredentials),
|
|
},
|
|
Proof: proofs,
|
|
}
|
|
jsonDeposits[depositIndex] = jsonDeposit
|
|
}
|
|
return jsonDeposits
|
|
}
|
|
|
|
func jsonifyProposerSlashings(proposerSlashings []*ethpb.ProposerSlashing) []*apimiddleware.ProposerSlashingJson {
|
|
jsonProposerSlashings := make([]*apimiddleware.ProposerSlashingJson, len(proposerSlashings))
|
|
for index, proposerSlashing := range proposerSlashings {
|
|
jsonProposerSlashing := &apimiddleware.ProposerSlashingJson{
|
|
Header_1: jsonifySignedBeaconBlockHeader(proposerSlashing.Header_1),
|
|
Header_2: jsonifySignedBeaconBlockHeader(proposerSlashing.Header_2),
|
|
}
|
|
jsonProposerSlashings[index] = jsonProposerSlashing
|
|
}
|
|
return jsonProposerSlashings
|
|
}
|
|
|
|
// JsonifySignedVoluntaryExits converts an array of voluntary exit structs to a JSON hex string compatible format.
|
|
func JsonifySignedVoluntaryExits(voluntaryExits []*ethpb.SignedVoluntaryExit) []*apimiddleware.SignedVoluntaryExitJson {
|
|
jsonSignedVoluntaryExits := make([]*apimiddleware.SignedVoluntaryExitJson, len(voluntaryExits))
|
|
for index, signedVoluntaryExit := range voluntaryExits {
|
|
jsonSignedVoluntaryExit := &apimiddleware.SignedVoluntaryExitJson{
|
|
Exit: &apimiddleware.VoluntaryExitJson{
|
|
Epoch: uint64ToString(signedVoluntaryExit.Exit.Epoch),
|
|
ValidatorIndex: uint64ToString(signedVoluntaryExit.Exit.ValidatorIndex),
|
|
},
|
|
Signature: hexutil.Encode(signedVoluntaryExit.Signature),
|
|
}
|
|
jsonSignedVoluntaryExits[index] = jsonSignedVoluntaryExit
|
|
}
|
|
return jsonSignedVoluntaryExits
|
|
}
|
|
|
|
func jsonifySignedBeaconBlockHeader(signedBeaconBlockHeader *ethpb.SignedBeaconBlockHeader) *apimiddleware.SignedBeaconBlockHeaderJson {
|
|
return &apimiddleware.SignedBeaconBlockHeaderJson{
|
|
Header: &apimiddleware.BeaconBlockHeaderJson{
|
|
BodyRoot: hexutil.Encode(signedBeaconBlockHeader.Header.BodyRoot),
|
|
ParentRoot: hexutil.Encode(signedBeaconBlockHeader.Header.ParentRoot),
|
|
ProposerIndex: uint64ToString(signedBeaconBlockHeader.Header.ProposerIndex),
|
|
Slot: uint64ToString(signedBeaconBlockHeader.Header.Slot),
|
|
StateRoot: hexutil.Encode(signedBeaconBlockHeader.Header.StateRoot),
|
|
},
|
|
Signature: hexutil.Encode(signedBeaconBlockHeader.Signature),
|
|
}
|
|
}
|
|
|
|
func jsonifyIndexedAttestation(indexedAttestation *ethpb.IndexedAttestation) *apimiddleware.IndexedAttestationJson {
|
|
attestingIndices := make([]string, len(indexedAttestation.AttestingIndices))
|
|
for index, attestingIndex := range indexedAttestation.AttestingIndices {
|
|
attestingIndex := uint64ToString(attestingIndex)
|
|
attestingIndices[index] = attestingIndex
|
|
}
|
|
|
|
return &apimiddleware.IndexedAttestationJson{
|
|
AttestingIndices: attestingIndices,
|
|
Data: jsonifyAttestationData(indexedAttestation.Data),
|
|
Signature: hexutil.Encode(indexedAttestation.Signature),
|
|
}
|
|
}
|
|
|
|
func jsonifyAttestationData(attestationData *ethpb.AttestationData) *apimiddleware.AttestationDataJson {
|
|
return &apimiddleware.AttestationDataJson{
|
|
BeaconBlockRoot: hexutil.Encode(attestationData.BeaconBlockRoot),
|
|
CommitteeIndex: uint64ToString(attestationData.CommitteeIndex),
|
|
Slot: uint64ToString(attestationData.Slot),
|
|
Source: &apimiddleware.CheckpointJson{
|
|
Epoch: uint64ToString(attestationData.Source.Epoch),
|
|
Root: hexutil.Encode(attestationData.Source.Root),
|
|
},
|
|
Target: &apimiddleware.CheckpointJson{
|
|
Epoch: uint64ToString(attestationData.Target.Epoch),
|
|
Root: hexutil.Encode(attestationData.Target.Root),
|
|
},
|
|
}
|
|
}
|
|
|
|
func jsonifyAttestation(attestation *ethpb.Attestation) *apimiddleware.AttestationJson {
|
|
return &apimiddleware.AttestationJson{
|
|
AggregationBits: hexutil.Encode(attestation.AggregationBits),
|
|
Data: jsonifyAttestationData(attestation.Data),
|
|
Signature: hexutil.Encode(attestation.Signature),
|
|
}
|
|
}
|
|
|
|
func jsonifySignedAggregateAndProof(signedAggregateAndProof *ethpb.SignedAggregateAttestationAndProof) *apimiddleware.SignedAggregateAttestationAndProofJson {
|
|
return &apimiddleware.SignedAggregateAttestationAndProofJson{
|
|
Message: &apimiddleware.AggregateAttestationAndProofJson{
|
|
AggregatorIndex: uint64ToString(signedAggregateAndProof.Message.AggregatorIndex),
|
|
Aggregate: jsonifyAttestation(signedAggregateAndProof.Message.Aggregate),
|
|
SelectionProof: hexutil.Encode(signedAggregateAndProof.Message.SelectionProof),
|
|
},
|
|
Signature: hexutil.Encode(signedAggregateAndProof.Signature),
|
|
}
|
|
}
|
|
|
|
func jsonifyWithdrawals(withdrawals []*enginev1.Withdrawal) []*apimiddleware.WithdrawalJson {
|
|
jsonWithdrawals := make([]*apimiddleware.WithdrawalJson, len(withdrawals))
|
|
for index, withdrawal := range withdrawals {
|
|
jsonWithdrawals[index] = &apimiddleware.WithdrawalJson{
|
|
WithdrawalIndex: strconv.FormatUint(withdrawal.Index, 10),
|
|
ValidatorIndex: strconv.FormatUint(uint64(withdrawal.ValidatorIndex), 10),
|
|
ExecutionAddress: hexutil.Encode(withdrawal.Address),
|
|
Amount: strconv.FormatUint(withdrawal.Amount, 10),
|
|
}
|
|
}
|
|
return jsonWithdrawals
|
|
}
|