github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/state/v1/getters_block.go (about)

     1  package v1
     2  
     3  import ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
     4  
     5  // LatestBlockHeader stored within the beacon state.
     6  func (b *BeaconState) LatestBlockHeader() *ethpb.BeaconBlockHeader {
     7  	if !b.hasInnerState() {
     8  		return nil
     9  	}
    10  	if b.state.LatestBlockHeader == nil {
    11  		return nil
    12  	}
    13  
    14  	b.lock.RLock()
    15  	defer b.lock.RUnlock()
    16  
    17  	return b.latestBlockHeader()
    18  }
    19  
    20  // latestBlockHeader stored within the beacon state.
    21  // This assumes that a lock is already held on BeaconState.
    22  func (b *BeaconState) latestBlockHeader() *ethpb.BeaconBlockHeader {
    23  	if !b.hasInnerState() {
    24  		return nil
    25  	}
    26  	if b.state.LatestBlockHeader == nil {
    27  		return nil
    28  	}
    29  
    30  	hdr := &ethpb.BeaconBlockHeader{
    31  		Slot:          b.state.LatestBlockHeader.Slot,
    32  		ProposerIndex: b.state.LatestBlockHeader.ProposerIndex,
    33  	}
    34  
    35  	parentRoot := make([]byte, len(b.state.LatestBlockHeader.ParentRoot))
    36  	bodyRoot := make([]byte, len(b.state.LatestBlockHeader.BodyRoot))
    37  	stateRoot := make([]byte, len(b.state.LatestBlockHeader.StateRoot))
    38  
    39  	copy(parentRoot, b.state.LatestBlockHeader.ParentRoot)
    40  	copy(bodyRoot, b.state.LatestBlockHeader.BodyRoot)
    41  	copy(stateRoot, b.state.LatestBlockHeader.StateRoot)
    42  	hdr.ParentRoot = parentRoot
    43  	hdr.BodyRoot = bodyRoot
    44  	hdr.StateRoot = stateRoot
    45  	return hdr
    46  }
    47  
    48  // BlockRoots kept track of in the beacon state.
    49  func (b *BeaconState) BlockRoots() [][]byte {
    50  	if !b.hasInnerState() {
    51  		return nil
    52  	}
    53  	if b.state.BlockRoots == nil {
    54  		return nil
    55  	}
    56  
    57  	b.lock.RLock()
    58  	defer b.lock.RUnlock()
    59  
    60  	return b.blockRoots()
    61  }
    62  
    63  // blockRoots kept track of in the beacon state.
    64  // This assumes that a lock is already held on BeaconState.
    65  func (b *BeaconState) blockRoots() [][]byte {
    66  	if !b.hasInnerState() {
    67  		return nil
    68  	}
    69  	return b.safeCopy2DByteSlice(b.state.BlockRoots)
    70  }
    71  
    72  // BlockRootAtIndex retrieves a specific block root based on an
    73  // input index value.
    74  func (b *BeaconState) BlockRootAtIndex(idx uint64) ([]byte, error) {
    75  	if !b.hasInnerState() {
    76  		return nil, ErrNilInnerState
    77  	}
    78  	if b.state.BlockRoots == nil {
    79  		return nil, nil
    80  	}
    81  
    82  	b.lock.RLock()
    83  	defer b.lock.RUnlock()
    84  
    85  	return b.blockRootAtIndex(idx)
    86  }
    87  
    88  // blockRootAtIndex retrieves a specific block root based on an
    89  // input index value.
    90  // This assumes that a lock is already held on BeaconState.
    91  func (b *BeaconState) blockRootAtIndex(idx uint64) ([]byte, error) {
    92  	if !b.hasInnerState() {
    93  		return nil, ErrNilInnerState
    94  	}
    95  	return b.safeCopyBytesAtIndex(b.state.BlockRoots, idx)
    96  }