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 }