solana-go-sdk icon indicating copy to clipboard operation
solana-go-sdk copied to clipboard

An optimization suggestion about transaction serialization

Open shniu opened this issue 10 months ago • 0 comments

I have some questions about the following code:

// Serialize pack tx into byte array
func (tx *Transaction) Serialize() ([]byte, error) {
	if len(tx.Signatures) == 0 || len(tx.Signatures) != int(tx.Message.Header.NumRequireSignatures) {
		return nil, errors.New("Signature verification failed")
	}

	signatureCount := bincode.UintToVarLenBytes(uint64(len(tx.Signatures)))
	messageData, err := tx.Message.Serialize()
	if err != nil {
		return nil, err
	}
     
        // ?? Why does here use **len(signatureCount)*64** ??
	output := make([]byte, 0, len(signatureCount)+len(signatureCount)*64+len(messageData))
	output = append(output, signatureCount...)
	for _, sig := range tx.Signatures {
		output = append(output, sig...)
	}
	output = append(output, messageData...)

	return output, nil
}

This line output := make([]byte, 0, len(signatureCount)+len(signatureCount)*64+len(messageData)), i think it makes more sense to use len(tx.Signatures) * 64 here.

shniu avatar Apr 09 '24 07:04 shniu