github.com/ava-labs/avalanchego@v1.11.11/vms/example/xsvm/tx/tx.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package tx 5 6 import ( 7 "github.com/ava-labs/avalanchego/cache" 8 "github.com/ava-labs/avalanchego/ids" 9 "github.com/ava-labs/avalanchego/utils/crypto/secp256k1" 10 "github.com/ava-labs/avalanchego/utils/hashing" 11 ) 12 13 var secpCache = secp256k1.RecoverCache{ 14 LRU: cache.LRU[ids.ID, *secp256k1.PublicKey]{ 15 Size: 2048, 16 }, 17 } 18 19 type Tx struct { 20 Unsigned `serialize:"true" json:"unsigned"` 21 Signature [secp256k1.SignatureLen]byte `serialize:"true" json:"signature"` 22 } 23 24 func Parse(bytes []byte) (*Tx, error) { 25 tx := &Tx{} 26 _, err := Codec.Unmarshal(bytes, tx) 27 return tx, err 28 } 29 30 func Sign(utx Unsigned, key *secp256k1.PrivateKey) (*Tx, error) { 31 unsignedBytes, err := Codec.Marshal(CodecVersion, &utx) 32 if err != nil { 33 return nil, err 34 } 35 36 sig, err := key.Sign(unsignedBytes) 37 if err != nil { 38 return nil, err 39 } 40 41 tx := &Tx{ 42 Unsigned: utx, 43 } 44 copy(tx.Signature[:], sig) 45 return tx, nil 46 } 47 48 func (tx *Tx) ID() (ids.ID, error) { 49 bytes, err := Codec.Marshal(CodecVersion, tx) 50 return hashing.ComputeHash256Array(bytes), err 51 } 52 53 func (tx *Tx) SenderID() (ids.ShortID, error) { 54 unsignedBytes, err := Codec.Marshal(CodecVersion, &tx.Unsigned) 55 if err != nil { 56 return ids.ShortEmpty, err 57 } 58 59 pk, err := secpCache.RecoverPublicKey(unsignedBytes, tx.Signature[:]) 60 if err != nil { 61 return ids.ShortEmpty, err 62 } 63 return pk.Address(), nil 64 }