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 ðpb.SignedBeaconBlockHeader{ 18 Message: ðpb.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 ðpb.SignedBeaconBlockHeader{ 36 Message: ðpb.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 := ðpb.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 := ðpb_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 ðpb.AggregateAttestationAndProof{} 77 } 78 return ðpb.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 ðpb.IndexedAttestation{} 89 } 90 return ðpb.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 ðpb.Attestation{} 101 } 102 return ðpb.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 ðpb.AttestationData{} 113 } 114 return ðpb.AttestationData{ 115 Slot: v1alpha1AttData.Slot, 116 Index: v1alpha1AttData.CommitteeIndex, 117 BeaconBlockRoot: v1alpha1AttData.BeaconBlockRoot, 118 Source: ðpb.Checkpoint{ 119 Root: v1alpha1AttData.Source.Root, 120 Epoch: v1alpha1AttData.Source.Epoch, 121 }, 122 Target: ðpb.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 ðpb.AttesterSlashing{} 133 } 134 return ðpb.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 ðpb.SignedBeaconBlockHeader{} 144 } 145 return ðpb.SignedBeaconBlockHeader{ 146 Message: ðpb.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 ðpb_alpha.SignedBeaconBlockHeader{} 161 } 162 return ðpb_alpha.SignedBeaconBlockHeader{ 163 Header: ðpb_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 ðpb.ProposerSlashing{} 178 } 179 return ðpb.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 ðpb.SignedVoluntaryExit{} 189 } 190 return ðpb.SignedVoluntaryExit{ 191 Message: ðpb.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 ðpb_alpha.SignedVoluntaryExit{} 203 } 204 return ðpb_alpha.SignedVoluntaryExit{ 205 Exit: ðpb_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 ðpb_alpha.Attestation{} 217 } 218 return ðpb_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 ðpb_alpha.IndexedAttestation{} 229 } 230 return ðpb_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 ðpb_alpha.AttestationData{} 241 } 242 return ðpb_alpha.AttestationData{ 243 Slot: v1AttData.Slot, 244 CommitteeIndex: v1AttData.Index, 245 BeaconBlockRoot: v1AttData.BeaconBlockRoot, 246 Source: ðpb_alpha.Checkpoint{ 247 Root: v1AttData.Source.Root, 248 Epoch: v1AttData.Source.Epoch, 249 }, 250 Target: ðpb_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 ðpb_alpha.AttesterSlashing{} 261 } 262 return ðpb_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 ðpb_alpha.ProposerSlashing{} 272 } 273 return ðpb_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 ðpb.Validator{} 283 } 284 return ðpb.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 }