Skip to content

Commit 731c0d4

Browse files
Change how the signer data is copied from horizon to txnbuild
1 parent b7bec9f commit 731c0d4

File tree

4 files changed

+60
-54
lines changed

4 files changed

+60
-54
lines changed

protocols/horizon/main.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,15 @@ func (a *Account) GetData(key string) ([]byte, error) {
128128
return base64.StdEncoding.DecodeString(a.Data[key])
129129
}
130130

131+
// SignerSummary returns a map of signer's keys to weights.
132+
func (a *Account) SignerSummary() map[string]int32 {
133+
m := map[string]int32{}
134+
for _, s := range a.Signers {
135+
m[s.Key] = s.Weight
136+
}
137+
return m
138+
}
139+
131140
// AccountSigner is the account signer information.
132141
type AccountSigner struct {
133142
Links struct {

txnbuild/transaction.go

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,9 @@ func ReadChallengeTx(challengeTx, serverAccountID, network string) (tx Transacti
492492
return tx, clientAccountID, nil
493493
}
494494

495+
// SignerSummary is a map of signers to their weights.
496+
type SignerSummary map[string]int32
497+
495498
// VerifyChallengeTxThreshold verifies that for a SEP 10 challenge transaction
496499
// all signatures on the transaction are accounted for and that the signatures
497500
// meet a threshold on an account. A transaction is verified if it is signed by
@@ -505,33 +508,26 @@ func ReadChallengeTx(challengeTx, serverAccountID, network string) (tx Transacti
505508
// - One or more signatures in the transaction are not identifiable as the
506509
// server account or one of the signers provided in the arguments.
507510
// - The signatures are all valid but do not meet the threshold.
508-
func VerifyChallengeTxThreshold(challengeTx, serverAccountID, network string, threshold Threshold, signers []Signer) (signersFound []Signer, err error) {
509-
signerMap := map[string]Signer{}
510-
signerAddresses := make([]string, 0, len(signers))
511-
for _, s := range signers {
512-
signerMap[s.Address] = s
513-
signerAddresses = append(signerAddresses, s.Address)
511+
func VerifyChallengeTxThreshold(challengeTx, serverAccountID, network string, threshold Threshold, signerSummary SignerSummary) (signersFound []string, err error) {
512+
signerAddresses := make([]string, 0, len(signerSummary))
513+
for s := range signerSummary {
514+
signerAddresses = append(signerAddresses, s)
514515
}
515516

516-
signerAddressesFound, err := VerifyChallengeTxSigners(challengeTx, serverAccountID, network, signerAddresses...)
517+
signersFound, err = VerifyChallengeTxSigners(challengeTx, serverAccountID, network, signerAddresses...)
517518
if err != nil {
518519
return nil, err
519520
}
520521

521522
weight := Threshold(0)
522-
for _, s := range signerAddressesFound {
523-
weight += signerMap[s].Weight
523+
for _, s := range signersFound {
524+
weight += Threshold(signerSummary[s])
524525
}
525526

526527
if weight < threshold {
527528
return nil, errors.Errorf("signers with weight %d do not meet threshold %d", weight, threshold)
528529
}
529530

530-
signersFound = make([]Signer, 0, len(signerAddressesFound))
531-
for _, s := range signerAddressesFound {
532-
signersFound = append(signersFound, signerMap[s])
533-
}
534-
535531
return signersFound, nil
536532
}
537533

txnbuild/transaction_challenge_example_test.go

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -92,26 +92,20 @@ func ExampleVerifyChallengeTxThreshold() {
9292

9393
if clientAccountExists {
9494
// Server gets list of signers from account
95-
signers := make([]txnbuild.Signer, 0, len(horizonClientAccount.Signers))
96-
for _, hs := range horizonClientAccount.Signers {
97-
signers = append(signers, txnbuild.Signer{
98-
Address: hs.Key,
99-
Weight: txnbuild.Threshold(hs.Weight),
100-
})
101-
}
95+
signerSummary := horizonClientAccount.SignerSummary()
10296

10397
// Server chooses the threshold to require: low, med or high
10498
threshold := txnbuild.Threshold(horizonClientAccount.Thresholds.MedThreshold)
10599

106100
// Server verifies threshold is met
107-
signersFound, err := txnbuild.VerifyChallengeTxThreshold(signedChallengeTx, serverAccount.Address(), network.TestNetworkPassphrase, threshold, signers)
101+
signers, err := txnbuild.VerifyChallengeTxThreshold(signedChallengeTx, serverAccount.Address(), network.TestNetworkPassphrase, threshold, signerSummary)
108102
if err != nil {
109103
fmt.Println("Error:", err)
110104
return
111105
}
112106
fmt.Println("Client Signers Verified:")
113-
for _, signerFound := range signersFound {
114-
fmt.Println(signerFound.Address, "weight:", signerFound.Weight)
107+
for _, signer := range signers {
108+
fmt.Println(signer, "weight:", signerSummary[signer])
115109
}
116110
} else {
117111
// Server verifies that master key has signed challenge transaction

txnbuild/transaction_test.go

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1584,8 +1584,11 @@ func TestVerifyChallengeTxThreshold_validServerAndClientKeyMeetingThreshold(t *t
15841584
Network: network.TestNetworkPassphrase,
15851585
}
15861586
threshold := Threshold(1)
1587-
signers := []Signer{
1588-
{Address: clientKP.Address(), Weight: 1},
1587+
signerSummary := SignerSummary{
1588+
clientKP.Address(): 1,
1589+
}
1590+
wantSigners := []string{
1591+
clientKP.Address(),
15891592
}
15901593

15911594
err := tx.Build()
@@ -1594,8 +1597,8 @@ func TestVerifyChallengeTxThreshold_validServerAndClientKeyMeetingThreshold(t *t
15941597
assert.NoError(t, err)
15951598
tx64, err := tx.Base64()
15961599
require.NoError(t, err)
1597-
signersFound, err := VerifyChallengeTxThreshold(tx64, serverKP.Address(), network.TestNetworkPassphrase, threshold, signers)
1598-
assert.Equal(t, signers, signersFound)
1600+
signersFound, err := VerifyChallengeTxThreshold(tx64, serverKP.Address(), network.TestNetworkPassphrase, threshold, signerSummary)
1601+
assert.Equal(t, wantSigners, signersFound)
15991602
assert.NoError(t, err)
16001603
}
16011604

@@ -1617,9 +1620,13 @@ func TestVerifyChallengeTxThreshold_validServerAndMultipleClientKeyMeetingThresh
16171620
Network: network.TestNetworkPassphrase,
16181621
}
16191622
threshold := Threshold(3)
1620-
signers := []Signer{
1621-
{Address: clientKP1.Address(), Weight: 1},
1622-
{Address: clientKP2.Address(), Weight: 2},
1623+
signerSummary := map[string]int32{
1624+
clientKP1.Address(): 1,
1625+
clientKP2.Address(): 2,
1626+
}
1627+
wantSigners := []string{
1628+
clientKP1.Address(),
1629+
clientKP2.Address(),
16231630
}
16241631

16251632
err := tx.Build()
@@ -1628,8 +1635,8 @@ func TestVerifyChallengeTxThreshold_validServerAndMultipleClientKeyMeetingThresh
16281635
assert.NoError(t, err)
16291636
tx64, err := tx.Base64()
16301637
require.NoError(t, err)
1631-
signersFound, err := VerifyChallengeTxThreshold(tx64, serverKP.Address(), network.TestNetworkPassphrase, threshold, signers)
1632-
assert.Equal(t, signers, signersFound)
1638+
signersFound, err := VerifyChallengeTxThreshold(tx64, serverKP.Address(), network.TestNetworkPassphrase, threshold, signerSummary)
1639+
assert.Equal(t, wantSigners, signersFound)
16331640
assert.NoError(t, err)
16341641
}
16351642

@@ -1652,10 +1659,14 @@ func TestVerifyChallengeTxThreshold_validServerAndMultipleClientKeyMeetingThresh
16521659
Network: network.TestNetworkPassphrase,
16531660
}
16541661
threshold := Threshold(3)
1655-
signers := []Signer{
1656-
{Address: clientKP1.Address(), Weight: 1},
1657-
{Address: clientKP2.Address(), Weight: 2},
1658-
{Address: clientKP3.Address(), Weight: 2},
1662+
signerSummary := SignerSummary{
1663+
clientKP1.Address(): 1,
1664+
clientKP2.Address(): 2,
1665+
clientKP3.Address(): 2,
1666+
}
1667+
wantSigners := []string{
1668+
clientKP1.Address(),
1669+
clientKP2.Address(),
16591670
}
16601671

16611672
err := tx.Build()
@@ -1664,12 +1675,8 @@ func TestVerifyChallengeTxThreshold_validServerAndMultipleClientKeyMeetingThresh
16641675
assert.NoError(t, err)
16651676
tx64, err := tx.Base64()
16661677
require.NoError(t, err)
1667-
signersFound, err := VerifyChallengeTxThreshold(tx64, serverKP.Address(), network.TestNetworkPassphrase, threshold, signers)
1668-
wantSignersFound := []Signer{
1669-
{Address: clientKP1.Address(), Weight: 1},
1670-
{Address: clientKP2.Address(), Weight: 2},
1671-
}
1672-
assert.Equal(t, wantSignersFound, signersFound)
1678+
signersFound, err := VerifyChallengeTxThreshold(tx64, serverKP.Address(), network.TestNetworkPassphrase, threshold, signerSummary)
1679+
assert.Equal(t, wantSigners, signersFound)
16731680
assert.NoError(t, err)
16741681
}
16751682

@@ -1692,10 +1699,10 @@ func TestVerifyChallengeTxThreshold_invalidServerAndMultipleClientKeyNotMeetingT
16921699
Network: network.TestNetworkPassphrase,
16931700
}
16941701
threshold := Threshold(10)
1695-
signers := []Signer{
1696-
{Address: clientKP1.Address(), Weight: 1},
1697-
{Address: clientKP2.Address(), Weight: 2},
1698-
{Address: clientKP3.Address(), Weight: 2},
1702+
signerSummary := SignerSummary{
1703+
clientKP1.Address(): 1,
1704+
clientKP2.Address(): 2,
1705+
clientKP3.Address(): 2,
16991706
}
17001707

17011708
err := tx.Build()
@@ -1704,7 +1711,7 @@ func TestVerifyChallengeTxThreshold_invalidServerAndMultipleClientKeyNotMeetingT
17041711
assert.NoError(t, err)
17051712
tx64, err := tx.Base64()
17061713
require.NoError(t, err)
1707-
_, err = VerifyChallengeTxThreshold(tx64, serverKP.Address(), network.TestNetworkPassphrase, threshold, signers)
1714+
_, err = VerifyChallengeTxThreshold(tx64, serverKP.Address(), network.TestNetworkPassphrase, threshold, signerSummary)
17081715
assert.EqualError(t, err, "signers with weight 3 do not meet threshold 10")
17091716
}
17101717

@@ -1727,9 +1734,9 @@ func TestVerifyChallengeTxThreshold_invalidClientKeyUnrecognized(t *testing.T) {
17271734
Network: network.TestNetworkPassphrase,
17281735
}
17291736
threshold := Threshold(10)
1730-
signers := []Signer{
1731-
{Address: clientKP1.Address(), Weight: 1},
1732-
{Address: clientKP2.Address(), Weight: 2},
1737+
signerSummary := map[string]int32{
1738+
clientKP1.Address(): 1,
1739+
clientKP2.Address(): 2,
17331740
}
17341741

17351742
err := tx.Build()
@@ -1738,7 +1745,7 @@ func TestVerifyChallengeTxThreshold_invalidClientKeyUnrecognized(t *testing.T) {
17381745
assert.NoError(t, err)
17391746
tx64, err := tx.Base64()
17401747
require.NoError(t, err)
1741-
_, err = VerifyChallengeTxThreshold(tx64, serverKP.Address(), network.TestNetworkPassphrase, threshold, signers)
1748+
_, err = VerifyChallengeTxThreshold(tx64, serverKP.Address(), network.TestNetworkPassphrase, threshold, signerSummary)
17421749
assert.EqualError(t, err, "transaction has unrecognized signatures")
17431750
}
17441751

@@ -1761,15 +1768,15 @@ func TestVerifyChallengeTxThreshold_invalidNoSigners(t *testing.T) {
17611768
Network: network.TestNetworkPassphrase,
17621769
}
17631770
threshold := Threshold(10)
1764-
signers := []Signer{}
1771+
signerSummary := SignerSummary{}
17651772

17661773
err := tx.Build()
17671774
require.NoError(t, err)
17681775
err = tx.Sign(serverKP, clientKP1, clientKP2, clientKP3)
17691776
assert.NoError(t, err)
17701777
tx64, err := tx.Base64()
17711778
require.NoError(t, err)
1772-
_, err = VerifyChallengeTxThreshold(tx64, serverKP.Address(), network.TestNetworkPassphrase, threshold, signers)
1779+
_, err = VerifyChallengeTxThreshold(tx64, serverKP.Address(), network.TestNetworkPassphrase, threshold, signerSummary)
17731780
assert.EqualError(t, err, "no signers provided")
17741781
}
17751782

0 commit comments

Comments
 (0)