You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
1.8 KiB

  1. package tx
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/assert"
  5. "github.com/stretchr/testify/require"
  6. crypto "github.com/tendermint/go-crypto"
  7. keys "github.com/tendermint/go-crypto/keys"
  8. "github.com/tendermint/go-crypto/keys/cryptostore"
  9. "github.com/tendermint/go-crypto/keys/storage/memstorage"
  10. )
  11. func TestMultiSig(t *testing.T) {
  12. assert, require := assert.New(t), require.New(t)
  13. algo := crypto.NameEd25519
  14. cstore := cryptostore.New(
  15. cryptostore.SecretBox,
  16. memstorage.New(),
  17. keys.MustLoadCodec("english"),
  18. )
  19. n, p := "foo", "bar"
  20. n2, p2 := "other", "thing"
  21. acct, _, err := cstore.Create(n, p, algo)
  22. require.Nil(err, "%+v", err)
  23. acct2, _, err := cstore.Create(n2, p2, algo)
  24. require.Nil(err, "%+v", err)
  25. type signer struct {
  26. key keys.Info
  27. name, pass string
  28. }
  29. cases := []struct {
  30. data string
  31. signers []signer
  32. }{
  33. {"one", []signer{{acct, n, p}}},
  34. {"two", []signer{{acct2, n2, p2}}},
  35. {"both", []signer{{acct, n, p}, {acct2, n2, p2}}},
  36. }
  37. for _, tc := range cases {
  38. tx := NewMulti([]byte(tc.data))
  39. // unsigned version
  40. _, err = tx.Signers()
  41. assert.NotNil(err)
  42. orig, err := tx.TxBytes()
  43. require.Nil(err, "%+v", err)
  44. data := tx.SignBytes()
  45. assert.Equal(tc.data, string(data))
  46. // sign it
  47. for _, s := range tc.signers {
  48. err = cstore.Sign(s.name, s.pass, tx)
  49. require.Nil(err, "%+v", err)
  50. }
  51. // make sure it is proper now
  52. sigs, err := tx.Signers()
  53. require.Nil(err, "%+v", err)
  54. if assert.Equal(len(tc.signers), len(sigs)) {
  55. for i := range sigs {
  56. // This must be refactored...
  57. assert.Equal(tc.signers[i].key.PubKey, sigs[i])
  58. }
  59. }
  60. // the tx bytes should change after this
  61. after, err := tx.TxBytes()
  62. require.Nil(err, "%+v", err)
  63. assert.NotEqual(orig, after, "%X != %X", orig, after)
  64. // sign bytes are the same
  65. data = tx.SignBytes()
  66. assert.Equal(tc.data, string(data))
  67. }
  68. }