Changes to libkaspawallet to support Kaspaper (#1878)

* Add NewFileFromMnemonics

* Export InternalKeychain and ExternalKeychain

* Rename NewFileFromMnemonics -> NewFileFromMnemonic

* NewFileFromMnemonic: change also argument name

* Use libkaspawallet.ExternalKeychain instead of externalKeychain
This commit is contained in:
Svarog 2021-12-11 17:52:21 +02:00 committed by GitHub
parent 7292438e4a
commit 70900c571b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 37 additions and 14 deletions

View File

@ -3,6 +3,7 @@ package server
import ( import (
"context" "context"
"fmt" "fmt"
"github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/pb" "github.com/kaspanet/kaspad/cmd/kaspawallet/daemon/pb"
"github.com/kaspanet/kaspad/cmd/kaspawallet/libkaspawallet" "github.com/kaspanet/kaspad/cmd/kaspawallet/libkaspawallet"
"github.com/kaspanet/kaspad/util" "github.com/kaspanet/kaspad/util"
@ -23,7 +24,7 @@ func (s *server) changeAddress() (util.Address, error) {
walletAddr := &walletAddress{ walletAddr := &walletAddress{
index: s.keysFile.LastUsedInternalIndex(), index: s.keysFile.LastUsedInternalIndex(),
cosignerIndex: s.keysFile.CosignerIndex, cosignerIndex: s.keysFile.CosignerIndex,
keyChain: internalKeychain, keyChain: libkaspawallet.InternalKeychain,
} }
path := s.walletAddressPath(walletAddr) path := s.walletAddressPath(walletAddr)
return libkaspawallet.Address(s.params, s.keysFile.ExtendedPublicKeys, s.keysFile.MinimumSignatures, path, s.keysFile.ECDSA) return libkaspawallet.Address(s.params, s.keysFile.ExtendedPublicKeys, s.keysFile.MinimumSignatures, path, s.keysFile.ECDSA)
@ -42,7 +43,7 @@ func (s *server) ShowAddresses(_ context.Context, request *pb.ShowAddressesReque
walletAddr := &walletAddress{ walletAddr := &walletAddress{
index: i, index: i,
cosignerIndex: s.keysFile.CosignerIndex, cosignerIndex: s.keysFile.CosignerIndex,
keyChain: externalKeychain, keyChain: libkaspawallet.ExternalKeychain,
} }
path := s.walletAddressPath(walletAddr) path := s.walletAddressPath(walletAddr)
address, err := libkaspawallet.Address(s.params, s.keysFile.ExtendedPublicKeys, s.keysFile.MinimumSignatures, path, s.keysFile.ECDSA) address, err := libkaspawallet.Address(s.params, s.keysFile.ExtendedPublicKeys, s.keysFile.MinimumSignatures, path, s.keysFile.ECDSA)
@ -76,7 +77,7 @@ func (s *server) NewAddress(_ context.Context, request *pb.NewAddressRequest) (*
walletAddr := &walletAddress{ walletAddr := &walletAddress{
index: s.keysFile.LastUsedExternalIndex(), index: s.keysFile.LastUsedExternalIndex(),
cosignerIndex: s.keysFile.CosignerIndex, cosignerIndex: s.keysFile.CosignerIndex,
keyChain: externalKeychain, keyChain: libkaspawallet.ExternalKeychain,
} }
path := s.walletAddressPath(walletAddr) path := s.walletAddressPath(walletAddr)
address, err := libkaspawallet.Address(s.params, s.keysFile.ExtendedPublicKeys, s.keysFile.MinimumSignatures, path, s.keysFile.ECDSA) address, err := libkaspawallet.Address(s.params, s.keysFile.ExtendedPublicKeys, s.keysFile.MinimumSignatures, path, s.keysFile.ECDSA)

View File

@ -1,20 +1,16 @@
package server package server
import ( import (
"time"
"github.com/kaspanet/kaspad/cmd/kaspawallet/libkaspawallet"
"github.com/kaspanet/kaspad/app/appmessage" "github.com/kaspanet/kaspad/app/appmessage"
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi" "github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
"github.com/pkg/errors" "github.com/pkg/errors"
"time"
) )
const ( var keyChains = []uint8{libkaspawallet.ExternalKeychain, libkaspawallet.InternalKeychain}
// externalKeychain is the key chain that is used to create receive addresses
externalKeychain = 0
// internalKeychain is used to create change addresses
internalKeychain = 1
)
var keyChains = []uint8{externalKeychain, internalKeychain}
type walletAddressSet map[string]*walletAddress type walletAddressSet map[string]*walletAddress
@ -180,7 +176,7 @@ func (s *server) updateLastUsedIndexes(addressSet walletAddressSet,
continue continue
} }
if walletAddress.keyChain == externalKeychain { if walletAddress.keyChain == libkaspawallet.ExternalKeychain {
if walletAddress.index > lastUsedExternalIndex { if walletAddress.index > lastUsedExternalIndex {
lastUsedExternalIndex = walletAddress.index lastUsedExternalIndex = walletAddress.index
} }

View File

@ -6,12 +6,13 @@ import (
"encoding/hex" "encoding/hex"
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/kaspanet/kaspad/cmd/kaspawallet/utils"
"os" "os"
"path/filepath" "path/filepath"
"runtime" "runtime"
"strings" "strings"
"github.com/kaspanet/kaspad/cmd/kaspawallet/utils"
"github.com/kaspanet/kaspad/domain/dagconfig" "github.com/kaspanet/kaspad/domain/dagconfig"
"github.com/kaspanet/kaspad/util" "github.com/kaspanet/kaspad/util"
"github.com/pkg/errors" "github.com/pkg/errors"
@ -89,6 +90,23 @@ func (d *File) toJSON() *keysFileJSON {
} }
} }
// NewFileFromMnemonic generates a new File from the given mnemonic string
func NewFileFromMnemonic(params *dagconfig.Params, mnemonic string, password string) (*File, error) {
encryptedMnemonics, extendedPublicKeys, err :=
encryptedMnemonicExtendedPublicKeyPairs(params, []string{mnemonic}, password, false)
if err != nil {
return nil, err
}
return &File{
Version: LastVersion,
NumThreads: defaultNumThreads,
EncryptedMnemonics: encryptedMnemonics,
ExtendedPublicKeys: extendedPublicKeys,
MinimumSignatures: 1,
ECDSA: false,
}, nil
}
func (d *File) fromJSON(fileJSON *keysFileJSON) error { func (d *File) fromJSON(fileJSON *keysFileJSON) error {
d.Version = fileJSON.Version d.Version = fileJSON.Version
d.NumThreads = fileJSON.NumThreads d.NumThreads = fileJSON.NumThreads

View File

@ -0,0 +1,8 @@
package libkaspawallet
const (
// ExternalKeychain is the key chain that is used to create receive addresses
ExternalKeychain = 0
// InternalKeychain is used to create change addresses
InternalKeychain = 1
)