Skip to content

Commit 40b1b01

Browse files
authored
Add support for Substrate Network on Key load (#87)
* Revert "Add ExtrinsicSignatureV5 (#68)" This reverts commit 461cf42. * Add Support for network during key loading * remove debug line * added subkey + official image * comment dockerfile * Load network from env in test function
1 parent 6c55974 commit 40b1b01

5 files changed

Lines changed: 47 additions & 10 deletions

File tree

Dockerfile

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
11
# Note: We don't use Alpine and its packaged Rust/Cargo because they're too often out of date,
22
# preventing them from being used to build Substrate/Polkadot.
33

4-
FROM philipstanislaus/substrate
4+
# First Phase - Load Subkey
5+
FROM parity/subkey:2.0.0-alpha.3 as subkey
6+
RUN subkey --version
7+
8+
## Second Phase - Build context for tests
9+
FROM parity/substrate:v2.0.0-alpha.3
10+
11+
USER root
12+
13+
COPY --from=subkey /usr/local/bin/subkey /usr/local/bin/subkey
514

615
# gcc for cgo
716
RUN apt-get update && apt-get install -y --no-install-recommends \
@@ -56,6 +65,11 @@ RUN mkdir -p $GOPATH/src/github.com/centrifuge/go-substrate-rpc-client
5665
WORKDIR $GOPATH/src/github.com/centrifuge/go-substrate-rpc-client
5766
COPY . .
5867

68+
# Ensuring Subkey is available
69+
RUN subkey --version
70+
5971
RUN make install
6072

73+
# Reset parent entrypoint
74+
ENTRYPOINT []
6175
CMD ["make", "test-cover"]

signature/signature.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,17 @@ var rePubKey = regexp.MustCompile(`Public key \(hex\): 0x([a-f0-9]*)\n`)
4242
var reAddressOld = regexp.MustCompile(`Address \(SS58\): ([a-zA-Z0-9]*)\n`)
4343
var reAddressNew = regexp.MustCompile(`SS58 Address:\s+([a-zA-Z0-9]*)\n`)
4444

45-
func KeyringPairFromSecret(seedOrPhrase string) (KeyringPair, error) {
45+
// KeyringPairFromSecret creates KeyPair based on seed/phrase and network
46+
// Leave network empty for default behavior
47+
func KeyringPairFromSecret(seedOrPhrase, network string) (KeyringPair, error) {
48+
var args []string
49+
if network != "" {
50+
args = []string{"-n", network}
51+
}
52+
args = append(args, []string{"inspect", seedOrPhrase}...)
53+
4654
// use "subkey" command for creation of public key and address
47-
cmd := exec.Command(subkeyCmd, "inspect", seedOrPhrase)
55+
cmd := exec.Command(subkeyCmd, args...)
4856

4957
// execute the command, get the output
5058
out, err := cmd.Output()
@@ -165,12 +173,15 @@ func Verify(data []byte, sig []byte, privateKeyURI string) (bool, error) {
165173
// LoadKeyringPairFromEnv looks up whether the env variable TEST_PRIV_KEY is set and is not empty and tries to use its
166174
// content as a private phrase, seed or URI to derive a key ring pair. Panics if the private phrase, seed or URI is
167175
// not valid or the keyring pair cannot be derived
176+
// Loads Network from TEST_NETWORK variable
177+
// Leave TEST_NETWORK empty or unset for default
168178
func LoadKeyringPairFromEnv() (kp KeyringPair, ok bool) {
179+
network := os.Getenv("TEST_NETWORK")
169180
priv, ok := os.LookupEnv("TEST_PRIV_KEY")
170181
if !ok || priv == "" {
171182
return kp, false
172183
}
173-
kp, err := KeyringPairFromSecret(priv)
184+
kp, err := KeyringPairFromSecret(priv, network)
174185
if err != nil {
175186
panic(fmt.Errorf("cannot load keyring pair from env or use fallback: %v", err))
176187
}

signature/signature_test.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,10 @@ var testSecretPhrase = "little orbit comfort eyebrow talk pink flame ridge bring
2929
var testSecretSeed = "0x167d9a020688544ea246b056799d6a771e97c9da057e4d0b87024537f99177bc"
3030
var testPubKey = "0xdc64bef918ddda3126a39a11113767741ddfdf91399f055e1d963f2ae1ec2535"
3131
var testAddressSS58 = "5H3gKVQU7DfNFfNGkgTrD7p715jjg7QXtat8X3UxiSyw7APW"
32+
var testKusamaAddressSS58 = "HZHyokLjagJ1KBiXPGu75B79g1yUnDiLxisuhkvCFCRrWBk"
3233

3334
func TestKeyRingPairFromSecretPhrase(t *testing.T) {
34-
p, err := KeyringPairFromSecret(testSecretPhrase)
35+
p, err := KeyringPairFromSecret(testSecretPhrase, "")
3536
assert.NoError(t, err)
3637

3738
assert.Equal(t, KeyringPair{
@@ -42,7 +43,7 @@ func TestKeyRingPairFromSecretPhrase(t *testing.T) {
4243
}
4344

4445
func TestKeyringPairFromSecretSeed(t *testing.T) {
45-
p, err := KeyringPairFromSecret(testSecretSeed)
46+
p, err := KeyringPairFromSecret(testSecretSeed, "")
4647
assert.NoError(t, err)
4748

4849
assert.Equal(t, KeyringPair{
@@ -52,13 +53,24 @@ func TestKeyringPairFromSecretSeed(t *testing.T) {
5253
}, p)
5354
}
5455

56+
func TestKeyringPairFromSecretSeedAndNetwork(t *testing.T) {
57+
p, err := KeyringPairFromSecret(testSecretSeed, "kusama")
58+
assert.NoError(t, err)
59+
60+
assert.Equal(t, KeyringPair{
61+
URI: testSecretSeed,
62+
Address: testKusamaAddressSS58,
63+
PublicKey: types.MustHexDecodeString(testPubKey),
64+
}, p)
65+
}
66+
5567
func TestSignAndVerify(t *testing.T) {
5668
data := []byte("hello!")
5769

5870
sig, err := Sign(data, TestKeyringPairAlice.URI)
5971
assert.NoError(t, err)
6072

61-
ok, err := Verify(data, sig, TestKeyringPairAlice.URI)
73+
ok, err := Verify(data, sig, types.HexEncodeToString(TestKeyringPairAlice.PublicKey))
6274
assert.NoError(t, err)
6375

6476
assert.True(t, ok)
@@ -72,7 +84,7 @@ func TestSignAndVerifyLong(t *testing.T) {
7284
sig, err := Sign(data, TestKeyringPairAlice.URI)
7385
assert.NoError(t, err)
7486

75-
ok, err := Verify(data, sig, TestKeyringPairAlice.URI)
87+
ok, err := Verify(data, sig, types.HexEncodeToString(TestKeyringPairAlice.PublicKey))
7688
assert.NoError(t, err)
7789

7890
assert.True(t, ok)

types/extrinsic_payload_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ func TestExtrinsicPayload_Sign(t *testing.T) {
7171
// verify sig
7272
b, err := EncodeToBytes(examplaryExtrinsicPayload)
7373
assert.NoError(t, err)
74-
ok, err := signature.Verify(b, sig[:], signature.TestKeyringPairAlice.URI)
74+
ok, err := signature.Verify(b, sig[:], HexEncodeToString(signature.TestKeyringPairAlice.PublicKey))
7575
assert.NoError(t, err)
7676
assert.True(t, ok)
7777
}

types/extrinsic_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ func TestExtrinsic_Sign(t *testing.T) {
132132
// verify sig
133133
b, err := EncodeToBytes(verifyPayload)
134134
assert.NoError(t, err)
135-
ok, err := signature.Verify(b, extDec.Signature.Signature.AsSr25519[:], signature.TestKeyringPairAlice.URI)
135+
ok, err := signature.Verify(b, extDec.Signature.Signature.AsSr25519[:], HexEncodeToString(signature.TestKeyringPairAlice.PublicKey))
136136
assert.NoError(t, err)
137137
assert.True(t, ok)
138138
}

0 commit comments

Comments
 (0)