github.com/onflow/flow-go@v0.33.17/ledger/common/convert/convert.go (about)

     1  package convert
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/onflow/flow-go/ledger"
     7  	"github.com/onflow/flow-go/model/flow"
     8  )
     9  
    10  const (
    11  	KeyPartOwner = uint16(0)
    12  	// @deprecated - controller was used only by the very first
    13  	// version of cadence for access controll which was retired later on
    14  	// KeyPartController = uint16(1)
    15  	KeyPartKey = uint16(2)
    16  )
    17  
    18  // UnexpectedLedgerKeyFormat is returned when a ledger key is not in the expected format
    19  var UnexpectedLedgerKeyFormat = fmt.Errorf("unexpected ledger key format")
    20  
    21  // LedgerKeyToRegisterID converts a ledger key to a register id
    22  // returns an UnexpectedLedgerKeyFormat error if the key is not in the expected format
    23  func LedgerKeyToRegisterID(key ledger.Key) (flow.RegisterID, error) {
    24  	if len(key.KeyParts) != 2 ||
    25  		key.KeyParts[0].Type != KeyPartOwner ||
    26  		key.KeyParts[1].Type != KeyPartKey {
    27  		return flow.RegisterID{}, fmt.Errorf("ledger key %s: %w", key.String(), UnexpectedLedgerKeyFormat)
    28  	}
    29  
    30  	return flow.NewRegisterID(
    31  		flow.BytesToAddress(key.KeyParts[0].Value),
    32  		string(key.KeyParts[1].Value),
    33  	), nil
    34  }
    35  
    36  // RegisterIDToLedgerKey converts a register id to a ledger key
    37  func RegisterIDToLedgerKey(registerID flow.RegisterID) ledger.Key {
    38  	newKey := ledger.Key{}
    39  	newKey.KeyParts = []ledger.KeyPart{
    40  		{
    41  			Type:  KeyPartOwner,
    42  			Value: []byte(registerID.Owner),
    43  		},
    44  		{
    45  			Type:  KeyPartKey,
    46  			Value: []byte(registerID.Key),
    47  		},
    48  	}
    49  	return newKey
    50  }
    51  
    52  // PayloadToRegister converts a payload to a register id and value
    53  func PayloadToRegister(payload *ledger.Payload) (flow.RegisterID, flow.RegisterValue, error) {
    54  	key, err := payload.Key()
    55  	if err != nil {
    56  		return flow.RegisterID{}, flow.RegisterValue{}, fmt.Errorf("could not parse register key from payload: %w", err)
    57  	}
    58  	regID, err := LedgerKeyToRegisterID(key)
    59  	if err != nil {
    60  		return flow.RegisterID{}, flow.RegisterValue{}, fmt.Errorf("could not convert register key into register id: %w", err)
    61  	}
    62  
    63  	return regID, payload.Value(), nil
    64  }