blocto / solana-go-sdk

Solana Golang SDK
https://blocto.github.io/solana-go-sdk/
MIT License
349 stars 86 forks source link

An optimization suggestion about transaction serialization #161

Open shniu opened 3 months ago

shniu commented 3 months ago

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.