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

     1  package v1
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/prysmaticlabs/prysm/shared/copyutil"
     7  
     8  	"github.com/prysmaticlabs/prysm/beacon-chain/state/stateutil"
     9  	ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
    10  )
    11  
    12  // SetLatestBlockHeader in the beacon state.
    13  func (b *BeaconState) SetLatestBlockHeader(val *ethpb.BeaconBlockHeader) error {
    14  	if !b.hasInnerState() {
    15  		return ErrNilInnerState
    16  	}
    17  	b.lock.Lock()
    18  	defer b.lock.Unlock()
    19  
    20  	b.state.LatestBlockHeader = copyutil.CopyBeaconBlockHeader(val)
    21  	b.markFieldAsDirty(latestBlockHeader)
    22  	return nil
    23  }
    24  
    25  // SetBlockRoots for the beacon state. Updates the entire
    26  // list to a new value by overwriting the previous one.
    27  func (b *BeaconState) SetBlockRoots(val [][]byte) error {
    28  	if !b.hasInnerState() {
    29  		return ErrNilInnerState
    30  	}
    31  	b.lock.Lock()
    32  	defer b.lock.Unlock()
    33  
    34  	b.sharedFieldReferences[blockRoots].MinusRef()
    35  	b.sharedFieldReferences[blockRoots] = stateutil.NewRef(1)
    36  
    37  	b.state.BlockRoots = val
    38  	b.markFieldAsDirty(blockRoots)
    39  	b.rebuildTrie[blockRoots] = true
    40  	return nil
    41  }
    42  
    43  // UpdateBlockRootAtIndex for the beacon state. Updates the block root
    44  // at a specific index to a new value.
    45  func (b *BeaconState) UpdateBlockRootAtIndex(idx uint64, blockRoot [32]byte) error {
    46  	if !b.hasInnerState() {
    47  		return ErrNilInnerState
    48  	}
    49  	if uint64(len(b.state.BlockRoots)) <= idx {
    50  		return fmt.Errorf("invalid index provided %d", idx)
    51  	}
    52  	b.lock.Lock()
    53  	defer b.lock.Unlock()
    54  
    55  	r := b.state.BlockRoots
    56  	if ref := b.sharedFieldReferences[blockRoots]; ref.Refs() > 1 {
    57  		// Copy elements in underlying array by reference.
    58  		r = make([][]byte, len(b.state.BlockRoots))
    59  		copy(r, b.state.BlockRoots)
    60  		ref.MinusRef()
    61  		b.sharedFieldReferences[blockRoots] = stateutil.NewRef(1)
    62  	}
    63  
    64  	r[idx] = blockRoot[:]
    65  	b.state.BlockRoots = r
    66  
    67  	b.markFieldAsDirty(blockRoots)
    68  	b.addDirtyIndices(blockRoots, []uint64{idx})
    69  	return nil
    70  }