Skip to content

Commit

Permalink
tools for working with deterministic wallets.
Browse files Browse the repository at this point in the history
  • Loading branch information
genjix committed Jul 21, 2013
1 parent d9cfb62 commit 482255d
Show file tree
Hide file tree
Showing 9 changed files with 247 additions and 0 deletions.
43 changes: 43 additions & 0 deletions build.sh
Expand Up @@ -19,9 +19,52 @@ cd showtx
make
cd ..
echo "Compiled showtx"
# Sign tx input
cd sign-input
make
cd ..
echo "Compiled sign-input"
# Broadcast a transaction.
cd broadcast-tx
make
cd ..
echo "Compiled broadcast-tx"
# Create new deterministic wallet
cd newseed
make
cd ..
echo "Compiled newseed"
# Get master public key from a seed
cd mpk
make
cd ..
echo "Compiled mpk"
# Generate a private key from a seed, number and optional for_change flag.
cd genpriv
make
cd ..
echo "Compiled genpriv"
# Generate an address from a master pubkey, number and optional for_change flag.
cd genpub
make
cd ..
echo "Compiled genpub"
# These 2 tools depend on Obelisk: http://github.com/genjix/obelisk
#cd balance
#make
#cd history
#make

mkdir -p bin
cp newpriv/newpriv bin/
cp showpriv/showpriv bin/
cp mktx/mktx bin/
cp showtx/showtx bin/
cp sign-input/sign-input bin/
cp broadcast-tx/broadcast-tx bin/
cp newseed/newseed bin/
cp mpk/mpk bin/
cp genpriv/genpriv bin/
cp genpub/genpub bin/
echo "Copied binaries to bin/"

11 changes: 11 additions & 0 deletions genpriv/Makefile
@@ -0,0 +1,11 @@
CXXFLAGS=$(shell pkg-config --cflags libbitcoin)
LIBS=$(shell pkg-config --libs libbitcoin)

default: genpriv

main.o: main.cpp
g++ -c main.cpp -o main.o $(CXXFLAGS)

genpriv: main.o
g++ -o genpriv main.o $(LIBS)

57 changes: 57 additions & 0 deletions genpriv/main.cpp
@@ -0,0 +1,57 @@
#include <boost/lexical_cast.hpp>
#include <boost/algorithm/string.hpp>
#include <bitcoin/bitcoin.hpp>
using namespace bc;

std::string dump_file(std::istream& in_file)
{
std::istreambuf_iterator<char> it(in_file);
std::istreambuf_iterator<char> end;
return std::string(it, end);
}

int main(int argc, char** argv)
{
if (argc != 2 && argc != 3)
{
std::cerr << "Usage: genpriv N [CHANGE]" << std::endl;
return -1;
}
size_t n;
try
{
n = boost::lexical_cast<size_t>(argv[1]);
}
catch (const boost::bad_lexical_cast&)
{
std::cerr << "genpriv: Bad N provided" << std::endl;
return -1;
}
bool for_change = false;
if (argc == 3)
{
std::string change_str = argv[2];
boost::algorithm::to_lower(change_str);
if (change_str == "true" || change_str == "1")
for_change = true;
}
std::string seed = dump_file(std::cin);
boost::algorithm::trim(seed);
deterministic_wallet wallet;
if (!wallet.set_seed(seed))
{
std::cerr << "genpriv: Error setting seed" << std::endl;
return -1;
}
secret_parameter secret = wallet.generate_secret(n, for_change);
elliptic_curve_key key;
if (!key.set_secret(secret))
{
std::cerr << "genpriv: Internal error setting secret" << std::endl;
return -1;
}
private_data raw_private_key = key.private_key();
std::cout << std::string(raw_private_key.begin(), raw_private_key.end());
return 0;
}

11 changes: 11 additions & 0 deletions genpub/Makefile
@@ -0,0 +1,11 @@
CXXFLAGS=$(shell pkg-config --cflags libbitcoin)
LIBS=$(shell pkg-config --libs libbitcoin)

default: genpub

