Browse Source
RPC calls to manage zkey creation, management and backup Rebased on PR #1205 for keystore functionality. For #1197, implements: z_getnewaddress z_importkey z_exportkey For #1198, spending key support added to: z_exportwallet z_importwallet Example dump file containing zkeys: https://gist.github.com/bitcartel/d7013b30b19419c6a550bc5d6ff6cc47 Also adds: z_listaddresses Tests in: gtest/test_wallet_zkeys test/rpc_wallet_testspull/145/head
zkbot
8 years ago
12 changed files with 746 additions and 8 deletions
@ -0,0 +1,140 @@ |
|||
#include <gtest/gtest.h> |
|||
|
|||
#include "zcash/Address.hpp" |
|||
#include "wallet/wallet.h" |
|||
#include "wallet/walletdb.h" |
|||
#include "util.h" |
|||
|
|||
#include <boost/filesystem.hpp> |
|||
|
|||
/**
|
|||
* This test covers methods on CWallet |
|||
* GenerateNewZKey() |
|||
* AddZKey() |
|||
* LoadZKey() |
|||
* LoadZKeyMetadata() |
|||
*/ |
|||
TEST(wallet_zkeys_tests, store_and_load_zkeys) { |
|||
SelectParams(CBaseChainParams::MAIN); |
|||
|
|||
CWallet wallet; |
|||
|
|||
// wallet should be empty
|
|||
std::set<libzcash::PaymentAddress> addrs; |
|||
wallet.GetPaymentAddresses(addrs); |
|||
ASSERT_EQ(0, addrs.size()); |
|||
|
|||
// wallet should have one key
|
|||
CZCPaymentAddress paymentAddress = wallet.GenerateNewZKey(); |
|||
wallet.GetPaymentAddresses(addrs); |
|||
ASSERT_EQ(1, addrs.size()); |
|||
|
|||
// verify wallet has spending key for the address
|
|||
auto addr = paymentAddress.Get(); |
|||
ASSERT_TRUE(wallet.HaveSpendingKey(addr)); |
|||
|
|||
// manually add new spending key to wallet
|
|||
auto sk = libzcash::SpendingKey::random(); |
|||
ASSERT_TRUE(wallet.AddZKey(sk)); |
|||
|
|||
// verify wallet did add it
|
|||
addr = sk.address(); |
|||
ASSERT_TRUE(wallet.HaveSpendingKey(addr)); |
|||
|
|||
// verify spending key stored correctly
|
|||
libzcash::SpendingKey keyOut; |
|||
wallet.GetSpendingKey(addr, keyOut); |
|||
ASSERT_EQ(sk, keyOut); |
|||
|
|||
// verify there are two keys
|
|||
wallet.GetPaymentAddresses(addrs); |
|||
ASSERT_EQ(2, addrs.size()); |
|||
ASSERT_EQ(1, addrs.count(addr)); |
|||
|
|||
// Load a third key into the wallet
|
|||
sk = libzcash::SpendingKey::random(); |
|||
ASSERT_TRUE(wallet.LoadZKey(sk)); |
|||
|
|||
// attach metadata to this third key
|
|||
addr = sk.address(); |
|||
int64_t now = GetTime(); |
|||
CKeyMetadata meta(now); |
|||
ASSERT_TRUE(wallet.LoadZKeyMetadata(addr, meta)); |
|||
|
|||
// check metadata is the same
|
|||
CKeyMetadata m= wallet.mapZKeyMetadata[addr]; |
|||
ASSERT_EQ(m.nCreateTime, now); |
|||
} |
|||
|
|||
/**
|
|||
* This test covers methods on CWalletDB |
|||
* WriteZKey() |
|||
*/ |
|||
TEST(wallet_zkeys_tests, write_zkey_direct_to_db) { |
|||
SelectParams(CBaseChainParams::TESTNET); |
|||
|
|||
// Get temporary and unique path for file.
|
|||
// Note: / operator to append paths
|
|||
boost::filesystem::path temp = boost::filesystem::temp_directory_path() / |
|||
boost::filesystem::unique_path(); |
|||
const std::string path = temp.native(); |
|||
|
|||
bool fFirstRun; |
|||
CWallet wallet(path); |
|||
ASSERT_EQ(DB_LOAD_OK, wallet.LoadWallet(fFirstRun)); |
|||
|
|||
// No default CPubKey set
|
|||
ASSERT_TRUE(fFirstRun); |
|||
|
|||
// wallet should be empty
|
|||
std::set<libzcash::PaymentAddress> addrs; |
|||
wallet.GetPaymentAddresses(addrs); |
|||
ASSERT_EQ(0, addrs.size()); |
|||
|
|||
// Add random key to the wallet
|
|||
auto paymentAddress = wallet.GenerateNewZKey(); |
|||
|
|||
// wallet should have one key
|
|||
wallet.GetPaymentAddresses(addrs); |
|||
ASSERT_EQ(1, addrs.size()); |
|||
|
|||
// create random key and add it to database directly, bypassing wallet
|
|||
auto sk = libzcash::SpendingKey::random(); |
|||
auto addr = sk.address(); |
|||
int64_t now = GetTime(); |
|||
CKeyMetadata meta(now); |
|||
CWalletDB db(path); |
|||
db.WriteZKey(addr, sk, meta); |
|||
|
|||
// wallet should not be aware of key
|
|||
ASSERT_FALSE(wallet.HaveSpendingKey(addr)); |
|||
|
|||
// wallet sees one key
|
|||
wallet.GetPaymentAddresses(addrs); |
|||
ASSERT_EQ(1, addrs.size()); |
|||
|
|||
// wallet should have default metadata for addr with null createtime
|
|||
CKeyMetadata m = wallet.mapZKeyMetadata[addr]; |
|||
ASSERT_EQ(m.nCreateTime, 0); |
|||
ASSERT_NE(m.nCreateTime, now); |
|||
|
|||
// load the wallet again
|
|||
ASSERT_EQ(DB_LOAD_OK, wallet.LoadWallet(fFirstRun)); |
|||
|
|||
// wallet can now see the spending key
|
|||
ASSERT_TRUE(wallet.HaveSpendingKey(addr)); |
|||
|
|||
// check key is the same
|
|||
libzcash::SpendingKey keyOut; |
|||
wallet.GetSpendingKey(addr, keyOut); |
|||
ASSERT_EQ(sk, keyOut); |
|||
|
|||
// wallet should have two keys
|
|||
wallet.GetPaymentAddresses(addrs); |
|||
ASSERT_EQ(2, addrs.size()); |
|||
|
|||
// check metadata is now the same
|
|||
m = wallet.mapZKeyMetadata[addr]; |
|||
ASSERT_EQ(m.nCreateTime, now); |
|||
} |
|||
|
Loading…
Reference in new issue