public_key_type wallet_db::generate_new_account( const fc::sha512& password, const string& account_name, const variant& private_data ) { try { FC_ASSERT( is_open() ); owallet_account_record account_record = lookup_account( account_name ); FC_ASSERT( !account_record.valid(), "Wallet already contains an account with that name!" ); uint32_t key_index = get_last_wallet_child_key_index(); private_key_type account_private_key; public_key_type account_public_key; address account_address; while( true ) { ++key_index; FC_ASSERT( key_index != 0, "Overflow!" ); account_private_key = get_wallet_child_key( password, key_index ); account_public_key = account_private_key.get_public_key(); account_address = address( account_public_key ); account_record = lookup_account( account_address ); if( account_record.valid() ) continue; owallet_key_record key_record = lookup_key( account_address ); if( key_record.valid() && key_record->has_private_key() ) continue; break; } key_data key; key.account_address = account_address; key.public_key = account_public_key; key.encrypt_private_key( password, account_private_key ); key.gen_seq_number = key_index; account_data account; account.name = account_name; account.owner_key = account_public_key; account.set_active_key( blockchain::now(), account_public_key ); account.private_data = private_data; account.is_my_account = true; set_last_wallet_child_key_index( key_index ); store_key( key ); store_account( account ); return account_public_key; } FC_CAPTURE_AND_RETHROW( (account_name) ) }
PublicKeyType WalletDb::generate_new_account( const fc::sha512& password, const string& account_name, const variant& private_data ) { try { FC_ASSERT( is_open() ,"Wallet not open!"); oWalletAccountEntry account_entry = lookup_account( account_name ); FC_ASSERT( !account_entry.valid(), "Wallet already contains an account with that name!" ); uint32_t key_index = get_last_wallet_child_key_index(); PrivateKeyType owner_private_key, active_private_key; PublicKeyType owner_public_key, active_public_key; Address owner_address, active_address; while( true ) { ++key_index; FC_ASSERT( key_index != 0, "Overflow!" ); owner_private_key = get_wallet_child_key( password, key_index ); owner_public_key = owner_private_key.get_public_key(); owner_address = Address( owner_public_key ); account_entry = lookup_account( owner_address ); if( account_entry.valid() ) continue; oWalletKeyEntry key_entry = lookup_key( owner_address ); if( key_entry.valid() && key_entry->has_private_key() ) continue; active_private_key = get_account_child_key( owner_private_key, 0 ); active_public_key = active_private_key.get_public_key(); active_address = Address( active_public_key ); account_entry = lookup_account( active_address ); if( account_entry.valid() ) continue; key_entry = lookup_key( active_address ); if( key_entry.valid() && key_entry->has_private_key() ) continue; break; } KeyData active_key; active_key.account_address = owner_address; active_key.public_key = active_public_key; active_key.encrypt_private_key( password, active_private_key ); KeyData owner_key; owner_key.account_address = owner_address; owner_key.public_key = owner_public_key; owner_key.encrypt_private_key( password, owner_private_key ); owner_key.gen_seq_number = key_index; AccountData account; account.name = account_name; account.owner_key = owner_public_key; account.set_active_key( blockchain::now(), active_public_key ); account.last_update = blockchain::now(); account.is_my_account = true; account.private_data = private_data; store_key( active_key ); set_last_wallet_child_key_index( key_index ); store_key( owner_key ); store_account( account ); return owner_public_key; } FC_CAPTURE_AND_RETHROW( (account_name) ) }