示例#1
0
   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) ) }
示例#2
0
   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) ) }