github.com/prysmaticlabs/prysm@v1.4.4/proto/migration/migration.go (about)

     1  package migration
     2  
     3  import (
     4  	"github.com/pkg/errors"
     5  	ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1"
     6  	ethpb_alpha "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
     7  	"github.com/prysmaticlabs/prysm/proto/interfaces"
     8  	"google.golang.org/protobuf/proto"
     9  )
    10  
    11  // BlockIfaceToV1BlockHeader converts a signed beacon block interface into a signed beacon block header.
    12  func BlockIfaceToV1BlockHeader(block interfaces.SignedBeaconBlock) (*ethpb.SignedBeaconBlockHeader, error) {
    13  	bodyRoot, err := block.Block().Body().HashTreeRoot()
    14  	if err != nil {
    15  		return nil, errors.Wrap(err, "failed to get body root of block")
    16  	}
    17  	return &ethpb.SignedBeaconBlockHeader{
    18  		Message: &ethpb.BeaconBlockHeader{
    19  			Slot:          block.Block().Slot(),
    20  			ProposerIndex: block.Block().ProposerIndex(),
    21  			ParentRoot:    block.Block().ParentRoot(),
    22  			StateRoot:     block.Block().StateRoot(),
    23  			BodyRoot:      bodyRoot[:],
    24  		},
    25  		Signature: block.Signature(),
    26  	}, nil
    27  }
    28  
    29  // V1Alpha1BlockToV1BlockHeader converts a v1alpha1 SignedBeaconBlock proto to a v1 SignedBeaconBlockHeader proto.
    30  func V1Alpha1BlockToV1BlockHeader(block *ethpb_alpha.SignedBeaconBlock) (*ethpb.SignedBeaconBlockHeader, error) {
    31  	bodyRoot, err := block.Block.Body.HashTreeRoot()
    32  	if err != nil {
    33  		return nil, errors.Wrap(err, "failed to get body root of block")
    34  	}
    35  	return &ethpb.SignedBeaconBlockHeader{
    36  		Message: &ethpb.BeaconBlockHeader{
    37  			Slot:          block.Block.Slot,
    38  			ProposerIndex: block.Block.ProposerIndex,
    39  			ParentRoot:    block.Block.ParentRoot,
    40  			StateRoot:     block.Block.StateRoot,
    41  			BodyRoot:      bodyRoot[:],
    42  		},
    43  		Signature: block.Signature,
    44  	}, nil
    45  }
    46  
    47  // V1Alpha1ToV1Block converts a v1alpha1 SignedBeaconBlock proto to a v1 proto.
    48  func V1Alpha1ToV1Block(alphaBlk *ethpb_alpha.SignedBeaconBlock) (*ethpb.SignedBeaconBlock, error) {
    49  	marshaledBlk, err := proto.Marshal(alphaBlk)
    50  	if err != nil {
    51  		return nil, errors.Wrap(err, "could not marshal block")
    52  	}
    53  	v1Block := &ethpb.SignedBeaconBlock{}
    54  	if err := proto.Unmarshal(marshaledBlk, v1Block); err != nil {
    55  		return nil, errors.Wrap(err, "could not unmarshal block")
    56  	}
    57  	return v1Block, nil
    58  }
    59  
    60  // V1ToV1Alpha1Block converts a v1 SignedBeaconBlock proto to a v1alpha1 proto.
    61  func V1ToV1Alpha1Block(alphaBlk *ethpb.SignedBeaconBlock) (*ethpb_alpha.SignedBeaconBlock, error) {
    62  	marshaledBlk, err := proto.Marshal(alphaBlk)
    63  	if err != nil {
    64  		return nil, errors.Wrap(err, "could not marshal block")
    65  	}
    66  	v1alpha1Block := &ethpb_alpha.SignedBeaconBlock{}
    67  	if err := proto.Unmarshal(marshaledBlk, v1alpha1Block); err != nil {
    68  		return nil, errors.Wrap(err, "could not unmarshal block")
    69  	}
    70  	return v1alpha1Block, nil
    71  }
    72  
    73  // V1Alpha1AggregateAttAndProofToV1 converts a v1alpha1 aggregate attestation and proof to v1.
    74  func V1Alpha1AggregateAttAndProofToV1(v1alpha1Att *ethpb_alpha.AggregateAttestationAndProof) *ethpb.AggregateAttestationAndProof {
    75  	if v1alpha1Att == nil {
    76  		return &ethpb.AggregateAttestationAndProof{}
    77  	}
    78  	return &ethpb.AggregateAttestationAndProof{
    79  		AggregatorIndex: v1alpha1Att.AggregatorIndex,
    80  		Aggregate:       V1Alpha1AttestationToV1(v1alpha1Att.Aggregate),
    81  		SelectionProof:  v1alpha1Att.SelectionProof,
    82  	}
    83  }
    84  
    85  // V1Alpha1IndexedAttToV1 converts a v1alpha1 indexed attestation to v1.
    86  func V1Alpha1IndexedAttToV1(v1alpha1Att *ethpb_alpha.IndexedAttestation) *ethpb.IndexedAttestation {
    87  	if v1alpha1Att == nil {
    88  		return &ethpb.IndexedAttestation{}
    89  	}
    90  	return &ethpb.IndexedAttestation{
    91  		AttestingIndices: v1alpha1Att.AttestingIndices,
    92  		Data:             V1Alpha1AttDataToV1(v1alpha1Att.Data),
    93  		Signature:        v1alpha1Att.Signature,
    94  	}
    95  }
    96  
    97  // V1Alpha1AttestationToV1 converts a v1alpha1 attestation to v1.
    98  func V1Alpha1AttestationToV1(v1alpha1Att *ethpb_alpha.Attestation) *ethpb.Attestation {
    99  	if v1alpha1Att == nil {
   100  		return &ethpb.Attestation{}
   101  	}
   102  	return &ethpb.Attestation{
   103  		AggregationBits: v1alpha1Att.AggregationBits,
   104  		Data:            V1Alpha1AttDataToV1(v1alpha1Att.Data),
   105  		Signature:       v1alpha1Att.Signature,
   106  	}
   107  }
   108  
   109  // V1Alpha1AttDataToV1 converts a v1alpha1 attestation data to v1.
   110  func V1Alpha1AttDataToV1(v1alpha1AttData *ethpb_alpha.AttestationData) *ethpb.AttestationData {
   111  	if v1alpha1AttData == nil || v1alpha1AttData.Source == nil || v1alpha1AttData.Target == nil {
   112  		return &ethpb.AttestationData{}
   113  	}
   114  	return &ethpb.AttestationData{
   115  		Slot:            v1alpha1AttData.Slot,
   116  		Index:           v1alpha1AttData.CommitteeIndex,
   117  		BeaconBlockRoot: v1alpha1AttData.BeaconBlockRoot,
   118  		Source: &ethpb.Checkpoint{
   119  			Root:  v1alpha1AttData.Source.Root,
   120  			Epoch: v1alpha1AttData.Source.Epoch,
   121  		},
   122  		Target: &ethpb.Checkpoint{
   123  			Root:  v1alpha1AttData.Target.Root,
   124  			Epoch: v1alpha1AttData.Target.Epoch,
   125  		},
   126  	}
   127  }
   128  
   129  // V1Alpha1AttSlashingToV1 converts a v1alpha1 attester slashing to v1.
   130  func V1Alpha1AttSlashingToV1(v1alpha1Slashing *ethpb_alpha.AttesterSlashing) *ethpb.AttesterSlashing {
   131  	if v1alpha1Slashing == nil {
   132  		return &ethpb.AttesterSlashing{}
   133  	}
   134  	return &ethpb.AttesterSlashing{
   135  		Attestation_1: V1Alpha1IndexedAttToV1(v1alpha1Slashing.Attestation_1),
   136  		Attestation_2: V1Alpha1IndexedAttToV1(v1alpha1Slashing.Attestation_2),
   137  	}
   138  }
   139  
   140  // V1Alpha1SignedHeaderToV1 converts a v1alpha1 signed beacon block header to v1.
   141  func V1Alpha1SignedHeaderToV1(v1alpha1Hdr *ethpb_alpha.SignedBeaconBlockHeader) *ethpb.SignedBeaconBlockHeader {
   142  	if v1alpha1Hdr == nil || v1alpha1Hdr.Header == nil {
   143  		return &ethpb.SignedBeaconBlockHeader{}
   144  	}
   145  	return &ethpb.SignedBeaconBlockHeader{
   146  		Message: &ethpb.BeaconBlockHeader{
   147  			Slot:          v1alpha1Hdr.Header.Slot,
   148  			ProposerIndex: v1alpha1Hdr.Header.ProposerIndex,
   149  			ParentRoot:    v1alpha1Hdr.Header.ParentRoot,
   150  			StateRoot:     v1alpha1Hdr.Header.StateRoot,
   151  			BodyRoot:      v1alpha1Hdr.Header.BodyRoot,
   152  		},
   153  		Signature: v1alpha1Hdr.Signature,
   154  	}
   155  }
   156  
   157  // V1SignedHeaderToV1Alpha1 converts a v1 signed beacon block header to v1alpha1.
   158  func V1SignedHeaderToV1Alpha1(v1Header *ethpb.SignedBeaconBlockHeader) *ethpb_alpha.SignedBeaconBlockHeader {
   159  	if v1Header == nil || v1Header.Message == nil {
   160  		return &ethpb_alpha.SignedBeaconBlockHeader{}
   161  	}
   162  	return &ethpb_alpha.SignedBeaconBlockHeader{
   163  		Header: &ethpb_alpha.BeaconBlockHeader{
   164  			Slot:          v1Header.Message.Slot,
   165  			ProposerIndex: v1Header.Message.ProposerIndex,
   166  			ParentRoot:    v1Header.Message.ParentRoot,
   167  			StateRoot:     v1Header.Message.StateRoot,
   168  			BodyRoot:      v1Header.Message.BodyRoot,
   169  		},
   170  		Signature: v1Header.Signature,
   171  	}
   172  }
   173  
   174  // V1Alpha1ProposerSlashingToV1 converts a v1alpha1 proposer slashing to v1.
   175  func V1Alpha1ProposerSlashingToV1(v1alpha1Slashing *ethpb_alpha.ProposerSlashing) *ethpb.ProposerSlashing {
   176  	if v1alpha1Slashing == nil {
   177  		return &ethpb.ProposerSlashing{}
   178  	}
   179  	return &ethpb.ProposerSlashing{
   180  		SignedHeader_1: V1Alpha1SignedHeaderToV1(v1alpha1Slashing.Header_1),
   181  		SignedHeader_2: V1Alpha1SignedHeaderToV1(v1alpha1Slashing.Header_2),
   182  	}
   183  }
   184  
   185  // V1Alpha1ExitToV1 converts a v1alpha1 SignedVoluntaryExit to v1.
   186  func V1Alpha1ExitToV1(v1alpha1Exit *ethpb_alpha.SignedVoluntaryExit) *ethpb.SignedVoluntaryExit {
   187  	if v1alpha1Exit == nil || v1alpha1Exit.Exit == nil {
   188  		return &ethpb.SignedVoluntaryExit{}
   189  	}
   190  	return &ethpb.SignedVoluntaryExit{
   191  		Message: &ethpb.VoluntaryExit{
   192  			Epoch:          v1alpha1Exit.Exit.Epoch,
   193  			ValidatorIndex: v1alpha1Exit.Exit.ValidatorIndex,
   194  		},
   195  		Signature: v1alpha1Exit.Signature,
   196  	}
   197  }
   198  
   199  // V1ExitToV1Alpha1 converts a v1 SignedVoluntaryExit to v1alpha1.
   200  func V1ExitToV1Alpha1(v1Exit *ethpb.SignedVoluntaryExit) *ethpb_alpha.SignedVoluntaryExit {
   201  	if v1Exit == nil || v1Exit.Message == nil {
   202  		return &ethpb_alpha.SignedVoluntaryExit{}
   203  	}
   204  	return &ethpb_alpha.SignedVoluntaryExit{
   205  		Exit: &ethpb_alpha.VoluntaryExit{
   206  			Epoch:          v1Exit.Message.Epoch,
   207  			ValidatorIndex: v1Exit.Message.ValidatorIndex,
   208  		},
   209  		Signature: v1Exit.Signature,
   210  	}
   211  }
   212  
   213  // V1AttToV1Alpha1 converts a v1 attestation to v1alpha1.
   214  func V1AttToV1Alpha1(v1Att *ethpb.Attestation) *ethpb_alpha.Attestation {
   215  	if v1Att == nil {
   216  		return &ethpb_alpha.Attestation{}
   217  	}
   218  	return &ethpb_alpha.Attestation{
   219  		AggregationBits: v1Att.AggregationBits,
   220  		Data:            V1AttDataToV1Alpha1(v1Att.Data),
   221  		Signature:       v1Att.Signature,
   222  	}
   223  }
   224  
   225  // V1IndexedAttToV1Alpha1 converts a v1 indexed attestation to v1alpha1.
   226  func V1IndexedAttToV1Alpha1(v1Att *ethpb.IndexedAttestation) *ethpb_alpha.IndexedAttestation {
   227  	if v1Att == nil {
   228  		return &ethpb_alpha.IndexedAttestation{}
   229  	}
   230  	return &ethpb_alpha.IndexedAttestation{
   231  		AttestingIndices: v1Att.AttestingIndices,
   232  		Data:             V1AttDataToV1Alpha1(v1Att.Data),
   233  		Signature:        v1Att.Signature,
   234  	}
   235  }
   236  
   237  // V1AttDataToV1Alpha1 converts a v1 attestation data to v1alpha1.
   238  func V1AttDataToV1Alpha1(v1AttData *ethpb.AttestationData) *ethpb_alpha.AttestationData {
   239  	if v1AttData == nil || v1AttData.Source == nil || v1AttData.Target == nil {
   240  		return &ethpb_alpha.AttestationData{}
   241  	}
   242  	return &ethpb_alpha.AttestationData{
   243  		Slot:            v1AttData.Slot,
   244  		CommitteeIndex:  v1AttData.Index,
   245  		BeaconBlockRoot: v1AttData.BeaconBlockRoot,
   246  		Source: &ethpb_alpha.Checkpoint{
   247  			Root:  v1AttData.Source.Root,
   248  			Epoch: v1AttData.Source.Epoch,
   249  		},
   250  		Target: &ethpb_alpha.Checkpoint{
   251  			Root:  v1AttData.Target.Root,
   252  			Epoch: v1AttData.Target.Epoch,
   253  		},
   254  	}
   255  }
   256  
   257  // V1AttSlashingToV1Alpha1 converts a v1 attester slashing to v1alpha1.
   258  func V1AttSlashingToV1Alpha1(v1Slashing *ethpb.AttesterSlashing) *ethpb_alpha.AttesterSlashing {
   259  	if v1Slashing == nil {
   260  		return &ethpb_alpha.AttesterSlashing{}
   261  	}
   262  	return &ethpb_alpha.AttesterSlashing{
   263  		Attestation_1: V1IndexedAttToV1Alpha1(v1Slashing.Attestation_1),
   264  		Attestation_2: V1IndexedAttToV1Alpha1(v1Slashing.Attestation_2),
   265  	}
   266  }
   267  
   268  // V1ProposerSlashingToV1Alpha1 converts a v1 proposer slashing to v1alpha1.
   269  func V1ProposerSlashingToV1Alpha1(v1Slashing *ethpb.ProposerSlashing) *ethpb_alpha.ProposerSlashing {
   270  	if v1Slashing == nil {
   271  		return &ethpb_alpha.ProposerSlashing{}
   272  	}
   273  	return &ethpb_alpha.ProposerSlashing{
   274  		Header_1: V1SignedHeaderToV1Alpha1(v1Slashing.SignedHeader_1),
   275  		Header_2: V1SignedHeaderToV1Alpha1(v1Slashing.SignedHeader_2),
   276  	}
   277  }
   278  
   279  // V1Alpha1ValidatorToV1 converts a v1 validator to v1alpha1.
   280  func V1Alpha1ValidatorToV1(v1Validator *ethpb_alpha.Validator) *ethpb.Validator {
   281  	if v1Validator == nil {
   282  		return &ethpb.Validator{}
   283  	}
   284  	return &ethpb.Validator{
   285  		Pubkey:                     v1Validator.PublicKey,
   286  		WithdrawalCredentials:      v1Validator.WithdrawalCredentials,
   287  		EffectiveBalance:           v1Validator.EffectiveBalance,
   288  		Slashed:                    v1Validator.Slashed,
   289  		ActivationEligibilityEpoch: v1Validator.ActivationEligibilityEpoch,
   290  		ActivationEpoch:            v1Validator.ActivationEpoch,
   291  		ExitEpoch:                  v1Validator.ExitEpoch,
   292  		WithdrawableEpoch:          v1Validator.WithdrawableEpoch,
   293  	}
   294  }
   295  
   296  // SignedBeaconBlock converts a signed beacon block interface to a v1alpha1 block.
   297  func SignedBeaconBlock(block interfaces.SignedBeaconBlock) (*ethpb.SignedBeaconBlock, error) {
   298  	if block == nil || block.IsNil() {
   299  		return nil, errors.New("could not find requested block")
   300  	}
   301  	blk, err := block.PbPhase0Block()
   302  	if err != nil {
   303  		return nil, errors.Wrapf(err, "could not get raw block")
   304  	}
   305  
   306  	v1Block, err := V1Alpha1ToV1Block(blk)
   307  	if err != nil {
   308  		return nil, errors.New("could not convert block to v1 block")
   309  	}
   310  
   311  	return v1Block, nil
   312  }