-
Notifications
You must be signed in to change notification settings - Fork 1
/
address.go
58 lines (45 loc) · 999 Bytes
/
address.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package main
import (
"crypto/sha256"
"github.com/pactus-project/pactus/util/bech32m"
)
func encodePubKeyBytes(key *Key) []byte {
var rawKey []byte
switch key.Kind {
case KindEd25519:
rawKey = make([]byte, 1+32)
copy(rawKey[1:], key.Public)
case KindSecp256k1:
rawKey = make([]byte, 1+33)
rawKey[0] = 1
copy(rawKey[1:], key.Public)
}
return rawKey
}
func DerivePkHash(key *Key) [32]byte {
return sha256.Sum256(encodePubKeyBytes(key))
}
func DeriveAddress(digest [32]byte) string {
var data [21]byte
copy(data[1:], digest[:20])
converted, err := bech32m.ConvertBits(data[:], 8, 5, true)
if err != nil {
panic(err)
}
addr, err := bech32m.Encode("tnam", converted)
if err != nil {
panic(err)
}
return addr
}
func DerivePublicKey(key *Key) string {
converted, err := bech32m.ConvertBits(encodePubKeyBytes(key)[:], 8, 5, true)
if err != nil {
panic(err)
}
addr, err := bech32m.Encode("tpknam", converted)
if err != nil {
panic(err)
}
return addr
}