github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/db/kv/deposit_contract.go (about)

     1  package kv
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	"github.com/ethereum/go-ethereum/common"
     8  	bolt "go.etcd.io/bbolt"
     9  	"go.opencensus.io/trace"
    10  )
    11  
    12  // DepositContractAddress returns contract address is the address of
    13  // the deposit contract on the proof of work chain.
    14  func (s *Store) DepositContractAddress(ctx context.Context) ([]byte, error) {
    15  	ctx, span := trace.StartSpan(ctx, "BeaconDB.DepositContractAddress")
    16  	defer span.End()
    17  	var addr []byte
    18  	if err := s.db.View(func(tx *bolt.Tx) error {
    19  		chainInfo := tx.Bucket(chainMetadataBucket)
    20  		addr = chainInfo.Get(depositContractAddressKey)
    21  		return nil
    22  	}); err != nil { // This view never returns an error, but we'll handle anyway for sanity.
    23  		panic(err)
    24  	}
    25  	return addr, nil
    26  }
    27  
    28  // SaveDepositContractAddress to the db. It returns an error if an address has been previously saved.
    29  func (s *Store) SaveDepositContractAddress(ctx context.Context, addr common.Address) error {
    30  	ctx, span := trace.StartSpan(ctx, "BeaconDB.VerifyContractAddress")
    31  	defer span.End()
    32  
    33  	return s.db.Update(func(tx *bolt.Tx) error {
    34  		chainInfo := tx.Bucket(chainMetadataBucket)
    35  		expectedAddress := chainInfo.Get(depositContractAddressKey)
    36  		if expectedAddress != nil {
    37  			return fmt.Errorf("cannot override deposit contract address: %v", expectedAddress)
    38  		}
    39  		return chainInfo.Put(depositContractAddressKey, addr.Bytes())
    40  	})
    41  }