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  }