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 }