69 lines
2.2 KiB
Go
69 lines
2.2 KiB
Go
package tron
|
|
|
|
import (
|
|
"encoding/hex"
|
|
"testing"
|
|
)
|
|
|
|
// TestSignatureMatchesPython locks the hand-rolled RFC6979/low-s recoverable
|
|
// signing to values produced by coincurve/libsecp256k1 via tronpy's
|
|
// PrivateKey.sign_msg_hash. The hashes are the txids computed elsewhere in the
|
|
// suite.
|
|
func TestSignatureMatchesPython(t *testing.T) {
|
|
cases := []struct {
|
|
name string
|
|
priv string
|
|
hash string
|
|
want string
|
|
addr string
|
|
}{
|
|
{
|
|
"t3_transfer_txid",
|
|
"a96135266ba58bb5b3a450b8fe7a9d59ea3e6cb0cdb2300e8138d2d2d48e61a8",
|
|
"e93945efde601eed484553338e58218f4e81c51261dfda72db2d874f75378fe8",
|
|
"a48ffafc8bdb57bdb64216b0facdff77cd2bb7090e1e1b7dcd6e829823c7cd207422b7bd910a063b96f562e32dc566b3b6a1c935d7c63c01642dda14b0b4966d00",
|
|
"TG9vH8c2jBWq2wSnksrq5mVyq2wjhG4A1n",
|
|
},
|
|
{
|
|
"t3_sparse_hash",
|
|
"a96135266ba58bb5b3a450b8fe7a9d59ea3e6cb0cdb2300e8138d2d2d48e61a8",
|
|
"0000000000000000000000000000000000000000000000000000000000000001",
|
|
"2df95cd58fc299c155dd51e13799c42c00786b1d18a1423f9b098f8354f4785e670d6a75c0fea96162a990689a9ee0089e08bd9e663dfe27104902a0bdf6a04f01",
|
|
"TG9vH8c2jBWq2wSnksrq5mVyq2wjhG4A1n",
|
|
},
|
|
{
|
|
"t2_trigger_txid",
|
|
"3252a4cb9b3865c94dbb7d6f50107ca704c1c2b9e3d1eb81753e221c7db8fa25",
|
|
"0c1dec1fa73590ddf4a3975b78791e72d18998ae42751af199384587c2ef12d0",
|
|
"3136e1e010697c23c3aa7ba78b3eee06a3fbb75d32e37c0730f2b2a733ed5da6191f93d706b0c6c18d480d0f27cfd208bf64ce157ee83f6ff6082fdd230d0cab01",
|
|
"TUSQ1u3HKUsTpfsi5uRXScUzES9RN1w8kk",
|
|
},
|
|
}
|
|
for _, tc := range cases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
key, err := PrivateKeyFromHex(tc.priv)
|
|
if err != nil {
|
|
t.Fatalf("PrivateKeyFromHex: %v", err)
|
|
}
|
|
h, err := hex.DecodeString(tc.hash)
|
|
if err != nil {
|
|
t.Fatalf("decode hash: %v", err)
|
|
}
|
|
sig, err := key.Sign(h)
|
|
if err != nil {
|
|
t.Fatalf("Sign: %v", err)
|
|
}
|
|
if got := hex.EncodeToString(sig); got != tc.want {
|
|
t.Fatalf("signature = %s, want %s", got, tc.want)
|
|
}
|
|
rec, err := RecoverAddress(h, sig)
|
|
if err != nil {
|
|
t.Fatalf("RecoverAddress: %v", err)
|
|
}
|
|
if rec != tc.addr {
|
|
t.Fatalf("recovered = %s, want %s", rec, tc.addr)
|
|
}
|
|
})
|
|
}
|
|
}
|