54 lines
993 B
Go
54 lines
993 B
Go
package tpu
|
|
|
|
import (
|
|
"crypto/ed25519"
|
|
"errors"
|
|
"github.com/gagliardetto/binary"
|
|
"github.com/gagliardetto/solana-go"
|
|
)
|
|
|
|
func ParseTx(p []byte) (tx *solana.Transaction, err error) {
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
err = errors.New("ParseTx panic")
|
|
}
|
|
}()
|
|
|
|
tx, err = solana.TransactionFromDecoder(bin.NewBinDecoder(p))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return
|
|
}
|
|
|
|
func VerifyTxSig(tx *solana.Transaction) (ok bool) {
|
|
msg, err := tx.Message.MarshalBinary()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
signers := ExtractSigners(tx)
|
|
|
|
if len(signers) != len(tx.Signatures) {
|
|
return false
|
|
}
|
|
|
|
for i, sig := range tx.Signatures {
|
|
if !ed25519.Verify(signers[i][:], msg, sig[:]) {
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func ExtractSigners(tx *solana.Transaction) []solana.PublicKey {
|
|
signers := make([]solana.PublicKey, 0, len(tx.Signatures))
|
|
for _, acc := range tx.Message.AccountKeys {
|
|
if tx.IsSigner(acc) {
|
|
signers = append(signers, acc)
|
|
}
|
|
}
|
|
return signers
|
|
}
|