From 096a890097469304f2acb5f39cb1c7bc8269e5bb Mon Sep 17 00:00:00 2001 From: Han Lin Yap Date: Sun, 3 Jul 2011 15:24:47 +0200 Subject: [PATCH 01/42] Minor translation changes for latest build --- locale/sv/LC_MESSAGES/bitcoin.po | 475 +++++++++++++++---------------- 1 file changed, 235 insertions(+), 240 deletions(-) diff --git a/locale/sv/LC_MESSAGES/bitcoin.po b/locale/sv/LC_MESSAGES/bitcoin.po index fb46e1542..dc635f313 100644 --- a/locale/sv/LC_MESSAGES/bitcoin.po +++ b/locale/sv/LC_MESSAGES/bitcoin.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-11 21:58+0100\n" -"PO-Revision-Date: 2011-06-14 09:01+0100\n" +"POT-Creation-Date: 2011-07-03 10:40+0100\n" +"PO-Revision-Date: 2011-07-03 15:13+0100\n" "Last-Translator: Codler \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -11,130 +11,133 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-KeywordsList: _;gettext;gettext_noop\n" "X-Poedit-Basepath: .\n" -"X-Poedit-Bookmarks: 35,145,-1,-1,-1,-1,-1,-1,-1,-1\n" "X-Poedit-SearchPath-0: ../../..\n" -#: ../../../init.cpp:141 +#: ../../../init.cpp:162 msgid "Bitcoin version" msgstr "Bitcoin version" -#: ../../../init.cpp:142 +#: ../../../init.cpp:163 msgid "Usage:" msgstr "Användning:" -#: ../../../init.cpp:144 +#: ../../../init.cpp:165 msgid "Send command to -server or bitcoind\n" msgstr "Skicka kommando till -server eller bitcoind\n" -#: ../../../init.cpp:145 +#: ../../../init.cpp:166 msgid "List commands\n" msgstr "Lista kommandon\n" -#: ../../../init.cpp:146 +#: ../../../init.cpp:167 msgid "Get help for a command\n" msgstr "Få hjälp om kommandon\n" -#: ../../../init.cpp:147 +#: ../../../init.cpp:168 msgid "Options:\n" msgstr "Val:\n" -#: ../../../init.cpp:148 +#: ../../../init.cpp:169 msgid "Specify configuration file (default: bitcoin.conf)\n" msgstr "Ange konfigurationsfil (standard: bitcoin.conf)\n" -#: ../../../init.cpp:149 +#: ../../../init.cpp:170 msgid "Specify pid file (default: bitcoind.pid)\n" msgstr "Ange pid-fil (standard: bitcoind.pid)\n" -#: ../../../init.cpp:150 +#: ../../../init.cpp:171 msgid "Generate coins\n" msgstr "Generera mynt\n" -#: ../../../init.cpp:151 +#: ../../../init.cpp:172 msgid "Don't generate coins\n" msgstr "Generera inte mynt\n" -#: ../../../init.cpp:152 +#: ../../../init.cpp:173 msgid "Start minimized\n" msgstr "Starta minimerad\n" -#: ../../../init.cpp:153 +#: ../../../init.cpp:174 msgid "Specify data directory\n" msgstr "Ange data mappen\n" -#: ../../../init.cpp:154 +#: ../../../init.cpp:175 +msgid "Specify connection timeout (in milliseconds)\n" +msgstr "Ange timeout för anslutning (i millisekunder)\n" + +#: ../../../init.cpp:176 msgid "Connect through socks4 proxy\n" msgstr "Anslut via socks4 proxy\n" -#: ../../../init.cpp:155 +#: ../../../init.cpp:177 msgid "Allow DNS lookups for addnode and connect\n" msgstr "Tillåt DNS uppslagningar för addnode och connect\n" -#: ../../../init.cpp:156 +#: ../../../init.cpp:178 msgid "Add a node to connect to\n" msgstr "Lägg till en nod att ansluta till\n" -#: ../../../init.cpp:157 +#: ../../../init.cpp:179 msgid "Connect only to the specified node\n" msgstr "Anslut endast till specifik nod\n" -#: ../../../init.cpp:158 +#: ../../../init.cpp:180 msgid "Don't accept connections from outside\n" msgstr "Acceptera ej anslutningar från utsidan\n" -#: ../../../init.cpp:161 +#: ../../../init.cpp:183 msgid "Don't attempt to use UPnP to map the listening port\n" msgstr "Försöker inte använda UPnP till avslyssningsport\n" -#: ../../../init.cpp:163 +#: ../../../init.cpp:185 msgid "Attempt to use UPnP to map the listening port\n" msgstr "Försöker använda UPnP till avlyssningsport\n" -#: ../../../init.cpp:166 +#: ../../../init.cpp:188 msgid "Fee per KB to add to transactions you send\n" msgstr "Avgift per KB som läggs på transaktionen när du sänder\n" -#: ../../../init.cpp:168 +#: ../../../init.cpp:190 msgid "Accept command line and JSON-RPC commands\n" msgstr "Accepterar kommandorad och JSON-RPC kommando\n" -#: ../../../init.cpp:171 +#: ../../../init.cpp:193 msgid "Run in the background as a daemon and accept commands\n" msgstr "Kör i bakgrund som daemon och accepterar kommando\n" -#: ../../../init.cpp:173 +#: ../../../init.cpp:195 msgid "Use the test network\n" msgstr "Använd test nätverk\n" -#: ../../../init.cpp:174 +#: ../../../init.cpp:196 msgid "Username for JSON-RPC connections\n" msgstr "Användarnamn till JSON-RPC anslutning\n" -#: ../../../init.cpp:175 +#: ../../../init.cpp:197 msgid "Password for JSON-RPC connections\n" msgstr "Lösenord till JSON-RPC anslutning\n" -#: ../../../init.cpp:176 +#: ../../../init.cpp:198 msgid "Listen for JSON-RPC connections on (default: 8332)\n" msgstr "Lyssnar på JSON-RPC anslutningar på (standard: 8332)\n" -#: ../../../init.cpp:177 +#: ../../../init.cpp:199 msgid "Allow JSON-RPC connections from specified IP address\n" msgstr "Tillåt JSON-RPC anslutningar från specifik IP-adress\n" -#: ../../../init.cpp:178 +#: ../../../init.cpp:200 msgid "Send commands to node running on (default: 127.0.0.1)\n" msgstr "Skicka kommando till noden som körs på (standard: 127.0.0.1)\n" -#: ../../../init.cpp:179 +#: ../../../init.cpp:201 msgid "Set key pool size to (default: 100)\n" msgstr "Sätt nyckel pool storlek till (standard: 100)\n" -#: ../../../init.cpp:180 +#: ../../../init.cpp:202 msgid "Rescan the block chain for missing wallet transactions\n" msgstr "Scanna om block kedja efter saknade plånbokstransaktioner\n" -#: ../../../init.cpp:184 +#: ../../../init.cpp:206 msgid "" "\n" "SSL options: (see the Bitcoin Wiki for SSL setup instructions)\n" @@ -142,106 +145,71 @@ msgstr "" "\n" "SSL val: (Se på Bitcoin Wiki för SSL installation instruktioner)\n" -#: ../../../init.cpp:185 +#: ../../../init.cpp:207 msgid "Use OpenSSL (https) for JSON-RPC connections\n" msgstr "Använd OpenSSL (https) till JSON-RPC anslutningar\n" -#: ../../../init.cpp:186 +#: ../../../init.cpp:208 msgid "Server certificate file (default: server.cert)\n" msgstr "Server certifikatfil (standard: server.cert)\n" -#: ../../../init.cpp:187 +#: ../../../init.cpp:209 msgid "Server private key (default: server.pem)\n" msgstr "Server privat nyckel (standard: server.pem)\n" -#: ../../../init.cpp:188 +#: ../../../init.cpp:210 msgid "Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH)\n" msgstr "Acceptabla krypteringar (standard: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH)\n" -#: ../../../init.cpp:192 +#: ../../../init.cpp:214 msgid "This help message\n" msgstr "Detta hjälpmeddelande\n" -#: ../../../init.cpp:329 +#: ../../../init.cpp:351 #, c-format msgid "Cannot obtain a lock on data directory %s. Bitcoin is probably already running." msgstr "Kan inte sätta lås på data mappen %s. Bitcoin körs troligen redan." -#: ../../../init.cpp:355 +#: ../../../init.cpp:377 msgid "Error loading addr.dat \n" msgstr "Fel vid laddning av addr.dat \n" -#: ../../../init.cpp:361 +#: ../../../init.cpp:383 msgid "Error loading blkindex.dat \n" msgstr "Fel vid laddning av blkindex.dat \n" -#: ../../../init.cpp:368 +#: ../../../init.cpp:391 msgid "Error loading wallet.dat \n" msgstr "Fel vid laddning av wallet.dat \n" -#: ../../../init.cpp:448 +#: ../../../init.cpp:481 msgid "Invalid -proxy address" msgstr "Ogiltig -proxy adress" -#: ../../../init.cpp:471 +#: ../../../init.cpp:506 msgid "Invalid amount for -paytxfee=" msgstr "Ogiltig belopp på -paytxfee=" -#: ../../../init.cpp:475 +#: ../../../init.cpp:510 msgid "Warning: -paytxfee is set very high. This is the transaction fee you will pay if you send a transaction." msgstr "Varning: -paytxfee är satt väldigt högt. Denna är transaktionsavgiften som du kommer att betala om du skickar en transaktion." -#: ../../../main.cpp:1866 +#: ../../../main.cpp:1430 msgid "Warning: Disk space is low " msgstr "Varning: Diskutrymme är låg " -#: ../../../main.cpp:3999 -#, c-format -msgid "Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds " -msgstr "Fel: Denna transaktion kräver en transaktionsavgift minst %s för dess belopp, komplexitet, eller användning av nyligen mottagna pengar " - -#: ../../../main.cpp:4001 -msgid "Error: Transaction creation failed " -msgstr "Fel: Misslyckades att skapa transaktion " - -#: ../../../main.cpp:4006 -#: ../../../ui.cpp:1951 -#: ../../../ui.cpp:1956 -#: ../../../ui.cpp:2102 -#: ../../../ui.cpp:2255 -msgid "Sending..." -msgstr "Skickar..." - -#: ../../../main.cpp:4010 -msgid "Error: The transaction was rejected. This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here." -msgstr "Fel: Transaktionen blev nekad. Detta kan hända om några av dina mynt i din plånbok var redan spenderad. Till exempel om du använde en kopia av wallet.dat och mynten var redan spenderad i kopian, men som inte var markerad som spenderad här." - -#: ../../../main.cpp:4023 -msgid "Invalid amount" -msgstr "Ogiltig belopp" - -#: ../../../main.cpp:4025 -#: ../../../ui.cpp:2169 -#: ../../../ui.cpp:2240 -msgid "Insufficient funds" -msgstr "Otillräckligt med pengar" - -#: ../../../main.cpp:4030 -msgid "Invalid bitcoin address" -msgstr "Ogiltig bitcoin adress" - -#: ../../../net.cpp:1505 +#: ../../../net.cpp:1598 #, c-format msgid "Unable to bind to port %d on this computer. Bitcoin is probably already running." msgstr "Det gick inte att binda till port %d på denna dator. Bitcoin körs troligen redan." -#: ../../../rpc.cpp:1816 -#: ../../../rpc.cpp:1818 +#: ../../../rpc.cpp:1828 +#: ../../../rpc.cpp:1830 #, c-format msgid "To use the %s option" msgstr "För att använda %s val" -#: ../../../rpc.cpp:1820 +#: ../../../rpc.cpp:1832 #, c-format msgid "" "Warning: %s, you must set rpcpassword=\n" @@ -252,7 +220,7 @@ msgstr "" "i konfigurationsfilen: %s\n" "Om filen inte existerar, skapa med ägare med filbehörigheten -readable-only.\n" -#: ../../../rpc.cpp:1988 +#: ../../../rpc.cpp:2005 #, c-format msgid "" "You must set rpcpassword= in the configuration file:\n" @@ -263,347 +231,360 @@ msgstr "" "%s\n" "Om filen inte existerar, skapa med ägare med filbehörighete -readable-only." -#: ../../../ui.cpp:211 +#: ../../../ui.cpp:216 #, c-format msgid "This transaction is over the size limit. You can still send it for a fee of %s, which goes to the nodes that process your transaction and helps to support the network. Do you want to pay the fee?" msgstr "Denna transaktion är över storleksbegränsningen. Du kan fortfarande skicka mot en avgift på %s, som går till noderna som bearbetar din transaktion och hjälper att stödja nätverket. Vill du fortfarande betala avgiften?" -#: ../../../ui.cpp:311 +#: ../../../ui.cpp:316 msgid "Status" msgstr "Status" -#: ../../../ui.cpp:312 +#: ../../../ui.cpp:317 msgid "Date" msgstr "Datum" -#: ../../../ui.cpp:313 +#: ../../../ui.cpp:318 msgid "Description" msgstr "Beskrivning" -#: ../../../ui.cpp:314 +#: ../../../ui.cpp:319 msgid "Debit" -msgstr "Debitera" +msgstr "Debet" -#: ../../../ui.cpp:315 +#: ../../../ui.cpp:320 msgid "Credit" -msgstr "Kreditera" +msgstr "Kredit" -#: ../../../ui.cpp:521 +#: ../../../ui.cpp:526 #, c-format msgid "Open for %d blocks" -msgstr "Öppna för %d blocks" +msgstr "Öppen för %d block" -#: ../../../ui.cpp:523 +#: ../../../ui.cpp:528 #, c-format msgid "Open until %s" msgstr "Öppen tills %s" -#: ../../../ui.cpp:529 +#: ../../../ui.cpp:534 #, c-format msgid "%d/offline?" msgstr "%d/offline?" -#: ../../../ui.cpp:531 +#: ../../../ui.cpp:536 #, c-format msgid "%d/unconfirmed" msgstr "%d/obekräftade" -#: ../../../ui.cpp:533 +#: ../../../ui.cpp:538 #, c-format msgid "%d confirmations" msgstr "%d bekräftelser" -#: ../../../ui.cpp:618 +#: ../../../ui.cpp:623 msgid "Generated" msgstr "Genererad" -#: ../../../ui.cpp:626 -#, fuzzy, c-format +#: ../../../ui.cpp:631 +#, c-format msgid "Generated (%s matures in %d more blocks)" -msgstr "Genererad (%s mogna i %d fler block)" +msgstr "Genererad (%s mognar om %d block)" -#: ../../../ui.cpp:630 +#: ../../../ui.cpp:635 msgid "Generated - Warning: This block was not received by any other nodes and will probably not be accepted!" msgstr "Genererad - Varning: Denna block har inte blivit mottagen av någon annan nod och kommer troligtvis inte bli accepterad" -#: ../../../ui.cpp:634 +#: ../../../ui.cpp:639 msgid "Generated (not accepted)" msgstr "Genererad (ej accepterad)" -#: ../../../ui.cpp:644 +#: ../../../ui.cpp:649 msgid "From: " msgstr "Från: " -#: ../../../ui.cpp:668 +#: ../../../ui.cpp:673 msgid "Received with: " msgstr "Mottagen med: " -#: ../../../ui.cpp:714 +#: ../../../ui.cpp:719 msgid "Payment to yourself" msgstr "Betalning till dig själv" -#: ../../../ui.cpp:748 +#: ../../../ui.cpp:753 msgid "To: " msgstr "Till: " -#: ../../../ui.cpp:1063 +#: ../../../ui.cpp:1068 msgid " Generating" msgstr " Generering" -#: ../../../ui.cpp:1065 +#: ../../../ui.cpp:1070 msgid "(not connected)" msgstr "(inte ansluten)" -#: ../../../ui.cpp:1068 +#: ../../../ui.cpp:1073 #, c-format msgid " %d connections %d blocks %d transactions" msgstr " %d anslutningar %d block %d transaktioner" -#: ../../../ui.cpp:1173 -#: ../../../ui.cpp:2566 +#: ../../../ui.cpp:1178 +#: ../../../ui.cpp:2577 msgid "New Receiving Address" msgstr "Ny Mottagningsadress" -#: ../../../ui.cpp:1174 -#: ../../../ui.cpp:2567 +#: ../../../ui.cpp:1179 +#: ../../../ui.cpp:2578 msgid "" "You should use a new address for each payment you receive.\n" "\n" "Label" msgstr "" -"Du borde använda en ny adress för varje betalning som du mottar.\n" +"Du borde använda en ny adress för varje betalning som du mottagit.\n" "\n" "Etikett" -#: ../../../ui.cpp:1246 +#: ../../../ui.cpp:1252 msgid "Status: " msgstr "Status: " -#: ../../../ui.cpp:1251 +#: ../../../ui.cpp:1257 msgid ", has not been successfully broadcast yet" -msgstr ", has not been successfully broadcast yet" +msgstr ", har inte lyckats broadcast än" -#: ../../../ui.cpp:1253 +#: ../../../ui.cpp:1259 #, c-format msgid ", broadcast through %d node" msgstr ", broadcast genom %d nod" -#: ../../../ui.cpp:1255 +#: ../../../ui.cpp:1261 #, c-format msgid ", broadcast through %d nodes" msgstr ", broadcast genom %d noder" -#: ../../../ui.cpp:1259 +#: ../../../ui.cpp:1265 msgid "Date: " msgstr "Datum: " -#: ../../../ui.cpp:1267 +#: ../../../ui.cpp:1273 msgid "Source: Generated
" msgstr "Källa: Genererad
" -#: ../../../ui.cpp:1273 -#: ../../../ui.cpp:1291 +#: ../../../ui.cpp:1279 +#: ../../../ui.cpp:1297 msgid "From: " msgstr "Från: " -#: ../../../ui.cpp:1291 +#: ../../../ui.cpp:1297 msgid "unknown" msgstr "okänd" -#: ../../../ui.cpp:1292 -#: ../../../ui.cpp:1316 -#: ../../../ui.cpp:1375 +#: ../../../ui.cpp:1298 +#: ../../../ui.cpp:1322 +#: ../../../ui.cpp:1381 msgid "To: " msgstr "Till: " -#: ../../../ui.cpp:1295 +#: ../../../ui.cpp:1301 msgid " (yours, label: " msgstr " (din, etikett: " -#: ../../../ui.cpp:1297 +#: ../../../ui.cpp:1303 msgid " (yours)" msgstr " (ditt)" -#: ../../../ui.cpp:1334 -#: ../../../ui.cpp:1346 -#: ../../../ui.cpp:1392 -#: ../../../ui.cpp:1409 +#: ../../../ui.cpp:1340 +#: ../../../ui.cpp:1352 +#: ../../../ui.cpp:1398 +#: ../../../ui.cpp:1415 msgid "Credit: " msgstr "Kredit: " -#: ../../../ui.cpp:1336 -#, fuzzy, c-format +#: ../../../ui.cpp:1342 +#, c-format msgid "(%s matures in %d more blocks)" -msgstr "(%s matures in %d more blocks)" +msgstr "(%s mognar om %d block)" -#: ../../../ui.cpp:1338 +#: ../../../ui.cpp:1344 msgid "(not accepted)" msgstr "(ej accepterad)" -#: ../../../ui.cpp:1383 -#: ../../../ui.cpp:1391 -#: ../../../ui.cpp:1406 -msgid "Debit: " -msgstr "Debit: " - +#: ../../../ui.cpp:1389 #: ../../../ui.cpp:1397 +#: ../../../ui.cpp:1412 +msgid "Debit: " +msgstr "Debet: " + +#: ../../../ui.cpp:1403 msgid "Transaction fee: " msgstr "Transaktionsavgift: " -#: ../../../ui.cpp:1413 -#, fuzzy +#: ../../../ui.cpp:1419 msgid "Net amount: " msgstr "Nät belopp: " -#: ../../../ui.cpp:1420 +#: ../../../ui.cpp:1426 msgid "Message:" msgstr "Meddelande:" -#: ../../../ui.cpp:1422 +#: ../../../ui.cpp:1428 msgid "Comment:" msgstr "Kommentar:" -#: ../../../ui.cpp:1425 +#: ../../../ui.cpp:1431 msgid "Generated coins must wait 120 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, it will change to \"not accepted\" and not be spendable. This may occasionally happen if another node generates a block within a few seconds of yours." msgstr "Genererad mynt måste vänta 120 block innan dem kan användas.När du genererat denna block, skickades en broadcast till nätet och lades till block kedjan. Om den misslyckas att lägga till kedjan så kommer det ändras till \"not accepted\" och är icke brukbar. Detta kan hända om en annan nod genererat en block några sekunder efter din." -#: ../../../ui.cpp:1605 +#: ../../../ui.cpp:1611 msgid "Cannot write autostart/bitcoin.desktop file" msgstr "Kan inte skriva autostart/bitcoin.desktop fil" -#: ../../../ui.cpp:1641 +#: ../../../ui.cpp:1647 msgid "Main" -msgstr "Huvud" +msgstr "Allmänt" -#: ../../../ui.cpp:1651 +#: ../../../ui.cpp:1657 msgid "&Start Bitcoin on window system startup" -msgstr "&Starta Bitcoin vid uppstart i windows" +msgstr "&Starta Bitcoin vid system uppstart" -#: ../../../ui.cpp:1658 +#: ../../../ui.cpp:1664 msgid "&Minimize on close" msgstr "&Minimera vid stängning" -#: ../../../ui.cpp:1800 +#: ../../../ui.cpp:1806 #, c-format msgid "version %s" msgstr "version %s" -#: ../../../ui.cpp:1923 +#: ../../../ui.cpp:1929 msgid "Error in amount " msgstr "Fel i belopp " -#: ../../../ui.cpp:1923 -#: ../../../ui.cpp:1928 -#: ../../../ui.cpp:1933 -#: ../../../ui.cpp:1968 +#: ../../../ui.cpp:1929 +#: ../../../ui.cpp:1934 +#: ../../../ui.cpp:1939 +#: ../../../ui.cpp:1974 #: ../../../uibase.cpp:55 msgid "Send Coins" msgstr "Skicka mynt" -#: ../../../ui.cpp:1928 +#: ../../../ui.cpp:1934 msgid "Amount exceeds your balance " msgstr "Belopp överskrider din balans " -#: ../../../ui.cpp:1933 +#: ../../../ui.cpp:1939 msgid "Total exceeds your balance when the " -msgstr "Totals överskrider din balans när " +msgstr "Totalt överskrider din balans när " -#: ../../../ui.cpp:1933 +#: ../../../ui.cpp:1939 msgid " transaction fee is included " msgstr " transaktionsavgift är inkluderad " -#: ../../../ui.cpp:1951 +#: ../../../ui.cpp:1957 msgid "Payment sent " msgstr "Betalning skickad " -#: ../../../ui.cpp:1968 +#: ../../../ui.cpp:1957 +#: ../../../ui.cpp:1962 +#: ../../../ui.cpp:2108 +#: ../../../ui.cpp:2261 +#: ../../../wallet.cpp:924 +msgid "Sending..." +msgstr "Skickar..." + +#: ../../../ui.cpp:1974 msgid "Invalid address " msgstr "Ogiltig adress " -#: ../../../ui.cpp:2023 +#: ../../../ui.cpp:2029 #, c-format msgid "Sending %s to %s" msgstr "Skickar %s till %s" -#: ../../../ui.cpp:2096 -#: ../../../ui.cpp:2129 +#: ../../../ui.cpp:2102 +#: ../../../ui.cpp:2135 msgid "CANCELLED" msgstr "AVBRUTEN" -#: ../../../ui.cpp:2100 +#: ../../../ui.cpp:2106 msgid "Cancelled" msgstr "Avbruten" -#: ../../../ui.cpp:2102 +#: ../../../ui.cpp:2108 msgid "Transfer cancelled " msgstr "Överföring avbruten " -#: ../../../ui.cpp:2155 +#: ../../../ui.cpp:2161 msgid "Error: " msgstr "Fel: " -#: ../../../ui.cpp:2174 +#: ../../../ui.cpp:2175 +#: ../../../ui.cpp:2246 +#: ../../../wallet.cpp:943 +msgid "Insufficient funds" +msgstr "Otillräckligt med pengar" + +#: ../../../ui.cpp:2180 msgid "Connecting..." msgstr "Ansluter..." -#: ../../../ui.cpp:2179 +#: ../../../ui.cpp:2185 msgid "Unable to connect" msgstr "Det gick inte att ansluta" -#: ../../../ui.cpp:2184 +#: ../../../ui.cpp:2190 msgid "Requesting public key..." msgstr "Efterfrågar publik nyckel..." -#: ../../../ui.cpp:2196 +#: ../../../ui.cpp:2202 msgid "Received public key..." msgstr "Mottagen publik nyckel..." -#: ../../../ui.cpp:2210 +#: ../../../ui.cpp:2216 msgid "Recipient is not accepting transactions sent by IP address" msgstr "Mottagaren accepterar inte transaktioner skickat från IP adress" -#: ../../../ui.cpp:2212 +#: ../../../ui.cpp:2218 msgid "Transfer was not accepted" msgstr "Överföringen var inte accepterad" -#: ../../../ui.cpp:2221 +#: ../../../ui.cpp:2227 msgid "Invalid response received" msgstr "Ogiltig respons mottagen" -#: ../../../ui.cpp:2236 +#: ../../../ui.cpp:2242 msgid "Creating transaction..." msgstr "Skapar transation..." -#: ../../../ui.cpp:2248 +#: ../../../ui.cpp:2254 #, c-format msgid "This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds" msgstr "Denna transaktion kräver en transaktionsavgift minst %s för dess belopp, komplexitet, eller användning av nyligen mottagna pengar" -#: ../../../ui.cpp:2250 +#: ../../../ui.cpp:2256 msgid "Transaction creation failed" msgstr "Misslyckades skapa transaktion" -#: ../../../ui.cpp:2257 +#: ../../../ui.cpp:2263 msgid "Transaction aborted" msgstr "Transaktion avbruten" -#: ../../../ui.cpp:2265 +#: ../../../ui.cpp:2271 msgid "Lost connection, transaction cancelled" msgstr "Förlorad anslutning, transaktionen avbruten" -#: ../../../ui.cpp:2281 +#: ../../../ui.cpp:2287 msgid "Sending payment..." msgstr "Skickar betalning..." -#: ../../../ui.cpp:2287 +#: ../../../ui.cpp:2293 msgid "The transaction was rejected. This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here." msgstr "Transaktionen blev nekad. Detta kan hända om några av dina mynt i din plånbok var redan spenderad. Till exempel om du använde en kopia av wallet.dat och mynten var redan spenderad i kopian, men som inte var markerad som spenderad här." -#: ../../../ui.cpp:2296 +#: ../../../ui.cpp:2302 msgid "Waiting for confirmation..." msgstr "Väntar på bekräftelse..." -#: ../../../ui.cpp:2314 +#: ../../../ui.cpp:2320 msgid "" "The payment was sent, but the recipient was unable to verify it.\n" "The transaction is recorded and will credit to the recipient,\n" @@ -613,84 +594,84 @@ msgstr "" "Transaktionen är registrerad och kommer att kreditera mottagaren,\n" "men kommentar informationen kommer att vara tom." -#: ../../../ui.cpp:2323 +#: ../../../ui.cpp:2329 msgid "Payment was sent, but an invalid response was received" msgstr "Betalning var skickad, men en ogiltig respons var mottagen" -#: ../../../ui.cpp:2329 +#: ../../../ui.cpp:2335 msgid "Payment completed" msgstr "Betalning slutförd" -#: ../../../ui.cpp:2371 -#: ../../../ui.cpp:2517 -#: ../../../ui.cpp:2554 +#: ../../../ui.cpp:2377 +#: ../../../ui.cpp:2525 +#: ../../../ui.cpp:2565 msgid "Name" msgstr "Namn" -#: ../../../ui.cpp:2372 -#: ../../../ui.cpp:2517 -#: ../../../ui.cpp:2554 +#: ../../../ui.cpp:2378 +#: ../../../ui.cpp:2525 +#: ../../../ui.cpp:2565 msgid "Address" msgstr "Adress" -#: ../../../ui.cpp:2374 -#: ../../../ui.cpp:2529 +#: ../../../ui.cpp:2380 +#: ../../../ui.cpp:2537 msgid "Label" msgstr "Etikett" -#: ../../../ui.cpp:2375 +#: ../../../ui.cpp:2381 #: ../../../uibase.cpp:837 msgid "Bitcoin Address" msgstr "Bitcoin Adress" -#: ../../../ui.cpp:2499 +#: ../../../ui.cpp:2507 msgid "This is one of your own addresses for receiving payments and cannot be entered in the address book. " msgstr "Denna är en av dina egna adresser för mottagning av betalningar och kan inte slås in i adressboken. " -#: ../../../ui.cpp:2517 -#: ../../../ui.cpp:2523 +#: ../../../ui.cpp:2525 +#: ../../../ui.cpp:2531 msgid "Edit Address" msgstr "Ändra Adress" -#: ../../../ui.cpp:2529 +#: ../../../ui.cpp:2537 msgid "Edit Address Label" msgstr "Ändra Address Etikett" -#: ../../../ui.cpp:2554 -#: ../../../ui.cpp:2560 +#: ../../../ui.cpp:2565 +#: ../../../ui.cpp:2571 msgid "Add Address" msgstr "Lägg till Adress" -#: ../../../ui.cpp:2637 +#: ../../../ui.cpp:2649 msgid "Bitcoin" msgstr "Bitcoin" -#: ../../../ui.cpp:2639 +#: ../../../ui.cpp:2651 msgid "Bitcoin - Generating" msgstr "Bitcoin - Genererar" -#: ../../../ui.cpp:2641 +#: ../../../ui.cpp:2653 msgid "Bitcoin - (not connected)" msgstr "Bitcoin - (ej ansluten)" -#: ../../../ui.cpp:2720 +#: ../../../ui.cpp:2732 msgid "&Open Bitcoin" msgstr "&Öppna Bitcoin" -#: ../../../ui.cpp:2721 +#: ../../../ui.cpp:2733 msgid "&Send Bitcoins" msgstr "&Skicka Bitcoins" -#: ../../../ui.cpp:2722 +#: ../../../ui.cpp:2734 msgid "O&ptions..." msgstr "&Inställningar..." -#: ../../../ui.cpp:2725 +#: ../../../ui.cpp:2737 #: ../../../uibase.cpp:25 msgid "E&xit" msgstr "&Avsluta" -#: ../../../ui.cpp:2951 +#: ../../../ui.cpp:2963 msgid "Program has crashed and will terminate. " msgstr "Programmet har krachat och kommer att avslutas. " @@ -791,7 +772,6 @@ msgid "&Minimize to the tray instead of the taskbar" msgstr "&Minimerar till systemfältet istället för aktivitetsfält" #: ../../../uibase.cpp:351 -#, fuzzy msgid "Map port using &UPnP" msgstr "Mapp port använder &UPnP" @@ -812,9 +792,8 @@ msgid " &Port:" msgstr " &Port:" #: ../../../uibase.cpp:392 -#, fuzzy msgid "Optional transaction fee per KB that helps make sure your transactions are processed quickly. Most transactions are 1KB. Fee 0.01 recommended." -msgstr "Frivillig transaktionsavgift per KB som garanterar att din transaktion bearbetas snabbt. Flesta transaktioner är 1KB. Most transactions are 1KB. Avgift 0.01 rekommenderas." +msgstr "Frivillig transaktionsavgift per KB som garanterar att din transaktion bearbetas snabbt. Flesta transaktioner är 1KB. Avgift 0.01 rekommenderas." #: ../../../uibase.cpp:399 msgid "Pay transaction fee:" @@ -850,7 +829,6 @@ msgid "version" msgstr "version" #: ../../../uibase.cpp:525 -#, fuzzy msgid "" "Copyright (c) 2009-2011 Bitcoin Developers\n" "\n" @@ -865,14 +843,16 @@ msgid "" msgstr "" "Copyright (c) 2009-2011 Bitcoin Developers\n" "\n" -"This is experimental software.\n" +"Detta är en experimentell mjukvara.\n" "\n" -"Distributed under the MIT/X11 software license, see the accompanying file \n" -"license.txt or http://www.opensource.org/licenses/mit-license.php.\n" +"Distribuerad under MIT/X11 mjukvarulicens, se medföljande fil \n" +"license.txt eller http://www.opensource.org/licenses/mit-license.php.\n" "\n" -"This product includes software developed by the OpenSSL Project for use in the \n" -"OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by \n" -"Eric Young (eay@cryptsoft.com) and UPnP software written by Thomas Bernard." +"Denna produkt inkluderar mjukvara utvecklad av OpenSSL Project för användning i \n" +"OpenSSL Toolkit (http://www.openssl.org/) och kryptografisk mjukvara skriven av \n" +"Eric Young (eay@cryptsoft.com) och UPnP mjukvara skriven av Thomas Bernard.\n" +"\n" +"Översatt av Han Lin Yap." #: ../../../uibase.cpp:581 msgid "Enter a Bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L)" @@ -895,9 +875,8 @@ msgid "&Amount:" msgstr "&Belopp:" #: ../../../uibase.cpp:630 -#, fuzzy msgid "T&ransfer:" -msgstr "T&ransfer:" +msgstr "&Överföring:" #: ../../../uibase.cpp:636 msgid " Standard" @@ -918,9 +897,8 @@ msgstr "" "Ansluter..." #: ../../../uibase.cpp:761 -#, fuzzy msgid "These are your Bitcoin addresses for receiving payments. You may want to give a different one to each sender so you can keep track of who is paying you. The highlighted address is displayed in the main window." -msgstr "Dessa är dina Bitcoin adresser för mottagning av betalningar. Du rekommenderas att ge olika till varje avsändare så du kan ha koll på vem som betalar dig. Den markerade adressen är visar i huvudfönstret." +msgstr "Dessa är dina Bitcoin adresser för mottagning av betalningar. Du rekommenderas att ge olika till varje avsändare så du kan ha koll på vem som betalar dig. Den markerade adressen visas i huvudfönstret." #: ../../../uibase.cpp:774 #: ../../../uibase.cpp:886 @@ -937,9 +915,8 @@ msgid "Sending" msgstr "Skickar" #: ../../../uibase.cpp:857 -#, fuzzy msgid "These are your Bitcoin addresses for receiving payments. You can give a different one to each sender to keep track of who is paying you. The highlighted address will be displayed in the main window." -msgstr "Dessa är dina Bitcoin adresser för mottagning av betalningar. Du kan ge olika till varje avsändare så du kan ha koll på vem som betalar dig. Den markerade adressen är visar i huvudfönstret." +msgstr "Dessa är dina Bitcoin adresser för mottagning av betalningar. Du kan ge olika till varje avsändare så du kan ha koll på vem som betalar dig. Den markerade adressen visas i huvudfönstret." #: ../../../uibase.cpp:870 msgid "Receiving" @@ -949,15 +926,35 @@ msgstr "Mottagning" msgid "&Delete" msgstr "&Ta bort" -#: ../../../util.cpp:866 -#, fuzzy +#: ../../../util.cpp:874 msgid "Warning: Please check that your computer's date and time are correct. If your clock is wrong Bitcoin will not work properly." -msgstr "Varning: Var god och kolla att din dator har rätt datum och klockslag. Om din klocka är fel så kommer Bitcoin inte att fungera." +msgstr "Varning: Var god och kolla att din dator har rätt datum och klockslag. Om din klocka är fel så kommer Bitcoin inte att fungera ordentligt." -#: ../../../util.cpp:899 +#: ../../../util.cpp:908 msgid "beta" msgstr "beta" +#: ../../../wallet.cpp:917 +#, c-format +msgid "Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds " +msgstr "Fel: Denna transaktion kräver en transaktionsavgift minst %s för dess belopp, komplexitet, eller användning av nyligen mottagna pengar " + +#: ../../../wallet.cpp:919 +msgid "Error: Transaction creation failed " +msgstr "Fel: Misslyckades att skapa transaktion " + +#: ../../../wallet.cpp:928 +msgid "Error: The transaction was rejected. This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here." +msgstr "Fel: Transaktionen blev nekad. Detta kan hända om några av dina mynt i din plånbok var redan spenderad. Till exempel om du använde en kopia av wallet.dat och mynten var redan spenderad i kopian, men som inte var markerad som spenderad här." + +#: ../../../wallet.cpp:941 +msgid "Invalid amount" +msgstr "Ogiltig belopp" + +#: ../../../wallet.cpp:948 +msgid "Invalid bitcoin address" +msgstr "Ogiltig bitcoin adress" + #: ../../../uibase.h:147 msgid "Transaction Details" msgstr "Transaktion detaljer" @@ -974,5 +971,3 @@ msgstr "Om Bitcoin" msgid "Your Bitcoin Addresses" msgstr "Dina Bitcoin Adresser" -#~ msgid " beta" -#~ msgstr " beta" From 7ec552676c66488fe00fb503d02ec4a389a715b7 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Tue, 5 Jul 2011 03:06:19 +0200 Subject: [PATCH 02/42] Add minversion to wallet. --- src/db.cpp | 15 +++++++++++---- src/db.h | 9 ++++++++- src/init.cpp | 12 ++++++++++-- src/wallet.cpp | 5 +++-- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/db.cpp b/src/db.cpp index f044355a3..9e13727ae 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -670,7 +670,7 @@ void CWalletDB::ListAccountCreditDebit(const string& strAccount, listvchDefaultKey.clear(); int nFileVersion = 0; @@ -690,7 +690,7 @@ bool CWalletDB::LoadWallet(CWallet* pwallet) // Get cursor Dbc* pcursor = GetCursor(); if (!pcursor) - return false; + return DB_CORRUPT; loop { @@ -701,7 +701,7 @@ bool CWalletDB::LoadWallet(CWallet* pwallet) if (ret == DB_NOTFOUND) break; else if (ret != 0) - return false; + return DB_CORRUPT; // Unserialize // Taking advantage of the fact that pair serialization @@ -809,6 +809,13 @@ bool CWalletDB::LoadWallet(CWallet* pwallet) if (strKey == "addrProxy") ssValue >> addrProxy; if (fHaveUPnP && strKey == "fUseUPnP") ssValue >> fUseUPnP; } + else if (strType == "minversion") + { + int nMinVersion = 0; + ssValue >> nMinVersion; + if (nMinVersion > VERSION) + return DB_TOO_NEW; + } } pcursor->close(); } @@ -839,7 +846,7 @@ bool CWalletDB::LoadWallet(CWallet* pwallet) } - return true; + return DB_LOAD_OK; } void ThreadFlushWalletDB(void* parg) diff --git a/src/db.h b/src/db.h index b89b34e00..b91011127 100644 --- a/src/db.h +++ b/src/db.h @@ -342,6 +342,13 @@ public: +enum DBErrors +{ + DB_LOAD_OK, + DB_CORRUPT, + DB_TOO_NEW +}; + class CWalletDB : public CDB { public: @@ -450,7 +457,7 @@ public: int64 GetAccountCreditDebit(const std::string& strAccount); void ListAccountCreditDebit(const std::string& strAccount, std::list& acentries); - bool LoadWallet(CWallet* pwallet); + int LoadWallet(CWallet* pwallet); }; #endif diff --git a/src/init.cpp b/src/init.cpp index 635799ccf..beaad6889 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -387,8 +387,16 @@ bool AppInit2(int argc, char* argv[]) nStart = GetTimeMillis(); bool fFirstRun; pwalletMain = new CWallet("wallet.dat"); - if (!pwalletMain->LoadWallet(fFirstRun)) - strErrors += _("Error loading wallet.dat \n"); + int nLoadWalletRet = pwalletMain->LoadWallet(fFirstRun); + if (nLoadWalletRet != DB_LOAD_OK) + { + if (nLoadWalletRet == DB_CORRUPT) + strErrors += _("Error loading wallet.dat: Wallet corrupted \n"); + else if (nLoadWalletRet == DB_TOO_NEW) + strErrors += _("Error loading wallet.dat: Wallet requires newer version of Bitcoin \n"); + else + strErrors += _("Error loading wallet.dat \n"); + } printf(" wallet %15"PRI64d"ms\n", GetTimeMillis() - nStart); RegisterWallet(pwalletMain); diff --git a/src/wallet.cpp b/src/wallet.cpp index e54bbb3f4..ba9221f18 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -958,8 +958,9 @@ bool CWallet::LoadWallet(bool& fFirstRunRet) if (!fFileBacked) return false; fFirstRunRet = false; - if (!CWalletDB(strWalletFile,"cr+").LoadWallet(this)) - return false; + int nLoadWalletRet = CWalletDB(strWalletFile,"cr+").LoadWallet(this); + if (nLoadWalletRet != DB_LOAD_OK) + return nLoadWalletRet; fFirstRunRet = vchDefaultKey.empty(); if (!mapKeys.count(vchDefaultKey)) From acd6501610817eee0bd1c8ea9c591f043affbaec Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Sat, 25 Jun 2011 14:57:32 +0200 Subject: [PATCH 03/42] Prepare codebase for Encrypted Keys. --- src/db.cpp | 18 +++++--- src/init.cpp | 1 - src/key.h | 70 ++++++++++++++++++++++++++++++- src/keystore.cpp | 107 ++++++++++++++++++++++++++++++++++++++++++----- src/keystore.h | 89 +++++++++++++++++++++++++++++++++++++-- src/script.cpp | 2 +- src/ui.cpp | 2 +- src/wallet.cpp | 9 ++-- src/wallet.h | 5 ++- 9 files changed, 274 insertions(+), 29 deletions(-) diff --git a/src/db.cpp b/src/db.cpp index f044355a3..c479a452c 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -685,7 +685,7 @@ bool CWalletDB::LoadWallet(CWallet* pwallet) //// todo: shouldn't we catch exceptions and try to recover and continue? CRITICAL_BLOCK(pwallet->cs_mapWallet) - CRITICAL_BLOCK(pwallet->cs_mapKeys) + CRITICAL_BLOCK(pwallet->cs_KeyStore) { // Get cursor Dbc* pcursor = GetCursor(); @@ -765,14 +765,20 @@ bool CWalletDB::LoadWallet(CWallet* pwallet) { vector vchPubKey; ssKey >> vchPubKey; - CWalletKey wkey; + CKey key; if (strType == "key") - ssValue >> wkey.vchPrivKey; + { + CPrivKey pkey; + ssValue >> pkey; + key.SetPrivKey(pkey); + } else + { + CWalletKey wkey; ssValue >> wkey; - - pwallet->mapKeys[vchPubKey] = wkey.vchPrivKey; - mapPubKeys[Hash160(vchPubKey)] = vchPubKey; + key.SetPrivKey(wkey.vchPrivKey); + } + pwallet->LoadKey(key); } else if (strType == "defaultkey") { diff --git a/src/init.cpp b/src/init.cpp index 635799ccf..21b40d519 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -416,7 +416,6 @@ bool AppInit2(int argc, char* argv[]) //// debug print printf("mapBlockIndex.size() = %d\n", mapBlockIndex.size()); printf("nBestHeight = %d\n", nBestHeight); - printf("mapKeys.size() = %d\n", pwalletMain->mapKeys.size()); printf("setKeyPool.size() = %d\n", pwalletMain->setKeyPool.size()); printf("mapPubKeys.size() = %d\n", mapPubKeys.size()); printf("mapWallet.size() = %d\n", pwalletMain->mapWallet.size()); diff --git a/src/key.h b/src/key.h index c973d6eb8..c0fce18bf 100644 --- a/src/key.h +++ b/src/key.h @@ -31,6 +31,41 @@ // see www.keylength.com // script supports up to 75 for single byte push +int static inline EC_KEY_regenerate_key(EC_KEY *eckey, BIGNUM *priv_key) +{ + int ok = 0; + BN_CTX *ctx = NULL; + EC_POINT *pub_key = NULL; + + if (!eckey) return 0; + + const EC_GROUP *group = EC_KEY_get0_group(eckey); + + if ((ctx = BN_CTX_new()) == NULL) + goto err; + + pub_key = EC_POINT_new(group); + + if (pub_key == NULL) + goto err; + + if (!EC_POINT_mul(group, pub_key, priv_key, NULL, NULL, ctx)) + goto err; + + EC_KEY_set_private_key(eckey,priv_key); + EC_KEY_set_public_key(eckey,pub_key); + + ok = 1; + +err: + + if (pub_key) + EC_POINT_free(pub_key); + if (ctx != NULL) + BN_CTX_free(ctx); + + return(ok); +} class key_error : public std::runtime_error @@ -42,8 +77,7 @@ public: // secure_allocator is defined in serialize.h typedef std::vector > CPrivKey; - - +typedef std::vector > CSecret; class CKey { @@ -102,6 +136,38 @@ public: return true; } + bool SetSecret(const CSecret& vchSecret) + { + EC_KEY_free(pkey); + pkey = EC_KEY_new_by_curve_name(NID_secp256k1); + if (pkey == NULL) + throw key_error("CKey::SetSecret() : EC_KEY_new_by_curve_name failed"); + if (vchSecret.size() != 32) + throw key_error("CKey::SetSecret() : secret must be 32 bytes"); + BIGNUM *bn = BN_bin2bn(&vchSecret[0],32,BN_new()); + if (bn == NULL) + throw key_error("CKey::SetSecret() : BN_bin2bn failed"); + if (!EC_KEY_regenerate_key(pkey,bn)) + throw key_error("CKey::SetSecret() : EC_KEY_regenerate_key failed"); + BN_clear_free(bn); + fSet = true; + return true; + } + + CSecret GetSecret() const + { + CSecret vchRet; + vchRet.resize(32); + const BIGNUM *bn = EC_KEY_get0_private_key(pkey); + int nBytes = BN_num_bytes(bn); + if (bn == NULL) + throw key_error("CKey::GetSecret() : EC_KEY_get0_private_key failed"); + int n=BN_bn2bin(bn,&vchRet[32 - nBytes]); + if (n != nBytes) + throw key_error("CKey::GetSecret(): BN_bn2bin failed"); + return vchRet; + } + CPrivKey GetPrivKey() const { unsigned int nSize = i2d_ECPrivateKey(pkey, NULL); diff --git a/src/keystore.cpp b/src/keystore.cpp index 7dd045fe5..765144a9b 100644 --- a/src/keystore.cpp +++ b/src/keystore.cpp @@ -5,29 +5,116 @@ #include "headers.h" #include "db.h" - - -////////////////////////////////////////////////////////////////////////////// -// -// mapKeys -// - std::vector CKeyStore::GenerateNewKey() { RandAddSeedPerfmon(); CKey key; key.MakeNewKey(); if (!AddKey(key)) - throw std::runtime_error("GenerateNewKey() : AddKey failed"); + throw std::runtime_error("CKeyStore::GenerateNewKey() : AddKey failed"); return key.GetPubKey(); } -bool CKeyStore::AddKey(const CKey& key) +bool CBasicKeyStore::AddKey(const CKey& key) { - CRITICAL_BLOCK(cs_mapKeys) + CRITICAL_BLOCK(cs_KeyStore) { mapKeys[key.GetPubKey()] = key.GetPrivKey(); mapPubKeys[Hash160(key.GetPubKey())] = key.GetPubKey(); } + return true; } +bool CCryptoKeyStore::Unlock(const CMasterKey& vMasterKeyIn) +{ + if (!SetCrypted()) + return false; + + std::map, std::vector >::const_iterator mi = mapCryptedKeys.begin(); + for (; mi != mapCryptedKeys.end(); ++mi) + { + const std::vector &vchPubKey = (*mi).first; + const std::vector &vchCryptedSecret = (*mi).second; + CSecret vchSecret; + // decrypt vchCryptedSecret using vMasterKeyIn, into vchSecret + CKey key; + key.SetSecret(vchSecret); + if (key.GetPubKey() == vchPubKey) + break; + return false; + } + vMasterKey = vMasterKeyIn; + return true; +} + +bool CCryptoKeyStore::AddKey(const CKey& key) +{ + CRITICAL_BLOCK(cs_KeyStore) + { + if (!IsCrypted()) + return CBasicKeyStore::AddKey(key); + + if (IsLocked()) + return false; + + CSecret vchSecret = key.GetSecret(); + + std::vector vchCryptedSecret; + // encrypt vchSecret using vMasterKey, into vchCryptedSecret + + AddCryptedKey(key.GetPubKey(), vchCryptedSecret); + } + return true; +} + + +bool CCryptoKeyStore::AddCryptedKey(const std::vector &vchPubKey, const std::vector &vchCryptedSecret) +{ + CRITICAL_BLOCK(cs_KeyStore) + { + if (!SetCrypted()) + return false; + + mapCryptedKeys[vchPubKey] = vchCryptedSecret; + mapPubKeys[Hash160(vchPubKey)] = vchPubKey; + } + return true; +} + +bool CCryptoKeyStore::GetPrivKey(const std::vector &vchPubKey, CPrivKey& keyOut) const +{ + if (!IsCrypted()) + return CBasicKeyStore::GetPrivKey(vchPubKey, keyOut); + + std::map, std::vector >::const_iterator mi = mapCryptedKeys.find(vchPubKey); + if (mi != mapCryptedKeys.end()) + { + const std::vector &vchCryptedSecret = (*mi).second; + CSecret vchSecret; + // decrypt vchCryptedSecret using vMasterKey into vchSecret; + CKey key; + key.SetSecret(vchSecret); + keyOut = key.GetPrivKey(); + return true; + } + return false; +} + +bool CCryptoKeyStore::GenerateMasterKey() +{ + if (!mapCryptedKeys.empty()) + return false; + + RandAddSeedPerfmon(); + + vMasterKey.resize(32); + RAND_bytes(&vMasterKey[0], 32); + + if (!IsCrypted()) + { + // upgrade wallet + fUseCrypto = true; + } + + return true; +} diff --git a/src/keystore.h b/src/keystore.h index 6080d7d7f..409553549 100644 --- a/src/keystore.h +++ b/src/keystore.h @@ -4,12 +4,26 @@ #ifndef BITCOIN_KEYSTORE_H #define BITCOIN_KEYSTORE_H +typedef std::vector > CMasterKey; + class CKeyStore { public: + mutable CCriticalSection cs_KeyStore; + + virtual bool AddKey(const CKey& key) =0; + virtual bool HaveKey(const std::vector &vchPubKey) const =0; + virtual bool GetPrivKey(const std::vector &vchPubKey, CPrivKey& keyOut) const =0; + virtual std::vector GenerateNewKey(); +}; + +class CBasicKeyStore : public CKeyStore +{ +protected: std::map, CPrivKey> mapKeys; - mutable CCriticalSection cs_mapKeys; - virtual bool AddKey(const CKey& key); + +public: + bool AddKey(const CKey& key); bool HaveKey(const std::vector &vchPubKey) const { return (mapKeys.count(vchPubKey) > 0); @@ -24,7 +38,76 @@ public: } return false; } - std::vector GenerateNewKey(); +}; + +class CCryptoKeyStore : public CBasicKeyStore +{ +private: + std::map, std::vector > mapCryptedKeys; + + CMasterKey vMasterKey; + + // if fUseCrypto is true, mapKeys must be empty + // if fUseCrypto is false, vMasterKey must be empty + bool fUseCrypto; + +protected: + bool IsCrypted() const + { + return fUseCrypto; + } + + bool SetCrypted() + { + if (fUseCrypto) + return true; + if (!mapKeys.empty()) + return false; + fUseCrypto = true; + } + + // will encrypt previously unencrypted keys + bool GenerateMasterKey(); + + bool GetMasterKey(CMasterKey &vMasterKeyOut) const + { + if (!IsCrypted()) + return false; + if (IsLocked()) + return false; + vMasterKeyOut = vMasterKey; + return true; + } + bool Unlock(const CMasterKey& vMasterKeyIn); + +public: + CCryptoKeyStore() : fUseCrypto(false) + { + } + + bool IsLocked() const + { + if (!IsCrypted()) + return false; + return vMasterKey.empty(); + } + + bool Lock() + { + if (!SetCrypted()) + return false; + vMasterKey.clear(); + } + + virtual bool AddCryptedKey(const std::vector &vchPubKey, const std::vector &vchCryptedSecret); + bool AddKey(const CKey& key); + bool HaveKey(const std::vector &vchPubKey) const + { + if (!IsCrypted()) + return CBasicKeyStore::HaveKey(vchPubKey); + return mapCryptedKeys.count(vchPubKey) > 0; + } + bool GetPrivKey(const std::vector &vchPubKey, CPrivKey& keyOut) const; }; #endif diff --git a/src/script.cpp b/src/script.cpp index bd1b5b3c5..c17525034 100644 --- a/src/script.cpp +++ b/src/script.cpp @@ -1030,7 +1030,7 @@ bool Solver(const CKeyStore& keystore, const CScript& scriptPubKey, uint256 hash return false; // Compile solution - CRITICAL_BLOCK(keystore.cs_mapKeys) + CRITICAL_BLOCK(keystore.cs_KeyStore) { BOOST_FOREACH(PAIRTYPE(opcodetype, valtype)& item, vSolution) { diff --git a/src/ui.cpp b/src/ui.cpp index 9b84fb9e6..db02cb583 100644 --- a/src/ui.cpp +++ b/src/ui.cpp @@ -2382,7 +2382,7 @@ CAddressBookDialog::CAddressBookDialog(wxWindow* parent, const wxString& strInit m_listCtrlReceiving->SetFocus(); // Fill listctrl with address book data - CRITICAL_BLOCK(pwalletMain->cs_mapKeys) + CRITICAL_BLOCK(pwalletMain->cs_KeyStore) CRITICAL_BLOCK(pwalletMain->cs_mapAddressBook) { string strDefaultReceiving = (string)pframeMain->m_textCtrlAddress->GetValue(); diff --git a/src/wallet.cpp b/src/wallet.cpp index 6ef75ef27..a179876dc 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -17,7 +17,8 @@ using namespace std; bool CWallet::AddKey(const CKey& key) { - this->CKeyStore::AddKey(key); + if (!CBasicKeyStore::AddKey(key)) + return false; if (!fFileBacked) return true; return CWalletDB(strWalletFile).WriteKey(key.GetPubKey(), key.GetPrivKey()); @@ -783,7 +784,7 @@ bool CWallet::CreateTransaction(const vector >& vecSend, CW // Reserve a new key pair from key pool vector vchPubKey = reservekey.GetReservedKey(); - assert(mapKeys.count(vchPubKey)); + // assert(mapKeys.count(vchPubKey)); // Fill a vout to ourself, using same address type as the payment CScript scriptChange; @@ -957,7 +958,7 @@ bool CWallet::LoadWallet(bool& fFirstRunRet) if (!mapKeys.count(vchDefaultKey)) { - // Create new default key + // Create new keyUser and set as default key RandAddSeedPerfmon(); SetDefaultKey(GetKeyFromKeyPool()); @@ -1062,7 +1063,7 @@ void CWallet::ReserveKeyFromKeyPool(int64& nIndex, CKeyPool& keypool) setKeyPool.erase(setKeyPool.begin()); if (!walletdb.ReadPool(nIndex, keypool)) throw runtime_error("ReserveKeyFromKeyPool() : read failed"); - if (!mapKeys.count(keypool.vchPubKey)) + if (!HaveKey(keypool.vchPubKey)) throw runtime_error("ReserveKeyFromKeyPool() : unknown key in key pool"); assert(!keypool.vchPubKey.empty()); printf("keypool reserve %"PRI64d"\n", nIndex); diff --git a/src/wallet.h b/src/wallet.h index 7d9db9726..8fb29a489 100644 --- a/src/wallet.h +++ b/src/wallet.h @@ -12,7 +12,7 @@ class CWalletTx; class CReserveKey; class CWalletDB; -class CWallet : public CKeyStore +class CWallet : public CCryptoKeyStore { private: bool SelectCoinsMinConf(int64 nTargetValue, int nConfMine, int nConfTheirs, std::set >& setCoinsRet, int64& nValueRet) const; @@ -48,7 +48,10 @@ public: std::vector vchDefaultKey; + // keystore implementation bool AddKey(const CKey& key); + bool LoadKey(const CKey& key) { return CCryptoKeyStore::AddKey(key); } + bool AddToWallet(const CWalletTx& wtxIn); bool AddToWalletIfInvolvingMe(const CTransaction& tx, const CBlock* pblock, bool fUpdate = false); bool EraseFromWallet(uint256 hash); From c1aacf0be347b10a6ab9bbce841e8127412bce41 Mon Sep 17 00:00:00 2001 From: Dylan Noblesmith Date: Fri, 24 Jun 2011 03:03:17 +0000 Subject: [PATCH 04/42] mlock() all private keys in memory Inline comment and idea come from the encprivkeys branch by Matt Corallo . --- src/serialize.h | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/serialize.h b/src/serialize.h index 31862a71a..6952004e2 100644 --- a/src/serialize.h +++ b/src/serialize.h @@ -28,6 +28,18 @@ typedef unsigned long long uint64; #if defined(_MSC_VER) && _MSC_VER < 1300 #define for if (false) ; else for #endif + +#ifdef __WXMSW__ +// This is used to attempt to keep keying material out of swap +// Note that VirtualLock does not provide this as a guarantee on Windows, +// but, in practice, memory that has been VirtualLock'd almost never gets written to +// the pagefile except in rare circumstances where memory is extremely low. +#define mlock(p, n) VirtualLock((p), (n)); +#define munlock(p, n) VirtualUnlock((p), (n)); +#else +#include +#endif + class CScript; class CDataStream; class CAutoFile; @@ -755,7 +767,8 @@ struct ser_streamplaceholder // -// Allocator that clears its contents before deletion +// Allocator that locks its contents from being paged +// out of memory and clears its contents before deletion. // template struct secure_allocator : public std::allocator @@ -777,10 +790,22 @@ struct secure_allocator : public std::allocator template struct rebind { typedef secure_allocator<_Other> other; }; + T* allocate(std::size_t n, const void *hint = 0) + { + T *p; + p = std::allocator::allocate(n, hint); + if (p != NULL) + mlock(p, sizeof(T) * n); + return p; + } + void deallocate(T* p, std::size_t n) { if (p != NULL) + { memset(p, 0, sizeof(T) * n); + munlock(p, sizeof(T) * n); + } std::allocator::deallocate(p, n); } }; From f08736405e98d0f16ec294606dda782043d5ab3d Mon Sep 17 00:00:00 2001 From: Jeff Garzik Date: Fri, 8 Jul 2011 13:38:24 -0400 Subject: [PATCH 05/42] Compile 'sv' translation --- locale/sv/LC_MESSAGES/bitcoin.mo | Bin 0 -> 20407 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 locale/sv/LC_MESSAGES/bitcoin.mo diff --git a/locale/sv/LC_MESSAGES/bitcoin.mo b/locale/sv/LC_MESSAGES/bitcoin.mo new file mode 100644 index 0000000000000000000000000000000000000000..b61914cb4b3824e907dfa2c58acfe16a8af0467d GIT binary patch literal 20407 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 Date: Sat, 9 Jul 2011 10:06:49 +0200 Subject: [PATCH 06/42] remove magic number: change threshold for nLockTime to constant --- src/main.h | 4 +++- src/ui.cpp | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main.h b/src/main.h index aa74ac5ab..124c7c267 100644 --- a/src/main.h +++ b/src/main.h @@ -37,6 +37,8 @@ static const int64 MIN_RELAY_TX_FEE = 10000; static const int64 MAX_MONEY = 21000000 * COIN; inline bool MoneyRange(int64 nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); } static const int COINBASE_MATURITY = 100; +// Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp. +static const int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC #ifdef USE_UPNP static const int fHaveUPnP = true; #else @@ -441,7 +443,7 @@ public: nBlockHeight = nBestHeight; if (nBlockTime == 0) nBlockTime = GetAdjustedTime(); - if ((int64)nLockTime < (nLockTime < 500000000 ? (int64)nBlockHeight : nBlockTime)) + if ((int64)nLockTime < (nLockTime < LOCKTIME_THRESHOLD ? (int64)nBlockHeight : nBlockTime)) return true; BOOST_FOREACH(const CTxIn& txin, vin) if (!txin.IsFinal()) diff --git a/src/ui.cpp b/src/ui.cpp index 9b84fb9e6..ff0b4afb5 100644 --- a/src/ui.cpp +++ b/src/ui.cpp @@ -522,7 +522,7 @@ string FormatTxStatus(const CWalletTx& wtx) // Status if (!wtx.IsFinal()) { - if (wtx.nLockTime < 500000000) + if (wtx.nLockTime < LOCKTIME_THRESHOLD) return strprintf(_("Open for %d blocks"), nBestHeight - wtx.nLockTime); else return strprintf(_("Open until %s"), DateTimeStr(wtx.nLockTime).c_str()); From a48c671957e37594d8f9e0fd51b24e7a4f44300e Mon Sep 17 00:00:00 2001 From: Doug Huff Date: Thu, 30 Jun 2011 02:04:44 +0200 Subject: [PATCH 07/42] Make mlock() and munlock() portable to systems that require the address to be on a page boundary. --- src/serialize.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/serialize.h b/src/serialize.h index 6952004e2..38c533d9a 100644 --- a/src/serialize.h +++ b/src/serialize.h @@ -38,6 +38,18 @@ typedef unsigned long long uint64; #define munlock(p, n) VirtualUnlock((p), (n)); #else #include +#include +/* This comes from limits.h if it's not defined there set a sane default */ +#ifndef PAGESIZE +#include +#define PAGESIZE sysconf(_SC_PAGESIZE) +#endif +#define mlock(a,b) \ + mlock(((void *)(((size_t)(a)) & (~((PAGESIZE)-1)))),\ + (((((size_t)(a)) + (b) - 1) | ((PAGESIZE) - 1)) + 1) - (((size_t)(a)) & (~((PAGESIZE) - 1)))) +#define munlock(a,b) \ + munlock(((void *)(((size_t)(a)) & (~((PAGESIZE)-1)))),\ + (((((size_t)(a)) + (b) - 1) | ((PAGESIZE) - 1)) + 1) - (((size_t)(a)) & (~((PAGESIZE) - 1)))) #endif class CScript; From 6c9498147fb4bd6e1a79eaaa0c93a558a57a0caf Mon Sep 17 00:00:00 2001 From: Jay Weisskopf Date: Mon, 11 Jul 2011 02:09:07 -0500 Subject: [PATCH 08/42] Add logos/branding currently found on bitcoin.org into NSIS installer. --- share/pixmaps/nsis-header.bmp | Bin 0 -> 25818 bytes share/pixmaps/nsis-wizard.bmp | Bin 0 -> 154542 bytes share/setup.nsi | 5 +++++ 3 files changed, 5 insertions(+) create mode 100644 share/pixmaps/nsis-header.bmp create mode 100644 share/pixmaps/nsis-wizard.bmp diff --git a/share/pixmaps/nsis-header.bmp b/share/pixmaps/nsis-header.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9ab0ce2591d21cce2408983986b7c97c2d1c476f GIT binary patch literal 25818 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 literal 0 HcmV?d00001 diff --git a/share/pixmaps/nsis-wizard.bmp b/share/pixmaps/nsis-wizard.bmp new file mode 100644 index 0000000000000000000000000000000000000000..71255c6850b00ef1efea82fefd05ff736c90f816 GIT binary patch literal 154542 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 Date: Mon, 11 Jul 2011 02:11:15 -0500 Subject: [PATCH 09/42] Set default compression for NSIS installer to LZMA. Use of LZMA (versus the current zlib) shaves a few MB off the installer. --- share/setup.nsi | 1 + 1 file changed, 1 insertion(+) diff --git a/share/setup.nsi b/share/setup.nsi index cd39aa399..022eea822 100644 --- a/share/setup.nsi +++ b/share/setup.nsi @@ -1,6 +1,7 @@ Name Bitcoin RequestExecutionLevel highest +SetCompressor /SOLID lzma # General Symbol Definitions !define REGKEY "SOFTWARE\$(^Name)" From aa0bcaaf2be4bbb7729d307fffec13b7ef0cb806 Mon Sep 17 00:00:00 2001 From: Jay Weisskopf Date: Tue, 12 Jul 2011 01:18:57 -0500 Subject: [PATCH 10/42] Remove NSIS branding from bottom divider. --- share/setup.nsi | 1 + 1 file changed, 1 insertion(+) diff --git a/share/setup.nsi b/share/setup.nsi index 022eea822..888c8ea53 100644 --- a/share/setup.nsi +++ b/share/setup.nsi @@ -49,6 +49,7 @@ OutFile bitcoin-0.3.24-win32-setup.exe InstallDir $PROGRAMFILES\Bitcoin CRCCheck on XPStyle on +BrandingText " " ShowInstDetails show VIProductVersion 0.3.24.0 VIAddVersionKey ProductName Bitcoin From 4e87d341f75f13bbd7d108c31c03886fbc4df56f Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Fri, 8 Jul 2011 15:47:35 +0200 Subject: [PATCH 11/42] Add wallet privkey encryption. This commit adds support for ckeys, or enCrypted private keys, to the wallet. All keys are stored in memory in their encrypted form and thus the passphrase is required from the user to spend coins, or to create new addresses. Keys are encrypted with AES-256-CBC using OpenSSL's EVP library. The key is calculated via EVP_BytesToKey using SHA512 with (by default) 25000 rounds and a random salt. By default, the user's wallet remains unencrypted until they call the RPC command encryptwallet or, from the GUI menu, Options-> Encrypt Wallet. When the user is attempting to call RPC functions which require the password to unlock the wallet, an error will be returned unless they call walletpassphrase