main.o: main.cpp
g++ -c main.cpp -o main.o $(CXXFLAGS)

genpub: main.o
g++ -o genpub main.o $(LIBS)

66 changes: 66 additions & 0 deletions genpub/main.cpp
@@ -0,0 +1,66 @@
#include <boost/lexical_cast.hpp>
#include <boost/algorithm/string.hpp>
#include <bitcoin/bitcoin.hpp>
using namespace bc;

std::string dump_file(std::istream& in_file)
{
std::istreambuf_iterator<char> it(in_file);
std::istreambuf_iterator<char> end;
return std::string(it, end);
}

data_chunk read_mpk_data()
{
std::string raw_mpk = dump_file(std::cin);
return data_chunk(raw_mpk.begin(), raw_mpk.end());
}

int main(int argc, char** argv)
{
if (argc != 2 && argc != 3)
{
std::cerr << "Usage: genpub N [CHANGE]" << std::endl;
return -1;
}
size_t n;
try
{
n = boost::lexical_cast<size_t>(argv[1]);
}
catch (const boost::bad_lexical_cast&)
{
std::cerr << "genpub: Bad N provided" << std::endl;
return -1;
}
bool for_change = false;
if (argc == 3)
{
std::string change_str = argv[2];
boost::algorithm::to_lower(change_str);
if (change_str == "true" || change_str == "1")
for_change = true;
}
const data_chunk mpk = read_mpk_data();
if (mpk.empty())
{
std::cerr << "genpub: Empty master public key" << std::endl;
return -1;
}
deterministic_wallet wallet;
if (!wallet.set_master_public_key(mpk))
{
std::cerr << "genpub: Error setting master public key" << std::endl;
return -1;
}
data_chunk pubkey = wallet.generate_public_key(n, for_change);
payment_address addr;
if (!set_public_key(addr, pubkey))
{
std::cerr << "genpub: Internal error setting pubkey" << std::endl;
return -1;
}
std::cout << addr.encoded() << std::endl;
return 0;
}

11 changes: 11 additions & 0 deletions mpk/Makefile
@@ -0,0 +1,11 @@
CXXFLAGS=$(shell pkg-config --cflags libbitcoin)
LIBS=$(shell pkg-config --libs libbitcoin)

default: mpk

main.o: main.cpp
g++ -c main.cpp -o main.o $(CXXFLAGS)

mpk: main.o
g++ -o mpk main.o $(LIBS)

26 changes: 26 additions & 0 deletions mpk/main.cpp
@@ -0,0 +1,26 @@
#include <boost/algorithm/string.hpp>
#include <bitcoin/bitcoin.hpp>
using namespace bc;

std::string dump_file(std::istream& in_file)
{
std::istreambuf_iterator<char> it(in_file);
std::istreambuf_iterator<char> end;
return std::string(it, end);
}

int main()
{
std::string seed = dump_file(std::cin);
boost::algorithm::trim(seed);
deterministic_wallet wallet;
if (!wallet.set_seed(seed))
{
std::cerr << "mpk: Error setting seed" << std::endl;
return -1;
}
const data_chunk mpk = wallet.master_public_key();
std::cout << std::string(mpk.begin(), mpk.end()) << std::endl;
return 0;
}

11 changes: 11 additions & 0 deletions newseed/Makefile
@@ -0,0 +1,11 @@
CXXFLAGS=$(shell pkg-config --cflags libbitcoin)
LIBS=$(shell pkg-config --libs libbitcoin)

default: newseed

main.o: main.cpp
g++ -c main.cpp -o main.o $(CXXFLAGS)

newseed: main.o
g++ -o newseed main.o $(LIBS)

11 changes: 11 additions & 0 deletions newseed/main.cpp
@@ -0,0 +1,11 @@
#include <bitcoin/bitcoin.hpp>
using namespace bc;

int main()
{
deterministic_wallet wallet;
wallet.new_seed();
std::cout << wallet.seed() << std::endl;
return 0;
}

0 comments on commit 482255d

Please sign in to comment.